diff --git a/.github/actions/setup-meteor/action.yaml b/.github/actions/setup-meteor/action.yaml index 68a7305e4c..04dddf3796 100644 --- a/.github/actions/setup-meteor/action.yaml +++ b/.github/actions/setup-meteor/action.yaml @@ -3,5 +3,5 @@ description: "Setup Meteor" runs: using: "composite" steps: - - run: curl "https://install.meteor.com/?release=3.1" | sh + - run: curl "https://install.meteor.com/?release=3.1.2" | sh shell: bash diff --git a/.github/workflows/audit.yaml b/.github/workflows/audit.yaml index a27128ab0f..03b6eef4ea 100644 --- a/.github/workflows/audit.yaml +++ b/.github/workflows/audit.yaml @@ -11,7 +11,7 @@ jobs: continue-on-error: true timeout-minutes: 15 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: persist-credentials: false - name: Use Node.js @@ -41,7 +41,7 @@ jobs: continue-on-error: true timeout-minutes: 15 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: persist-credentials: false - name: Use Node.js @@ -78,12 +78,13 @@ jobs: - blueprints-integration - server-core-integration - shared-lib + - live-status-gateway-api - playout-gateway - mos-gateway - live-status-gateway steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: persist-credentials: false - name: Use Node.js @@ -116,7 +117,7 @@ jobs: timeout-minutes: 15 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: persist-credentials: false - name: Use Node.js diff --git a/.github/workflows/node.yaml b/.github/workflows/node.yaml index 4529a75770..c067d58149 100644 --- a/.github/workflows/node.yaml +++ b/.github/workflows/node.yaml @@ -16,7 +16,7 @@ jobs: continue-on-error: true timeout-minutes: 15 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: persist-credentials: false - name: Use Node.js @@ -57,7 +57,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 30 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: persist-credentials: false - name: Use Node.js @@ -104,7 +104,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 30 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: persist-credentials: false - name: Determine if images should be published to DockerHub @@ -284,7 +284,7 @@ jobs: gateway-name: [playout-gateway, mos-gateway, "live-status-gateway"] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: persist-credentials: false - name: Determine if images should be published to DockerHub @@ -446,9 +446,10 @@ jobs: - openapi - live-status-gateway - webui + - live-status-gateway-api steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: persist-credentials: false - name: Use Node.js @@ -490,6 +491,7 @@ jobs: - blueprints-integration - server-core-integration - shared-lib + # - live-status-gateway-api # no tests yet - openapi node-version: [22.x] include: @@ -516,7 +518,7 @@ jobs: send-coverage: true steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: persist-credentials: false - name: Use Node.js ${{ matrix.node-version }} @@ -556,7 +558,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 15 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: persist-credentials: false - name: Use Node.js @@ -573,10 +575,12 @@ jobs: CI: true - name: Run generator run: | - cd packages/live-status-gateway + cd packages/live-status-gateway-api yarn gendocs yarn genserver + + yarn generate-schema-types env: CI: true openapi-generation: @@ -584,7 +588,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 15 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: persist-credentials: false - name: Use Node.js @@ -620,7 +624,7 @@ jobs: timeout-minutes: 15 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: persist-credentials: false - name: Use Node.js @@ -677,7 +681,7 @@ jobs: - build-core steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: persist-credentials: false - name: Use Node.js @@ -754,7 +758,7 @@ jobs: continue-on-error: true timeout-minutes: 15 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: persist-credentials: false - name: Use Node.js diff --git a/.github/workflows/prerelease-libs.yml b/.github/workflows/prerelease-libs.yml index 1e56770004..3dd3a070d7 100644 --- a/.github/workflows/prerelease-libs.yml +++ b/.github/workflows/prerelease-libs.yml @@ -18,9 +18,10 @@ jobs: - blueprints-integration - server-core-integration - shared-lib + - live-status-gateway-api steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: persist-credentials: false - name: Use Node.js @@ -55,10 +56,12 @@ jobs: - blueprints-integration - server-core-integration - shared-lib + # - live-status-gateway-api # no tests yet + - openapi node-version: [22.x] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: persist-credentials: false - name: Use Node.js ${{ matrix.node-version }} @@ -90,7 +93,7 @@ jobs: - test-packages steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: persist-credentials: false - name: Use Node.js diff --git a/.github/workflows/prune-tags.yml b/.github/workflows/prune-tags.yml index 4137013de6..ceb88351d0 100644 --- a/.github/workflows/prune-tags.yml +++ b/.github/workflows/prune-tags.yml @@ -23,7 +23,7 @@ jobs: timeout-minutes: 15 steps: - name: Checkout repo with all tags - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: fetch-depth: 0 diff --git a/.github/workflows/sonar.yaml b/.github/workflows/sonar.yaml index 5f9c45c425..7c664f3f66 100644 --- a/.github/workflows/sonar.yaml +++ b/.github/workflows/sonar.yaml @@ -16,7 +16,7 @@ jobs: timeout-minutes: 15 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: # Disabling shallow clone is recommended for improving relevancy of reporting fetch-depth: 0 diff --git a/.husky/pre-commit b/.husky/pre-commit old mode 100755 new mode 100644 index d2ae35e84b..3723623171 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - yarn lint-staged diff --git a/.node-version b/.node-version index 8b84b727be..d5b283a3ac 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -22.11 +22.13.1 diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000000..4e895da43b --- /dev/null +++ b/.prettierignore @@ -0,0 +1,5 @@ +meteor/.meteor +**/dist/** + +**/node_modules/** + diff --git a/.vscode/extensions.json b/.vscode/extensions.json index b676eca82d..0ba5809a0a 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -4,4 +4,4 @@ "esbenp.prettier-vscode", "sonarsource.sonarlint-vscode" ] -} \ No newline at end of file +} diff --git a/.vscode/launch.json b/.vscode/launch.json index bf9ed3d8ab..012844d9c6 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,35 +1,35 @@ { - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "type": "pwa-chrome", - "request": "launch", - "name": "Launch Chrome", - "url": "http://localhost:3000/", - "sourceMaps": true, - "webRoot": "${workspaceFolder}/meteor", - "sourceMapPathOverrides": { - "meteor://💻app/*": "${webRoot}/*" - } - }, - { - "type": "node", - "request": "attach", - "name": "Attach", - "port": 9229, - "cwd": "${workspaceFolder}/meteor", - "sourceMapPathOverrides": { - "db:///blueprint/*": "${workspaceFolder:Blueprints}/dist/*", - "blueprint:///*": "${workspaceFolder:Blueprints}/*" - }, - "outFiles": [ - "${workspaceFolder}/**/*.js", - "!**/node_modules/**", - "${workspaceFolder:Blueprints}/dist/*.js", - ] - } - ] -} \ No newline at end of file + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "pwa-chrome", + "request": "launch", + "name": "Launch Chrome", + "url": "http://localhost:3000/", + "sourceMaps": true, + "webRoot": "${workspaceFolder}/meteor", + "sourceMapPathOverrides": { + "meteor://💻app/*": "${webRoot}/*" + } + }, + { + "type": "node", + "request": "attach", + "name": "Attach", + "port": 9229, + "cwd": "${workspaceFolder}/meteor", + "sourceMapPathOverrides": { + "db:///blueprint/*": "${workspaceFolder:Blueprints}/dist/*", + "blueprint:///*": "${workspaceFolder:Blueprints}/*" + }, + "outFiles": [ + "${workspaceFolder}/**/*.js", + "!**/node_modules/**", + "${workspaceFolder:Blueprints}/dist/*.js" + ] + } + ] +} diff --git a/.vscode/settings.json.default b/.vscode/settings.json.default index bbed2d7f28..e02c73f2a0 100644 --- a/.vscode/settings.json.default +++ b/.vscode/settings.json.default @@ -9,6 +9,7 @@ "packages/shared-lib", "packages/job-worker", "packages/openapi", + "packages/live-status-gateway-api", "packages/live-status-gateway", "packages/webui" ], diff --git a/CHANGELOG.md b/CHANGELOG.md index b06f211fad..3937f7ce92 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,2 +1,2 @@ - [Changelog for _Sofie Core_](meteor/CHANGELOG.md) -- [_Sofie_ Releases](https://sofie-automation.github.io/sofie-core//releases) +- [_Sofie_ Releases](https://sofie-automation.github.io/sofie-core/releases) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0d398e8c00..318fe769ff 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ # How to Contribute to this Repository -Before contributing to this specific repository, please read the [Contribution Guidelines](https://sofie-automation.github.io/sofie-core//docs/for-developers/contribution-guidelines) for the Sofie project. +Before contributing to this specific repository, please read the [Contribution Guidelines](https://sofie-automation.github.io/sofie-core/docs/for-developers/contribution-guidelines) for the Sofie project. ## Branches diff --git a/DEVELOPER.md b/DEVELOPER.md index caca06ac60..20a4aa8028 100644 --- a/DEVELOPER.md +++ b/DEVELOPER.md @@ -145,10 +145,6 @@ However, one usage by AdlibActions for their userDataManifest remains as this is In R52, the replacement flow of `validateConfig` and `applyConfig` was extended to the system blueprint It is no longer recommended to use the old migrations flow for system blueprints. -### ExpectedMediaItems - -These are used for Media-manager which is no longer being developed. - ### Blueprints: getPieceABSessionId & getTimelineObjectAbSessionId With AB being a native concept supported by Sofie since R50, these are likely no longer useful to Blueprints. diff --git a/meteor.coverage.json b/meteor.coverage.json index 38b9dd5087..945a868526 100644 --- a/meteor.coverage.json +++ b/meteor.coverage.json @@ -1,34 +1,43 @@ { - "include": [ - ], - "exclude": { - "general": [], - "server": [ - "**/node_modules/**/*.json", - "**/.!(meteor)*/**", - "**/packages/!(local-test_?*.js)", - "**/+([^:]):+([^:])/**", - "**/@(test|tests|spec|specs)/**", - "**/?(*.)test?(s).?*", - "**/?(*.)spec?(s).?*", - "**/?(*.)app-test?(s).?*", - "**/?(*.)app-spec?(s).?*" - ], - "client": [ - "**/*.json", - "**/client/stylesheets/**", - "**/.npm/package/node_modules/**", - "**/web.browser/packages/**", - "**/.?*/**", - "**/packages/!(local-test_?*.js)", - "**/+([^:]):+([^:])/**", - "**/@(test|tests|spec|specs)/**", - "**/?(*.)test?(s).?*", - "**/?(*.)spec?(s).?*", - "**/?(*.)app-test?(s).?*", - "**/?(*.)app-spec?(s).?*" - ] - }, - "remapFormat": ["html", "cobertura", "clover", "json", "json-summary", "lcovonly", "teamcity", "text", "text-summary"], - "output": "./.coverage" -} \ No newline at end of file + "include": [], + "exclude": { + "general": [], + "server": [ + "**/node_modules/**/*.json", + "**/.!(meteor)*/**", + "**/packages/!(local-test_?*.js)", + "**/+([^:]):+([^:])/**", + "**/@(test|tests|spec|specs)/**", + "**/?(*.)test?(s).?*", + "**/?(*.)spec?(s).?*", + "**/?(*.)app-test?(s).?*", + "**/?(*.)app-spec?(s).?*" + ], + "client": [ + "**/*.json", + "**/client/stylesheets/**", + "**/.npm/package/node_modules/**", + "**/web.browser/packages/**", + "**/.?*/**", + "**/packages/!(local-test_?*.js)", + "**/+([^:]):+([^:])/**", + "**/@(test|tests|spec|specs)/**", + "**/?(*.)test?(s).?*", + "**/?(*.)spec?(s).?*", + "**/?(*.)app-test?(s).?*", + "**/?(*.)app-spec?(s).?*" + ] + }, + "remapFormat": [ + "html", + "cobertura", + "clover", + "json", + "json-summary", + "lcovonly", + "teamcity", + "text", + "text-summary" + ], + "output": "./.coverage" +} diff --git a/meteor/.eslintignore b/meteor/.eslintignore deleted file mode 100644 index e2a1ee2fca..0000000000 --- a/meteor/.eslintignore +++ /dev/null @@ -1,5 +0,0 @@ -.meteor -public -scripts -server/_force_restart.js -/packages/ diff --git a/meteor/.eslintrc.js b/meteor/.eslintrc.js deleted file mode 100644 index a6d6491a5a..0000000000 --- a/meteor/.eslintrc.js +++ /dev/null @@ -1,107 +0,0 @@ -const { - commonPlugins, - tsPlugins, - commonExtends, - tsExtends, - commonRules, - tsRules, - tsParser, -} = require('./node_modules/@sofie-automation/code-standard-preset/eslint/fragments') // eslint-disable-line node/no-unpublished-require - -const tmpRules = { - // Temporary rules to be removed over time - '@typescript-eslint/ban-types': 'off', - '@typescript-eslint/no-namespace': 'off', - '@typescript-eslint/no-var-requires': 'off', - '@typescript-eslint/no-non-null-assertion': 'off', - '@typescript-eslint/unbound-method': 'off', - '@typescript-eslint/no-misused-promises': 'off', - '@typescript-eslint/no-unnecessary-type-assertion': 'off', -} - -const tsBase = { - extends: [...tsExtends], - plugins: tsPlugins, - ...tsParser, - settings: { - node: { - tryExtensions: ['.js', '.json', '.node', '.ts', '.tsx', '.d.ts'], - }, - }, - env: { - 'jest/globals': false, // Block jest from this - }, - rules: { - ...commonRules, - ...tsRules, - - // custom - 'no-inner-declarations': 'off', // some functions are unexported and placed inside a namespace next to related ones - 'node/no-missing-import': [ - 'error', - { - allowModules: ['meteor', 'mongodb'], - tryExtensions: ['.js', '.json', '.node', '.ts', '.tsx', '.d.ts'], - }, - ], - 'node/no-extraneous-import': [ - 'error', - { - allowModules: ['meteor', 'mongodb'], - }, - ], - ...tmpRules, - }, -} - -module.exports = { - extends: [...commonExtends], - plugins: [...commonPlugins], - rules: { - 'prettier/prettier': 'error', - }, - env: { es2017: true }, - parserOptions: { sourceType: 'module', ecmaVersion: 2018 }, - settings: {}, - overrides: [ - // Note: these replace the values defined above, so make sure to extend them if they are needed - { - files: ['*.ts'], - ...tsBase, - }, - { - files: ['*.js'], - env: { - 'jest/globals': false, // Block jest from this - }, - settings: { - node: { - tryExtensions: ['.js', '.json', '.node', '.ts', '.tsx'], - }, - }, - rules: { - ...commonRules, - ...tmpRules, - }, - }, - { - files: ['**/__tests__/**/*.ts', '**/__tests__/**/*.js', '**/__mocks__/**/*.ts'], - ...tsBase, - env: { - 'jest/globals': true, - jest: true, - }, - rules: { - ...tsBase.rules, - '@typescript-eslint/ban-ts-ignore': 'off', - '@typescript-eslint/ban-ts-comment': 'off', - - // custom - 'node/no-unpublished-import': 'off', - 'node/no-unpublished-require': 'off', - '@typescript-eslint/no-non-null-assertion': 'off', - ...tmpRules, - }, - }, - ], -} diff --git a/meteor/.meteor/packages b/meteor/.meteor/packages index 34ab0cf5f5..3e586bdb11 100644 --- a/meteor/.meteor/packages +++ b/meteor/.meteor/packages @@ -8,14 +8,14 @@ # but you can also edit it by hand. -meteor@2.0.1 -webapp@2.0.3 +meteor@2.1.0 +webapp@2.0.5 ddp@1.4.2 -mongo@2.0.2 # The database Meteor supports right now +mongo@2.1.0 # The database Meteor supports right now -ecmascript@0.16.9 # Enable ECMAScript2015+ syntax in app code -typescript@5.4.3 # Enable TypeScript syntax in .ts and .tsx modules +ecmascript@0.16.10 # Enable ECMAScript2015+ syntax in app code +typescript@5.6.3 # Enable TypeScript syntax in .ts and .tsx modules tracker@1.3.4 # Meteor's client-side reactive programming library diff --git a/meteor/.meteor/release b/meteor/.meteor/release index 8d20e1a2d3..5f22892744 100644 --- a/meteor/.meteor/release +++ b/meteor/.meteor/release @@ -1 +1 @@ -METEOR@3.1 +METEOR@3.1.2 diff --git a/meteor/.meteor/versions b/meteor/.meteor/versions index 93c057c752..e73648723f 100644 --- a/meteor/.meteor/versions +++ b/meteor/.meteor/versions @@ -1,5 +1,5 @@ -allow-deny@2.0.0 -babel-compiler@7.11.2 +allow-deny@2.1.0 +babel-compiler@7.11.3 babel-runtime@1.5.2 base64@1.0.13 binary-heap@1.0.12 @@ -8,9 +8,9 @@ callback-hook@1.6.0 check@1.4.4 core-runtime@1.0.0 ddp@1.4.2 -ddp-client@3.0.3 +ddp-client@3.1.0 ddp-common@1.4.4 -ddp-server@3.0.3 +ddp-server@3.1.0 diff-sequence@1.1.3 dynamic-import@0.7.4 ecmascript@0.16.10 @@ -24,16 +24,16 @@ geojson-utils@1.0.12 id-map@1.2.0 inter-process-messaging@0.1.2 logging@1.3.5 -meteor@2.0.2 +meteor@2.1.0 minimongo@2.0.2 -modern-browsers@0.1.11 +modern-browsers@0.2.0 modules@0.20.3 modules-runtime@0.13.2 -mongo@2.0.3 +mongo@2.1.0 mongo-decimal@0.2.0 mongo-dev-server@1.1.1 mongo-id@1.0.9 -npm-mongo@6.10.0 +npm-mongo@6.10.2 ordered-dict@1.2.0 promise@1.0.0 random@1.2.2 @@ -41,9 +41,9 @@ react-fast-refresh@0.2.9 reload@1.3.2 retry@1.1.1 routepolicy@1.1.2 -socket-stream-client@0.5.3 +socket-stream-client@0.6.0 tracker@1.3.4 typescript@5.6.3 -webapp@2.0.4 +webapp@2.0.5 webapp-hashing@1.1.2 zodern:types@1.0.13 diff --git a/meteor/.prettierignore b/meteor/.prettierignore index 3d4aefaedf..e0486e5e88 100644 --- a/meteor/.prettierignore +++ b/meteor/.prettierignore @@ -3,3 +3,4 @@ CHANGELOG*.md *.snap *.xml public/locales +.meteor diff --git a/meteor/.vscode/launch.json b/meteor/.vscode/launch.json index 81fe8cb5c0..a0c4954e67 100644 --- a/meteor/.vscode/launch.json +++ b/meteor/.vscode/launch.json @@ -1,34 +1,34 @@ { - "version": "0.2.0", - "configurations": [ - { - "type": "chrome", - "request": "launch", - "name": "Meteor: Chrome", - "url": "http://localhost:3000", - "webRoot": "${workspaceFolder}" - }, - { - "type": "node", - "request": "launch", - "name": "Meteor: Node", - "runtimeExecutable": "npm", - "runtimeArgs": ["run", "debug"], - "port": 9229, - "timeout": 240000 - }, - { - "type": "node", - "request": "attach", - "name": "Meteor: Attach Node", - "port": 9229, - "timeout": 240000 - } - ], - "compounds": [ - { - "name": "Meteor: All", - "configurations": ["Meteor: Node", "Meteor: Chrome"] - } - ] -} \ No newline at end of file + "version": "0.2.0", + "configurations": [ + { + "type": "chrome", + "request": "launch", + "name": "Meteor: Chrome", + "url": "http://localhost:3000", + "webRoot": "${workspaceFolder}" + }, + { + "type": "node", + "request": "launch", + "name": "Meteor: Node", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "debug"], + "port": 9229, + "timeout": 240000 + }, + { + "type": "node", + "request": "attach", + "name": "Meteor: Attach Node", + "port": 9229, + "timeout": 240000 + } + ], + "compounds": [ + { + "name": "Meteor: All", + "configurations": ["Meteor: Node", "Meteor: Chrome"] + } + ] +} diff --git a/meteor/CHANGELOG_0_x_x.md b/meteor/CHANGELOG_0_x_x.md index 61a5afe8c8..f19d970d02 100644 --- a/meteor/CHANGELOG_0_x_x.md +++ b/meteor/CHANGELOG_0_x_x.md @@ -3,4131 +3,4136 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. -# 0.26.0 (2019-08-19) +# 0.26.0 (2019-08-19) ### Bug Fixes -* &nbps; in a string instead of A0 ([299ba28](https://github.com/nrkno/tv-automation-server-core/commit/299ba28)) -* a bug where DEFAULT_DISPLAY_DURATION would be added to a 0-duration member of a displayDurationGroup ([13f784d](https://github.com/nrkno/tv-automation-server-core/commit/13f784d)) -* a bug where DEFAULT_DISPLAY_DURATION would be added to a 0-duration member of a displayDurationGroup ([5f2ed62](https://github.com/nrkno/tv-automation-server-core/commit/5f2ed62)) -* accepted resolutions should not be separated by space. ([1b80a2c](https://github.com/nrkno/tv-automation-server-core/commit/1b80a2c)) -* activate past ROs ([4b128a5](https://github.com/nrkno/tv-automation-server-core/commit/4b128a5)) -* activate past ROs ([c20af5d](https://github.com/nrkno/tv-automation-server-core/commit/c20af5d)) -* add (preliminary) security rules for all collections ([6fd60e2](https://github.com/nrkno/tv-automation-server-core/commit/6fd60e2)) -* add additional fallbacks for a 0-situation ([2444d56](https://github.com/nrkno/tv-automation-server-core/commit/2444d56)) -* Add code documentation to the Notification Center ([ec03358](https://github.com/nrkno/tv-automation-server-core/commit/ec03358)) -* Add default exclusivity groups to InitDB ([dfd1782](https://github.com/nrkno/tv-automation-server-core/commit/dfd1782)) -* add dependency: timeline-state-resolver-types ([cd2db55](https://github.com/nrkno/tv-automation-server-core/commit/cd2db55)) -* Add exception handlers for timeline vizualiser page ([6bb56d8](https://github.com/nrkno/tv-automation-server-core/commit/6bb56d8)) -* Add exception handlers for timeline vizualiser page ([d9103dd](https://github.com/nrkno/tv-automation-server-core/commit/d9103dd)) -* Add migration to set type on existing blueprints ([f1b4f3c](https://github.com/nrkno/tv-automation-server-core/commit/f1b4f3c)) -* add missing translation json-file ([6059965](https://github.com/nrkno/tv-automation-server-core/commit/6059965)) -* add missing _id ([c948d09](https://github.com/nrkno/tv-automation-server-core/commit/c948d09)) -* add missing _id ([970fbf8](https://github.com/nrkno/tv-automation-server-core/commit/970fbf8)) -* Add missing _rank field to SegmentLineAdLibItem ([9cd15fa](https://github.com/nrkno/tv-automation-server-core/commit/9cd15fa)) -* add missing $ne (not equal) in mongoWhere ([53c76a8](https://github.com/nrkno/tv-automation-server-core/commit/53c76a8)) -* add missing asRunEvent in AsRunEventContext ([b8def27](https://github.com/nrkno/tv-automation-server-core/commit/b8def27)) -* add missing core version ([8ad3a9e](https://github.com/nrkno/tv-automation-server-core/commit/8ad3a9e)) -* add missing function ([de2b81f](https://github.com/nrkno/tv-automation-server-core/commit/de2b81f)) -* Add missing layers to initdb. Use readtime as possible duration of segmentline when calculating story length ([e388d63](https://github.com/nrkno/tv-automation-server-core/commit/e388d63)) -* add missing migration: rename Timeline.siId to studioId ([f0a1289](https://github.com/nrkno/tv-automation-server-core/commit/f0a1289)) -* add missing parameter in callback ([fc4f690](https://github.com/nrkno/tv-automation-server-core/commit/fc4f690)) -* add new timeline visualizer ([9cad423](https://github.com/nrkno/tv-automation-server-core/commit/9cad423)) -* add new timeline visualizer ([f240aab](https://github.com/nrkno/tv-automation-server-core/commit/f240aab)) -* add nn translation to whitelist ([4663e3b](https://github.com/nrkno/tv-automation-server-core/commit/4663e3b)) -* add parseDateTime code hints to template editor ([c38b2f7](https://github.com/nrkno/tv-automation-server-core/commit/c38b2f7)) -* add postinstall script for Jest & Fibers to work ([2ad398d](https://github.com/nrkno/tv-automation-server-core/commit/2ad398d)) -* add shortcut ctrl+shift+enter-on-numpad to reload ([b9820ff](https://github.com/nrkno/tv-automation-server-core/commit/b9820ff)) -* add Studios migrations ([6e8f9f9](https://github.com/nrkno/tv-automation-server-core/commit/6e8f9f9)) -* added _valid: true to mock-data ([6c2775b](https://github.com/nrkno/tv-automation-server-core/commit/6c2775b)) -* added a place to run updateExpectedMediaItems ([c70704d](https://github.com/nrkno/tv-automation-server-core/commit/c70704d)) -* added missing "force" parameter ([7b50a97](https://github.com/nrkno/tv-automation-server-core/commit/7b50a97)) -* added missing debug-logging setting ([8f616ca](https://github.com/nrkno/tv-automation-server-core/commit/8f616ca)) -* added missing getRank import ([9d37eb8](https://github.com/nrkno/tv-automation-server-core/commit/9d37eb8)) -* added MomentFromNow, to use instead of ([aefea31](https://github.com/nrkno/tv-automation-server-core/commit/aefea31)) -* added peripheralDevices subscription, used by status display ([ccb309d](https://github.com/nrkno/tv-automation-server-core/commit/ccb309d)) -* added sorting of runtimeFunctions when generating backup, so diffing works ([b3ba3f6](https://github.com/nrkno/tv-automation-server-core/commit/b3ba3f6)) -* added sorting of runtimeFunctions when generating backup, so diffing works ([17639a0](https://github.com/nrkno/tv-automation-server-core/commit/17639a0)) -* added virtual lines to the generated function, so that line numbers add up in error messages ([df2366a](https://github.com/nrkno/tv-automation-server-core/commit/df2366a)) -* adlib items conflict with programmed content ([a304238](https://github.com/nrkno/tv-automation-server-core/commit/a304238)) -* after broadcast form failed to saveEvaluation ([f55546b](https://github.com/nrkno/tv-automation-server-core/commit/f55546b)) -* allow duration 0 of segmentLines ([11a18ae](https://github.com/nrkno/tv-automation-server-core/commit/11a18ae)) -* allow esc & enter in modalDialog ([cd511b6](https://github.com/nrkno/tv-automation-server-core/commit/cd511b6)) -* allow re-sync of unsynced RO while it is active ([b824d72](https://github.com/nrkno/tv-automation-server-core/commit/b824d72)) -* allow removing peripheralDevices from Settings page ([b14e56a](https://github.com/nrkno/tv-automation-server-core/commit/b14e56a)) -* allow removing peripheralDevices from Settings page ([948675f](https://github.com/nrkno/tv-automation-server-core/commit/948675f)) -* allow timelineobjs to be declared as abstract, and always route those with the core_abstract layer ([9bfa6c4](https://github.com/nrkno/tv-automation-server-core/commit/9bfa6c4)) -* allow translating actions ([af4dc78](https://github.com/nrkno/tv-automation-server-core/commit/af4dc78)) -* Allow translations of media warnings, show clip as broken until scan finished ([b693de7](https://github.com/nrkno/tv-automation-server-core/commit/b693de7)) -* also defer sendStoryStatus, as that's not critical for playback ([9417862](https://github.com/nrkno/tv-automation-server-core/commit/9417862)) -* always rewind GUI on roReset, roResetAndActivate ([4502d90](https://github.com/nrkno/tv-automation-server-core/commit/4502d90)) -* always rewind GUI on roReset, roResetAndActivate ([11744c9](https://github.com/nrkno/tv-automation-server-core/commit/11744c9)) -* an issue where the state would be updated after the component was unmounted ([6ccf413](https://github.com/nrkno/tv-automation-server-core/commit/6ccf413)) -* anomaly timings as numbers ([d0c0d36](https://github.com/nrkno/tv-automation-server-core/commit/d0c0d36)) -* another bugfix ([c7ed208](https://github.com/nrkno/tv-automation-server-core/commit/c7ed208)) -* apning with no heads ([dfb1976](https://github.com/nrkno/tv-automation-server-core/commit/dfb1976)) -* apparently componentwillmount is running in a reactive context and causes issues ([a8e53b6](https://github.com/nrkno/tv-automation-server-core/commit/a8e53b6)) -* apply some fixes when restoring a RO ([b04bf53](https://github.com/nrkno/tv-automation-server-core/commit/b04bf53)) -* asRunLog: defer handleEvent, to make sure all events have been reported before running. ([6c56ec7](https://github.com/nrkno/tv-automation-server-core/commit/6c56ec7)) -* Assign ids for timeline object keyframes ([2ce1318](https://github.com/nrkno/tv-automation-server-core/commit/2ce1318)) -* Assign ids for timeline object keyframes ([f56218a](https://github.com/nrkno/tv-automation-server-core/commit/f56218a)) -* atem mappings ([8d4ea2d](https://github.com/nrkno/tv-automation-server-core/commit/8d4ea2d)) -* attach upload handler in RundownLayoutEditor ([c8feeb2](https://github.com/nrkno/tv-automation-server-core/commit/c8feeb2)) -* autoNext should update yellow line (it didn't) ([ff42a81](https://github.com/nrkno/tv-automation-server-core/commit/ff42a81)) -* backport timing changes for play-from-anywhere from R10 ([5d96b1e](https://github.com/nrkno/tv-automation-server-core/commit/5d96b1e)) -* baselineTemplates not being calculated correctly for showstyle ([e4799b4](https://github.com/nrkno/tv-automation-server-core/commit/e4799b4)) -* basic fiber test ([2419397](https://github.com/nrkno/tv-automation-server-core/commit/2419397)) -* Basic rundown playback ([3b88d2a](https://github.com/nrkno/tv-automation-server-core/commit/3b88d2a)) -* be able to reset & activate inactivated RO ([e7d52da](https://github.com/nrkno/tv-automation-server-core/commit/e7d52da)) -* be able to reset & activate inactivated RO ([18e01f4](https://github.com/nrkno/tv-automation-server-core/commit/18e01f4)) -* better debug message ([17e1b4e](https://github.com/nrkno/tv-automation-server-core/commit/17e1b4e)) -* better handling of template-errors ([9f98100](https://github.com/nrkno/tv-automation-server-core/commit/9f98100)) -* better implementation of push update to local objects ([d692c96](https://github.com/nrkno/tv-automation-server-core/commit/d692c96)) -* Better syncFunction loging for anonymous functions, or in a timeout ([3633e4a](https://github.com/nrkno/tv-automation-server-core/commit/3633e4a)) -* BIG optimization in roTake and affected functions, made database fetches async & parallel where possible. This should not affect the functionality, though testing is needed. ([aa6f4bd](https://github.com/nrkno/tv-automation-server-core/commit/aa6f4bd)) -* bind keydown for any keyup events to prevent their default behaviour ([83e42e4](https://github.com/nrkno/tv-automation-server-core/commit/83e42e4)) -* blueprint config from manifest is reenabled and used for show style base and variant ([59b2f2f](https://github.com/nrkno/tv-automation-server-core/commit/59b2f2f)) -* Blueprint selection input in studio settings ([fc80da1](https://github.com/nrkno/tv-automation-server-core/commit/fc80da1)) -* blueprint settings page ([5697afe](https://github.com/nrkno/tv-automation-server-core/commit/5697afe)) -* break long script better in hoverscrub ([5697493](https://github.com/nrkno/tv-automation-server-core/commit/5697493)) -* break long script better in hoverscrub ([2d2f26d](https://github.com/nrkno/tv-automation-server-core/commit/2d2f26d)) -* broken GUI SegmentLineItems resolution, when simulating timeline output ([60fb843](https://github.com/nrkno/tv-automation-server-core/commit/60fb843)) -* broken logging + message ([ffe4fb4](https://github.com/nrkno/tv-automation-server-core/commit/ffe4fb4)) -* broken settings page ([1e99ff7](https://github.com/nrkno/tv-automation-server-core/commit/1e99ff7)) -* broken tests ([aa71eda](https://github.com/nrkno/tv-automation-server-core/commit/aa71eda)) -* broken tests ([69a4472](https://github.com/nrkno/tv-automation-server-core/commit/69a4472)) -* broken tests ([b92a8a6](https://github.com/nrkno/tv-automation-server-core/commit/b92a8a6)) -* broken tests ([0e107bd](https://github.com/nrkno/tv-automation-server-core/commit/0e107bd)) -* broken timing on continued piece during HOLD ([8c0d81f](https://github.com/nrkno/tv-automation-server-core/commit/8c0d81f)) -* broken timing on continued piece during HOLD ([bbd7528](https://github.com/nrkno/tv-automation-server-core/commit/bbd7528)) -* bug in logic, migrations should run if there are any steps left ([87ec102](https://github.com/nrkno/tv-automation-server-core/commit/87ec102)) -* bug in popup: nora payload can be deep objects, causing ui crash ([30bfca9](https://github.com/nrkno/tv-automation-server-core/commit/30bfca9)) -* bug in storePath migration step ([b623973](https://github.com/nrkno/tv-automation-server-core/commit/b623973)) -* bug that caused unhandledPromiseRejection. Also added logging of result of user action ([e799277](https://github.com/nrkno/tv-automation-server-core/commit/e799277)) -* bug when moving story to last ([83cef62](https://github.com/nrkno/tv-automation-server-core/commit/83cef62)) -* bug when moving story to last ([2b86f1a](https://github.com/nrkno/tv-automation-server-core/commit/2b86f1a)) -* bugfix ([943ff72](https://github.com/nrkno/tv-automation-server-core/commit/943ff72)) -* bugfix, broke stuff when renaming ([22c4eb1](https://github.com/nrkno/tv-automation-server-core/commit/22c4eb1)) -* bugfix, some keys didn't work in text inputs ([36e99cb](https://github.com/nrkno/tv-automation-server-core/commit/36e99cb)) -* bugfix: changed property ([a7710ad](https://github.com/nrkno/tv-automation-server-core/commit/a7710ad)) -* bugfix: didn't correctly find the right segmentLineItem in next segmentLine ([0f9313f](https://github.com/nrkno/tv-automation-server-core/commit/0f9313f)) -* bugfix: executeFunction didn't really time out ([acba08c](https://github.com/nrkno/tv-automation-server-core/commit/acba08c)) -* bugfix: timeline wasn't updated when going rehersal => roResetAndActivate ([ca76732](https://github.com/nrkno/tv-automation-server-core/commit/ca76732)) -* bugfix: undefined storePath ([cbfdde5](https://github.com/nrkno/tv-automation-server-core/commit/cbfdde5)) -* bugfix: update local object when updating database ([9d3b05b](https://github.com/nrkno/tv-automation-server-core/commit/9d3b05b)) -* bugfix: updateExpectedMediaItems used all segmentLineItems in RO, not just in segmmentLine ([406829b](https://github.com/nrkno/tv-automation-server-core/commit/406829b)) -* bugfix: When updating collection, documents with removed properties didn't get their properties removed. ([93dd81e](https://github.com/nrkno/tv-automation-server-core/commit/93dd81e)) -* bugfix: When updating collection, documents with removed properties didn't get their properties removed. ([237b8ff](https://github.com/nrkno/tv-automation-server-core/commit/237b8ff)) -* build errors ([34889b9](https://github.com/nrkno/tv-automation-server-core/commit/34889b9)) -* build errors ([81382f7](https://github.com/nrkno/tv-automation-server-core/commit/81382f7)) -* bumps expected version ([bd06edc](https://github.com/nrkno/tv-automation-server-core/commit/bd06edc)) -* Call ShowStyleBlueprint.onTimelineGenerate when the timeline is being generated for any extra post-processing ([cd22af3](https://github.com/nrkno/tv-automation-server-core/commit/cd22af3)) -* catch scroll events properly in later Chrome versions. ([7396973](https://github.com/nrkno/tv-automation-server-core/commit/7396973)) -* change lawo enum & interface ([3959761](https://github.com/nrkno/tv-automation-server-core/commit/3959761)) -* change logging to info on device state change ([1cc9429](https://github.com/nrkno/tv-automation-server-core/commit/1cc9429)) -* changed backup sorting to use templateId instead of _id ([d7047a5](https://github.com/nrkno/tv-automation-server-core/commit/d7047a5)) -* changed default chortcuts ([ba33bb7](https://github.com/nrkno/tv-automation-server-core/commit/ba33bb7)) -* changed from promise to not ([6261cdc](https://github.com/nrkno/tv-automation-server-core/commit/6261cdc)) -* changed header colors ([b9efc61](https://github.com/nrkno/tv-automation-server-core/commit/b9efc61)) -* changed how i18n is initialized & exported ([cc674aa](https://github.com/nrkno/tv-automation-server-core/commit/cc674aa)) -* Changed the color of the top bar during Rehearsal mode to something a little less hideous. ([1e887e3](https://github.com/nrkno/tv-automation-server-core/commit/1e887e3)) -* changed timeline ids to use both _id (globally unnique) and id (unique within a studio) ([d637fb0](https://github.com/nrkno/tv-automation-server-core/commit/d637fb0)) -* changes attr. paths in lawo source objs ([55f8c7b](https://github.com/nrkno/tv-automation-server-core/commit/55f8c7b)) -* changes lawo mapping with the effects change ([dbe58fe](https://github.com/nrkno/tv-automation-server-core/commit/dbe58fe)) -* check blueprint during upload & return it ([29c0600](https://github.com/nrkno/tv-automation-server-core/commit/29c0600)) -* check category of rundown-ingest-device ([b4f95a7](https://github.com/nrkno/tv-automation-server-core/commit/b4f95a7)) -* check content.path before creating an ExpectedMediaItem ([0914e98](https://github.com/nrkno/tv-automation-server-core/commit/0914e98)) -* check if the component didn't get unmounted mid-call ([5cbfc58](https://github.com/nrkno/tv-automation-server-core/commit/5cbfc58)) -* check that blueprint type stays the same on upload ([c2e4c10](https://github.com/nrkno/tv-automation-server-core/commit/c2e4c10)) -* chore: clean up in peripheralDevice typings ([09c8f4a](https://github.com/nrkno/tv-automation-server-core/commit/09c8f4a)) -* circular imports caused mocks to go haywire. ([210e6a3](https://github.com/nrkno/tv-automation-server-core/commit/210e6a3)) -* circular imports caused mocks to go haywire. ([976b89d](https://github.com/nrkno/tv-automation-server-core/commit/976b89d)) -* clean up expectedMediaItems when removing RDs, also include a clean-up step in the migration for 0.25.0 ([e401741](https://github.com/nrkno/tv-automation-server-core/commit/e401741)) -* clean up imports in ROV ([58067a6](https://github.com/nrkno/tv-automation-server-core/commit/58067a6)) -* clean up more collections when removing RO ([b84ed59](https://github.com/nrkno/tv-automation-server-core/commit/b84ed59)) -* clean up onBeforeUnload handler ([51adbba](https://github.com/nrkno/tv-automation-server-core/commit/51adbba)) -* clear queued adlibs when resetting running order ([83ed11a](https://github.com/nrkno/tv-automation-server-core/commit/83ed11a)) -* clear runtimeArguments on resetRunningOrder ([350dd45](https://github.com/nrkno/tv-automation-server-core/commit/350dd45)) -* clip floating inspector values ([d4c7430](https://github.com/nrkno/tv-automation-server-core/commit/d4c7430)) -* collection name ([e014558](https://github.com/nrkno/tv-automation-server-core/commit/e014558)) -* comment out dropping the rundownBaselineObjs ([d7679aa](https://github.com/nrkno/tv-automation-server-core/commit/d7679aa)) -* Comment out some code that is currently unused ([070081d](https://github.com/nrkno/tv-automation-server-core/commit/070081d)) -* ConfigRef fix ([f557052](https://github.com/nrkno/tv-automation-server-core/commit/f557052)) -* copy retryUntil from blueprint to core message ([72546b6](https://github.com/nrkno/tv-automation-server-core/commit/72546b6)) -* correct handling of blueprint.minimumCoreVersion ([19b2130](https://github.com/nrkno/tv-automation-server-core/commit/19b2130)) -* correct names of some ingest api methods ([6a87c9b](https://github.com/nrkno/tv-automation-server-core/commit/6a87c9b)) -* Correct some TimelineObj typings ([eb36ef9](https://github.com/nrkno/tv-automation-server-core/commit/eb36ef9)) -* corrects the default baseline template ([bf4eb03](https://github.com/nrkno/tv-automation-server-core/commit/bf4eb03)) -* Creating blueprints in UI ([8419ecf](https://github.com/nrkno/tv-automation-server-core/commit/8419ecf)) -* Ctrl-S in template editor triggers a save ([bacbc3e](https://github.com/nrkno/tv-automation-server-core/commit/bacbc3e)) -* default duration for KAM in timing group ([adf63cb](https://github.com/nrkno/tv-automation-server-core/commit/adf63cb)) -* defer triggerExternalMessage so as not to block timelineUpdate's ([ba7383f](https://github.com/nrkno/tv-automation-server-core/commit/ba7383f)) -* delete & sync buttons in RO-list ([9fbc875](https://github.com/nrkno/tv-automation-server-core/commit/9fbc875)) -* detect and discard double as-run events ([98f65a2](https://github.com/nrkno/tv-automation-server-core/commit/98f65a2)) -* dev Collections bug, due to collections being filled in later ([43e8856](https://github.com/nrkno/tv-automation-server-core/commit/43e8856)) -* dev debug data function ([e4570e2](https://github.com/nrkno/tv-automation-server-core/commit/e4570e2)) -* device is first created as Abstract ([98dca79](https://github.com/nrkno/tv-automation-server-core/commit/98dca79)) -* device status notifications ([7ab4a4c](https://github.com/nrkno/tv-automation-server-core/commit/7ab4a4c)) -* disable client-side RO updates ([72ba831](https://github.com/nrkno/tv-automation-server-core/commit/72ba831)) -* disable fullscreen overlay in developer mode ([7cc2e43](https://github.com/nrkno/tv-automation-server-core/commit/7cc2e43)) -* disable runtimeFunction caching during code-test & save ([e21f8dd](https://github.com/nrkno/tv-automation-server-core/commit/e21f8dd)) -* disable runtimeFunction caching during code-test & save ([74d6d34](https://github.com/nrkno/tv-automation-server-core/commit/74d6d34)) -* do full rundown update when recieve rundown metadata ([11ae325](https://github.com/nrkno/tv-automation-server-core/commit/11ae325)) -* Do not allow queue ad lib during hold mode ([c378fc8](https://github.com/nrkno/tv-automation-server-core/commit/c378fc8)) -* do not allow toggling sl arguments during hold mode ([3311f0a](https://github.com/nrkno/tv-automation-server-core/commit/3311f0a)) -* do not display notification count if = 0 ([1fe9a39](https://github.com/nrkno/tv-automation-server-core/commit/1fe9a39)) -* do not error CountdownItemLabel when sourceLayer is not found ([9451d1c](https://github.com/nrkno/tv-automation-server-core/commit/9451d1c)) -* do not refresh RO notifications if RO/showStyleBase/studioInstallation changes ([5702939](https://github.com/nrkno/tv-automation-server-core/commit/5702939)) -* do not show empty string values in L3rd popup ([b0c6c8e](https://github.com/nrkno/tv-automation-server-core/commit/b0c6c8e)) -* Don't remove enable.duration when setting enable.start to an absolute time instead of now for pieces ([991f2ba](https://github.com/nrkno/tv-automation-server-core/commit/991f2ba)) -* don't send devicesMakeReady until verified no other runningOrders are active ([953a1a7](https://github.com/nrkno/tv-automation-server-core/commit/953a1a7)) -* don't update device name if already got one ([833196a](https://github.com/nrkno/tv-automation-server-core/commit/833196a)) -* don't wait for subscriptions before rendering ([2bbfa20](https://github.com/nrkno/tv-automation-server-core/commit/2bbfa20)) -* Dont generate ui outputlayers for sli which are virtual ([c0ad368](https://github.com/nrkno/tv-automation-server-core/commit/c0ad368)) -* dont set nora_* config values in initDB ([1330008](https://github.com/nrkno/tv-automation-server-core/commit/1330008)) -* Dont show unset optional config in the config list ([5689865](https://github.com/nrkno/tv-automation-server-core/commit/5689865)) -* duration settling ([0648f57](https://github.com/nrkno/tv-automation-server-core/commit/0648f57)) -* Editattribute type typing ([1206d0c](https://github.com/nrkno/tv-automation-server-core/commit/1206d0c)) -* Editattribute type typing ([392f4aa](https://github.com/nrkno/tv-automation-server-core/commit/392f4aa)) -* EditAttribute: dropdown options was always strings ([814cdf7](https://github.com/nrkno/tv-automation-server-core/commit/814cdf7)) -* End of Show marker line doesn't end where it should ([e188c97](https://github.com/nrkno/tv-automation-server-core/commit/e188c97)) -* enforce workflow data structure ([d01245f](https://github.com/nrkno/tv-automation-server-core/commit/d01245f)) -* Ensure lookahead ids are always unique ([26f6637](https://github.com/nrkno/tv-automation-server-core/commit/26f6637)) -* Ensure PeripheralDevice.executeFunction doesnt timeout during callback execution ([087a6f8](https://github.com/nrkno/tv-automation-server-core/commit/087a6f8)) -* ensure that mediaFlowId and studioId are both indices ([5744ff3](https://github.com/nrkno/tv-automation-server-core/commit/5744ff3)) -* ensure that the connection notification is always on top ([662cd7a](https://github.com/nrkno/tv-automation-server-core/commit/662cd7a)) -* ensure that VideoEditMonitor is comfortably scrubbable at any window width ([a5e882a](https://github.com/nrkno/tv-automation-server-core/commit/a5e882a)) -* ensure that VideoEditMonitor is comfortably scrubbable at any window width ([ece3dfb](https://github.com/nrkno/tv-automation-server-core/commit/ece3dfb)) -* ensure the same overlap is used for autonext and the previous sl ([efb39e6](https://github.com/nrkno/tv-automation-server-core/commit/efb39e6)) -* Ensure the sl overlapDuration is respected on autonext. ([8c3bf3e](https://github.com/nrkno/tv-automation-server-core/commit/8c3bf3e)) -* Ensure typeVariant on SegmentLine is preserved when a roList is received ([98b224c](https://github.com/nrkno/tv-automation-server-core/commit/98b224c)) -* error in GUI (devices was added twice to list) ([80c4128](https://github.com/nrkno/tv-automation-server-core/commit/80c4128)) -* error when content.boxSourceConfiguration is undefined ([fc7ec40](https://github.com/nrkno/tv-automation-server-core/commit/fc7ec40)) -* error when content.boxSourceConfiguration is undefined ([81c896b](https://github.com/nrkno/tv-automation-server-core/commit/81c896b)) -* expectedMediaItems should work again ([a3bb4e9](https://github.com/nrkno/tv-automation-server-core/commit/a3bb4e9)) -* expectedMediaItems should work again ([f33467d](https://github.com/nrkno/tv-automation-server-core/commit/f33467d)) -* expectedMediaItems: make ids uniquer ([e16594a](https://github.com/nrkno/tv-automation-server-core/commit/e16594a)) -* externalMessage: priority of messages to send ([cffcd97](https://github.com/nrkno/tv-automation-server-core/commit/cffcd97)) -* externalMessage: update status on removed document ([75a1053](https://github.com/nrkno/tv-automation-server-core/commit/75a1053)) -* externalMessageQueue id ([5c8c39d](https://github.com/nrkno/tv-automation-server-core/commit/5c8c39d)) -* externalMessages upd ([a803882](https://github.com/nrkno/tv-automation-server-core/commit/a803882)) -* failing on startup if dp property missing ([041fc3e](https://github.com/nrkno/tv-automation-server-core/commit/041fc3e)) -* fetch from collections in EMI API ([73a3bd1](https://github.com/nrkno/tv-automation-server-core/commit/73a3bd1)) -* filter on json files on restore backup file selector ([1a0b867](https://github.com/nrkno/tv-automation-server-core/commit/1a0b867)) -* First pass of implementing mosRoFullStory and mosRoStoryDelete ([47602d1](https://github.com/nrkno/tv-automation-server-core/commit/47602d1)) -* fix a missing colon ([9f2aab9](https://github.com/nrkno/tv-automation-server-core/commit/9f2aab9)) -* fix according to updated interface ([e372a66](https://github.com/nrkno/tv-automation-server-core/commit/e372a66)) -* fix an issue where some of the snapshot restores would not be recognized as JSON ([57d31bc](https://github.com/nrkno/tv-automation-server-core/commit/57d31bc)) -* fix an issue where the message for clip ingested would be "null, Clip is being ingested" ([7ac5672](https://github.com/nrkno/tv-automation-server-core/commit/7ac5672)) -* fix an issue with overlapping labels on pieces when an infinite item was cropped by another item at 0 point. ([7599f64](https://github.com/nrkno/tv-automation-server-core/commit/7599f64)) -* fix an issue with resizing Shelf when scrolled down ([78155d6](https://github.com/nrkno/tv-automation-server-core/commit/78155d6)) -* fix an issue with scene, black and freeze information only showing up after a hover ([3505514](https://github.com/nrkno/tv-automation-server-core/commit/3505514)) -* Fix broken syncFunction and infinite loop in afterRemoveParts. Add test for rundownSyncFunction ([95ec0cc](https://github.com/nrkno/tv-automation-server-core/commit/95ec0cc)) -* Fix context.runHelper not working in templates. ([36ca5f3](https://github.com/nrkno/tv-automation-server-core/commit/36ca5f3)) -* Fix device status notifications ([b9f274e](https://github.com/nrkno/tv-automation-server-core/commit/b9f274e)) -* fix expectVersion ([afeaa74](https://github.com/nrkno/tv-automation-server-core/commit/afeaa74)) -* fix for React whitespace error: ([f66983b](https://github.com/nrkno/tv-automation-server-core/commit/f66983b)) -* fix for strange (temporary?) error about method missing ([0db30ae](https://github.com/nrkno/tv-automation-server-core/commit/0db30ae)) -* fix mocks ([3d64f0c](https://github.com/nrkno/tv-automation-server-core/commit/3d64f0c)) -* fix more typings and add some null checks in unusual places ([d0c53c3](https://github.com/nrkno/tv-automation-server-core/commit/d0c53c3)) -* fix MOS status indicators in RO header ([c0724cc](https://github.com/nrkno/tv-automation-server-core/commit/c0724cc)) -* fix notifications toggle button cursor ([b0d8dcb](https://github.com/nrkno/tv-automation-server-core/commit/b0d8dcb)) -* fix notifications toggle button cursor ([402486b](https://github.com/nrkno/tv-automation-server-core/commit/402486b)) -* fix PTZ Testing harness ([97bccc7](https://github.com/nrkno/tv-automation-server-core/commit/97bccc7)) -* Fix regenerateRundown when not sourced from mos ([3f0191d](https://github.com/nrkno/tv-automation-server-core/commit/3f0191d)) -* Fix regenerateRundown when not sourced from mos ([292d6c5](https://github.com/nrkno/tv-automation-server-core/commit/292d6c5)) -* fix Segment Line notifications ([3753250](https://github.com/nrkno/tv-automation-server-core/commit/3753250)) -* fix set offset working from UI ([91bc80d](https://github.com/nrkno/tv-automation-server-core/commit/91bc80d)) -* fix some subscriptions and naming ([3696183](https://github.com/nrkno/tv-automation-server-core/commit/3696183)) -* Fix some unstable tests ([c521b76](https://github.com/nrkno/tv-automation-server-core/commit/c521b76)) -* fix typings to match with the stronger typings ([ae1bd4f](https://github.com/nrkno/tv-automation-server-core/commit/ae1bd4f)) -* fix zoom area height ([24d2e38](https://github.com/nrkno/tv-automation-server-core/commit/24d2e38)) -* fixes ([2fc3802](https://github.com/nrkno/tv-automation-server-core/commit/2fc3802)) -* force lookahead inGroup field to be emptied. Fixes mismatched statobj ([c76209c](https://github.com/nrkno/tv-automation-server-core/commit/c76209c)) -* freeze/black in begin/end of mediafile gets special warning ([ea950e2](https://github.com/nrkno/tv-automation-server-core/commit/ea950e2)) -* generate statObject per device ([82a0736](https://github.com/nrkno/tv-automation-server-core/commit/82a0736)) -* Get some playout working ([161fca3](https://github.com/nrkno/tv-automation-server-core/commit/161fca3)) -* getHash undefined exception in asRunLog ([8faab78](https://github.com/nrkno/tv-automation-server-core/commit/8faab78)) -* getSnapshot: don't ask devices of type OTHER ([ea874d4](https://github.com/nrkno/tv-automation-server-core/commit/ea874d4)) -* getting monaco to work runtime while still having typings ([5db8218](https://github.com/nrkno/tv-automation-server-core/commit/5db8218)) -* global ad-lib order was wrong, basline blueprint did not set _rank ([ffbacc8](https://github.com/nrkno/tv-automation-server-core/commit/ffbacc8)) -* Guard against there being no next segmentline ([849d97f](https://github.com/nrkno/tv-automation-server-core/commit/849d97f)) -* GUI externalMessages json formatting ([0b7cd2c](https://github.com/nrkno/tv-automation-server-core/commit/0b7cd2c)) -* GUI: new try on rewinding the viewport on RO reset ([b0edaf4](https://github.com/nrkno/tv-automation-server-core/commit/b0edaf4)) -* GUI: round number of frames ([c90021f](https://github.com/nrkno/tv-automation-server-core/commit/c90021f)) -* GUI: settings: only show parent-devices in left menu (only they have settings on them) ([ecb164e](https://github.com/nrkno/tv-automation-server-core/commit/ecb164e)) -* GUI: unexpected behaviour in blueprint configuration ([f5bed4e](https://github.com/nrkno/tv-automation-server-core/commit/f5bed4e)) -* handle both update & insert of runningOrder ([84a6c53](https://github.com/nrkno/tv-automation-server-core/commit/84a6c53)) -* handle both update & insert of runningOrder ([3701bb3](https://github.com/nrkno/tv-automation-server-core/commit/3701bb3)) -* handle promises correctly.. ([2e57296](https://github.com/nrkno/tv-automation-server-core/commit/2e57296)) -* handle promises correctly.. ([b952e1d](https://github.com/nrkno/tv-automation-server-core/commit/b952e1d)) -* handle take situation better when having invalid segmentLines ([dacd3b0](https://github.com/nrkno/tv-automation-server-core/commit/dacd3b0)) -* handle when error is thrown in function in makePromise ([c287727](https://github.com/nrkno/tv-automation-server-core/commit/c287727)) -* handle when error is thrown in function in makePromise ([b7094dd](https://github.com/nrkno/tv-automation-server-core/commit/b7094dd)) -* handle when nexting before start or after end ([506bb8a](https://github.com/nrkno/tv-automation-server-core/commit/506bb8a)) -* has played styling shouldn't be applied to Guest and Remote segments ([18bdc82](https://github.com/nrkno/tv-automation-server-core/commit/18bdc82)) -* have both a cirtuclar button and a 'branch' to the panel ([1fa3cf9](https://github.com/nrkno/tv-automation-server-core/commit/1fa3cf9)) -* head mute audio and hold on last frame ([ceec7f6](https://github.com/nrkno/tv-automation-server-core/commit/ceec7f6)) -* header context menu z-order fix ([c68244b](https://github.com/nrkno/tv-automation-server-core/commit/c68244b)) -* hide "Restart playout" from support panel when not in studio mode ([5820b00](https://github.com/nrkno/tv-automation-server-core/commit/5820b00)) -* hide "Restart playout" from support panel when not in studio mode ([34ba937](https://github.com/nrkno/tv-automation-server-core/commit/34ba937)) -* Hide child devices from being added to the studio ([852ec9b](https://github.com/nrkno/tv-automation-server-core/commit/852ec9b)) -* Hide Keyboard focus marker when not in studio mode ([70dc6b0](https://github.com/nrkno/tv-automation-server-core/commit/70dc6b0)) -* HOLD add new llayer to initDB ([650b6e6](https://github.com/nrkno/tv-automation-server-core/commit/650b6e6)) -* hold-copy of the SLI should provide seek information to offset markers on the SLI ([3967d03](https://github.com/nrkno/tv-automation-server-core/commit/3967d03)) -* holdState = 0 displayed a status ([49c7ead](https://github.com/nrkno/tv-automation-server-core/commit/49c7ead)) -* holdState = 0 displayed a status ([aacd140](https://github.com/nrkno/tv-automation-server-core/commit/aacd140)) -* hot fix for rehearsal activation when an RO is already active ([648c02d](https://github.com/nrkno/tv-automation-server-core/commit/648c02d)) -* houskeeping: remove uneccessary logs ([0c054f9](https://github.com/nrkno/tv-automation-server-core/commit/0c054f9)) -* if the next:ed segment is removed, instead next the one in its place ([22597b3](https://github.com/nrkno/tv-automation-server-core/commit/22597b3)) -* ignore custom dependencies ([b9db526](https://github.com/nrkno/tv-automation-server-core/commit/b9db526)) -* implement Play from here ([bd79569](https://github.com/nrkno/tv-automation-server-core/commit/bd79569)) -* implement Play from here ([0dce2af](https://github.com/nrkno/tv-automation-server-core/commit/0dce2af)) -* Implement rerunning blueprints on resetPart if dirty ([b942323](https://github.com/nrkno/tv-automation-server-core/commit/b942323)) -* Importing of some mock running orders ([eadf225](https://github.com/nrkno/tv-automation-server-core/commit/eadf225)) -* improve elements in AdLibListItem ([e917c43](https://github.com/nrkno/tv-automation-server-core/commit/e917c43)) -* improve evaluation form visuals ([30af081](https://github.com/nrkno/tv-automation-server-core/commit/30af081)) -* Improve group label visuals ([39b43e1](https://github.com/nrkno/tv-automation-server-core/commit/39b43e1)) -* Improve missing mosId error message ([89695fb](https://github.com/nrkno/tv-automation-server-core/commit/89695fb)) -* improve notification center button ([0b4d082](https://github.com/nrkno/tv-automation-server-core/commit/0b4d082)) -* improve notifications highlighting animation ([abda2c3](https://github.com/nrkno/tv-automation-server-core/commit/abda2c3)) -* improve notifications highlighting animation ([afeb568](https://github.com/nrkno/tv-automation-server-core/commit/afeb568)) -* improve some error logging ([60af59b](https://github.com/nrkno/tv-automation-server-core/commit/60af59b)) -* improve status bar panel buttons look when panels open ([247c8ee](https://github.com/nrkno/tv-automation-server-core/commit/247c8ee)) -* Improve the segment diff logic ([1465890](https://github.com/nrkno/tv-automation-server-core/commit/1465890)) -* improve typings for Notification messages ([bed664b](https://github.com/nrkno/tv-automation-server-core/commit/bed664b)) -* improve uncaughtErrorHandler ([fa744f4](https://github.com/nrkno/tv-automation-server-core/commit/fa744f4)) -* improved queries & added index ([159f6d5](https://github.com/nrkno/tv-automation-server-core/commit/159f6d5)) -* Include rundown baseline in snapshots ([96fedcb](https://github.com/nrkno/tv-automation-server-core/commit/96fedcb)) -* incorrect typings for template editor ([9d021df](https://github.com/nrkno/tv-automation-server-core/commit/9d021df)) -* Increase size of template editor to make it better fill the screen ([3212d7b](https://github.com/nrkno/tv-automation-server-core/commit/3212d7b)) -* increase upload limit for backup files ([5effaa9](https://github.com/nrkno/tv-automation-server-core/commit/5effaa9)) -* increase upload limit for backup files ([e658f12](https://github.com/nrkno/tv-automation-server-core/commit/e658f12)) -* Infinite items dont stop against a absolute 0 item properly. ([78c1499](https://github.com/nrkno/tv-automation-server-core/commit/78c1499)) -* infinite segment line tidying and fixes ([8469ffb](https://github.com/nrkno/tv-automation-server-core/commit/8469ffb)) -* Infinite segmentline bad guard when calculating the current infinites that caused the process to stop early ([2f9abeb](https://github.com/nrkno/tv-automation-server-core/commit/2f9abeb)) -* infinite segmentlines crossing an autonext throwing a duplicate key exception ([93b2a30](https://github.com/nrkno/tv-automation-server-core/commit/93b2a30)) -* inGroup property of timeline objects should be id, not _id ([35b34c5](https://github.com/nrkno/tv-automation-server-core/commit/35b34c5)) -* init state properly ([2572cdc](https://github.com/nrkno/tv-automation-server-core/commit/2572cdc)) -* initDB for pharos lights ([57fbc73](https://github.com/nrkno/tv-automation-server-core/commit/57fbc73)) -* initial optimization of updateSourceLayerInfinitesAfterLine ([5cd8235](https://github.com/nrkno/tv-automation-server-core/commit/5cd8235)) -* initial optimization of updateSourceLayerInfinitesAfterLine ([871bdd2](https://github.com/nrkno/tv-automation-server-core/commit/871bdd2)) -* initiateDB update for PTZ ([e529782](https://github.com/nrkno/tv-automation-server-core/commit/e529782)) -* Invalid ids in PeripheralDeviceCommand responses. Not using cached ingest data when reloadingRundown. Adds tests for reloadingRundown ([cb59bbc](https://github.com/nrkno/tv-automation-server-core/commit/cb59bbc)) -* isClientResponseSuccess returned wrong values ([ce0b44e](https://github.com/nrkno/tv-automation-server-core/commit/ce0b44e)) -* Issue with duplicate ids ([ed27041](https://github.com/nrkno/tv-automation-server-core/commit/ed27041)) -* issue with rehearsal double-activation warning ([17b4e95](https://github.com/nrkno/tv-automation-server-core/commit/17b4e95)) -* issue with roPrepareForBroadcast ([c3ad30c](https://github.com/nrkno/tv-automation-server-core/commit/c3ad30c)) -* issue with segment context menu ([7a44deb](https://github.com/nrkno/tv-automation-server-core/commit/7a44deb)) -* issue with source layers marked as used even though they were used in the following segmentLine ([71acfb3](https://github.com/nrkno/tv-automation-server-core/commit/71acfb3)) -* issues with timelineTriggerTime ([0459729](https://github.com/nrkno/tv-automation-server-core/commit/0459729)) -* jest config ([e53663c](https://github.com/nrkno/tv-automation-server-core/commit/e53663c)) -* Jest not finding all tests ([2464e87](https://github.com/nrkno/tv-automation-server-core/commit/2464e87)) -* JSDoc-ify existing comments ([6825f00](https://github.com/nrkno/tv-automation-server-core/commit/6825f00)) -* JSX props typings fix in Header ([7596557](https://github.com/nrkno/tv-automation-server-core/commit/7596557)) -* keep device header in Mos parent properties settings ([4ff9b91](https://github.com/nrkno/tv-automation-server-core/commit/4ff9b91)) -* keep device header in Mos parent properties settings ([2f2529d](https://github.com/nrkno/tv-automation-server-core/commit/2f2529d)) -* Keep the devices header visible when editing device ([cb2d7d9](https://github.com/nrkno/tv-automation-server-core/commit/cb2d7d9)) -* Keep the devices header visible when editing device ([90dbe05](https://github.com/nrkno/tv-automation-server-core/commit/90dbe05)) -* keys should be handled at up, not down ([957f583](https://github.com/nrkno/tv-automation-server-core/commit/957f583)) -* label on Play From here in SegmentContextMenu ([8bfa631](https://github.com/nrkno/tv-automation-server-core/commit/8bfa631)) -* labels in modal dialogs ([3af18fc](https://github.com/nrkno/tv-automation-server-core/commit/3af18fc)) -* limit black/freeze markers width to within the item ([5bbb385](https://github.com/nrkno/tv-automation-server-core/commit/5bbb385)) -* limit db fetches to active running order ([f3aca8f](https://github.com/nrkno/tv-automation-server-core/commit/f3aca8f)) -* lock down package.json & update package-lock, to get release2 to build ([472f8ab](https://github.com/nrkno/tv-automation-server-core/commit/472f8ab)) -* locked [@babel](https://github.com/babel)/runtime version & updated package-lock ([8e62d2f](https://github.com/nrkno/tv-automation-server-core/commit/8e62d2f)) -* Log unresolved ids when resolving pieces ([28691c6](https://github.com/nrkno/tv-automation-server-core/commit/28691c6)) -* logics bugfix after optimization ([2b8fa3c](https://github.com/nrkno/tv-automation-server-core/commit/2b8fa3c)) -* logics bugfix after optimization ([fe85cd3](https://github.com/nrkno/tv-automation-server-core/commit/fe85cd3)) -* lookahead object id not being set correctly ([594a1e7](https://github.com/nrkno/tv-automation-server-core/commit/594a1e7)) -* made editor height dynamic ([c68ac4f](https://github.com/nrkno/tv-automation-server-core/commit/c68ac4f)) -* made editor height dynamic ([7f5f40e](https://github.com/nrkno/tv-automation-server-core/commit/7f5f40e)) -* Made sure that the typography update for the prompter has a font fallback. ([6f2b20a](https://github.com/nrkno/tv-automation-server-core/commit/6f2b20a)) -* Major refactoring, splitting code into separate files depending on their areas: "rundown": General rundown manipulation, "media-scanner": Media-scanner, "mos": mos-specific functions ([db82375](https://github.com/nrkno/tv-automation-server-core/commit/db82375)) -* make 'Lights' source layer type translatable in the Settings ([65d5b76](https://github.com/nrkno/tv-automation-server-core/commit/65d5b76)) -* make most of the UI actually run ([45941d5](https://github.com/nrkno/tv-automation-server-core/commit/45941d5)) -* make RundownTiming reuse objects to limit the amount of GC done ([6e04daf](https://github.com/nrkno/tv-automation-server-core/commit/6e04daf)) -* make segmentLine.invalid optional ([c179e3c](https://github.com/nrkno/tv-automation-server-core/commit/c179e3c)) -* make sure that expectedMediaItems are purged along with the RO ([0d9dda1](https://github.com/nrkno/tv-automation-server-core/commit/0d9dda1)) -* make sure that the ad-lib drawer isn't obstructed by the right-hand bar ([8783819](https://github.com/nrkno/tv-automation-server-core/commit/8783819)) -* make sure that the OnAir line connects to the label ([3788672](https://github.com/nrkno/tv-automation-server-core/commit/3788672)) -* make the context menu available in the entire header ([0590f9d](https://github.com/nrkno/tv-automation-server-core/commit/0590f9d)) -* make the FullScreen detection more lenient ([28b689a](https://github.com/nrkno/tv-automation-server-core/commit/28b689a)) -* make the FullScreen detection more lenient ([215d73c](https://github.com/nrkno/tv-automation-server-core/commit/215d73c)) -* Make the head to kam wipe not use the mosartVariant field. Correct the head order checking ([6030755](https://github.com/nrkno/tv-automation-server-core/commit/6030755)) -* media-manager: rename keyStep => criticalStep ([77f4d6a](https://github.com/nrkno/tv-automation-server-core/commit/77f4d6a)) -* mediainfo typings & timebase ([67f16be](https://github.com/nrkno/tv-automation-server-core/commit/67f16be)) -* mediaobjects to use computed field ([39d13b5](https://github.com/nrkno/tv-automation-server-core/commit/39d13b5)) -* mediaobjects to use computed field ([dba858f](https://github.com/nrkno/tv-automation-server-core/commit/dba858f)) -* message came twice, wrong index for signature ([64aeafb](https://github.com/nrkno/tv-automation-server-core/commit/64aeafb)) -* Meteor mock ([dec64db](https://github.com/nrkno/tv-automation-server-core/commit/dec64db)) -* meteor mock error ([f005291](https://github.com/nrkno/tv-automation-server-core/commit/f005291)) -* Migration for stk&full audio remapping ([2491f52](https://github.com/nrkno/tv-automation-server-core/commit/2491f52)) -* migration helpers ([40228e8](https://github.com/nrkno/tv-automation-server-core/commit/40228e8)) -* Migration UI fixes ([b141243](https://github.com/nrkno/tv-automation-server-core/commit/b141243)) -* Migrations internal server error ([45d0238](https://github.com/nrkno/tv-automation-server-core/commit/45d0238)) -* migrations: upgrade peripheralDevices as good as possible ([150ca2a](https://github.com/nrkno/tv-automation-server-core/commit/150ca2a)) -* minor ui fix on status page ([97fc3c2](https://github.com/nrkno/tv-automation-server-core/commit/97fc3c2)) -* miss in merge ([93106b1](https://github.com/nrkno/tv-automation-server-core/commit/93106b1)) -* missed line ([4f635b9](https://github.com/nrkno/tv-automation-server-core/commit/4f635b9)) -* missing argument for mediaStatusCheck ([658e82a](https://github.com/nrkno/tv-automation-server-core/commit/658e82a)) -* missing key property ([79fb3e6](https://github.com/nrkno/tv-automation-server-core/commit/79fb3e6)) -* missing sass import ([f1f10ff](https://github.com/nrkno/tv-automation-server-core/commit/f1f10ff)) -* Missing typings on ShowStyle ([a0a4e14](https://github.com/nrkno/tv-automation-server-core/commit/a0a4e14)) -* Mix transitions ([5cf2314](https://github.com/nrkno/tv-automation-server-core/commit/5cf2314)) -* Mix transitions ([0ebf3e1](https://github.com/nrkno/tv-automation-server-core/commit/0ebf3e1)) -* Mock Collection object ([a6976fa](https://github.com/nrkno/tv-automation-server-core/commit/a6976fa)) -* mode logging method, to avoid circular dependency ([4d55286](https://github.com/nrkno/tv-automation-server-core/commit/4d55286)) -* modified timestamp on imported blueprints was not being set, causing the cache to not be cleared properly ([2f3fd17](https://github.com/nrkno/tv-automation-server-core/commit/2f3fd17)) -* monaco typing error fix ([e73467e](https://github.com/nrkno/tv-automation-server-core/commit/e73467e)) -* more CSS fixes due to switching to buttons ([f3a939f](https://github.com/nrkno/tv-automation-server-core/commit/f3a939f)) -* more fixes for MOS status indicator in header ([97311b1](https://github.com/nrkno/tv-automation-server-core/commit/97311b1)) -* more optimizations ([df8c397](https://github.com/nrkno/tv-automation-server-core/commit/df8c397)) -* more performance subscription based on studioId and rundownId ([e1b8d77](https://github.com/nrkno/tv-automation-server-core/commit/e1b8d77)) -* more refactoring of the styles ([f5af269](https://github.com/nrkno/tv-automation-server-core/commit/f5af269)) -* MOS ingest fixes and tests ([233c523](https://github.com/nrkno/tv-automation-server-core/commit/233c523)) -* mos-gateway external functions names ([a3497df](https://github.com/nrkno/tv-automation-server-core/commit/a3497df)) -* move all segment notes away from header, show only summary, clickable summary ([aee3d01](https://github.com/nrkno/tv-automation-server-core/commit/aee3d01)) -* move all segment notes away from header, show only summary, clickable summary ([d0a4801](https://github.com/nrkno/tv-automation-server-core/commit/d0a4801)) -* move back executeFunction to peripheralDeviceAPI ([226289f](https://github.com/nrkno/tv-automation-server-core/commit/226289f)) -* move notifications pop-ups when NC is open ([6f7759f](https://github.com/nrkno/tv-automation-server-core/commit/6f7759f)) -* move notifications pop-ups when NC is open ([d6ce260](https://github.com/nrkno/tv-automation-server-core/commit/d6ce260)) -* Move remaining mos types into ingest/mosDevice ([904b3cb](https://github.com/nrkno/tv-automation-server-core/commit/904b3cb)) -* move wrapMethods, to avoid circular import ([df41959](https://github.com/nrkno/tv-automation-server-core/commit/df41959)) -* multiply inPoint/duration by timeBase before sending back to MOS ([b576f26](https://github.com/nrkno/tv-automation-server-core/commit/b576f26)) -* multiply inPoint/duration by timebase before storing to MOS ([d01b8d9](https://github.com/nrkno/tv-automation-server-core/commit/d01b8d9)) -* new implementation of runtime caching ([92e09be](https://github.com/nrkno/tv-automation-server-core/commit/92e09be)) -* new implementation of runtime caching ([767fbb7](https://github.com/nrkno/tv-automation-server-core/commit/767fbb7)) -* new lawo source mappings ([20f7d5a](https://github.com/nrkno/tv-automation-server-core/commit/20f7d5a)) -* next part not updating properly from ingest data changes ([1486e65](https://github.com/nrkno/tv-automation-server-core/commit/1486e65)) -* non-persistent pop-ups should be prioritized over persistent ones ([99f147a](https://github.com/nrkno/tv-automation-server-core/commit/99f147a)) -* normalize naming scheme to 'runtimeArguments', normalize hotkey labels ([528679d](https://github.com/nrkno/tv-automation-server-core/commit/528679d)) -* not able to run migration on empty database (to bump system version) ([f65fcfe](https://github.com/nrkno/tv-automation-server-core/commit/f65fcfe)) -* note type got lost ([863e49d](https://github.com/nrkno/tv-automation-server-core/commit/863e49d)) -* notification center panel shadow ([1010dda](https://github.com/nrkno/tv-automation-server-core/commit/1010dda)) -* Notification Center width calculations ([fa31d65](https://github.com/nrkno/tv-automation-server-core/commit/fa31d65)) -* notification equality check, resolves 'republished' RO notifications ([27b6102](https://github.com/nrkno/tv-automation-server-core/commit/27b6102)) -* NotificationCenter visual fix for other pages ([10b1afa](https://github.com/nrkno/tv-automation-server-core/commit/10b1afa)) -* NotificationCenter visual fix for other pages ([2c5da97](https://github.com/nrkno/tv-automation-server-core/commit/2c5da97)) -* Notifications panel styling fix ([7f7f5cb](https://github.com/nrkno/tv-automation-server-core/commit/7f7f5cb)) -* NymansPlayground caused issues in Timeline ([83e772d](https://github.com/nrkno/tv-automation-server-core/commit/83e772d)) -* on air label position ([00d4e20](https://github.com/nrkno/tv-automation-server-core/commit/00d4e20)) -* on startup, clear old connection statuses ([e9d7cba](https://github.com/nrkno/tv-automation-server-core/commit/e9d7cba)) -* onAir line jumping around on takes ([8330112](https://github.com/nrkno/tv-automation-server-core/commit/8330112)) -* optimizations during ad-libs (thanks to [@baltedewit](https://github.com/baltedewit)) ([f50b60e](https://github.com/nrkno/tv-automation-server-core/commit/f50b60e)) -* optimizations during ad-libs (thanks to [@baltedewit](https://github.com/baltedewit)) ([daa135b](https://github.com/nrkno/tv-automation-server-core/commit/daa135b)) -* optimizations in roTake ([3457e73](https://github.com/nrkno/tv-automation-server-core/commit/3457e73)) -* optimize font loading in TimelineGrid ([b4c60c1](https://github.com/nrkno/tv-automation-server-core/commit/b4c60c1)) -* optimize saveIntoDB ([65c189e](https://github.com/nrkno/tv-automation-server-core/commit/65c189e)) -* Out of space build failures. Run circleci for tags ([53a5626](https://github.com/nrkno/tv-automation-server-core/commit/53a5626)) -* Out of space build failures. Run circleci for tags ([08b4a2c](https://github.com/nrkno/tv-automation-server-core/commit/08b4a2c)) -* output version differ error ([8816ed3](https://github.com/nrkno/tv-automation-server-core/commit/8816ed3)) -* Pass SofieHostURL to blueprints config ([8c18821](https://github.com/nrkno/tv-automation-server-core/commit/8c18821)) -* peripheralDevices subscription for RO data ([90b4e13](https://github.com/nrkno/tv-automation-server-core/commit/90b4e13)) -* Persist SegmentLine.updateStoryStatus ([427b24c](https://github.com/nrkno/tv-automation-server-core/commit/427b24c)) -* playout ([969e316](https://github.com/nrkno/tv-automation-server-core/commit/969e316)) -* playout, lookahead: use the originalLayer instear of isAbstract ([30fe842](https://github.com/nrkno/tv-automation-server-core/commit/30fe842)) -* PR changes ([c877aad](https://github.com/nrkno/tv-automation-server-core/commit/c877aad)) -* prevent default action for f1 & f3 ([53b2f22](https://github.com/nrkno/tv-automation-server-core/commit/53b2f22)) -* prevent resetting rundown when on-air ([d842922](https://github.com/nrkno/tv-automation-server-core/commit/d842922)) -* prevent take + autotake bug ([b3d9a4d](https://github.com/nrkno/tv-automation-server-core/commit/b3d9a4d)) -* problem with viewing test recordings ([2e817ac](https://github.com/nrkno/tv-automation-server-core/commit/2e817ac)) -* Prompter: keyboard device interface ([540f47a](https://github.com/nrkno/tv-automation-server-core/commit/540f47a)) -* proper calls of IngestActions ([69121dc](https://github.com/nrkno/tv-automation-server-core/commit/69121dc)) -* proper dispose of executeFunction checkReply after execution is done ([523ec99](https://github.com/nrkno/tv-automation-server-core/commit/523ec99)) -* queued adlib should have infinite sli's ([75452dc](https://github.com/nrkno/tv-automation-server-core/commit/75452dc)) -* R3 ONLY: bugfix: reload data from ENPS ([cc6ed44](https://github.com/nrkno/tv-automation-server-core/commit/cc6ed44)) -* rabbitMQ sending messages ([df72c4c](https://github.com/nrkno/tv-automation-server-core/commit/df72c4c)) -* re-add blueprint & mosdatacache restore (to be deprecated later) ([886c756](https://github.com/nrkno/tv-automation-server-core/commit/886c756)) -* re-add jest-meteor-stubs ([86ede36](https://github.com/nrkno/tv-automation-server-core/commit/86ede36)) -* re-added monaco typings and disabled import, so it works client-side ([1226763](https://github.com/nrkno/tv-automation-server-core/commit/1226763)) -* re-timing vignett ([17fbced](https://github.com/nrkno/tv-automation-server-core/commit/17fbced)) -* react errors while rendering nymansPlayground ([0c245d3](https://github.com/nrkno/tv-automation-server-core/commit/0c245d3)) -* React unique keys ([4f728d9](https://github.com/nrkno/tv-automation-server-core/commit/4f728d9)) -* RecordedFiles index ([f1aae5e](https://github.com/nrkno/tv-automation-server-core/commit/f1aae5e)) -* refactor ([9e9d60a](https://github.com/nrkno/tv-automation-server-core/commit/9e9d60a)) -* refactor infinite generation logic into separate file ([84ef579](https://github.com/nrkno/tv-automation-server-core/commit/84ef579)) -* refactor storeSnapshot methods ([6e66394](https://github.com/nrkno/tv-automation-server-core/commit/6e66394)) -* refactor updateExternalMessageQueueStatus to avoid fatal startup bug ([b54b09d](https://github.com/nrkno/tv-automation-server-core/commit/b54b09d)) -* refactored execMethod, so it doesn't use promises and causes unhandled promise rejections ([24da71b](https://github.com/nrkno/tv-automation-server-core/commit/24da71b)) -* refactored reset-segmentLine further ([0523eb6](https://github.com/nrkno/tv-automation-server-core/commit/0523eb6)) -* refactored/DRYd adminMode & studioMode, disabled trashbin-button for externalMessages when not in adminMode ([b29dae1](https://github.com/nrkno/tv-automation-server-core/commit/b29dae1)) -* refactoring of mos-ingest functions ([ad26959](https://github.com/nrkno/tv-automation-server-core/commit/ad26959)) -* refator ingest API ([a9fa737](https://github.com/nrkno/tv-automation-server-core/commit/a9fa737)) -* rehaul of versions, WIP ([93dea2f](https://github.com/nrkno/tv-automation-server-core/commit/93dea2f)) -* Reimplement mosRoCreate via new ingest api ([34c3247](https://github.com/nrkno/tv-automation-server-core/commit/34c3247)) -* relative durations causing type warnings for ui code ([5249435](https://github.com/nrkno/tv-automation-server-core/commit/5249435)) -* Release 3 only: disable config missing warning ([921cc82](https://github.com/nrkno/tv-automation-server-core/commit/921cc82)) -* remount monaco ([4ce1566](https://github.com/nrkno/tv-automation-server-core/commit/4ce1566)) -* remove 'computation stopped' notifications ([bf4d8d8](https://github.com/nrkno/tv-automation-server-core/commit/bf4d8d8)) -* Remove all notifications from prompter (incl. connection) ([b13d561](https://github.com/nrkno/tv-automation-server-core/commit/b13d561)) -* remove check that didn't work ([fdc917f](https://github.com/nrkno/tv-automation-server-core/commit/fdc917f)) -* remove config didn't work ([893717e](https://github.com/nrkno/tv-automation-server-core/commit/893717e)) -* remove debug line in nightly cronjob ([dda3017](https://github.com/nrkno/tv-automation-server-core/commit/dda3017)) -* remove deprecated options ([ab7275b](https://github.com/nrkno/tv-automation-server-core/commit/ab7275b)) -* remove duplicate attributes ([31e4414](https://github.com/nrkno/tv-automation-server-core/commit/31e4414)) -* Remove empty translations ([d2f1bd0](https://github.com/nrkno/tv-automation-server-core/commit/d2f1bd0)) -* remove expectedMediaItems when ro is removed ([5230695](https://github.com/nrkno/tv-automation-server-core/commit/5230695)) -* remove full-screen button, add label ([5c9a3e5](https://github.com/nrkno/tv-automation-server-core/commit/5c9a3e5)) -* remove full-screen button, add label ([5e9826e](https://github.com/nrkno/tv-automation-server-core/commit/5e9826e)) -* remove internal methods from API ([1752bb1](https://github.com/nrkno/tv-automation-server-core/commit/1752bb1)) -* remove leftover debug info ([d475b76](https://github.com/nrkno/tv-automation-server-core/commit/d475b76)) -* remove memoization of RVars ([ca22155](https://github.com/nrkno/tv-automation-server-core/commit/ca22155)) -* remove minified timeline-visualizer ([1cd5552](https://github.com/nrkno/tv-automation-server-core/commit/1cd5552)) -* remove minified timeline-visualizer ([da85c89](https://github.com/nrkno/tv-automation-server-core/commit/da85c89)) -* remove queued ad-libs when original part is reset ([812e19c](https://github.com/nrkno/tv-automation-server-core/commit/812e19c)) -* Remove some calls to rundownSyncFunction from inside another ([83eb955](https://github.com/nrkno/tv-automation-server-core/commit/83eb955)) -* remove some console.logs ([a9f3f53](https://github.com/nrkno/tv-automation-server-core/commit/a9f3f53)) -* remove systemStatus when removing blueprint ([1aa9b44](https://github.com/nrkno/tv-automation-server-core/commit/1aa9b44)) -* Remove timestamps from blueprint backups ([74fa1b3](https://github.com/nrkno/tv-automation-server-core/commit/74fa1b3)) -* remove trigger from the AdLibPieceUi setup in AdLibPanel ([847edb5](https://github.com/nrkno/tv-automation-server-core/commit/847edb5)) -* remove unneccessary margin in some headers ([b47ea11](https://github.com/nrkno/tv-automation-server-core/commit/b47ea11)) -* remove unneccessary margin in some headers ([32874a1](https://github.com/nrkno/tv-automation-server-core/commit/32874a1)) -* remove unused imports ([59041fc](https://github.com/nrkno/tv-automation-server-core/commit/59041fc)) -* remove unused imports ([5fe6ac3](https://github.com/nrkno/tv-automation-server-core/commit/5fe6ac3)) -* remove unused translation helper ([e545a9e](https://github.com/nrkno/tv-automation-server-core/commit/e545a9e)) -* removed autopublish and insecure packages, we'll implement publications and allow/deny rules from now on ([213998d](https://github.com/nrkno/tv-automation-server-core/commit/213998d)) -* removed ntp server debug code ([b9857e7](https://github.com/nrkno/tv-automation-server-core/commit/b9857e7)) -* removed old, deprecated attr ([bf0cdfd](https://github.com/nrkno/tv-automation-server-core/commit/bf0cdfd)) -* Removed the hard-coded link in the header that set the translation to Norwegian Bokmål. ([4515066](https://github.com/nrkno/tv-automation-server-core/commit/4515066)) -* removed uploadFileToAtem function, this should be done in devicesMakeReady ([4e96bb3](https://github.com/nrkno/tv-automation-server-core/commit/4e96bb3)) -* removed wrongful error throw ([852c495](https://github.com/nrkno/tv-automation-server-core/commit/852c495)) -* removed wrongful error throw ([b3deed1](https://github.com/nrkno/tv-automation-server-core/commit/b3deed1)) -* Removing trailing slashes in url defaults ([f6fa32c](https://github.com/nrkno/tv-automation-server-core/commit/f6fa32c)) -* rename "Edit" to "Trim" for clipTrimDialog ([3879a34](https://github.com/nrkno/tv-automation-server-core/commit/3879a34)) -* rename collection RundownBaselineItems => RundownBaselineObjs ([e471321](https://github.com/nrkno/tv-automation-server-core/commit/e471321)) -* rename InspectorDrawer to Shelf ([db6e778](https://github.com/nrkno/tv-automation-server-core/commit/db6e778)) -* rename method getShowStyleRef => getShowStyleConfigRef ([c8bbe95](https://github.com/nrkno/tv-automation-server-core/commit/c8bbe95)) -* rename restoreBackups page to Snapshots ([0c5103f](https://github.com/nrkno/tv-automation-server-core/commit/0c5103f)) -* rename rundownAPI => runningOrderAPI ([89d48d0](https://github.com/nrkno/tv-automation-server-core/commit/89d48d0)) -* rename rundownBaselineAdLibItem => rundownBaselineAdLibPiece ([82f8327](https://github.com/nrkno/tv-automation-server-core/commit/82f8327)) -* rename runningOrder => rundown ([4eab6de](https://github.com/nrkno/tv-automation-server-core/commit/4eab6de)) -* rename segmentLine => part ([b56b55b](https://github.com/nrkno/tv-automation-server-core/commit/b56b55b)) -* rename SegmentLineAdLibItem => AdLibPiece ([04c50a9](https://github.com/nrkno/tv-automation-server-core/commit/04c50a9)) -* rename segmentLineItem => piece ([bf61c48](https://github.com/nrkno/tv-automation-server-core/commit/bf61c48)) -* Rename shelf, more fixes ([898247e](https://github.com/nrkno/tv-automation-server-core/commit/898247e)) -* rename siId to studioId in Timeline ([88f6039](https://github.com/nrkno/tv-automation-server-core/commit/88f6039)) -* rename some methods in RundownNotifier ([1a5b6ea](https://github.com/nrkno/tv-automation-server-core/commit/1a5b6ea)) -* rename some segmentLine props to parts ([344f796](https://github.com/nrkno/tv-automation-server-core/commit/344f796)) -* rename StudioInstallation => Studio ([22d0786](https://github.com/nrkno/tv-automation-server-core/commit/22d0786)) -* rename version 0.20.0 => 0.21.0 (release 6) ([7b1ee3a](https://github.com/nrkno/tv-automation-server-core/commit/7b1ee3a)) -* renames ([b606907](https://github.com/nrkno/tv-automation-server-core/commit/b606907)) -* Rerunning blueprints losing part timings ([e6c35b4](https://github.com/nrkno/tv-automation-server-core/commit/e6c35b4)) -* resetRunningOrder functionality in GUI ([4eb096a](https://github.com/nrkno/tv-automation-server-core/commit/4eb096a)) -* resetRunningorder should update timeline ([0d01e6a](https://github.com/nrkno/tv-automation-server-core/commit/0d01e6a)) -* resetRunningorder should update timeline ([35451b1](https://github.com/nrkno/tv-automation-server-core/commit/35451b1)) -* resetting running order rewind ([a122f2c](https://github.com/nrkno/tv-automation-server-core/commit/a122f2c)) -* resolve a typo in rabbitMQ.ts ([3b36ae3](https://github.com/nrkno/tv-automation-server-core/commit/3b36ae3)) -* resolve an issue with dropdown EditAttribute not selecting the undefined option ([9f85845](https://github.com/nrkno/tv-automation-server-core/commit/9f85845)) -* resolve an issue with dropdown EditAttribute not selecting the undefined option ([2658ed3](https://github.com/nrkno/tv-automation-server-core/commit/2658ed3)) -* resolve an issue with missing media notification after floating a line ([00fedce](https://github.com/nrkno/tv-automation-server-core/commit/00fedce)) -* resolve issue with ContextMenus in RO view ([8d9ba96](https://github.com/nrkno/tv-automation-server-core/commit/8d9ba96)) -* resolve issue with hit-area of Notification Center ([1618619](https://github.com/nrkno/tv-automation-server-core/commit/1618619)) -* resolve issue with lowPriority cron jobs ([f7c3c83](https://github.com/nrkno/tv-automation-server-core/commit/f7c3c83)) -* resolve issue with segmentLineDisplayDuration & segment duration ([a73ed09](https://github.com/nrkno/tv-automation-server-core/commit/a73ed09)) -* resolve issues with how play-from-here is displayed in GUI ([ebdb549](https://github.com/nrkno/tv-automation-server-core/commit/ebdb549)) -* resolve Media Object Status notifications bug ([367dcce](https://github.com/nrkno/tv-automation-server-core/commit/367dcce)) -* resolve merge issue ([0cbc75a](https://github.com/nrkno/tv-automation-server-core/commit/0cbc75a)) -* resolve some sizing issues in the RD view ([f0c1826](https://github.com/nrkno/tv-automation-server-core/commit/f0c1826)) -* Respect disableOutTransition on SegmentLine during manual takes (not just autonext) ([f19788d](https://github.com/nrkno/tv-automation-server-core/commit/f19788d)) -* restore blueprint settings page ([faa7fdd](https://github.com/nrkno/tv-automation-server-core/commit/faa7fdd)) -* restore running order 'backup' fails if doesnt already exist ([87b3300](https://github.com/nrkno/tv-automation-server-core/commit/87b3300)) -* retry strategy for restart casparcg cronjob ([b54f0f6](https://github.com/nrkno/tv-automation-server-core/commit/b54f0f6)) -* reversed logic during refactoring by mistake ([694191e](https://github.com/nrkno/tv-automation-server-core/commit/694191e)) -* Revert 594a1e7 ([edeb166](https://github.com/nrkno/tv-automation-server-core/commit/edeb166)) -* rewind all segments when re-enabling follow on air ([a23b84c](https://github.com/nrkno/tv-automation-server-core/commit/a23b84c)) -* rewind icon was not responsive in ROFullscreenControls ([2e7c1d2](https://github.com/nrkno/tv-automation-server-core/commit/2e7c1d2)) -* rewind icon was not responsive in ROFullscreenControls ([0e494df](https://github.com/nrkno/tv-automation-server-core/commit/0e494df)) -* rewind UI even if reset returns error ([3bd5417](https://github.com/nrkno/tv-automation-server-core/commit/3bd5417)) -* rewind UI even if reset returns error ([08c5d6b](https://github.com/nrkno/tv-automation-server-core/commit/08c5d6b)) -* reworked systemStatus to use components instead ([cccfe3c](https://github.com/nrkno/tv-automation-server-core/commit/cccfe3c)) -* Rewrite piece durations to allow for specifying end instead of duration ([9dee8a6](https://github.com/nrkno/tv-automation-server-core/commit/9dee8a6)) -* right zoom area handle stops moving after first move ([20820fa](https://github.com/nrkno/tv-automation-server-core/commit/20820fa)) -* RO buttons z-order ([3c53254](https://github.com/nrkno/tv-automation-server-core/commit/3c53254)) -* RO buttons z-order ([15e9da8](https://github.com/nrkno/tv-automation-server-core/commit/15e9da8)) -* RO config changed notification not updating when RO is updated ([f5c2540](https://github.com/nrkno/tv-automation-server-core/commit/f5c2540)) -* RO notification action ([36cf900](https://github.com/nrkno/tv-automation-server-core/commit/36cf900)) -* RO Notifications fixes attempt no. 3 ([f0eee1f](https://github.com/nrkno/tv-automation-server-core/commit/f0eee1f)) -* RO overview crashed during rebuild of RO ([d2c62a1](https://github.com/nrkno/tv-automation-server-core/commit/d2c62a1)) -* ro-reset does not reset properly ([6367658](https://github.com/nrkno/tv-automation-server-core/commit/6367658)) -* roReset should reset holdItems and infinites ([bdf8385](https://github.com/nrkno/tv-automation-server-core/commit/bdf8385)) -* run afterUpdateTimeline after timelineTriggerTime ([98ece60](https://github.com/nrkno/tv-automation-server-core/commit/98ece60)) -* Rundown name dissappearing from view ([91dcc21](https://github.com/nrkno/tv-automation-server-core/commit/91dcc21)) -* running blueprint migrations ([fe1e7fd](https://github.com/nrkno/tv-automation-server-core/commit/fe1e7fd)) -* Running blueprints and migrations ([3b29df3](https://github.com/nrkno/tv-automation-server-core/commit/3b29df3)) -* running order closing prompt ([3024543](https://github.com/nrkno/tv-automation-server-core/commit/3024543)) -* running order closing prompt ([7074cc3](https://github.com/nrkno/tv-automation-server-core/commit/7074cc3)) -* Running Order Notifications in activeRo view ([63658b1](https://github.com/nrkno/tv-automation-server-core/commit/63658b1)) -* Running order status notifying wrong dep ([e6b84e5](https://github.com/nrkno/tv-automation-server-core/commit/e6b84e5)) -* running order view notifications in production build ([b593323](https://github.com/nrkno/tv-automation-server-core/commit/b593323)) -* saveIntoDb: throw if trying to insert objects with non-unique identifiers ([85791d7](https://github.com/nrkno/tv-automation-server-core/commit/85791d7)) -* scroll needed check ([5e8c77c](https://github.com/nrkno/tv-automation-server-core/commit/5e8c77c)) -* seek support in VT, STK, hoverscrub ([43e413b](https://github.com/nrkno/tv-automation-server-core/commit/43e413b)) -* semver.clean cannot handle undefined input parameter ([333588a](https://github.com/nrkno/tv-automation-server-core/commit/333588a)) -* send utf-8 filenames properly in Content-Disposition ([60eb521](https://github.com/nrkno/tv-automation-server-core/commit/60eb521)) -* separate warnings for black frames & freeze frames ([e2acad5](https://github.com/nrkno/tv-automation-server-core/commit/e2acad5)) -* Set KAM source layer, and a probably incorrect duration (but its now non-zero) ([6e152f0](https://github.com/nrkno/tv-automation-server-core/commit/6e152f0)) -* set tsr multithreading from UI instead of CLI ([c8be25b](https://github.com/nrkno/tv-automation-server-core/commit/c8be25b)) -* setAsNext on previous ([4ffe665](https://github.com/nrkno/tv-automation-server-core/commit/4ffe665)) -* setAsNext on previous ([6ced09b](https://github.com/nrkno/tv-automation-server-core/commit/6ced09b)) -* setAsNext on previous line no longer shows default state, but now instead stalls when attempting to take ([e441aaf](https://github.com/nrkno/tv-automation-server-core/commit/e441aaf)) -* settings styling improvements, code fixes ([d9484cd](https://github.com/nrkno/tv-automation-server-core/commit/d9484cd)) -* shelf height would not change ([123b407](https://github.com/nrkno/tv-automation-server-core/commit/123b407)) -* show connected devices in RO view ([e804d1e](https://github.com/nrkno/tv-automation-server-core/commit/e804d1e)) -* show full timecode for set with of offset ([0954ce6](https://github.com/nrkno/tv-automation-server-core/commit/0954ce6)) -* show media errors in segment header ([3775d2e](https://github.com/nrkno/tv-automation-server-core/commit/3775d2e)) -* show ShowStyleBase name as a part of the ShowStyleVariant name in Studios ([ba67011](https://github.com/nrkno/tv-automation-server-core/commit/ba67011)) -* ShowStyleVariant settings not saving changes ([e90137b](https://github.com/nrkno/tv-automation-server-core/commit/e90137b)) -* simplify getRSourceLayer - unnecessary null check ([0405f35](https://github.com/nrkno/tv-automation-server-core/commit/0405f35)) -* since afterUpdateTimeline is called in from a syncFunctionIgnore-function, we can remove the timeout ([e7f8f25](https://github.com/nrkno/tv-automation-server-core/commit/e7f8f25)) -* skip an allocation in RundownTiming ([db83682](https://github.com/nrkno/tv-automation-server-core/commit/db83682)) -* skip untranslated strings from po files, update i18next-conv to latest version ([1de4ccb](https://github.com/nrkno/tv-automation-server-core/commit/1de4ccb)) -* sl prod init ([2ff4a46](https://github.com/nrkno/tv-automation-server-core/commit/2ff4a46)) -* smoother handling when reloading ENPS data ([83be7cb](https://github.com/nrkno/tv-automation-server-core/commit/83be7cb)) -* snapshots ([182c221](https://github.com/nrkno/tv-automation-server-core/commit/182c221)) -* SOAP message encoding ([b19ea77](https://github.com/nrkno/tv-automation-server-core/commit/b19ea77)) -* SOAP message encoding ([63d8634](https://github.com/nrkno/tv-automation-server-core/commit/63d8634)) -* solve a problem with viewing recordings ([01c165b](https://github.com/nrkno/tv-automation-server-core/commit/01c165b)) -* solve a problem with viewing recordings ([09aa112](https://github.com/nrkno/tv-automation-server-core/commit/09aa112)) -* solve an issue with content trimmed icon ([461617f](https://github.com/nrkno/tv-automation-server-core/commit/461617f)) -* Some durations using removed self references ([b3b7776](https://github.com/nrkno/tv-automation-server-core/commit/b3b7776)) -* Some fatal bugs in a clean installation ([b311ae1](https://github.com/nrkno/tv-automation-server-core/commit/b311ae1)) -* some minor react errors in the settings ([d7bb849](https://github.com/nrkno/tv-automation-server-core/commit/d7bb849)) -* some more linting and refactoring due to deprecation of certain lifecycle methods ([a6d1cc6](https://github.com/nrkno/tv-automation-server-core/commit/a6d1cc6)) -* some more margin touch-ups ([71a291a](https://github.com/nrkno/tv-automation-server-core/commit/71a291a)) -* some more margin touch-ups ([c8b6f1e](https://github.com/nrkno/tv-automation-server-core/commit/c8b6f1e)) -* Some mos typing errors, and references to old runningorderdatacache ([3722a86](https://github.com/nrkno/tv-automation-server-core/commit/3722a86)) -* some playout and rundown issues ([c235fda](https://github.com/nrkno/tv-automation-server-core/commit/c235fda)) -* some playout bugs ([065de84](https://github.com/nrkno/tv-automation-server-core/commit/065de84)) -* Some playout bugs ([08ec090](https://github.com/nrkno/tv-automation-server-core/commit/08ec090)) -* Some playout timeline bugs ([f4ad363](https://github.com/nrkno/tv-automation-server-core/commit/f4ad363)) -* speech synthesis: say the countdown time slightly earlier. and fix of a bug from the Big Renaming ([fa0c334](https://github.com/nrkno/tv-automation-server-core/commit/fa0c334)) -* split abbreviation spacing ([43ea9d5](https://github.com/nrkno/tv-automation-server-core/commit/43ea9d5)) -* Start on template for KAM ÅPNING ([4cd682f](https://github.com/nrkno/tv-automation-server-core/commit/4cd682f)) -* status colors ([46fdaf1](https://github.com/nrkno/tv-automation-server-core/commit/46fdaf1)) -* strip blueprint manifest versions of '^' ([54a5ecf](https://github.com/nrkno/tv-automation-server-core/commit/54a5ecf)) -* StudioInstallation key-value config tidying ([4b0bc1a](https://github.com/nrkno/tv-automation-server-core/commit/4b0bc1a)) -* styling fix for z-order with menu and RO buttons ([1b0717e](https://github.com/nrkno/tv-automation-server-core/commit/1b0717e)) -* subscription handling ([8aaa3ec](https://github.com/nrkno/tv-automation-server-core/commit/8aaa3ec)) -* super.componentWillUnmount is required ([2342e48](https://github.com/nrkno/tv-automation-server-core/commit/2342e48)) -* suppress console.errors, display notifications whenever possible ([5918886](https://github.com/nrkno/tv-automation-server-core/commit/5918886)) -* syncFunction only timing out when any other syncFunction gets queued ([2d45122](https://github.com/nrkno/tv-automation-server-core/commit/2d45122)) -* syntax errors in test file ([a8f5d1e](https://github.com/nrkno/tv-automation-server-core/commit/a8f5d1e)) -* systemStatus _internal messages ([05fd6c8](https://github.com/nrkno/tv-automation-server-core/commit/05fd6c8)) -* systemStatus _internal messages ([d150f54](https://github.com/nrkno/tv-automation-server-core/commit/d150f54)) -* systemStatus messages ([e595e5b](https://github.com/nrkno/tv-automation-server-core/commit/e595e5b)) -* systemStatus messages ([17420cc](https://github.com/nrkno/tv-automation-server-core/commit/17420cc)) -* systemStatus versions ([62bfa9a](https://github.com/nrkno/tv-automation-server-core/commit/62bfa9a)) -* take action should not throw as nasty errors when called by user. ([6791d50](https://github.com/nrkno/tv-automation-server-core/commit/6791d50)) -* take playOffset into account for timing ([422783a](https://github.com/nrkno/tv-automation-server-core/commit/422783a)) -* templates with wipe. Readd seperate audio file ([5be2802](https://github.com/nrkno/tv-automation-server-core/commit/5be2802)) -* temporary fix for the "UnhandledPromiseRejectionWarning" bug, supressing the error when used ([7aa7cf8](https://github.com/nrkno/tv-automation-server-core/commit/7aa7cf8)) -* temporary fix of typing error ([73bf56d](https://github.com/nrkno/tv-automation-server-core/commit/73bf56d)) -* temporary ignore typings issue ([abb5d71](https://github.com/nrkno/tv-automation-server-core/commit/abb5d71)) -* test-tools decklink input format dropdown has no options ([b02f447](https://github.com/nrkno/tv-automation-server-core/commit/b02f447)) -* text shadow in SegmentLineLabels ([3a310b1](https://github.com/nrkno/tv-automation-server-core/commit/3a310b1)) -* tie snapshot to evaluation ([ec18370](https://github.com/nrkno/tv-automation-server-core/commit/ec18370)) -* Timeline always being built without previous segmentline ([a077805](https://github.com/nrkno/tv-automation-server-core/commit/a077805)) -* timeline dep ([b26eecb](https://github.com/nrkno/tv-automation-server-core/commit/b26eecb)) -* timeline resolution bug for non-infinite items ([35fc40a](https://github.com/nrkno/tv-automation-server-core/commit/35fc40a)) -* timeline statobj didn't update on inactivate (empty timeline) ([839b906](https://github.com/nrkno/tv-automation-server-core/commit/839b906)) -* timeline statObject: updated hashing function ([e00a01c](https://github.com/nrkno/tv-automation-server-core/commit/e00a01c)) -* Timeline viewer infinite loop ([74856df](https://github.com/nrkno/tv-automation-server-core/commit/74856df)) -* **playout:** Ensure that infinite segmentLineItems are reset correctly after being removed by some hotkeys ([045c9b1](https://github.com/nrkno/tv-automation-server-core/commit/045c9b1)) -* timelineObj _id missing ([1dcedbf](https://github.com/nrkno/tv-automation-server-core/commit/1dcedbf)) -* timelineObj _id missing ([0f8e0da](https://github.com/nrkno/tv-automation-server-core/commit/0f8e0da)) -* **adlib:** Allow for overlap of adlib sli to give preload time ([d2f0dcd](https://github.com/nrkno/tv-automation-server-core/commit/d2f0dcd)) -* **adlib:** An adlib replacing the main sli of a sl would not adjust the length of the original. F5/F6 sometimes failed to insert a sli correctly, causing black ([fca6f05](https://github.com/nrkno/tv-automation-server-core/commit/fca6f05)) -* **adlib:** Set as next on SL after using F5/F6 would not restore correctly ([3829293](https://github.com/nrkno/tv-automation-server-core/commit/3829293)) -* **asRunLog:** wrong id, typo ([636fc41](https://github.com/nrkno/tv-automation-server-core/commit/636fc41)) -* **backup:** make restore running order less strict ([e78313f](https://github.com/nrkno/tv-automation-server-core/commit/e78313f)) -* **blueprint:** Fill in missing TimelineObj fields ([0ed7663](https://github.com/nrkno/tv-automation-server-core/commit/0ed7663)) -* **blueprint:** fix manifest config add item showing an 'undefined' option ([fa6182a](https://github.com/nrkno/tv-automation-server-core/commit/fa6182a)) -* **blueprint:** Remove invalid backup restore code ([2e00eca](https://github.com/nrkno/tv-automation-server-core/commit/2e00eca)) -* **blueprints:** Ensure ids are not duplicated ([fbd0a04](https://github.com/nrkno/tv-automation-server-core/commit/fbd0a04)) -* **blueprints:** Ensure the object ids generated by the post-process blueprint are unique ([bdee540](https://github.com/nrkno/tv-automation-server-core/commit/bdee540)) -* **cam/dir:** clear hotkeys ([2545de8](https://github.com/nrkno/tv-automation-server-core/commit/2545de8)) -* **clip metadata:** timebase info ([5c39ea8](https://github.com/nrkno/tv-automation-server-core/commit/5c39ea8)) -* **countdowns:** ignore sourceLayers that we don't have an icon for ([27b2ac0](https://github.com/nrkno/tv-automation-server-core/commit/27b2ac0)) -* **countdowns:** split text parsing ([9a174ae](https://github.com/nrkno/tv-automation-server-core/commit/9a174ae)) -* **Devices:** Better strings and device list layouts (less details) ([be26a18](https://github.com/nrkno/tv-automation-server-core/commit/be26a18)) -* **displayDurationGroup:** fix GUI clocks for displayDurationGroups ([76e217e](https://github.com/nrkno/tv-automation-server-core/commit/76e217e)) -* **displayDurationGroup:** fix GUI clocks for displayDurationGroups ([10ac255](https://github.com/nrkno/tv-automation-server-core/commit/10ac255)) -* **displayDurationGroup:** use displayDurationGroup timing in presenter's screen ([61e04f9](https://github.com/nrkno/tv-automation-server-core/commit/61e04f9)) -* **displayDurationGroup:** use displayDurationGroup timing in presenter's screen ([9138845](https://github.com/nrkno/tv-automation-server-core/commit/9138845)) -* **emberplus:** changes intiDB mapping to new .-delimited string format ([b6d8bc7](https://github.com/nrkno/tv-automation-server-core/commit/b6d8bc7)) -* **expected media items:** use a function instead of fat arrow ([fa23c05](https://github.com/nrkno/tv-automation-server-core/commit/fa23c05)) -* **externalMessage:** encode proper html-entities in strings ([243995c](https://github.com/nrkno/tv-automation-server-core/commit/243995c)) -* **FirstObjects:** Reverts regression introduced by removing isAbstract from firstObject items ([8f1608b](https://github.com/nrkno/tv-automation-server-core/commit/8f1608b)) -* **GUI:** bug in EditAttribute dropdown, causing NaN to be written if optionsAreNumbers is not set ([4b17853](https://github.com/nrkno/tv-automation-server-core/commit/4b17853)) -* **GUI:** bug in EditAttribute dropdown, causing NaN to be written if optionsAreNumbers is not set ([efc1162](https://github.com/nrkno/tv-automation-server-core/commit/efc1162)) -* **hold:** Disable transition when in HOLD ([cfcb141](https://github.com/nrkno/tv-automation-server-core/commit/cfcb141)) -* **hold:** Disable transition when leaving HOLD ([809dd34](https://github.com/nrkno/tv-automation-server-core/commit/809dd34)) -* **hold:** Disable transition when leaving HOLD ([6b7184c](https://github.com/nrkno/tv-automation-server-core/commit/6b7184c)) -* **hold:** Disable transition when leaving or leaving HOLD ([ef5cbcb](https://github.com/nrkno/tv-automation-server-core/commit/ef5cbcb)) -* **hold:** Ensure the original stk does not get picked up as a dynamic object when setting the sl as next ([b10f48d](https://github.com/nrkno/tv-automation-server-core/commit/b10f48d)) -* **hold:** Ensure the original stk does not get picked up as a dynamic object when setting the sl as next ([225304d](https://github.com/nrkno/tv-automation-server-core/commit/225304d)) -* **hold:** Ensure the original stk does not get picked up as a dynamic object when setting the sl as next ([22da4d8](https://github.com/nrkno/tv-automation-server-core/commit/22da4d8)) -* **hold:** keep showing any infinite items that existed on the previous sl ([21a9973](https://github.com/nrkno/tv-automation-server-core/commit/21a9973)) -* **hold:** Too many sli being extended for hold mode ([f644e32](https://github.com/nrkno/tv-automation-server-core/commit/f644e32)) -* **hold:** When extending a sli during hold, use the original id to make any triggers on the sli work ([a3fd1a6](https://github.com/nrkno/tv-automation-server-core/commit/a3fd1a6)) -* **hold:** When extending a sli during hold, use the original id to make any triggers on the sli work ([669a4b2](https://github.com/nrkno/tv-automation-server-core/commit/669a4b2)) -* **infinite:** Persist overrideDuration when updating infinites ([72670d5](https://github.com/nrkno/tv-automation-server-core/commit/72670d5)) -* **infinite:** Persist overrideDuration when updating infinites ([b15bfa3](https://github.com/nrkno/tv-automation-server-core/commit/b15bfa3)) -* **infinite items:** removes infinite icon from outOnNextSegment ([4a75d7d](https://github.com/nrkno/tv-automation-server-core/commit/4a75d7d)) -* **ingest:** Error when removeSegment doesnt remove anything. Call updateDynamicPartRanks after importing ingest data ([5bf0c95](https://github.com/nrkno/tv-automation-server-core/commit/5bf0c95)) -* **ingest:** Rewrite portions of the removeX and afterRemoveX functions to allow batching changes and make more durable ([2457a29](https://github.com/nrkno/tv-automation-server-core/commit/2457a29)) -* **ingest:** Save notes generated by blueprints ([06fac36](https://github.com/nrkno/tv-automation-server-core/commit/06fac36)) -* **ingest:** Some syncFunction timeouts. Finish a bit more of the mos ingest ([38e7576](https://github.com/nrkno/tv-automation-server-core/commit/38e7576)) -* **ingest:** Tidy up the peripheraldevice api ingest method parameters and expect valid Ingest types to be sent by the gateway ([a49fb7c](https://github.com/nrkno/tv-automation-server-core/commit/a49fb7c)) -* **ingest:** Use Ingest types for the peripheraldevice ingest api methods (Some mangling is still done internally to fix up spreadsheet gateway data) ([4a5421b](https://github.com/nrkno/tv-automation-server-core/commit/4a5421b)) -* **init:** Adds default lawo device settings ([28759df](https://github.com/nrkno/tv-automation-server-core/commit/28759df)) -* **init:** adds qwerty to bakskjerm ([a45de4d](https://github.com/nrkno/tv-automation-server-core/commit/a45de4d)) -* **init:** adds qwerty to bakskjerm ([7329976](https://github.com/nrkno/tv-automation-server-core/commit/7329976)) -* **init:** adds qwerty to bakskjerm ([78198c9](https://github.com/nrkno/tv-automation-server-core/commit/78198c9)) -* **init:** hides klokke and logo layers by default ([1847ca4](https://github.com/nrkno/tv-automation-server-core/commit/1847ca4)) -* **init:** Layer names ([221b374](https://github.com/nrkno/tv-automation-server-core/commit/221b374)) -* **init:** Layer names ([16a504c](https://github.com/nrkno/tv-automation-server-core/commit/16a504c)) -* **init:** Splits init_layers and init_config. ([e056e5a](https://github.com/nrkno/tv-automation-server-core/commit/e056e5a)) -* **init:** swaps MP2 and MP1NXT layers ([b8a370c](https://github.com/nrkno/tv-automation-server-core/commit/b8a370c)) -* **init:** updated channel orders after 2-caspar setup ([3404b9b](https://github.com/nrkno/tv-automation-server-core/commit/3404b9b)) -* **Init:** Creat empty settings for Nora ([f8d0669](https://github.com/nrkno/tv-automation-server-core/commit/f8d0669)) -* **Init:** fixes wrong mapping of Lawo RMs ([ee68432](https://github.com/nrkno/tv-automation-server-core/commit/ee68432)) -* **Init:** Sets init defaults to xpro ([fd9c182](https://github.com/nrkno/tv-automation-server-core/commit/fd9c182)) -* **Initdb:** Preload vignett ([156a454](https://github.com/nrkno/tv-automation-server-core/commit/156a454)) -* **Initdb:** Preload vignett ([9470318](https://github.com/nrkno/tv-automation-server-core/commit/9470318)) -* **iterateDeeply:** typos ([c9198f1](https://github.com/nrkno/tv-automation-server-core/commit/c9198f1)) -* **L3rd pop-up:** filter out properties starting with @ ([19977e7](https://github.com/nrkno/tv-automation-server-core/commit/19977e7)) -* **L3rd pop-up:** filter out properties starting with @ ([c85ebeb](https://github.com/nrkno/tv-automation-server-core/commit/c85ebeb)) -* **lawo:** changes tempaltes to new structure ([29bf666](https://github.com/nrkno/tv-automation-server-core/commit/29bf666)) -* **lawo:** more generic timeline object ([b0418ab](https://github.com/nrkno/tv-automation-server-core/commit/b0418ab)) -* **lookahead:** clear inGroup in a better fashion ([60541cc](https://github.com/nrkno/tv-automation-server-core/commit/60541cc)) -* **lookahead:** consider transitions properly in lookahead ([c78c6fa](https://github.com/nrkno/tv-automation-server-core/commit/c78c6fa)) -* **lookahead:** Dont run lookahead on abs0 sli if there is an active transition. ([bb4123a](https://github.com/nrkno/tv-automation-server-core/commit/bb4123a)) -* **lookahead:** Dont run lookahead on abs0 sli if there is an active transition. ([191df09](https://github.com/nrkno/tv-automation-server-core/commit/191df09)) -* **lookahead:** Fix lookahead when transition does not define clip. Fix duplicate key exception when using hold multiple times at the same point ([a1bb026](https://github.com/nrkno/tv-automation-server-core/commit/a1bb026)) -* **lookahead:** Fix lookahead when transition object starts at abs0 ([bd3edbd](https://github.com/nrkno/tv-automation-server-core/commit/bd3edbd)) -* **lookahead:** Fix lookahead when transition object starts at abs0 ([c88c830](https://github.com/nrkno/tv-automation-server-core/commit/c88c830)) -* **lookahead:** Give lookahead the correct limit when in the next SegmentLine during autonext ([a3a299a](https://github.com/nrkno/tv-automation-server-core/commit/a3a299a)) -* **lookahead:** Give lookahead the correct limit when in the next SegmentLine during autonext ([0b20b9e](https://github.com/nrkno/tv-automation-server-core/commit/0b20b9e)) -* **lookahead:** Ignore transition if this is the first sl and so no transition will be used ([3df2e1e](https://github.com/nrkno/tv-automation-server-core/commit/3df2e1e)) -* **lookahead:** Not using transition info when in a segmentline with no previous segmentline ([917b34e](https://github.com/nrkno/tv-automation-server-core/commit/917b34e)) -* **lookahead:** Produced objects not resolving properly ([7660bf5](https://github.com/nrkno/tv-automation-server-core/commit/7660bf5)) -* **lookahead:** Produced objects not resolving properly ([322a94f](https://github.com/nrkno/tv-automation-server-core/commit/322a94f)) -* **lookahead:** Resolving an object for both transition clip and main clip causing an extra loadbg ([875bd1a](https://github.com/nrkno/tv-automation-server-core/commit/875bd1a)) -* **lookahead:** Resolving an object for both transition clip and main clip causing an extra loadbg ([739b5e4](https://github.com/nrkno/tv-automation-server-core/commit/739b5e4)) -* **lookahead:** RETAIN mode now follows the WHEN_CLEAR behaviour instead of PRELOAD ([f0df41c](https://github.com/nrkno/tv-automation-server-core/commit/f0df41c)) -* **media formats:** do not 2x interlaced frame rates ([1639c32](https://github.com/nrkno/tv-automation-server-core/commit/1639c32)) -* **media manager:** label on MM workFlow ([fc2e8d5](https://github.com/nrkno/tv-automation-server-core/commit/fc2e8d5)) -* **media manager ui:** display work step labels correctly ([05cce78](https://github.com/nrkno/tv-automation-server-core/commit/05cce78)) -* **media manager ui:** fix task list layout issue ([9902dc1](https://github.com/nrkno/tv-automation-server-core/commit/9902dc1)) -* **media manager ui:** media manager flow order ([1eb1c48](https://github.com/nrkno/tv-automation-server-core/commit/1eb1c48)) -* **migration:** Missing studio0_audio_bed ([1c6edcc](https://github.com/nrkno/tv-automation-server-core/commit/1c6edcc)) -* **migration:** overrideSteps should be applied before .validate() is run, so overrideSteps works independent of the validation result. ([c9c1f25](https://github.com/nrkno/tv-automation-server-core/commit/c9c1f25)) -* **migrations:** Broken StudioContext.updateDevice method ([7311d10](https://github.com/nrkno/tv-automation-server-core/commit/7311d10)) -* **migrations:** Broken StudioContext.updateDevice method ([d882e8b](https://github.com/nrkno/tv-automation-server-core/commit/d882e8b)) -* **migrations:** Check migrate function exists before trying to run it ([cf076f5](https://github.com/nrkno/tv-automation-server-core/commit/cf076f5)) -* **migrations:** Create ShowStyleVariant with ShowStyleBase in the migrations and setup studio to use it as its default ([75073d4](https://github.com/nrkno/tv-automation-server-core/commit/75073d4)) -* **migrations:** DependOnResultFrom id was not being prefixed causing it to never work ([602740c](https://github.com/nrkno/tv-automation-server-core/commit/602740c)) -* **migrations:** DependOnResultFrom id was not being prefixed causing it to never work ([5830754](https://github.com/nrkno/tv-automation-server-core/commit/5830754)) -* **migrations:** Ensure there are migrations to run before running another batch ([3b703e5](https://github.com/nrkno/tv-automation-server-core/commit/3b703e5)) -* **migrations:** Ensure there are migrations to run before running another batch ([c3d77b5](https://github.com/nrkno/tv-automation-server-core/commit/c3d77b5)) -* **migrations:** Uncomment mos check migration ([c262fff](https://github.com/nrkno/tv-automation-server-core/commit/c262fff)) -* **migrations:** Various problems when running from empty ([11d1d0b](https://github.com/nrkno/tv-automation-server-core/commit/11d1d0b)) -* **mos:** Mos ingest typing errors ([8f08f6e](https://github.com/nrkno/tv-automation-server-core/commit/8f08f6e)) -* **mos:** move stories. Refactor updating next-part to be seperately testable ([19b2d05](https://github.com/nrkno/tv-automation-server-core/commit/19b2d05)) -* **mos:** Segment externalId is now based on externalId of first part, instead of rank ([0916113](https://github.com/nrkno/tv-automation-server-core/commit/0916113)) -* **mos:** Set next part logic after story updates ([2b8cf47](https://github.com/nrkno/tv-automation-server-core/commit/2b8cf47)) -* **notification center:** fix notification center toggle button in RO view ([894c1e2](https://github.com/nrkno/tv-automation-server-core/commit/894c1e2)) -* **notification center:** fix running order overview to line up with the Segments column ([0906cab](https://github.com/nrkno/tv-automation-server-core/commit/0906cab)) -* **notification center:** notification count position ([1d8d2cb](https://github.com/nrkno/tv-automation-server-core/commit/1d8d2cb)) -* **notification center:** reintroduce RunningOrderNotifier into RunningOrderView ([e70e5c9](https://github.com/nrkno/tv-automation-server-core/commit/e70e5c9)) -* **notifications:** change unknown to any ([7ac8008](https://github.com/nrkno/tv-automation-server-core/commit/7ac8008)) -* **Notifications refresh:** limit amount of reactive vars ([2c01e66](https://github.com/nrkno/tv-automation-server-core/commit/2c01e66)) -* **NRK Template:** Use LLayers Enum ([84ed5df](https://github.com/nrkno/tv-automation-server-core/commit/84ed5df)) -* **pharos:** add missing settingsType and migration step ([9f73a8e](https://github.com/nrkno/tv-automation-server-core/commit/9f73a8e)) -* **pharos:** add missing settingsType and migration step ([be618d2](https://github.com/nrkno/tv-automation-server-core/commit/be618d2)) -* **playout:** bad timing during autonext ([5524e3b](https://github.com/nrkno/tv-automation-server-core/commit/5524e3b)) -* **playout:** Better account for duration and overlaps with transitions etc. ([dc249a3](https://github.com/nrkno/tv-automation-server-core/commit/dc249a3)) -* **playout:** Double head2 headline out animation ([165e2c0](https://github.com/nrkno/tv-automation-server-core/commit/165e2c0)) -* **playout:** Double head2 headline out animation ([7ec91ff](https://github.com/nrkno/tv-automation-server-core/commit/7ec91ff)) -* **playout:** Ensure that infinite segmentLineItems are reset correctly after being removed by some hotkeys ([e4f8a83](https://github.com/nrkno/tv-automation-server-core/commit/e4f8a83)) -* **playout:** Fix overlap tests ([15628a2](https://github.com/nrkno/tv-automation-server-core/commit/15628a2)) -* **playout:** ID prefixing did not handle logical object id references ([44f2883](https://github.com/nrkno/tv-automation-server-core/commit/44f2883)) -* **playout:** Infinite item continuations were not always updated correctly ([7a7aed6](https://github.com/nrkno/tv-automation-server-core/commit/7a7aed6)) -* **playout:** Objects being written out without an id ([b05a851](https://github.com/nrkno/tv-automation-server-core/commit/b05a851)) -* userAction: increased timeout value for "waiting for..." notification ([f00e273](https://github.com/nrkno/tv-automation-server-core/commit/f00e273)) -* **playout:** Optimise layers of promises in infinite generation logic, and reorder function parameters ([e400c7c](https://github.com/nrkno/tv-automation-server-core/commit/e400c7c)) -* **playout:** R4 only partial merge of dc249a31b342e8bdbeb7faac064dd97cec15c3e8. Fix sl duration with autonext and no transitions ([17175c3](https://github.com/nrkno/tv-automation-server-core/commit/17175c3)) -* **playout:** Refactor setting object siId ([48de044](https://github.com/nrkno/tv-automation-server-core/commit/48de044)) -* **playout:** sl with autoNextOverlap not getting applied properly ([eb22967](https://github.com/nrkno/tv-automation-server-core/commit/eb22967)) -* **playout:** StatObj not being generated ([581d99d](https://github.com/nrkno/tv-automation-server-core/commit/581d99d)) -* **playout:** Typo in ID prefixing ([249b35d](https://github.com/nrkno/tv-automation-server-core/commit/249b35d)) -* **playout:** Use original sli id when adding infinite to the timeline, to ensure that any triggers on other objects resolve ([c0382ec](https://github.com/nrkno/tv-automation-server-core/commit/c0382ec)) -* **playout:** Use original sli id when adding infinite to the timeline, to ensure that any triggers on other objects resolve ([e7eb871](https://github.com/nrkno/tv-automation-server-core/commit/e7eb871)) -* **presenter screen:** display hours correctly ([e242a9e](https://github.com/nrkno/tv-automation-server-core/commit/e242a9e)) -* **presenter screen:** split background + text spacing ([9aad750](https://github.com/nrkno/tv-automation-server-core/commit/9aad750)) -* **rabbitmq:** send persistant messages ([ff8d375](https://github.com/nrkno/tv-automation-server-core/commit/ff8d375)) -* **record:** CR changes ([b3adbec](https://github.com/nrkno/tv-automation-server-core/commit/b3adbec)) -* **record:** Hide internal layer mappings ([24dfef1](https://github.com/nrkno/tv-automation-server-core/commit/24dfef1)) -* **refactor:** existing runningOrders were not migrated to the new data structure ([b20bc2d](https://github.com/nrkno/tv-automation-server-core/commit/b20bc2d)) -* **refactor:** remove stray debugger calls ([3be5c22](https://github.com/nrkno/tv-automation-server-core/commit/3be5c22)) -* **ro list:** translatify & hide 'Unsynced from MOS' label when no unsynced items ([fa56ecd](https://github.com/nrkno/tv-automation-server-core/commit/fa56ecd)) -* **ro list:** translatify & hide 'Unsynced from MOS' label when no unsynced items ([11b0f29](https://github.com/nrkno/tv-automation-server-core/commit/11b0f29)) -* **RO view:** Always persist original event in user-action methods ([6ba7df8](https://github.com/nrkno/tv-automation-server-core/commit/6ba7df8)) -* **rundown layout:** don't display segment headers when currentSegemnt filter is on ([9b09858](https://github.com/nrkno/tv-automation-server-core/commit/9b09858)) -* **rundown layouts:** issue with layer type filtering ([c41bd5a](https://github.com/nrkno/tv-automation-server-core/commit/c41bd5a)) -* **RundownView:** don't wrap on system status header ([0daaa6a](https://github.com/nrkno/tv-automation-server-core/commit/0daaa6a)) -* **runtimeArgs:** Removing infinite items from changed sl and anything following ([28ffd5d](https://github.com/nrkno/tv-automation-server-core/commit/28ffd5d)) -* **scroll:** fix issues with non-jQuery scroll methods ([4b5afb2](https://github.com/nrkno/tv-automation-server-core/commit/4b5afb2)) -* **snapshot:** SegmentLines were not being included in the snapshot ([d9a427e](https://github.com/nrkno/tv-automation-server-core/commit/d9a427e)) -* **snapshot:** SegmentLines were not being included in the snapshot ([224f806](https://github.com/nrkno/tv-automation-server-core/commit/224f806)) -* **sticky:** Fix sticky items with objects using relative triggers or durations ([0c47cff](https://github.com/nrkno/tv-automation-server-core/commit/0c47cff)) -* **template:** Caspar portion of in-transition for segmentline rerun whenever timeline was recalculated ([3373457](https://github.com/nrkno/tv-automation-server-core/commit/3373457)) -* **template:** graphic supers group using wrong trigger. ([e28d1ef](https://github.com/nrkno/tv-automation-server-core/commit/e28d1ef)) -* **template:** Reduce volume of head wipes ([b2092cc](https://github.com/nrkno/tv-automation-server-core/commit/b2092cc)) -* **template:** setup dsk properly ([2e8309c](https://github.com/nrkno/tv-automation-server-core/commit/2e8309c)) -* **templates:** Fix incorrect camera number used with head transition. Hook in sluttvignett. Fix segments not respecting overlapduration if no transition is used ([00b7cdd](https://github.com/nrkno/tv-automation-server-core/commit/00b7cdd)) -* **templates:** use enum for nora channels ([55c0cfc](https://github.com/nrkno/tv-automation-server-core/commit/55c0cfc)) -* **templates:** Various tweaks ([eb93c6a](https://github.com/nrkno/tv-automation-server-core/commit/eb93c6a)) -* **Test:** Verifying build and deploy script ([0b13e18](https://github.com/nrkno/tv-automation-server-core/commit/0b13e18)) -* **timeline:** don't round items in relative mode ([2938819](https://github.com/nrkno/tv-automation-server-core/commit/2938819)) -* timesync: better retry strategy on startup sync ([eda632a](https://github.com/nrkno/tv-automation-server-core/commit/eda632a)) -* toc trace message ([c53124f](https://github.com/nrkno/tv-automation-server-core/commit/c53124f)) -* Toggle hotkeys legend in support panel ([e6f4769](https://github.com/nrkno/tv-automation-server-core/commit/e6f4769)) -* too long script out-words could overlap with previous items ([8f8a9a2](https://github.com/nrkno/tv-automation-server-core/commit/8f8a9a2)) -* Tooltip import ([cd2b65a](https://github.com/nrkno/tv-automation-server-core/commit/cd2b65a)) -* tooltips after import change ([a82140f](https://github.com/nrkno/tv-automation-server-core/commit/a82140f)) -* top RO overview labels clipped in wrong places ([5e5c228](https://github.com/nrkno/tv-automation-server-core/commit/5e5c228)) -* Tweaked styling of evaluation form, warning messages, color of the next lines, translations, capialized warning icon file name, and optimized png and svg icons. ([50d2753](https://github.com/nrkno/tv-automation-server-core/commit/50d2753)) -* tweaks on externalMessage send function, limiting the number of messages sent in one go ([046ae38](https://github.com/nrkno/tv-automation-server-core/commit/046ae38)) -* type bug ([de43835](https://github.com/nrkno/tv-automation-server-core/commit/de43835)) -* type error in SegmentTimelineContainer ([c4d6b4d](https://github.com/nrkno/tv-automation-server-core/commit/c4d6b4d)) -* type error, ensure string ([76da25d](https://github.com/nrkno/tv-automation-server-core/commit/76da25d)) -* typing ([7c21efe](https://github.com/nrkno/tv-automation-server-core/commit/7c21efe)) -* typing fix: cannot find name 'monaco' ([3ad88ce](https://github.com/nrkno/tv-automation-server-core/commit/3ad88ce)) -* typing fixes, to work with updated packages ([b4362f7](https://github.com/nrkno/tv-automation-server-core/commit/b4362f7)) -* typings error, ensuring string ([1e25345](https://github.com/nrkno/tv-automation-server-core/commit/1e25345)) -* typings issue ([4f96c3d](https://github.com/nrkno/tv-automation-server-core/commit/4f96c3d)) -* typo ([2efc829](https://github.com/nrkno/tv-automation-server-core/commit/2efc829)) -* typo bug in performanceMonitor ([6a5eeb4](https://github.com/nrkno/tv-automation-server-core/commit/6a5eeb4)) -* typo bug in performanceMonitor ([797c393](https://github.com/nrkno/tv-automation-server-core/commit/797c393)) -* typo MediaResolutions vs mediaResolutions ([6a72e09](https://github.com/nrkno/tv-automation-server-core/commit/6a72e09)) -* Typographic tweaks for prompter. ([068d535](https://github.com/nrkno/tv-automation-server-core/commit/068d535)) -* UI bug: key in

missing ([b957660](https://github.com/nrkno/tv-automation-server-core/commit/b957660)) -* UI crash when outputLayer is undefined ([e6dd558](https://github.com/nrkno/tv-automation-server-core/commit/e6dd558)) -* UI fixes for some margins in the migrations view ([4dc6fef](https://github.com/nrkno/tv-automation-server-core/commit/4dc6fef)) -* ui manualPlayback key ([5d4e49f](https://github.com/nrkno/tv-automation-server-core/commit/5d4e49f)) -* ui manualPlayback key ([ca1a943](https://github.com/nrkno/tv-automation-server-core/commit/ca1a943)) -* UI tweaks for messages status view. so it doesn't break when having long error messages ([ca1e3ae](https://github.com/nrkno/tv-automation-server-core/commit/ca1e3ae)) -* UI: improve shapshot comment edit field ([093e6cb](https://github.com/nrkno/tv-automation-server-core/commit/093e6cb)) -* upd meteor typings ([53f17d2](https://github.com/nrkno/tv-automation-server-core/commit/53f17d2)) -* upd query-string dependency & fixed typings issue ([e0d3f12](https://github.com/nrkno/tv-automation-server-core/commit/e0d3f12)) -* update all data in roReplaceMetadata ([8a5a671](https://github.com/nrkno/tv-automation-server-core/commit/8a5a671)) -* update asRunLog typings ([5d18c66](https://github.com/nrkno/tv-automation-server-core/commit/5d18c66)) -* update blueprints-integration ([5b247f8](https://github.com/nrkno/tv-automation-server-core/commit/5b247f8)) -* update blueprints-integration ([28d17c2](https://github.com/nrkno/tv-automation-server-core/commit/28d17c2)) -* update blueprints-integration ([59c29f6](https://github.com/nrkno/tv-automation-server-core/commit/59c29f6)) -* Update blueprints-integration ([9870256](https://github.com/nrkno/tv-automation-server-core/commit/9870256)) -* update blueprints-integration depencendy & update getHashId to match ([e1c12d2](https://github.com/nrkno/tv-automation-server-core/commit/e1c12d2)) -* update design of presenter screen ([4f41195](https://github.com/nrkno/tv-automation-server-core/commit/4f41195)) -* update device last data timestamp ([ac82ebd](https://github.com/nrkno/tv-automation-server-core/commit/ac82ebd)) -* Update names passed to SegmentLineItems ([ed0fc0d](https://github.com/nrkno/tv-automation-server-core/commit/ed0fc0d)) -* update Next-line when inserting story just before it, also added property to track if the next point was set manually ([d82dbc6](https://github.com/nrkno/tv-automation-server-core/commit/d82dbc6)) -* update package versions to fix audit issues ([be3cae5](https://github.com/nrkno/tv-automation-server-core/commit/be3cae5)) -* update Part & Rundown classes from inherited interface ([956f4c6](https://github.com/nrkno/tv-automation-server-core/commit/956f4c6)) -* Update RO change notification on an interval, to ensure it catches changes to other document types ([79d8c05](https://github.com/nrkno/tv-automation-server-core/commit/79d8c05)) -* update ro data cache when getting new metadata ([d700783](https://github.com/nrkno/tv-automation-server-core/commit/d700783)) -* Update some playout timelineobj types ([fe883a8](https://github.com/nrkno/tv-automation-server-core/commit/fe883a8)) -* update supertimeline ([28bccfe](https://github.com/nrkno/tv-automation-server-core/commit/28bccfe)) -* update timeline dependency ([b83f6be](https://github.com/nrkno/tv-automation-server-core/commit/b83f6be)) -* Update timeline on new ingest data ([80ac1ed](https://github.com/nrkno/tv-automation-server-core/commit/80ac1ed)) -* Update timeline on removing a mos story ([fd3d443](https://github.com/nrkno/tv-automation-server-core/commit/fd3d443)) -* update timeline-visualizer ([8e46981](https://github.com/nrkno/tv-automation-server-core/commit/8e46981)) -* update timeline-visualizer ([a43166c](https://github.com/nrkno/tv-automation-server-core/commit/a43166c)) -* Update TimelineObjCCGRoute. ([203ef91](https://github.com/nrkno/tv-automation-server-core/commit/203ef91)) -* update ts-jest dependency ([69c3c64](https://github.com/nrkno/tv-automation-server-core/commit/69c3c64)) -* Update tsr version ([92359bd](https://github.com/nrkno/tv-automation-server-core/commit/92359bd)) -* update typings ([d536ad1](https://github.com/nrkno/tv-automation-server-core/commit/d536ad1)) -* update typings ([4accaea](https://github.com/nrkno/tv-automation-server-core/commit/4accaea)) -* update typings to match blueprints-integration ([f97f177](https://github.com/nrkno/tv-automation-server-core/commit/f97f177)) -* updated health endpoint according to spec ([c196382](https://github.com/nrkno/tv-automation-server-core/commit/c196382)) -* updated health endpoint according to spec ([900728b](https://github.com/nrkno/tv-automation-server-core/commit/900728b)) -* updated mock data ([a7a4ae5](https://github.com/nrkno/tv-automation-server-core/commit/a7a4ae5)) -* updated mock data ([3e140c6](https://github.com/nrkno/tv-automation-server-core/commit/3e140c6)) -* updated nightly cronjob: restart casparcg devices, to work with new restartCasparCG function implementation ([edbc186](https://github.com/nrkno/tv-automation-server-core/commit/edbc186)) -* updated nightly cronjob: restart casparcg devices, to work with new restartCasparCG function implementation ([3f9344d](https://github.com/nrkno/tv-automation-server-core/commit/3f9344d)) -* updated package-lock.json ([bf0cfde](https://github.com/nrkno/tv-automation-server-core/commit/bf0cfde)) -* updated systemTime endpoint ([503d2c8](https://github.com/nrkno/tv-automation-server-core/commit/503d2c8)) -* updated timeline dep (bugfixes) ([ff29ce6](https://github.com/nrkno/tv-automation-server-core/commit/ff29ce6)) -* updated versions file ([f6c9869](https://github.com/nrkno/tv-automation-server-core/commit/f6c9869)) -* updateExpectedMediaItems failing was causing the post-process blueprint to not be run. Errors from this are still logged, but no longer block blueprint execution ([2fe22bb](https://github.com/nrkno/tv-automation-server-core/commit/2fe22bb)) -* usage of logging.warning didn't work (use logging.warn() ) ([fbf7528](https://github.com/nrkno/tv-automation-server-core/commit/fbf7528)) -* use a single setState in updateVersions in MigrationsView ([afd730a](https://github.com/nrkno/tv-automation-server-core/commit/afd730a)) -* use admin as parameter instead of all ([20751b4](https://github.com/nrkno/tv-automation-server-core/commit/20751b4)) -* use DisplayName field for graphic elements ([e2e9014](https://github.com/nrkno/tv-automation-server-core/commit/e2e9014)) -* use floor for all positioning and sizing of segment lines ([8a84a7e](https://github.com/nrkno/tv-automation-server-core/commit/8a84a7e)) -* Use more consistent inputs in Blueprints page ([d223d11](https://github.com/nrkno/tv-automation-server-core/commit/d223d11)) -* Use new mediaPreviewsUrl setting ([1bd0ba4](https://github.com/nrkno/tv-automation-server-core/commit/1bd0ba4)) -* use parseRange for expected versions ([1604bea](https://github.com/nrkno/tv-automation-server-core/commit/1604bea)) -* use Range check instead of Version for minimumCoreVersion ([392c646](https://github.com/nrkno/tv-automation-server-core/commit/392c646)) -* use studioInstallationId of parent peripheralDevice ([7dedf9b](https://github.com/nrkno/tv-automation-server-core/commit/7dedf9b)) -* Use thin styling for a solo 'AUTO' label ([0c26d38](https://github.com/nrkno/tv-automation-server-core/commit/0c26d38)) -* Use thin styling for a solo 'AUTO' label ([74b5f15](https://github.com/nrkno/tv-automation-server-core/commit/74b5f15)) -* use unique id for baseline items cache entries ([cf89409](https://github.com/nrkno/tv-automation-server-core/commit/cf89409)) -* useractions: proper handling of the this keyword ([a2686db](https://github.com/nrkno/tv-automation-server-core/commit/a2686db)) -* useractions: proper handling of the this keyword ([49a44a7](https://github.com/nrkno/tv-automation-server-core/commit/49a44a7)) -* userActivity executionTime logging ([a3e763e](https://github.com/nrkno/tv-automation-server-core/commit/a3e763e)) -* Using object as notification message ([f06aee6](https://github.com/nrkno/tv-automation-server-core/commit/f06aee6)) -* **timeline:** Infinite sli do not update properly on new mos data. Fix detection of the end of the chain, and ensure the last is set to not infinite ([61b2930](https://github.com/nrkno/tv-automation-server-core/commit/61b2930)) -* various fixes after refactoring ([1a17414](https://github.com/nrkno/tv-automation-server-core/commit/1a17414)) -* **timeline:** Infinite sli do not update properly on new mos data. Fix detection of the end of the chain, and ensure the last is set to not infinite ([16d9715](https://github.com/nrkno/tv-automation-server-core/commit/16d9715)) -* **Timeline:** Corrects the angle of the gradient indication mix-in-transition on a segmentLineItem ([151ecf9](https://github.com/nrkno/tv-automation-server-core/commit/151ecf9)) -* **transition:** Delay sli not contents, to ensure relative triggers against the sli are correct (fixes sluttvignett with transition) ([856da4b](https://github.com/nrkno/tv-automation-server-core/commit/856da4b)) -* **transition:** reverses direction of wipe transitions ([9961a3f](https://github.com/nrkno/tv-automation-server-core/commit/9961a3f)) -* **transition:** Using wrong overlap when combined with autonext ([4c56102](https://github.com/nrkno/tv-automation-server-core/commit/4c56102)) -* **transitions:** Ensure they are run with the correct overlap on autonext ([bbc6ca2](https://github.com/nrkno/tv-automation-server-core/commit/bbc6ca2)) -* **transitions:** Timed graphics being run wrong ([8b39960](https://github.com/nrkno/tv-automation-server-core/commit/8b39960)) -* when restoring a runningOrder, use the .active property of the database (or false) ([b5e5b05](https://github.com/nrkno/tv-automation-server-core/commit/b5e5b05)) -* **UI:** Improves device settings and status page by removing information ([267c10c](https://github.com/nrkno/tv-automation-server-core/commit/267c10c)) -* **unsync:** refactor, add method to unsync runningOrder ([d54c147](https://github.com/nrkno/tv-automation-server-core/commit/d54c147)) -* **vignett:** do not preload vignett, as it is risky business preloading sluttvignett. Could be done better by separating vignett and sluttvignett ([b0da067](https://github.com/nrkno/tv-automation-server-core/commit/b0da067)) -* **vignett:** do not preload vignett, as it is risky business preloading sluttvignett. Could be done better by separating vignett and sluttvignett ([8bf7ff8](https://github.com/nrkno/tv-automation-server-core/commit/8bf7ff8)) -* Wrong icon for split in presenter view ([1ec1c56](https://github.com/nrkno/tv-automation-server-core/commit/1ec1c56)) -* **zoom:** moved zoom modifier for scroll action to ctrl ([80829f2](https://github.com/nrkno/tv-automation-server-core/commit/80829f2)) -* **zoom:** moved zoom modifier for scroll action to ctrl ([863d81e](https://github.com/nrkno/tv-automation-server-core/commit/863d81e)) -* various fixes for mocks ([aebcfc7](https://github.com/nrkno/tv-automation-server-core/commit/aebcfc7)) -* version handling ([4b9863a](https://github.com/nrkno/tv-automation-server-core/commit/4b9863a)) -* wait for response from MOS device until resolving segmentLineItemSetInOutPoints ([2572a11](https://github.com/nrkno/tv-automation-server-core/commit/2572a11)) -* when (for some reason) the currently playing part is missing in db, it was impossible to continue. ([e3ba048](https://github.com/nrkno/tv-automation-server-core/commit/e3ba048)) -* when activating, set Next if not set ([c9f71a1](https://github.com/nrkno/tv-automation-server-core/commit/c9f71a1)) -* when overriding componentWillUnmount, we need to call this._cleanup() ([0f39cd4](https://github.com/nrkno/tv-automation-server-core/commit/0f39cd4)) -* wrap all MeteorReactComponent.autoruns in nonreactive. ([9020c96](https://github.com/nrkno/tv-automation-server-core/commit/9020c96)) -* wrap ntpClient.getNetworkTime() in try/catch, as an attempt to fix fatal error thrown ([cd44862](https://github.com/nrkno/tv-automation-server-core/commit/cd44862)) -* write back TimeBase when changing EditorialStart/Duration ([8012cea](https://github.com/nrkno/tv-automation-server-core/commit/8012cea)) -* write back TimeBase with EditorialStart/Duration ([96f8e21](https://github.com/nrkno/tv-automation-server-core/commit/96f8e21)) -* Wrong icon for split in presenter view ([08c8df8](https://github.com/nrkno/tv-automation-server-core/commit/08c8df8)) - +- &nbps; in a string instead of A0 ([299ba28](https://github.com/nrkno/tv-automation-server-core/commit/299ba28)) +- a bug where DEFAULT_DISPLAY_DURATION would be added to a 0-duration member of a displayDurationGroup ([13f784d](https://github.com/nrkno/tv-automation-server-core/commit/13f784d)) +- a bug where DEFAULT_DISPLAY_DURATION would be added to a 0-duration member of a displayDurationGroup ([5f2ed62](https://github.com/nrkno/tv-automation-server-core/commit/5f2ed62)) +- accepted resolutions should not be separated by space. ([1b80a2c](https://github.com/nrkno/tv-automation-server-core/commit/1b80a2c)) +- activate past ROs ([4b128a5](https://github.com/nrkno/tv-automation-server-core/commit/4b128a5)) +- activate past ROs ([c20af5d](https://github.com/nrkno/tv-automation-server-core/commit/c20af5d)) +- add (preliminary) security rules for all collections ([6fd60e2](https://github.com/nrkno/tv-automation-server-core/commit/6fd60e2)) +- add additional fallbacks for a 0-situation ([2444d56](https://github.com/nrkno/tv-automation-server-core/commit/2444d56)) +- Add code documentation to the Notification Center ([ec03358](https://github.com/nrkno/tv-automation-server-core/commit/ec03358)) +- Add default exclusivity groups to InitDB ([dfd1782](https://github.com/nrkno/tv-automation-server-core/commit/dfd1782)) +- add dependency: timeline-state-resolver-types ([cd2db55](https://github.com/nrkno/tv-automation-server-core/commit/cd2db55)) +- Add exception handlers for timeline vizualiser page ([6bb56d8](https://github.com/nrkno/tv-automation-server-core/commit/6bb56d8)) +- Add exception handlers for timeline vizualiser page ([d9103dd](https://github.com/nrkno/tv-automation-server-core/commit/d9103dd)) +- Add migration to set type on existing blueprints ([f1b4f3c](https://github.com/nrkno/tv-automation-server-core/commit/f1b4f3c)) +- add missing translation json-file ([6059965](https://github.com/nrkno/tv-automation-server-core/commit/6059965)) +- add missing \_id ([c948d09](https://github.com/nrkno/tv-automation-server-core/commit/c948d09)) +- add missing \_id ([970fbf8](https://github.com/nrkno/tv-automation-server-core/commit/970fbf8)) +- Add missing \_rank field to SegmentLineAdLibItem ([9cd15fa](https://github.com/nrkno/tv-automation-server-core/commit/9cd15fa)) +- add missing $ne (not equal) in mongoWhere ([53c76a8](https://github.com/nrkno/tv-automation-server-core/commit/53c76a8)) +- add missing asRunEvent in AsRunEventContext ([b8def27](https://github.com/nrkno/tv-automation-server-core/commit/b8def27)) +- add missing core version ([8ad3a9e](https://github.com/nrkno/tv-automation-server-core/commit/8ad3a9e)) +- add missing function ([de2b81f](https://github.com/nrkno/tv-automation-server-core/commit/de2b81f)) +- Add missing layers to initdb. Use readtime as possible duration of segmentline when calculating story length ([e388d63](https://github.com/nrkno/tv-automation-server-core/commit/e388d63)) +- add missing migration: rename Timeline.siId to studioId ([f0a1289](https://github.com/nrkno/tv-automation-server-core/commit/f0a1289)) +- add missing parameter in callback ([fc4f690](https://github.com/nrkno/tv-automation-server-core/commit/fc4f690)) +- add new timeline visualizer ([9cad423](https://github.com/nrkno/tv-automation-server-core/commit/9cad423)) +- add new timeline visualizer ([f240aab](https://github.com/nrkno/tv-automation-server-core/commit/f240aab)) +- add nn translation to whitelist ([4663e3b](https://github.com/nrkno/tv-automation-server-core/commit/4663e3b)) +- add parseDateTime code hints to template editor ([c38b2f7](https://github.com/nrkno/tv-automation-server-core/commit/c38b2f7)) +- add postinstall script for Jest & Fibers to work ([2ad398d](https://github.com/nrkno/tv-automation-server-core/commit/2ad398d)) +- add shortcut ctrl+shift+enter-on-numpad to reload ([b9820ff](https://github.com/nrkno/tv-automation-server-core/commit/b9820ff)) +- add Studios migrations ([6e8f9f9](https://github.com/nrkno/tv-automation-server-core/commit/6e8f9f9)) +- added \_valid: true to mock-data ([6c2775b](https://github.com/nrkno/tv-automation-server-core/commit/6c2775b)) +- added a place to run updateExpectedMediaItems ([c70704d](https://github.com/nrkno/tv-automation-server-core/commit/c70704d)) +- added missing "force" parameter ([7b50a97](https://github.com/nrkno/tv-automation-server-core/commit/7b50a97)) +- added missing debug-logging setting ([8f616ca](https://github.com/nrkno/tv-automation-server-core/commit/8f616ca)) +- added missing getRank import ([9d37eb8](https://github.com/nrkno/tv-automation-server-core/commit/9d37eb8)) +- added MomentFromNow, to use instead of ([aefea31](https://github.com/nrkno/tv-automation-server-core/commit/aefea31)) +- added peripheralDevices subscription, used by status display ([ccb309d](https://github.com/nrkno/tv-automation-server-core/commit/ccb309d)) +- added sorting of runtimeFunctions when generating backup, so diffing works ([b3ba3f6](https://github.com/nrkno/tv-automation-server-core/commit/b3ba3f6)) +- added sorting of runtimeFunctions when generating backup, so diffing works ([17639a0](https://github.com/nrkno/tv-automation-server-core/commit/17639a0)) +- added virtual lines to the generated function, so that line numbers add up in error messages ([df2366a](https://github.com/nrkno/tv-automation-server-core/commit/df2366a)) +- adlib items conflict with programmed content ([a304238](https://github.com/nrkno/tv-automation-server-core/commit/a304238)) +- after broadcast form failed to saveEvaluation ([f55546b](https://github.com/nrkno/tv-automation-server-core/commit/f55546b)) +- allow duration 0 of segmentLines ([11a18ae](https://github.com/nrkno/tv-automation-server-core/commit/11a18ae)) +- allow esc & enter in modalDialog ([cd511b6](https://github.com/nrkno/tv-automation-server-core/commit/cd511b6)) +- allow re-sync of unsynced RO while it is active ([b824d72](https://github.com/nrkno/tv-automation-server-core/commit/b824d72)) +- allow removing peripheralDevices from Settings page ([b14e56a](https://github.com/nrkno/tv-automation-server-core/commit/b14e56a)) +- allow removing peripheralDevices from Settings page ([948675f](https://github.com/nrkno/tv-automation-server-core/commit/948675f)) +- allow timelineobjs to be declared as abstract, and always route those with the core_abstract layer ([9bfa6c4](https://github.com/nrkno/tv-automation-server-core/commit/9bfa6c4)) +- allow translating actions ([af4dc78](https://github.com/nrkno/tv-automation-server-core/commit/af4dc78)) +- Allow translations of media warnings, show clip as broken until scan finished ([b693de7](https://github.com/nrkno/tv-automation-server-core/commit/b693de7)) +- also defer sendStoryStatus, as that's not critical for playback ([9417862](https://github.com/nrkno/tv-automation-server-core/commit/9417862)) +- always rewind GUI on roReset, roResetAndActivate ([4502d90](https://github.com/nrkno/tv-automation-server-core/commit/4502d90)) +- always rewind GUI on roReset, roResetAndActivate ([11744c9](https://github.com/nrkno/tv-automation-server-core/commit/11744c9)) +- an issue where the state would be updated after the component was unmounted ([6ccf413](https://github.com/nrkno/tv-automation-server-core/commit/6ccf413)) +- anomaly timings as numbers ([d0c0d36](https://github.com/nrkno/tv-automation-server-core/commit/d0c0d36)) +- another bugfix ([c7ed208](https://github.com/nrkno/tv-automation-server-core/commit/c7ed208)) +- apning with no heads ([dfb1976](https://github.com/nrkno/tv-automation-server-core/commit/dfb1976)) +- apparently componentwillmount is running in a reactive context and causes issues ([a8e53b6](https://github.com/nrkno/tv-automation-server-core/commit/a8e53b6)) +- apply some fixes when restoring a RO ([b04bf53](https://github.com/nrkno/tv-automation-server-core/commit/b04bf53)) +- asRunLog: defer handleEvent, to make sure all events have been reported before running. ([6c56ec7](https://github.com/nrkno/tv-automation-server-core/commit/6c56ec7)) +- Assign ids for timeline object keyframes ([2ce1318](https://github.com/nrkno/tv-automation-server-core/commit/2ce1318)) +- Assign ids for timeline object keyframes ([f56218a](https://github.com/nrkno/tv-automation-server-core/commit/f56218a)) +- atem mappings ([8d4ea2d](https://github.com/nrkno/tv-automation-server-core/commit/8d4ea2d)) +- attach upload handler in RundownLayoutEditor ([c8feeb2](https://github.com/nrkno/tv-automation-server-core/commit/c8feeb2)) +- autoNext should update yellow line (it didn't) ([ff42a81](https://github.com/nrkno/tv-automation-server-core/commit/ff42a81)) +- backport timing changes for play-from-anywhere from R10 ([5d96b1e](https://github.com/nrkno/tv-automation-server-core/commit/5d96b1e)) +- baselineTemplates not being calculated correctly for showstyle ([e4799b4](https://github.com/nrkno/tv-automation-server-core/commit/e4799b4)) +- basic fiber test ([2419397](https://github.com/nrkno/tv-automation-server-core/commit/2419397)) +- Basic rundown playback ([3b88d2a](https://github.com/nrkno/tv-automation-server-core/commit/3b88d2a)) +- be able to reset & activate inactivated RO ([e7d52da](https://github.com/nrkno/tv-automation-server-core/commit/e7d52da)) +- be able to reset & activate inactivated RO ([18e01f4](https://github.com/nrkno/tv-automation-server-core/commit/18e01f4)) +- better debug message ([17e1b4e](https://github.com/nrkno/tv-automation-server-core/commit/17e1b4e)) +- better handling of template-errors ([9f98100](https://github.com/nrkno/tv-automation-server-core/commit/9f98100)) +- better implementation of push update to local objects ([d692c96](https://github.com/nrkno/tv-automation-server-core/commit/d692c96)) +- Better syncFunction loging for anonymous functions, or in a timeout ([3633e4a](https://github.com/nrkno/tv-automation-server-core/commit/3633e4a)) +- BIG optimization in roTake and affected functions, made database fetches async & parallel where possible. This should not affect the functionality, though testing is needed. ([aa6f4bd](https://github.com/nrkno/tv-automation-server-core/commit/aa6f4bd)) +- bind keydown for any keyup events to prevent their default behaviour ([83e42e4](https://github.com/nrkno/tv-automation-server-core/commit/83e42e4)) +- blueprint config from manifest is reenabled and used for show style base and variant ([59b2f2f](https://github.com/nrkno/tv-automation-server-core/commit/59b2f2f)) +- Blueprint selection input in studio settings ([fc80da1](https://github.com/nrkno/tv-automation-server-core/commit/fc80da1)) +- blueprint settings page ([5697afe](https://github.com/nrkno/tv-automation-server-core/commit/5697afe)) +- break long script better in hoverscrub ([5697493](https://github.com/nrkno/tv-automation-server-core/commit/5697493)) +- break long script better in hoverscrub ([2d2f26d](https://github.com/nrkno/tv-automation-server-core/commit/2d2f26d)) +- broken GUI SegmentLineItems resolution, when simulating timeline output ([60fb843](https://github.com/nrkno/tv-automation-server-core/commit/60fb843)) +- broken logging + message ([ffe4fb4](https://github.com/nrkno/tv-automation-server-core/commit/ffe4fb4)) +- broken settings page ([1e99ff7](https://github.com/nrkno/tv-automation-server-core/commit/1e99ff7)) +- broken tests ([aa71eda](https://github.com/nrkno/tv-automation-server-core/commit/aa71eda)) +- broken tests ([69a4472](https://github.com/nrkno/tv-automation-server-core/commit/69a4472)) +- broken tests ([b92a8a6](https://github.com/nrkno/tv-automation-server-core/commit/b92a8a6)) +- broken tests ([0e107bd](https://github.com/nrkno/tv-automation-server-core/commit/0e107bd)) +- broken timing on continued piece during HOLD ([8c0d81f](https://github.com/nrkno/tv-automation-server-core/commit/8c0d81f)) +- broken timing on continued piece during HOLD ([bbd7528](https://github.com/nrkno/tv-automation-server-core/commit/bbd7528)) +- bug in logic, migrations should run if there are any steps left ([87ec102](https://github.com/nrkno/tv-automation-server-core/commit/87ec102)) +- bug in popup: nora payload can be deep objects, causing ui crash ([30bfca9](https://github.com/nrkno/tv-automation-server-core/commit/30bfca9)) +- bug in storePath migration step ([b623973](https://github.com/nrkno/tv-automation-server-core/commit/b623973)) +- bug that caused unhandledPromiseRejection. Also added logging of result of user action ([e799277](https://github.com/nrkno/tv-automation-server-core/commit/e799277)) +- bug when moving story to last ([83cef62](https://github.com/nrkno/tv-automation-server-core/commit/83cef62)) +- bug when moving story to last ([2b86f1a](https://github.com/nrkno/tv-automation-server-core/commit/2b86f1a)) +- bugfix ([943ff72](https://github.com/nrkno/tv-automation-server-core/commit/943ff72)) +- bugfix, broke stuff when renaming ([22c4eb1](https://github.com/nrkno/tv-automation-server-core/commit/22c4eb1)) +- bugfix, some keys didn't work in text inputs ([36e99cb](https://github.com/nrkno/tv-automation-server-core/commit/36e99cb)) +- bugfix: changed property ([a7710ad](https://github.com/nrkno/tv-automation-server-core/commit/a7710ad)) +- bugfix: didn't correctly find the right segmentLineItem in next segmentLine ([0f9313f](https://github.com/nrkno/tv-automation-server-core/commit/0f9313f)) +- bugfix: executeFunction didn't really time out ([acba08c](https://github.com/nrkno/tv-automation-server-core/commit/acba08c)) +- bugfix: timeline wasn't updated when going rehersal => roResetAndActivate ([ca76732](https://github.com/nrkno/tv-automation-server-core/commit/ca76732)) +- bugfix: undefined storePath ([cbfdde5](https://github.com/nrkno/tv-automation-server-core/commit/cbfdde5)) +- bugfix: update local object when updating database ([9d3b05b](https://github.com/nrkno/tv-automation-server-core/commit/9d3b05b)) +- bugfix: updateExpectedMediaItems used all segmentLineItems in RO, not just in segmmentLine ([406829b](https://github.com/nrkno/tv-automation-server-core/commit/406829b)) +- bugfix: When updating collection, documents with removed properties didn't get their properties removed. ([93dd81e](https://github.com/nrkno/tv-automation-server-core/commit/93dd81e)) +- bugfix: When updating collection, documents with removed properties didn't get their properties removed. ([237b8ff](https://github.com/nrkno/tv-automation-server-core/commit/237b8ff)) +- build errors ([34889b9](https://github.com/nrkno/tv-automation-server-core/commit/34889b9)) +- build errors ([81382f7](https://github.com/nrkno/tv-automation-server-core/commit/81382f7)) +- bumps expected version ([bd06edc](https://github.com/nrkno/tv-automation-server-core/commit/bd06edc)) +- Call ShowStyleBlueprint.onTimelineGenerate when the timeline is being generated for any extra post-processing ([cd22af3](https://github.com/nrkno/tv-automation-server-core/commit/cd22af3)) +- catch scroll events properly in later Chrome versions. ([7396973](https://github.com/nrkno/tv-automation-server-core/commit/7396973)) +- change lawo enum & interface ([3959761](https://github.com/nrkno/tv-automation-server-core/commit/3959761)) +- change logging to info on device state change ([1cc9429](https://github.com/nrkno/tv-automation-server-core/commit/1cc9429)) +- changed backup sorting to use templateId instead of \_id ([d7047a5](https://github.com/nrkno/tv-automation-server-core/commit/d7047a5)) +- changed default chortcuts ([ba33bb7](https://github.com/nrkno/tv-automation-server-core/commit/ba33bb7)) +- changed from promise to not ([6261cdc](https://github.com/nrkno/tv-automation-server-core/commit/6261cdc)) +- changed header colors ([b9efc61](https://github.com/nrkno/tv-automation-server-core/commit/b9efc61)) +- changed how i18n is initialized & exported ([cc674aa](https://github.com/nrkno/tv-automation-server-core/commit/cc674aa)) +- Changed the color of the top bar during Rehearsal mode to something a little less hideous. ([1e887e3](https://github.com/nrkno/tv-automation-server-core/commit/1e887e3)) +- changed timeline ids to use both \_id (globally unnique) and id (unique within a studio) ([d637fb0](https://github.com/nrkno/tv-automation-server-core/commit/d637fb0)) +- changes attr. paths in lawo source objs ([55f8c7b](https://github.com/nrkno/tv-automation-server-core/commit/55f8c7b)) +- changes lawo mapping with the effects change ([dbe58fe](https://github.com/nrkno/tv-automation-server-core/commit/dbe58fe)) +- check blueprint during upload & return it ([29c0600](https://github.com/nrkno/tv-automation-server-core/commit/29c0600)) +- check category of rundown-ingest-device ([b4f95a7](https://github.com/nrkno/tv-automation-server-core/commit/b4f95a7)) +- check content.path before creating an ExpectedMediaItem ([0914e98](https://github.com/nrkno/tv-automation-server-core/commit/0914e98)) +- check if the component didn't get unmounted mid-call ([5cbfc58](https://github.com/nrkno/tv-automation-server-core/commit/5cbfc58)) +- check that blueprint type stays the same on upload ([c2e4c10](https://github.com/nrkno/tv-automation-server-core/commit/c2e4c10)) +- chore: clean up in peripheralDevice typings ([09c8f4a](https://github.com/nrkno/tv-automation-server-core/commit/09c8f4a)) +- circular imports caused mocks to go haywire. ([210e6a3](https://github.com/nrkno/tv-automation-server-core/commit/210e6a3)) +- circular imports caused mocks to go haywire. ([976b89d](https://github.com/nrkno/tv-automation-server-core/commit/976b89d)) +- clean up expectedMediaItems when removing RDs, also include a clean-up step in the migration for 0.25.0 ([e401741](https://github.com/nrkno/tv-automation-server-core/commit/e401741)) +- clean up imports in ROV ([58067a6](https://github.com/nrkno/tv-automation-server-core/commit/58067a6)) +- clean up more collections when removing RO ([b84ed59](https://github.com/nrkno/tv-automation-server-core/commit/b84ed59)) +- clean up onBeforeUnload handler ([51adbba](https://github.com/nrkno/tv-automation-server-core/commit/51adbba)) +- clear queued adlibs when resetting running order ([83ed11a](https://github.com/nrkno/tv-automation-server-core/commit/83ed11a)) +- clear runtimeArguments on resetRunningOrder ([350dd45](https://github.com/nrkno/tv-automation-server-core/commit/350dd45)) +- clip floating inspector values ([d4c7430](https://github.com/nrkno/tv-automation-server-core/commit/d4c7430)) +- collection name ([e014558](https://github.com/nrkno/tv-automation-server-core/commit/e014558)) +- comment out dropping the rundownBaselineObjs ([d7679aa](https://github.com/nrkno/tv-automation-server-core/commit/d7679aa)) +- Comment out some code that is currently unused ([070081d](https://github.com/nrkno/tv-automation-server-core/commit/070081d)) +- ConfigRef fix ([f557052](https://github.com/nrkno/tv-automation-server-core/commit/f557052)) +- copy retryUntil from blueprint to core message ([72546b6](https://github.com/nrkno/tv-automation-server-core/commit/72546b6)) +- correct handling of blueprint.minimumCoreVersion ([19b2130](https://github.com/nrkno/tv-automation-server-core/commit/19b2130)) +- correct names of some ingest api methods ([6a87c9b](https://github.com/nrkno/tv-automation-server-core/commit/6a87c9b)) +- Correct some TimelineObj typings ([eb36ef9](https://github.com/nrkno/tv-automation-server-core/commit/eb36ef9)) +- corrects the default baseline template ([bf4eb03](https://github.com/nrkno/tv-automation-server-core/commit/bf4eb03)) +- Creating blueprints in UI ([8419ecf](https://github.com/nrkno/tv-automation-server-core/commit/8419ecf)) +- Ctrl-S in template editor triggers a save ([bacbc3e](https://github.com/nrkno/tv-automation-server-core/commit/bacbc3e)) +- default duration for KAM in timing group ([adf63cb](https://github.com/nrkno/tv-automation-server-core/commit/adf63cb)) +- defer triggerExternalMessage so as not to block timelineUpdate's ([ba7383f](https://github.com/nrkno/tv-automation-server-core/commit/ba7383f)) +- delete & sync buttons in RO-list ([9fbc875](https://github.com/nrkno/tv-automation-server-core/commit/9fbc875)) +- detect and discard double as-run events ([98f65a2](https://github.com/nrkno/tv-automation-server-core/commit/98f65a2)) +- dev Collections bug, due to collections being filled in later ([43e8856](https://github.com/nrkno/tv-automation-server-core/commit/43e8856)) +- dev debug data function ([e4570e2](https://github.com/nrkno/tv-automation-server-core/commit/e4570e2)) +- device is first created as Abstract ([98dca79](https://github.com/nrkno/tv-automation-server-core/commit/98dca79)) +- device status notifications ([7ab4a4c](https://github.com/nrkno/tv-automation-server-core/commit/7ab4a4c)) +- disable client-side RO updates ([72ba831](https://github.com/nrkno/tv-automation-server-core/commit/72ba831)) +- disable fullscreen overlay in developer mode ([7cc2e43](https://github.com/nrkno/tv-automation-server-core/commit/7cc2e43)) +- disable runtimeFunction caching during code-test & save ([e21f8dd](https://github.com/nrkno/tv-automation-server-core/commit/e21f8dd)) +- disable runtimeFunction caching during code-test & save ([74d6d34](https://github.com/nrkno/tv-automation-server-core/commit/74d6d34)) +- do full rundown update when recieve rundown metadata ([11ae325](https://github.com/nrkno/tv-automation-server-core/commit/11ae325)) +- Do not allow queue ad lib during hold mode ([c378fc8](https://github.com/nrkno/tv-automation-server-core/commit/c378fc8)) +- do not allow toggling sl arguments during hold mode ([3311f0a](https://github.com/nrkno/tv-automation-server-core/commit/3311f0a)) +- do not display notification count if = 0 ([1fe9a39](https://github.com/nrkno/tv-automation-server-core/commit/1fe9a39)) +- do not error CountdownItemLabel when sourceLayer is not found ([9451d1c](https://github.com/nrkno/tv-automation-server-core/commit/9451d1c)) +- do not refresh RO notifications if RO/showStyleBase/studioInstallation changes ([5702939](https://github.com/nrkno/tv-automation-server-core/commit/5702939)) +- do not show empty string values in L3rd popup ([b0c6c8e](https://github.com/nrkno/tv-automation-server-core/commit/b0c6c8e)) +- Don't remove enable.duration when setting enable.start to an absolute time instead of now for pieces ([991f2ba](https://github.com/nrkno/tv-automation-server-core/commit/991f2ba)) +- don't send devicesMakeReady until verified no other runningOrders are active ([953a1a7](https://github.com/nrkno/tv-automation-server-core/commit/953a1a7)) +- don't update device name if already got one ([833196a](https://github.com/nrkno/tv-automation-server-core/commit/833196a)) +- don't wait for subscriptions before rendering ([2bbfa20](https://github.com/nrkno/tv-automation-server-core/commit/2bbfa20)) +- Dont generate ui outputlayers for sli which are virtual ([c0ad368](https://github.com/nrkno/tv-automation-server-core/commit/c0ad368)) +- dont set nora\_\* config values in initDB ([1330008](https://github.com/nrkno/tv-automation-server-core/commit/1330008)) +- Dont show unset optional config in the config list ([5689865](https://github.com/nrkno/tv-automation-server-core/commit/5689865)) +- duration settling ([0648f57](https://github.com/nrkno/tv-automation-server-core/commit/0648f57)) +- Editattribute type typing ([1206d0c](https://github.com/nrkno/tv-automation-server-core/commit/1206d0c)) +- Editattribute type typing ([392f4aa](https://github.com/nrkno/tv-automation-server-core/commit/392f4aa)) +- EditAttribute: dropdown options was always strings ([814cdf7](https://github.com/nrkno/tv-automation-server-core/commit/814cdf7)) +- End of Show marker line doesn't end where it should ([e188c97](https://github.com/nrkno/tv-automation-server-core/commit/e188c97)) +- enforce workflow data structure ([d01245f](https://github.com/nrkno/tv-automation-server-core/commit/d01245f)) +- Ensure lookahead ids are always unique ([26f6637](https://github.com/nrkno/tv-automation-server-core/commit/26f6637)) +- Ensure PeripheralDevice.executeFunction doesnt timeout during callback execution ([087a6f8](https://github.com/nrkno/tv-automation-server-core/commit/087a6f8)) +- ensure that mediaFlowId and studioId are both indices ([5744ff3](https://github.com/nrkno/tv-automation-server-core/commit/5744ff3)) +- ensure that the connection notification is always on top ([662cd7a](https://github.com/nrkno/tv-automation-server-core/commit/662cd7a)) +- ensure that VideoEditMonitor is comfortably scrubbable at any window width ([a5e882a](https://github.com/nrkno/tv-automation-server-core/commit/a5e882a)) +- ensure that VideoEditMonitor is comfortably scrubbable at any window width ([ece3dfb](https://github.com/nrkno/tv-automation-server-core/commit/ece3dfb)) +- ensure the same overlap is used for autonext and the previous sl ([efb39e6](https://github.com/nrkno/tv-automation-server-core/commit/efb39e6)) +- Ensure the sl overlapDuration is respected on autonext. ([8c3bf3e](https://github.com/nrkno/tv-automation-server-core/commit/8c3bf3e)) +- Ensure typeVariant on SegmentLine is preserved when a roList is received ([98b224c](https://github.com/nrkno/tv-automation-server-core/commit/98b224c)) +- error in GUI (devices was added twice to list) ([80c4128](https://github.com/nrkno/tv-automation-server-core/commit/80c4128)) +- error when content.boxSourceConfiguration is undefined ([fc7ec40](https://github.com/nrkno/tv-automation-server-core/commit/fc7ec40)) +- error when content.boxSourceConfiguration is undefined ([81c896b](https://github.com/nrkno/tv-automation-server-core/commit/81c896b)) +- expectedMediaItems should work again ([a3bb4e9](https://github.com/nrkno/tv-automation-server-core/commit/a3bb4e9)) +- expectedMediaItems should work again ([f33467d](https://github.com/nrkno/tv-automation-server-core/commit/f33467d)) +- expectedMediaItems: make ids uniquer ([e16594a](https://github.com/nrkno/tv-automation-server-core/commit/e16594a)) +- externalMessage: priority of messages to send ([cffcd97](https://github.com/nrkno/tv-automation-server-core/commit/cffcd97)) +- externalMessage: update status on removed document ([75a1053](https://github.com/nrkno/tv-automation-server-core/commit/75a1053)) +- externalMessageQueue id ([5c8c39d](https://github.com/nrkno/tv-automation-server-core/commit/5c8c39d)) +- externalMessages upd ([a803882](https://github.com/nrkno/tv-automation-server-core/commit/a803882)) +- failing on startup if dp property missing ([041fc3e](https://github.com/nrkno/tv-automation-server-core/commit/041fc3e)) +- fetch from collections in EMI API ([73a3bd1](https://github.com/nrkno/tv-automation-server-core/commit/73a3bd1)) +- filter on json files on restore backup file selector ([1a0b867](https://github.com/nrkno/tv-automation-server-core/commit/1a0b867)) +- First pass of implementing mosRoFullStory and mosRoStoryDelete ([47602d1](https://github.com/nrkno/tv-automation-server-core/commit/47602d1)) +- fix a missing colon ([9f2aab9](https://github.com/nrkno/tv-automation-server-core/commit/9f2aab9)) +- fix according to updated interface ([e372a66](https://github.com/nrkno/tv-automation-server-core/commit/e372a66)) +- fix an issue where some of the snapshot restores would not be recognized as JSON ([57d31bc](https://github.com/nrkno/tv-automation-server-core/commit/57d31bc)) +- fix an issue where the message for clip ingested would be "null, Clip is being ingested" ([7ac5672](https://github.com/nrkno/tv-automation-server-core/commit/7ac5672)) +- fix an issue with overlapping labels on pieces when an infinite item was cropped by another item at 0 point. ([7599f64](https://github.com/nrkno/tv-automation-server-core/commit/7599f64)) +- fix an issue with resizing Shelf when scrolled down ([78155d6](https://github.com/nrkno/tv-automation-server-core/commit/78155d6)) +- fix an issue with scene, black and freeze information only showing up after a hover ([3505514](https://github.com/nrkno/tv-automation-server-core/commit/3505514)) +- Fix broken syncFunction and infinite loop in afterRemoveParts. Add test for rundownSyncFunction ([95ec0cc](https://github.com/nrkno/tv-automation-server-core/commit/95ec0cc)) +- Fix context.runHelper not working in templates. ([36ca5f3](https://github.com/nrkno/tv-automation-server-core/commit/36ca5f3)) +- Fix device status notifications ([b9f274e](https://github.com/nrkno/tv-automation-server-core/commit/b9f274e)) +- fix expectVersion ([afeaa74](https://github.com/nrkno/tv-automation-server-core/commit/afeaa74)) +- fix for React whitespace error: ([f66983b](https://github.com/nrkno/tv-automation-server-core/commit/f66983b)) +- fix for strange (temporary?) error about method missing ([0db30ae](https://github.com/nrkno/tv-automation-server-core/commit/0db30ae)) +- fix mocks ([3d64f0c](https://github.com/nrkno/tv-automation-server-core/commit/3d64f0c)) +- fix more typings and add some null checks in unusual places ([d0c53c3](https://github.com/nrkno/tv-automation-server-core/commit/d0c53c3)) +- fix MOS status indicators in RO header ([c0724cc](https://github.com/nrkno/tv-automation-server-core/commit/c0724cc)) +- fix notifications toggle button cursor ([b0d8dcb](https://github.com/nrkno/tv-automation-server-core/commit/b0d8dcb)) +- fix notifications toggle button cursor ([402486b](https://github.com/nrkno/tv-automation-server-core/commit/402486b)) +- fix PTZ Testing harness ([97bccc7](https://github.com/nrkno/tv-automation-server-core/commit/97bccc7)) +- Fix regenerateRundown when not sourced from mos ([3f0191d](https://github.com/nrkno/tv-automation-server-core/commit/3f0191d)) +- Fix regenerateRundown when not sourced from mos ([292d6c5](https://github.com/nrkno/tv-automation-server-core/commit/292d6c5)) +- fix Segment Line notifications ([3753250](https://github.com/nrkno/tv-automation-server-core/commit/3753250)) +- fix set offset working from UI ([91bc80d](https://github.com/nrkno/tv-automation-server-core/commit/91bc80d)) +- fix some subscriptions and naming ([3696183](https://github.com/nrkno/tv-automation-server-core/commit/3696183)) +- Fix some unstable tests ([c521b76](https://github.com/nrkno/tv-automation-server-core/commit/c521b76)) +- fix typings to match with the stronger typings ([ae1bd4f](https://github.com/nrkno/tv-automation-server-core/commit/ae1bd4f)) +- fix zoom area height ([24d2e38](https://github.com/nrkno/tv-automation-server-core/commit/24d2e38)) +- fixes ([2fc3802](https://github.com/nrkno/tv-automation-server-core/commit/2fc3802)) +- force lookahead inGroup field to be emptied. Fixes mismatched statobj ([c76209c](https://github.com/nrkno/tv-automation-server-core/commit/c76209c)) +- freeze/black in begin/end of mediafile gets special warning ([ea950e2](https://github.com/nrkno/tv-automation-server-core/commit/ea950e2)) +- generate statObject per device ([82a0736](https://github.com/nrkno/tv-automation-server-core/commit/82a0736)) +- Get some playout working ([161fca3](https://github.com/nrkno/tv-automation-server-core/commit/161fca3)) +- getHash undefined exception in asRunLog ([8faab78](https://github.com/nrkno/tv-automation-server-core/commit/8faab78)) +- getSnapshot: don't ask devices of type OTHER ([ea874d4](https://github.com/nrkno/tv-automation-server-core/commit/ea874d4)) +- getting monaco to work runtime while still having typings ([5db8218](https://github.com/nrkno/tv-automation-server-core/commit/5db8218)) +- global ad-lib order was wrong, basline blueprint did not set \_rank ([ffbacc8](https://github.com/nrkno/tv-automation-server-core/commit/ffbacc8)) +- Guard against there being no next segmentline ([849d97f](https://github.com/nrkno/tv-automation-server-core/commit/849d97f)) +- GUI externalMessages json formatting ([0b7cd2c](https://github.com/nrkno/tv-automation-server-core/commit/0b7cd2c)) +- GUI: new try on rewinding the viewport on RO reset ([b0edaf4](https://github.com/nrkno/tv-automation-server-core/commit/b0edaf4)) +- GUI: round number of frames ([c90021f](https://github.com/nrkno/tv-automation-server-core/commit/c90021f)) +- GUI: settings: only show parent-devices in left menu (only they have settings on them) ([ecb164e](https://github.com/nrkno/tv-automation-server-core/commit/ecb164e)) +- GUI: unexpected behaviour in blueprint configuration ([f5bed4e](https://github.com/nrkno/tv-automation-server-core/commit/f5bed4e)) +- handle both update & insert of runningOrder ([84a6c53](https://github.com/nrkno/tv-automation-server-core/commit/84a6c53)) +- handle both update & insert of runningOrder ([3701bb3](https://github.com/nrkno/tv-automation-server-core/commit/3701bb3)) +- handle promises correctly.. ([2e57296](https://github.com/nrkno/tv-automation-server-core/commit/2e57296)) +- handle promises correctly.. ([b952e1d](https://github.com/nrkno/tv-automation-server-core/commit/b952e1d)) +- handle take situation better when having invalid segmentLines ([dacd3b0](https://github.com/nrkno/tv-automation-server-core/commit/dacd3b0)) +- handle when error is thrown in function in makePromise ([c287727](https://github.com/nrkno/tv-automation-server-core/commit/c287727)) +- handle when error is thrown in function in makePromise ([b7094dd](https://github.com/nrkno/tv-automation-server-core/commit/b7094dd)) +- handle when nexting before start or after end ([506bb8a](https://github.com/nrkno/tv-automation-server-core/commit/506bb8a)) +- has played styling shouldn't be applied to Guest and Remote segments ([18bdc82](https://github.com/nrkno/tv-automation-server-core/commit/18bdc82)) +- have both a cirtuclar button and a 'branch' to the panel ([1fa3cf9](https://github.com/nrkno/tv-automation-server-core/commit/1fa3cf9)) +- head mute audio and hold on last frame ([ceec7f6](https://github.com/nrkno/tv-automation-server-core/commit/ceec7f6)) +- header context menu z-order fix ([c68244b](https://github.com/nrkno/tv-automation-server-core/commit/c68244b)) +- hide "Restart playout" from support panel when not in studio mode ([5820b00](https://github.com/nrkno/tv-automation-server-core/commit/5820b00)) +- hide "Restart playout" from support panel when not in studio mode ([34ba937](https://github.com/nrkno/tv-automation-server-core/commit/34ba937)) +- Hide child devices from being added to the studio ([852ec9b](https://github.com/nrkno/tv-automation-server-core/commit/852ec9b)) +- Hide Keyboard focus marker when not in studio mode ([70dc6b0](https://github.com/nrkno/tv-automation-server-core/commit/70dc6b0)) +- HOLD add new llayer to initDB ([650b6e6](https://github.com/nrkno/tv-automation-server-core/commit/650b6e6)) +- hold-copy of the SLI should provide seek information to offset markers on the SLI ([3967d03](https://github.com/nrkno/tv-automation-server-core/commit/3967d03)) +- holdState = 0 displayed a status ([49c7ead](https://github.com/nrkno/tv-automation-server-core/commit/49c7ead)) +- holdState = 0 displayed a status ([aacd140](https://github.com/nrkno/tv-automation-server-core/commit/aacd140)) +- hot fix for rehearsal activation when an RO is already active ([648c02d](https://github.com/nrkno/tv-automation-server-core/commit/648c02d)) +- houskeeping: remove uneccessary logs ([0c054f9](https://github.com/nrkno/tv-automation-server-core/commit/0c054f9)) +- if the next:ed segment is removed, instead next the one in its place ([22597b3](https://github.com/nrkno/tv-automation-server-core/commit/22597b3)) +- ignore custom dependencies ([b9db526](https://github.com/nrkno/tv-automation-server-core/commit/b9db526)) +- implement Play from here ([bd79569](https://github.com/nrkno/tv-automation-server-core/commit/bd79569)) +- implement Play from here ([0dce2af](https://github.com/nrkno/tv-automation-server-core/commit/0dce2af)) +- Implement rerunning blueprints on resetPart if dirty ([b942323](https://github.com/nrkno/tv-automation-server-core/commit/b942323)) +- Importing of some mock running orders ([eadf225](https://github.com/nrkno/tv-automation-server-core/commit/eadf225)) +- improve elements in AdLibListItem ([e917c43](https://github.com/nrkno/tv-automation-server-core/commit/e917c43)) +- improve evaluation form visuals ([30af081](https://github.com/nrkno/tv-automation-server-core/commit/30af081)) +- Improve group label visuals ([39b43e1](https://github.com/nrkno/tv-automation-server-core/commit/39b43e1)) +- Improve missing mosId error message ([89695fb](https://github.com/nrkno/tv-automation-server-core/commit/89695fb)) +- improve notification center button ([0b4d082](https://github.com/nrkno/tv-automation-server-core/commit/0b4d082)) +- improve notifications highlighting animation ([abda2c3](https://github.com/nrkno/tv-automation-server-core/commit/abda2c3)) +- improve notifications highlighting animation ([afeb568](https://github.com/nrkno/tv-automation-server-core/commit/afeb568)) +- improve some error logging ([60af59b](https://github.com/nrkno/tv-automation-server-core/commit/60af59b)) +- improve status bar panel buttons look when panels open ([247c8ee](https://github.com/nrkno/tv-automation-server-core/commit/247c8ee)) +- Improve the segment diff logic ([1465890](https://github.com/nrkno/tv-automation-server-core/commit/1465890)) +- improve typings for Notification messages ([bed664b](https://github.com/nrkno/tv-automation-server-core/commit/bed664b)) +- improve uncaughtErrorHandler ([fa744f4](https://github.com/nrkno/tv-automation-server-core/commit/fa744f4)) +- improved queries & added index ([159f6d5](https://github.com/nrkno/tv-automation-server-core/commit/159f6d5)) +- Include rundown baseline in snapshots ([96fedcb](https://github.com/nrkno/tv-automation-server-core/commit/96fedcb)) +- incorrect typings for template editor ([9d021df](https://github.com/nrkno/tv-automation-server-core/commit/9d021df)) +- Increase size of template editor to make it better fill the screen ([3212d7b](https://github.com/nrkno/tv-automation-server-core/commit/3212d7b)) +- increase upload limit for backup files ([5effaa9](https://github.com/nrkno/tv-automation-server-core/commit/5effaa9)) +- increase upload limit for backup files ([e658f12](https://github.com/nrkno/tv-automation-server-core/commit/e658f12)) +- Infinite items dont stop against a absolute 0 item properly. ([78c1499](https://github.com/nrkno/tv-automation-server-core/commit/78c1499)) +- infinite segment line tidying and fixes ([8469ffb](https://github.com/nrkno/tv-automation-server-core/commit/8469ffb)) +- Infinite segmentline bad guard when calculating the current infinites that caused the process to stop early ([2f9abeb](https://github.com/nrkno/tv-automation-server-core/commit/2f9abeb)) +- infinite segmentlines crossing an autonext throwing a duplicate key exception ([93b2a30](https://github.com/nrkno/tv-automation-server-core/commit/93b2a30)) +- inGroup property of timeline objects should be id, not \_id ([35b34c5](https://github.com/nrkno/tv-automation-server-core/commit/35b34c5)) +- init state properly ([2572cdc](https://github.com/nrkno/tv-automation-server-core/commit/2572cdc)) +- initDB for pharos lights ([57fbc73](https://github.com/nrkno/tv-automation-server-core/commit/57fbc73)) +- initial optimization of updateSourceLayerInfinitesAfterLine ([5cd8235](https://github.com/nrkno/tv-automation-server-core/commit/5cd8235)) +- initial optimization of updateSourceLayerInfinitesAfterLine ([871bdd2](https://github.com/nrkno/tv-automation-server-core/commit/871bdd2)) +- initiateDB update for PTZ ([e529782](https://github.com/nrkno/tv-automation-server-core/commit/e529782)) +- Invalid ids in PeripheralDeviceCommand responses. Not using cached ingest data when reloadingRundown. Adds tests for reloadingRundown ([cb59bbc](https://github.com/nrkno/tv-automation-server-core/commit/cb59bbc)) +- isClientResponseSuccess returned wrong values ([ce0b44e](https://github.com/nrkno/tv-automation-server-core/commit/ce0b44e)) +- Issue with duplicate ids ([ed27041](https://github.com/nrkno/tv-automation-server-core/commit/ed27041)) +- issue with rehearsal double-activation warning ([17b4e95](https://github.com/nrkno/tv-automation-server-core/commit/17b4e95)) +- issue with roPrepareForBroadcast ([c3ad30c](https://github.com/nrkno/tv-automation-server-core/commit/c3ad30c)) +- issue with segment context menu ([7a44deb](https://github.com/nrkno/tv-automation-server-core/commit/7a44deb)) +- issue with source layers marked as used even though they were used in the following segmentLine ([71acfb3](https://github.com/nrkno/tv-automation-server-core/commit/71acfb3)) +- issues with timelineTriggerTime ([0459729](https://github.com/nrkno/tv-automation-server-core/commit/0459729)) +- jest config ([e53663c](https://github.com/nrkno/tv-automation-server-core/commit/e53663c)) +- Jest not finding all tests ([2464e87](https://github.com/nrkno/tv-automation-server-core/commit/2464e87)) +- JSDoc-ify existing comments ([6825f00](https://github.com/nrkno/tv-automation-server-core/commit/6825f00)) +- JSX props typings fix in Header ([7596557](https://github.com/nrkno/tv-automation-server-core/commit/7596557)) +- keep device header in Mos parent properties settings ([4ff9b91](https://github.com/nrkno/tv-automation-server-core/commit/4ff9b91)) +- keep device header in Mos parent properties settings ([2f2529d](https://github.com/nrkno/tv-automation-server-core/commit/2f2529d)) +- Keep the devices header visible when editing device ([cb2d7d9](https://github.com/nrkno/tv-automation-server-core/commit/cb2d7d9)) +- Keep the devices header visible when editing device ([90dbe05](https://github.com/nrkno/tv-automation-server-core/commit/90dbe05)) +- keys should be handled at up, not down ([957f583](https://github.com/nrkno/tv-automation-server-core/commit/957f583)) +- label on Play From here in SegmentContextMenu ([8bfa631](https://github.com/nrkno/tv-automation-server-core/commit/8bfa631)) +- labels in modal dialogs ([3af18fc](https://github.com/nrkno/tv-automation-server-core/commit/3af18fc)) +- limit black/freeze markers width to within the item ([5bbb385](https://github.com/nrkno/tv-automation-server-core/commit/5bbb385)) +- limit db fetches to active running order ([f3aca8f](https://github.com/nrkno/tv-automation-server-core/commit/f3aca8f)) +- lock down package.json & update package-lock, to get release2 to build ([472f8ab](https://github.com/nrkno/tv-automation-server-core/commit/472f8ab)) +- locked [@babel](https://github.com/babel)/runtime version & updated package-lock ([8e62d2f](https://github.com/nrkno/tv-automation-server-core/commit/8e62d2f)) +- Log unresolved ids when resolving pieces ([28691c6](https://github.com/nrkno/tv-automation-server-core/commit/28691c6)) +- logics bugfix after optimization ([2b8fa3c](https://github.com/nrkno/tv-automation-server-core/commit/2b8fa3c)) +- logics bugfix after optimization ([fe85cd3](https://github.com/nrkno/tv-automation-server-core/commit/fe85cd3)) +- lookahead object id not being set correctly ([594a1e7](https://github.com/nrkno/tv-automation-server-core/commit/594a1e7)) +- made editor height dynamic ([c68ac4f](https://github.com/nrkno/tv-automation-server-core/commit/c68ac4f)) +- made editor height dynamic ([7f5f40e](https://github.com/nrkno/tv-automation-server-core/commit/7f5f40e)) +- Made sure that the typography update for the prompter has a font fallback. ([6f2b20a](https://github.com/nrkno/tv-automation-server-core/commit/6f2b20a)) +- Major refactoring, splitting code into separate files depending on their areas: "rundown": General rundown manipulation, "media-scanner": Media-scanner, "mos": mos-specific functions ([db82375](https://github.com/nrkno/tv-automation-server-core/commit/db82375)) +- make 'Lights' source layer type translatable in the Settings ([65d5b76](https://github.com/nrkno/tv-automation-server-core/commit/65d5b76)) +- make most of the UI actually run ([45941d5](https://github.com/nrkno/tv-automation-server-core/commit/45941d5)) +- make RundownTiming reuse objects to limit the amount of GC done ([6e04daf](https://github.com/nrkno/tv-automation-server-core/commit/6e04daf)) +- make segmentLine.invalid optional ([c179e3c](https://github.com/nrkno/tv-automation-server-core/commit/c179e3c)) +- make sure that expectedMediaItems are purged along with the RO ([0d9dda1](https://github.com/nrkno/tv-automation-server-core/commit/0d9dda1)) +- make sure that the ad-lib drawer isn't obstructed by the right-hand bar ([8783819](https://github.com/nrkno/tv-automation-server-core/commit/8783819)) +- make sure that the OnAir line connects to the label ([3788672](https://github.com/nrkno/tv-automation-server-core/commit/3788672)) +- make the context menu available in the entire header ([0590f9d](https://github.com/nrkno/tv-automation-server-core/commit/0590f9d)) +- make the FullScreen detection more lenient ([28b689a](https://github.com/nrkno/tv-automation-server-core/commit/28b689a)) +- make the FullScreen detection more lenient ([215d73c](https://github.com/nrkno/tv-automation-server-core/commit/215d73c)) +- Make the head to kam wipe not use the mosartVariant field. Correct the head order checking ([6030755](https://github.com/nrkno/tv-automation-server-core/commit/6030755)) +- media-manager: rename keyStep => criticalStep ([77f4d6a](https://github.com/nrkno/tv-automation-server-core/commit/77f4d6a)) +- mediainfo typings & timebase ([67f16be](https://github.com/nrkno/tv-automation-server-core/commit/67f16be)) +- mediaobjects to use computed field ([39d13b5](https://github.com/nrkno/tv-automation-server-core/commit/39d13b5)) +- mediaobjects to use computed field ([dba858f](https://github.com/nrkno/tv-automation-server-core/commit/dba858f)) +- message came twice, wrong index for signature ([64aeafb](https://github.com/nrkno/tv-automation-server-core/commit/64aeafb)) +- Meteor mock ([dec64db](https://github.com/nrkno/tv-automation-server-core/commit/dec64db)) +- meteor mock error ([f005291](https://github.com/nrkno/tv-automation-server-core/commit/f005291)) +- Migration for stk&full audio remapping ([2491f52](https://github.com/nrkno/tv-automation-server-core/commit/2491f52)) +- migration helpers ([40228e8](https://github.com/nrkno/tv-automation-server-core/commit/40228e8)) +- Migration UI fixes ([b141243](https://github.com/nrkno/tv-automation-server-core/commit/b141243)) +- Migrations internal server error ([45d0238](https://github.com/nrkno/tv-automation-server-core/commit/45d0238)) +- migrations: upgrade peripheralDevices as good as possible ([150ca2a](https://github.com/nrkno/tv-automation-server-core/commit/150ca2a)) +- minor ui fix on status page ([97fc3c2](https://github.com/nrkno/tv-automation-server-core/commit/97fc3c2)) +- miss in merge ([93106b1](https://github.com/nrkno/tv-automation-server-core/commit/93106b1)) +- missed line ([4f635b9](https://github.com/nrkno/tv-automation-server-core/commit/4f635b9)) +- missing argument for mediaStatusCheck ([658e82a](https://github.com/nrkno/tv-automation-server-core/commit/658e82a)) +- missing key property ([79fb3e6](https://github.com/nrkno/tv-automation-server-core/commit/79fb3e6)) +- missing sass import ([f1f10ff](https://github.com/nrkno/tv-automation-server-core/commit/f1f10ff)) +- Missing typings on ShowStyle ([a0a4e14](https://github.com/nrkno/tv-automation-server-core/commit/a0a4e14)) +- Mix transitions ([5cf2314](https://github.com/nrkno/tv-automation-server-core/commit/5cf2314)) +- Mix transitions ([0ebf3e1](https://github.com/nrkno/tv-automation-server-core/commit/0ebf3e1)) +- Mock Collection object ([a6976fa](https://github.com/nrkno/tv-automation-server-core/commit/a6976fa)) +- mode logging method, to avoid circular dependency ([4d55286](https://github.com/nrkno/tv-automation-server-core/commit/4d55286)) +- modified timestamp on imported blueprints was not being set, causing the cache to not be cleared properly ([2f3fd17](https://github.com/nrkno/tv-automation-server-core/commit/2f3fd17)) +- monaco typing error fix ([e73467e](https://github.com/nrkno/tv-automation-server-core/commit/e73467e)) +- more CSS fixes due to switching to buttons ([f3a939f](https://github.com/nrkno/tv-automation-server-core/commit/f3a939f)) +- more fixes for MOS status indicator in header ([97311b1](https://github.com/nrkno/tv-automation-server-core/commit/97311b1)) +- more optimizations ([df8c397](https://github.com/nrkno/tv-automation-server-core/commit/df8c397)) +- more performance subscription based on studioId and rundownId ([e1b8d77](https://github.com/nrkno/tv-automation-server-core/commit/e1b8d77)) +- more refactoring of the styles ([f5af269](https://github.com/nrkno/tv-automation-server-core/commit/f5af269)) +- MOS ingest fixes and tests ([233c523](https://github.com/nrkno/tv-automation-server-core/commit/233c523)) +- mos-gateway external functions names ([a3497df](https://github.com/nrkno/tv-automation-server-core/commit/a3497df)) +- move all segment notes away from header, show only summary, clickable summary ([aee3d01](https://github.com/nrkno/tv-automation-server-core/commit/aee3d01)) +- move all segment notes away from header, show only summary, clickable summary ([d0a4801](https://github.com/nrkno/tv-automation-server-core/commit/d0a4801)) +- move back executeFunction to peripheralDeviceAPI ([226289f](https://github.com/nrkno/tv-automation-server-core/commit/226289f)) +- move notifications pop-ups when NC is open ([6f7759f](https://github.com/nrkno/tv-automation-server-core/commit/6f7759f)) +- move notifications pop-ups when NC is open ([d6ce260](https://github.com/nrkno/tv-automation-server-core/commit/d6ce260)) +- Move remaining mos types into ingest/mosDevice ([904b3cb](https://github.com/nrkno/tv-automation-server-core/commit/904b3cb)) +- move wrapMethods, to avoid circular import ([df41959](https://github.com/nrkno/tv-automation-server-core/commit/df41959)) +- multiply inPoint/duration by timeBase before sending back to MOS ([b576f26](https://github.com/nrkno/tv-automation-server-core/commit/b576f26)) +- multiply inPoint/duration by timebase before storing to MOS ([d01b8d9](https://github.com/nrkno/tv-automation-server-core/commit/d01b8d9)) +- new implementation of runtime caching ([92e09be](https://github.com/nrkno/tv-automation-server-core/commit/92e09be)) +- new implementation of runtime caching ([767fbb7](https://github.com/nrkno/tv-automation-server-core/commit/767fbb7)) +- new lawo source mappings ([20f7d5a](https://github.com/nrkno/tv-automation-server-core/commit/20f7d5a)) +- next part not updating properly from ingest data changes ([1486e65](https://github.com/nrkno/tv-automation-server-core/commit/1486e65)) +- non-persistent pop-ups should be prioritized over persistent ones ([99f147a](https://github.com/nrkno/tv-automation-server-core/commit/99f147a)) +- normalize naming scheme to 'runtimeArguments', normalize hotkey labels ([528679d](https://github.com/nrkno/tv-automation-server-core/commit/528679d)) +- not able to run migration on empty database (to bump system version) ([f65fcfe](https://github.com/nrkno/tv-automation-server-core/commit/f65fcfe)) +- note type got lost ([863e49d](https://github.com/nrkno/tv-automation-server-core/commit/863e49d)) +- notification center panel shadow ([1010dda](https://github.com/nrkno/tv-automation-server-core/commit/1010dda)) +- Notification Center width calculations ([fa31d65](https://github.com/nrkno/tv-automation-server-core/commit/fa31d65)) +- notification equality check, resolves 'republished' RO notifications ([27b6102](https://github.com/nrkno/tv-automation-server-core/commit/27b6102)) +- NotificationCenter visual fix for other pages ([10b1afa](https://github.com/nrkno/tv-automation-server-core/commit/10b1afa)) +- NotificationCenter visual fix for other pages ([2c5da97](https://github.com/nrkno/tv-automation-server-core/commit/2c5da97)) +- Notifications panel styling fix ([7f7f5cb](https://github.com/nrkno/tv-automation-server-core/commit/7f7f5cb)) +- NymansPlayground caused issues in Timeline ([83e772d](https://github.com/nrkno/tv-automation-server-core/commit/83e772d)) +- on air label position ([00d4e20](https://github.com/nrkno/tv-automation-server-core/commit/00d4e20)) +- on startup, clear old connection statuses ([e9d7cba](https://github.com/nrkno/tv-automation-server-core/commit/e9d7cba)) +- onAir line jumping around on takes ([8330112](https://github.com/nrkno/tv-automation-server-core/commit/8330112)) +- optimizations during ad-libs (thanks to [@baltedewit](https://github.com/baltedewit)) ([f50b60e](https://github.com/nrkno/tv-automation-server-core/commit/f50b60e)) +- optimizations during ad-libs (thanks to [@baltedewit](https://github.com/baltedewit)) ([daa135b](https://github.com/nrkno/tv-automation-server-core/commit/daa135b)) +- optimizations in roTake ([3457e73](https://github.com/nrkno/tv-automation-server-core/commit/3457e73)) +- optimize font loading in TimelineGrid ([b4c60c1](https://github.com/nrkno/tv-automation-server-core/commit/b4c60c1)) +- optimize saveIntoDB ([65c189e](https://github.com/nrkno/tv-automation-server-core/commit/65c189e)) +- Out of space build failures. Run circleci for tags ([53a5626](https://github.com/nrkno/tv-automation-server-core/commit/53a5626)) +- Out of space build failures. Run circleci for tags ([08b4a2c](https://github.com/nrkno/tv-automation-server-core/commit/08b4a2c)) +- output version differ error ([8816ed3](https://github.com/nrkno/tv-automation-server-core/commit/8816ed3)) +- Pass SofieHostURL to blueprints config ([8c18821](https://github.com/nrkno/tv-automation-server-core/commit/8c18821)) +- peripheralDevices subscription for RO data ([90b4e13](https://github.com/nrkno/tv-automation-server-core/commit/90b4e13)) +- Persist SegmentLine.updateStoryStatus ([427b24c](https://github.com/nrkno/tv-automation-server-core/commit/427b24c)) +- playout ([969e316](https://github.com/nrkno/tv-automation-server-core/commit/969e316)) +- playout, lookahead: use the originalLayer instear of isAbstract ([30fe842](https://github.com/nrkno/tv-automation-server-core/commit/30fe842)) +- PR changes ([c877aad](https://github.com/nrkno/tv-automation-server-core/commit/c877aad)) +- prevent default action for f1 & f3 ([53b2f22](https://github.com/nrkno/tv-automation-server-core/commit/53b2f22)) +- prevent resetting rundown when on-air ([d842922](https://github.com/nrkno/tv-automation-server-core/commit/d842922)) +- prevent take + autotake bug ([b3d9a4d](https://github.com/nrkno/tv-automation-server-core/commit/b3d9a4d)) +- problem with viewing test recordings ([2e817ac](https://github.com/nrkno/tv-automation-server-core/commit/2e817ac)) +- Prompter: keyboard device interface ([540f47a](https://github.com/nrkno/tv-automation-server-core/commit/540f47a)) +- proper calls of IngestActions ([69121dc](https://github.com/nrkno/tv-automation-server-core/commit/69121dc)) +- proper dispose of executeFunction checkReply after execution is done ([523ec99](https://github.com/nrkno/tv-automation-server-core/commit/523ec99)) +- queued adlib should have infinite sli's ([75452dc](https://github.com/nrkno/tv-automation-server-core/commit/75452dc)) +- R3 ONLY: bugfix: reload data from ENPS ([cc6ed44](https://github.com/nrkno/tv-automation-server-core/commit/cc6ed44)) +- rabbitMQ sending messages ([df72c4c](https://github.com/nrkno/tv-automation-server-core/commit/df72c4c)) +- re-add blueprint & mosdatacache restore (to be deprecated later) ([886c756](https://github.com/nrkno/tv-automation-server-core/commit/886c756)) +- re-add jest-meteor-stubs ([86ede36](https://github.com/nrkno/tv-automation-server-core/commit/86ede36)) +- re-added monaco typings and disabled import, so it works client-side ([1226763](https://github.com/nrkno/tv-automation-server-core/commit/1226763)) +- re-timing vignett ([17fbced](https://github.com/nrkno/tv-automation-server-core/commit/17fbced)) +- react errors while rendering nymansPlayground ([0c245d3](https://github.com/nrkno/tv-automation-server-core/commit/0c245d3)) +- React unique keys ([4f728d9](https://github.com/nrkno/tv-automation-server-core/commit/4f728d9)) +- RecordedFiles index ([f1aae5e](https://github.com/nrkno/tv-automation-server-core/commit/f1aae5e)) +- refactor ([9e9d60a](https://github.com/nrkno/tv-automation-server-core/commit/9e9d60a)) +- refactor infinite generation logic into separate file ([84ef579](https://github.com/nrkno/tv-automation-server-core/commit/84ef579)) +- refactor storeSnapshot methods ([6e66394](https://github.com/nrkno/tv-automation-server-core/commit/6e66394)) +- refactor updateExternalMessageQueueStatus to avoid fatal startup bug ([b54b09d](https://github.com/nrkno/tv-automation-server-core/commit/b54b09d)) +- refactored execMethod, so it doesn't use promises and causes unhandled promise rejections ([24da71b](https://github.com/nrkno/tv-automation-server-core/commit/24da71b)) +- refactored reset-segmentLine further ([0523eb6](https://github.com/nrkno/tv-automation-server-core/commit/0523eb6)) +- refactored/DRYd adminMode & studioMode, disabled trashbin-button for externalMessages when not in adminMode ([b29dae1](https://github.com/nrkno/tv-automation-server-core/commit/b29dae1)) +- refactoring of mos-ingest functions ([ad26959](https://github.com/nrkno/tv-automation-server-core/commit/ad26959)) +- refator ingest API ([a9fa737](https://github.com/nrkno/tv-automation-server-core/commit/a9fa737)) +- rehaul of versions, WIP ([93dea2f](https://github.com/nrkno/tv-automation-server-core/commit/93dea2f)) +- Reimplement mosRoCreate via new ingest api ([34c3247](https://github.com/nrkno/tv-automation-server-core/commit/34c3247)) +- relative durations causing type warnings for ui code ([5249435](https://github.com/nrkno/tv-automation-server-core/commit/5249435)) +- Release 3 only: disable config missing warning ([921cc82](https://github.com/nrkno/tv-automation-server-core/commit/921cc82)) +- remount monaco ([4ce1566](https://github.com/nrkno/tv-automation-server-core/commit/4ce1566)) +- remove 'computation stopped' notifications ([bf4d8d8](https://github.com/nrkno/tv-automation-server-core/commit/bf4d8d8)) +- Remove all notifications from prompter (incl. connection) ([b13d561](https://github.com/nrkno/tv-automation-server-core/commit/b13d561)) +- remove check that didn't work ([fdc917f](https://github.com/nrkno/tv-automation-server-core/commit/fdc917f)) +- remove config didn't work ([893717e](https://github.com/nrkno/tv-automation-server-core/commit/893717e)) +- remove debug line in nightly cronjob ([dda3017](https://github.com/nrkno/tv-automation-server-core/commit/dda3017)) +- remove deprecated options ([ab7275b](https://github.com/nrkno/tv-automation-server-core/commit/ab7275b)) +- remove duplicate attributes ([31e4414](https://github.com/nrkno/tv-automation-server-core/commit/31e4414)) +- Remove empty translations ([d2f1bd0](https://github.com/nrkno/tv-automation-server-core/commit/d2f1bd0)) +- remove expectedMediaItems when ro is removed ([5230695](https://github.com/nrkno/tv-automation-server-core/commit/5230695)) +- remove full-screen button, add label ([5c9a3e5](https://github.com/nrkno/tv-automation-server-core/commit/5c9a3e5)) +- remove full-screen button, add label ([5e9826e](https://github.com/nrkno/tv-automation-server-core/commit/5e9826e)) +- remove internal methods from API ([1752bb1](https://github.com/nrkno/tv-automation-server-core/commit/1752bb1)) +- remove leftover debug info ([d475b76](https://github.com/nrkno/tv-automation-server-core/commit/d475b76)) +- remove memoization of RVars ([ca22155](https://github.com/nrkno/tv-automation-server-core/commit/ca22155)) +- remove minified timeline-visualizer ([1cd5552](https://github.com/nrkno/tv-automation-server-core/commit/1cd5552)) +- remove minified timeline-visualizer ([da85c89](https://github.com/nrkno/tv-automation-server-core/commit/da85c89)) +- remove queued ad-libs when original part is reset ([812e19c](https://github.com/nrkno/tv-automation-server-core/commit/812e19c)) +- Remove some calls to rundownSyncFunction from inside another ([83eb955](https://github.com/nrkno/tv-automation-server-core/commit/83eb955)) +- remove some console.logs ([a9f3f53](https://github.com/nrkno/tv-automation-server-core/commit/a9f3f53)) +- remove systemStatus when removing blueprint ([1aa9b44](https://github.com/nrkno/tv-automation-server-core/commit/1aa9b44)) +- Remove timestamps from blueprint backups ([74fa1b3](https://github.com/nrkno/tv-automation-server-core/commit/74fa1b3)) +- remove trigger from the AdLibPieceUi setup in AdLibPanel ([847edb5](https://github.com/nrkno/tv-automation-server-core/commit/847edb5)) +- remove unneccessary margin in some headers ([b47ea11](https://github.com/nrkno/tv-automation-server-core/commit/b47ea11)) +- remove unneccessary margin in some headers ([32874a1](https://github.com/nrkno/tv-automation-server-core/commit/32874a1)) +- remove unused imports ([59041fc](https://github.com/nrkno/tv-automation-server-core/commit/59041fc)) +- remove unused imports ([5fe6ac3](https://github.com/nrkno/tv-automation-server-core/commit/5fe6ac3)) +- remove unused translation helper ([e545a9e](https://github.com/nrkno/tv-automation-server-core/commit/e545a9e)) +- removed autopublish and insecure packages, we'll implement publications and allow/deny rules from now on ([213998d](https://github.com/nrkno/tv-automation-server-core/commit/213998d)) +- removed ntp server debug code ([b9857e7](https://github.com/nrkno/tv-automation-server-core/commit/b9857e7)) +- removed old, deprecated attr ([bf0cdfd](https://github.com/nrkno/tv-automation-server-core/commit/bf0cdfd)) +- Removed the hard-coded link in the header that set the translation to Norwegian Bokmål. ([4515066](https://github.com/nrkno/tv-automation-server-core/commit/4515066)) +- removed uploadFileToAtem function, this should be done in devicesMakeReady ([4e96bb3](https://github.com/nrkno/tv-automation-server-core/commit/4e96bb3)) +- removed wrongful error throw ([852c495](https://github.com/nrkno/tv-automation-server-core/commit/852c495)) +- removed wrongful error throw ([b3deed1](https://github.com/nrkno/tv-automation-server-core/commit/b3deed1)) +- Removing trailing slashes in url defaults ([f6fa32c](https://github.com/nrkno/tv-automation-server-core/commit/f6fa32c)) +- rename "Edit" to "Trim" for clipTrimDialog ([3879a34](https://github.com/nrkno/tv-automation-server-core/commit/3879a34)) +- rename collection RundownBaselineItems => RundownBaselineObjs ([e471321](https://github.com/nrkno/tv-automation-server-core/commit/e471321)) +- rename InspectorDrawer to Shelf ([db6e778](https://github.com/nrkno/tv-automation-server-core/commit/db6e778)) +- rename method getShowStyleRef => getShowStyleConfigRef ([c8bbe95](https://github.com/nrkno/tv-automation-server-core/commit/c8bbe95)) +- rename restoreBackups page to Snapshots ([0c5103f](https://github.com/nrkno/tv-automation-server-core/commit/0c5103f)) +- rename rundownAPI => runningOrderAPI ([89d48d0](https://github.com/nrkno/tv-automation-server-core/commit/89d48d0)) +- rename rundownBaselineAdLibItem => rundownBaselineAdLibPiece ([82f8327](https://github.com/nrkno/tv-automation-server-core/commit/82f8327)) +- rename runningOrder => rundown ([4eab6de](https://github.com/nrkno/tv-automation-server-core/commit/4eab6de)) +- rename segmentLine => part ([b56b55b](https://github.com/nrkno/tv-automation-server-core/commit/b56b55b)) +- rename SegmentLineAdLibItem => AdLibPiece ([04c50a9](https://github.com/nrkno/tv-automation-server-core/commit/04c50a9)) +- rename segmentLineItem => piece ([bf61c48](https://github.com/nrkno/tv-automation-server-core/commit/bf61c48)) +- Rename shelf, more fixes ([898247e](https://github.com/nrkno/tv-automation-server-core/commit/898247e)) +- rename siId to studioId in Timeline ([88f6039](https://github.com/nrkno/tv-automation-server-core/commit/88f6039)) +- rename some methods in RundownNotifier ([1a5b6ea](https://github.com/nrkno/tv-automation-server-core/commit/1a5b6ea)) +- rename some segmentLine props to parts ([344f796](https://github.com/nrkno/tv-automation-server-core/commit/344f796)) +- rename StudioInstallation => Studio ([22d0786](https://github.com/nrkno/tv-automation-server-core/commit/22d0786)) +- rename version 0.20.0 => 0.21.0 (release 6) ([7b1ee3a](https://github.com/nrkno/tv-automation-server-core/commit/7b1ee3a)) +- renames ([b606907](https://github.com/nrkno/tv-automation-server-core/commit/b606907)) +- Rerunning blueprints losing part timings ([e6c35b4](https://github.com/nrkno/tv-automation-server-core/commit/e6c35b4)) +- resetRunningOrder functionality in GUI ([4eb096a](https://github.com/nrkno/tv-automation-server-core/commit/4eb096a)) +- resetRunningorder should update timeline ([0d01e6a](https://github.com/nrkno/tv-automation-server-core/commit/0d01e6a)) +- resetRunningorder should update timeline ([35451b1](https://github.com/nrkno/tv-automation-server-core/commit/35451b1)) +- resetting running order rewind ([a122f2c](https://github.com/nrkno/tv-automation-server-core/commit/a122f2c)) +- resolve a typo in rabbitMQ.ts ([3b36ae3](https://github.com/nrkno/tv-automation-server-core/commit/3b36ae3)) +- resolve an issue with dropdown EditAttribute not selecting the undefined option ([9f85845](https://github.com/nrkno/tv-automation-server-core/commit/9f85845)) +- resolve an issue with dropdown EditAttribute not selecting the undefined option ([2658ed3](https://github.com/nrkno/tv-automation-server-core/commit/2658ed3)) +- resolve an issue with missing media notification after floating a line ([00fedce](https://github.com/nrkno/tv-automation-server-core/commit/00fedce)) +- resolve issue with ContextMenus in RO view ([8d9ba96](https://github.com/nrkno/tv-automation-server-core/commit/8d9ba96)) +- resolve issue with hit-area of Notification Center ([1618619](https://github.com/nrkno/tv-automation-server-core/commit/1618619)) +- resolve issue with lowPriority cron jobs ([f7c3c83](https://github.com/nrkno/tv-automation-server-core/commit/f7c3c83)) +- resolve issue with segmentLineDisplayDuration & segment duration ([a73ed09](https://github.com/nrkno/tv-automation-server-core/commit/a73ed09)) +- resolve issues with how play-from-here is displayed in GUI ([ebdb549](https://github.com/nrkno/tv-automation-server-core/commit/ebdb549)) +- resolve Media Object Status notifications bug ([367dcce](https://github.com/nrkno/tv-automation-server-core/commit/367dcce)) +- resolve merge issue ([0cbc75a](https://github.com/nrkno/tv-automation-server-core/commit/0cbc75a)) +- resolve some sizing issues in the RD view ([f0c1826](https://github.com/nrkno/tv-automation-server-core/commit/f0c1826)) +- Respect disableOutTransition on SegmentLine during manual takes (not just autonext) ([f19788d](https://github.com/nrkno/tv-automation-server-core/commit/f19788d)) +- restore blueprint settings page ([faa7fdd](https://github.com/nrkno/tv-automation-server-core/commit/faa7fdd)) +- restore running order 'backup' fails if doesnt already exist ([87b3300](https://github.com/nrkno/tv-automation-server-core/commit/87b3300)) +- retry strategy for restart casparcg cronjob ([b54f0f6](https://github.com/nrkno/tv-automation-server-core/commit/b54f0f6)) +- reversed logic during refactoring by mistake ([694191e](https://github.com/nrkno/tv-automation-server-core/commit/694191e)) +- Revert 594a1e7 ([edeb166](https://github.com/nrkno/tv-automation-server-core/commit/edeb166)) +- rewind all segments when re-enabling follow on air ([a23b84c](https://github.com/nrkno/tv-automation-server-core/commit/a23b84c)) +- rewind icon was not responsive in ROFullscreenControls ([2e7c1d2](https://github.com/nrkno/tv-automation-server-core/commit/2e7c1d2)) +- rewind icon was not responsive in ROFullscreenControls ([0e494df](https://github.com/nrkno/tv-automation-server-core/commit/0e494df)) +- rewind UI even if reset returns error ([3bd5417](https://github.com/nrkno/tv-automation-server-core/commit/3bd5417)) +- rewind UI even if reset returns error ([08c5d6b](https://github.com/nrkno/tv-automation-server-core/commit/08c5d6b)) +- reworked systemStatus to use components instead ([cccfe3c](https://github.com/nrkno/tv-automation-server-core/commit/cccfe3c)) +- Rewrite piece durations to allow for specifying end instead of duration ([9dee8a6](https://github.com/nrkno/tv-automation-server-core/commit/9dee8a6)) +- right zoom area handle stops moving after first move ([20820fa](https://github.com/nrkno/tv-automation-server-core/commit/20820fa)) +- RO buttons z-order ([3c53254](https://github.com/nrkno/tv-automation-server-core/commit/3c53254)) +- RO buttons z-order ([15e9da8](https://github.com/nrkno/tv-automation-server-core/commit/15e9da8)) +- RO config changed notification not updating when RO is updated ([f5c2540](https://github.com/nrkno/tv-automation-server-core/commit/f5c2540)) +- RO notification action ([36cf900](https://github.com/nrkno/tv-automation-server-core/commit/36cf900)) +- RO Notifications fixes attempt no. 3 ([f0eee1f](https://github.com/nrkno/tv-automation-server-core/commit/f0eee1f)) +- RO overview crashed during rebuild of RO ([d2c62a1](https://github.com/nrkno/tv-automation-server-core/commit/d2c62a1)) +- ro-reset does not reset properly ([6367658](https://github.com/nrkno/tv-automation-server-core/commit/6367658)) +- roReset should reset holdItems and infinites ([bdf8385](https://github.com/nrkno/tv-automation-server-core/commit/bdf8385)) +- run afterUpdateTimeline after timelineTriggerTime ([98ece60](https://github.com/nrkno/tv-automation-server-core/commit/98ece60)) +- Rundown name dissappearing from view ([91dcc21](https://github.com/nrkno/tv-automation-server-core/commit/91dcc21)) +- running blueprint migrations ([fe1e7fd](https://github.com/nrkno/tv-automation-server-core/commit/fe1e7fd)) +- Running blueprints and migrations ([3b29df3](https://github.com/nrkno/tv-automation-server-core/commit/3b29df3)) +- running order closing prompt ([3024543](https://github.com/nrkno/tv-automation-server-core/commit/3024543)) +- running order closing prompt ([7074cc3](https://github.com/nrkno/tv-automation-server-core/commit/7074cc3)) +- Running Order Notifications in activeRo view ([63658b1](https://github.com/nrkno/tv-automation-server-core/commit/63658b1)) +- Running order status notifying wrong dep ([e6b84e5](https://github.com/nrkno/tv-automation-server-core/commit/e6b84e5)) +- running order view notifications in production build ([b593323](https://github.com/nrkno/tv-automation-server-core/commit/b593323)) +- saveIntoDb: throw if trying to insert objects with non-unique identifiers ([85791d7](https://github.com/nrkno/tv-automation-server-core/commit/85791d7)) +- scroll needed check ([5e8c77c](https://github.com/nrkno/tv-automation-server-core/commit/5e8c77c)) +- seek support in VT, STK, hoverscrub ([43e413b](https://github.com/nrkno/tv-automation-server-core/commit/43e413b)) +- semver.clean cannot handle undefined input parameter ([333588a](https://github.com/nrkno/tv-automation-server-core/commit/333588a)) +- send utf-8 filenames properly in Content-Disposition ([60eb521](https://github.com/nrkno/tv-automation-server-core/commit/60eb521)) +- separate warnings for black frames & freeze frames ([e2acad5](https://github.com/nrkno/tv-automation-server-core/commit/e2acad5)) +- Set KAM source layer, and a probably incorrect duration (but its now non-zero) ([6e152f0](https://github.com/nrkno/tv-automation-server-core/commit/6e152f0)) +- set tsr multithreading from UI instead of CLI ([c8be25b](https://github.com/nrkno/tv-automation-server-core/commit/c8be25b)) +- setAsNext on previous ([4ffe665](https://github.com/nrkno/tv-automation-server-core/commit/4ffe665)) +- setAsNext on previous ([6ced09b](https://github.com/nrkno/tv-automation-server-core/commit/6ced09b)) +- setAsNext on previous line no longer shows default state, but now instead stalls when attempting to take ([e441aaf](https://github.com/nrkno/tv-automation-server-core/commit/e441aaf)) +- settings styling improvements, code fixes ([d9484cd](https://github.com/nrkno/tv-automation-server-core/commit/d9484cd)) +- shelf height would not change ([123b407](https://github.com/nrkno/tv-automation-server-core/commit/123b407)) +- show connected devices in RO view ([e804d1e](https://github.com/nrkno/tv-automation-server-core/commit/e804d1e)) +- show full timecode for set with of offset ([0954ce6](https://github.com/nrkno/tv-automation-server-core/commit/0954ce6)) +- show media errors in segment header ([3775d2e](https://github.com/nrkno/tv-automation-server-core/commit/3775d2e)) +- show ShowStyleBase name as a part of the ShowStyleVariant name in Studios ([ba67011](https://github.com/nrkno/tv-automation-server-core/commit/ba67011)) +- ShowStyleVariant settings not saving changes ([e90137b](https://github.com/nrkno/tv-automation-server-core/commit/e90137b)) +- simplify getRSourceLayer - unnecessary null check ([0405f35](https://github.com/nrkno/tv-automation-server-core/commit/0405f35)) +- since afterUpdateTimeline is called in from a syncFunctionIgnore-function, we can remove the timeout ([e7f8f25](https://github.com/nrkno/tv-automation-server-core/commit/e7f8f25)) +- skip an allocation in RundownTiming ([db83682](https://github.com/nrkno/tv-automation-server-core/commit/db83682)) +- skip untranslated strings from po files, update i18next-conv to latest version ([1de4ccb](https://github.com/nrkno/tv-automation-server-core/commit/1de4ccb)) +- sl prod init ([2ff4a46](https://github.com/nrkno/tv-automation-server-core/commit/2ff4a46)) +- smoother handling when reloading ENPS data ([83be7cb](https://github.com/nrkno/tv-automation-server-core/commit/83be7cb)) +- snapshots ([182c221](https://github.com/nrkno/tv-automation-server-core/commit/182c221)) +- SOAP message encoding ([b19ea77](https://github.com/nrkno/tv-automation-server-core/commit/b19ea77)) +- SOAP message encoding ([63d8634](https://github.com/nrkno/tv-automation-server-core/commit/63d8634)) +- solve a problem with viewing recordings ([01c165b](https://github.com/nrkno/tv-automation-server-core/commit/01c165b)) +- solve a problem with viewing recordings ([09aa112](https://github.com/nrkno/tv-automation-server-core/commit/09aa112)) +- solve an issue with content trimmed icon ([461617f](https://github.com/nrkno/tv-automation-server-core/commit/461617f)) +- Some durations using removed self references ([b3b7776](https://github.com/nrkno/tv-automation-server-core/commit/b3b7776)) +- Some fatal bugs in a clean installation ([b311ae1](https://github.com/nrkno/tv-automation-server-core/commit/b311ae1)) +- some minor react errors in the settings ([d7bb849](https://github.com/nrkno/tv-automation-server-core/commit/d7bb849)) +- some more linting and refactoring due to deprecation of certain lifecycle methods ([a6d1cc6](https://github.com/nrkno/tv-automation-server-core/commit/a6d1cc6)) +- some more margin touch-ups ([71a291a](https://github.com/nrkno/tv-automation-server-core/commit/71a291a)) +- some more margin touch-ups ([c8b6f1e](https://github.com/nrkno/tv-automation-server-core/commit/c8b6f1e)) +- Some mos typing errors, and references to old runningorderdatacache ([3722a86](https://github.com/nrkno/tv-automation-server-core/commit/3722a86)) +- some playout and rundown issues ([c235fda](https://github.com/nrkno/tv-automation-server-core/commit/c235fda)) +- some playout bugs ([065de84](https://github.com/nrkno/tv-automation-server-core/commit/065de84)) +- Some playout bugs ([08ec090](https://github.com/nrkno/tv-automation-server-core/commit/08ec090)) +- Some playout timeline bugs ([f4ad363](https://github.com/nrkno/tv-automation-server-core/commit/f4ad363)) +- speech synthesis: say the countdown time slightly earlier. and fix of a bug from the Big Renaming ([fa0c334](https://github.com/nrkno/tv-automation-server-core/commit/fa0c334)) +- split abbreviation spacing ([43ea9d5](https://github.com/nrkno/tv-automation-server-core/commit/43ea9d5)) +- Start on template for KAM ÅPNING ([4cd682f](https://github.com/nrkno/tv-automation-server-core/commit/4cd682f)) +- status colors ([46fdaf1](https://github.com/nrkno/tv-automation-server-core/commit/46fdaf1)) +- strip blueprint manifest versions of '^' ([54a5ecf](https://github.com/nrkno/tv-automation-server-core/commit/54a5ecf)) +- StudioInstallation key-value config tidying ([4b0bc1a](https://github.com/nrkno/tv-automation-server-core/commit/4b0bc1a)) +- styling fix for z-order with menu and RO buttons ([1b0717e](https://github.com/nrkno/tv-automation-server-core/commit/1b0717e)) +- subscription handling ([8aaa3ec](https://github.com/nrkno/tv-automation-server-core/commit/8aaa3ec)) +- super.componentWillUnmount is required ([2342e48](https://github.com/nrkno/tv-automation-server-core/commit/2342e48)) +- suppress console.errors, display notifications whenever possible ([5918886](https://github.com/nrkno/tv-automation-server-core/commit/5918886)) +- syncFunction only timing out when any other syncFunction gets queued ([2d45122](https://github.com/nrkno/tv-automation-server-core/commit/2d45122)) +- syntax errors in test file ([a8f5d1e](https://github.com/nrkno/tv-automation-server-core/commit/a8f5d1e)) +- systemStatus \_internal messages ([05fd6c8](https://github.com/nrkno/tv-automation-server-core/commit/05fd6c8)) +- systemStatus \_internal messages ([d150f54](https://github.com/nrkno/tv-automation-server-core/commit/d150f54)) +- systemStatus messages ([e595e5b](https://github.com/nrkno/tv-automation-server-core/commit/e595e5b)) +- systemStatus messages ([17420cc](https://github.com/nrkno/tv-automation-server-core/commit/17420cc)) +- systemStatus versions ([62bfa9a](https://github.com/nrkno/tv-automation-server-core/commit/62bfa9a)) +- take action should not throw as nasty errors when called by user. ([6791d50](https://github.com/nrkno/tv-automation-server-core/commit/6791d50)) +- take playOffset into account for timing ([422783a](https://github.com/nrkno/tv-automation-server-core/commit/422783a)) +- templates with wipe. Readd seperate audio file ([5be2802](https://github.com/nrkno/tv-automation-server-core/commit/5be2802)) +- temporary fix for the "UnhandledPromiseRejectionWarning" bug, supressing the error when used ([7aa7cf8](https://github.com/nrkno/tv-automation-server-core/commit/7aa7cf8)) +- temporary fix of typing error ([73bf56d](https://github.com/nrkno/tv-automation-server-core/commit/73bf56d)) +- temporary ignore typings issue ([abb5d71](https://github.com/nrkno/tv-automation-server-core/commit/abb5d71)) +- test-tools decklink input format dropdown has no options ([b02f447](https://github.com/nrkno/tv-automation-server-core/commit/b02f447)) +- text shadow in SegmentLineLabels ([3a310b1](https://github.com/nrkno/tv-automation-server-core/commit/3a310b1)) +- tie snapshot to evaluation ([ec18370](https://github.com/nrkno/tv-automation-server-core/commit/ec18370)) +- Timeline always being built without previous segmentline ([a077805](https://github.com/nrkno/tv-automation-server-core/commit/a077805)) +- timeline dep ([b26eecb](https://github.com/nrkno/tv-automation-server-core/commit/b26eecb)) +- timeline resolution bug for non-infinite items ([35fc40a](https://github.com/nrkno/tv-automation-server-core/commit/35fc40a)) +- timeline statobj didn't update on inactivate (empty timeline) ([839b906](https://github.com/nrkno/tv-automation-server-core/commit/839b906)) +- timeline statObject: updated hashing function ([e00a01c](https://github.com/nrkno/tv-automation-server-core/commit/e00a01c)) +- Timeline viewer infinite loop ([74856df](https://github.com/nrkno/tv-automation-server-core/commit/74856df)) +- **playout:** Ensure that infinite segmentLineItems are reset correctly after being removed by some hotkeys ([045c9b1](https://github.com/nrkno/tv-automation-server-core/commit/045c9b1)) +- timelineObj \_id missing ([1dcedbf](https://github.com/nrkno/tv-automation-server-core/commit/1dcedbf)) +- timelineObj \_id missing ([0f8e0da](https://github.com/nrkno/tv-automation-server-core/commit/0f8e0da)) +- **adlib:** Allow for overlap of adlib sli to give preload time ([d2f0dcd](https://github.com/nrkno/tv-automation-server-core/commit/d2f0dcd)) +- **adlib:** An adlib replacing the main sli of a sl would not adjust the length of the original. F5/F6 sometimes failed to insert a sli correctly, causing black ([fca6f05](https://github.com/nrkno/tv-automation-server-core/commit/fca6f05)) +- **adlib:** Set as next on SL after using F5/F6 would not restore correctly ([3829293](https://github.com/nrkno/tv-automation-server-core/commit/3829293)) +- **asRunLog:** wrong id, typo ([636fc41](https://github.com/nrkno/tv-automation-server-core/commit/636fc41)) +- **backup:** make restore running order less strict ([e78313f](https://github.com/nrkno/tv-automation-server-core/commit/e78313f)) +- **blueprint:** Fill in missing TimelineObj fields ([0ed7663](https://github.com/nrkno/tv-automation-server-core/commit/0ed7663)) +- **blueprint:** fix manifest config add item showing an 'undefined' option ([fa6182a](https://github.com/nrkno/tv-automation-server-core/commit/fa6182a)) +- **blueprint:** Remove invalid backup restore code ([2e00eca](https://github.com/nrkno/tv-automation-server-core/commit/2e00eca)) +- **blueprints:** Ensure ids are not duplicated ([fbd0a04](https://github.com/nrkno/tv-automation-server-core/commit/fbd0a04)) +- **blueprints:** Ensure the object ids generated by the post-process blueprint are unique ([bdee540](https://github.com/nrkno/tv-automation-server-core/commit/bdee540)) +- **cam/dir:** clear hotkeys ([2545de8](https://github.com/nrkno/tv-automation-server-core/commit/2545de8)) +- **clip metadata:** timebase info ([5c39ea8](https://github.com/nrkno/tv-automation-server-core/commit/5c39ea8)) +- **countdowns:** ignore sourceLayers that we don't have an icon for ([27b2ac0](https://github.com/nrkno/tv-automation-server-core/commit/27b2ac0)) +- **countdowns:** split text parsing ([9a174ae](https://github.com/nrkno/tv-automation-server-core/commit/9a174ae)) +- **Devices:** Better strings and device list layouts (less details) ([be26a18](https://github.com/nrkno/tv-automation-server-core/commit/be26a18)) +- **displayDurationGroup:** fix GUI clocks for displayDurationGroups ([76e217e](https://github.com/nrkno/tv-automation-server-core/commit/76e217e)) +- **displayDurationGroup:** fix GUI clocks for displayDurationGroups ([10ac255](https://github.com/nrkno/tv-automation-server-core/commit/10ac255)) +- **displayDurationGroup:** use displayDurationGroup timing in presenter's screen ([61e04f9](https://github.com/nrkno/tv-automation-server-core/commit/61e04f9)) +- **displayDurationGroup:** use displayDurationGroup timing in presenter's screen ([9138845](https://github.com/nrkno/tv-automation-server-core/commit/9138845)) +- **emberplus:** changes intiDB mapping to new .-delimited string format ([b6d8bc7](https://github.com/nrkno/tv-automation-server-core/commit/b6d8bc7)) +- **expected media items:** use a function instead of fat arrow ([fa23c05](https://github.com/nrkno/tv-automation-server-core/commit/fa23c05)) +- **externalMessage:** encode proper html-entities in strings ([243995c](https://github.com/nrkno/tv-automation-server-core/commit/243995c)) +- **FirstObjects:** Reverts regression introduced by removing isAbstract from firstObject items ([8f1608b](https://github.com/nrkno/tv-automation-server-core/commit/8f1608b)) +- **GUI:** bug in EditAttribute dropdown, causing NaN to be written if optionsAreNumbers is not set ([4b17853](https://github.com/nrkno/tv-automation-server-core/commit/4b17853)) +- **GUI:** bug in EditAttribute dropdown, causing NaN to be written if optionsAreNumbers is not set ([efc1162](https://github.com/nrkno/tv-automation-server-core/commit/efc1162)) +- **hold:** Disable transition when in HOLD ([cfcb141](https://github.com/nrkno/tv-automation-server-core/commit/cfcb141)) +- **hold:** Disable transition when leaving HOLD ([809dd34](https://github.com/nrkno/tv-automation-server-core/commit/809dd34)) +- **hold:** Disable transition when leaving HOLD ([6b7184c](https://github.com/nrkno/tv-automation-server-core/commit/6b7184c)) +- **hold:** Disable transition when leaving or leaving HOLD ([ef5cbcb](https://github.com/nrkno/tv-automation-server-core/commit/ef5cbcb)) +- **hold:** Ensure the original stk does not get picked up as a dynamic object when setting the sl as next ([b10f48d](https://github.com/nrkno/tv-automation-server-core/commit/b10f48d)) +- **hold:** Ensure the original stk does not get picked up as a dynamic object when setting the sl as next ([225304d](https://github.com/nrkno/tv-automation-server-core/commit/225304d)) +- **hold:** Ensure the original stk does not get picked up as a dynamic object when setting the sl as next ([22da4d8](https://github.com/nrkno/tv-automation-server-core/commit/22da4d8)) +- **hold:** keep showing any infinite items that existed on the previous sl ([21a9973](https://github.com/nrkno/tv-automation-server-core/commit/21a9973)) +- **hold:** Too many sli being extended for hold mode ([f644e32](https://github.com/nrkno/tv-automation-server-core/commit/f644e32)) +- **hold:** When extending a sli during hold, use the original id to make any triggers on the sli work ([a3fd1a6](https://github.com/nrkno/tv-automation-server-core/commit/a3fd1a6)) +- **hold:** When extending a sli during hold, use the original id to make any triggers on the sli work ([669a4b2](https://github.com/nrkno/tv-automation-server-core/commit/669a4b2)) +- **infinite:** Persist overrideDuration when updating infinites ([72670d5](https://github.com/nrkno/tv-automation-server-core/commit/72670d5)) +- **infinite:** Persist overrideDuration when updating infinites ([b15bfa3](https://github.com/nrkno/tv-automation-server-core/commit/b15bfa3)) +- **infinite items:** removes infinite icon from outOnNextSegment ([4a75d7d](https://github.com/nrkno/tv-automation-server-core/commit/4a75d7d)) +- **ingest:** Error when removeSegment doesnt remove anything. Call updateDynamicPartRanks after importing ingest data ([5bf0c95](https://github.com/nrkno/tv-automation-server-core/commit/5bf0c95)) +- **ingest:** Rewrite portions of the removeX and afterRemoveX functions to allow batching changes and make more durable ([2457a29](https://github.com/nrkno/tv-automation-server-core/commit/2457a29)) +- **ingest:** Save notes generated by blueprints ([06fac36](https://github.com/nrkno/tv-automation-server-core/commit/06fac36)) +- **ingest:** Some syncFunction timeouts. Finish a bit more of the mos ingest ([38e7576](https://github.com/nrkno/tv-automation-server-core/commit/38e7576)) +- **ingest:** Tidy up the peripheraldevice api ingest method parameters and expect valid Ingest types to be sent by the gateway ([a49fb7c](https://github.com/nrkno/tv-automation-server-core/commit/a49fb7c)) +- **ingest:** Use Ingest types for the peripheraldevice ingest api methods (Some mangling is still done internally to fix up spreadsheet gateway data) ([4a5421b](https://github.com/nrkno/tv-automation-server-core/commit/4a5421b)) +- **init:** Adds default lawo device settings ([28759df](https://github.com/nrkno/tv-automation-server-core/commit/28759df)) +- **init:** adds qwerty to bakskjerm ([a45de4d](https://github.com/nrkno/tv-automation-server-core/commit/a45de4d)) +- **init:** adds qwerty to bakskjerm ([7329976](https://github.com/nrkno/tv-automation-server-core/commit/7329976)) +- **init:** adds qwerty to bakskjerm ([78198c9](https://github.com/nrkno/tv-automation-server-core/commit/78198c9)) +- **init:** hides klokke and logo layers by default ([1847ca4](https://github.com/nrkno/tv-automation-server-core/commit/1847ca4)) +- **init:** Layer names ([221b374](https://github.com/nrkno/tv-automation-server-core/commit/221b374)) +- **init:** Layer names ([16a504c](https://github.com/nrkno/tv-automation-server-core/commit/16a504c)) +- **init:** Splits init_layers and init_config. ([e056e5a](https://github.com/nrkno/tv-automation-server-core/commit/e056e5a)) +- **init:** swaps MP2 and MP1NXT layers ([b8a370c](https://github.com/nrkno/tv-automation-server-core/commit/b8a370c)) +- **init:** updated channel orders after 2-caspar setup ([3404b9b](https://github.com/nrkno/tv-automation-server-core/commit/3404b9b)) +- **Init:** Creat empty settings for Nora ([f8d0669](https://github.com/nrkno/tv-automation-server-core/commit/f8d0669)) +- **Init:** fixes wrong mapping of Lawo RMs ([ee68432](https://github.com/nrkno/tv-automation-server-core/commit/ee68432)) +- **Init:** Sets init defaults to xpro ([fd9c182](https://github.com/nrkno/tv-automation-server-core/commit/fd9c182)) +- **Initdb:** Preload vignett ([156a454](https://github.com/nrkno/tv-automation-server-core/commit/156a454)) +- **Initdb:** Preload vignett ([9470318](https://github.com/nrkno/tv-automation-server-core/commit/9470318)) +- **iterateDeeply:** typos ([c9198f1](https://github.com/nrkno/tv-automation-server-core/commit/c9198f1)) +- **L3rd pop-up:** filter out properties starting with @ ([19977e7](https://github.com/nrkno/tv-automation-server-core/commit/19977e7)) +- **L3rd pop-up:** filter out properties starting with @ ([c85ebeb](https://github.com/nrkno/tv-automation-server-core/commit/c85ebeb)) +- **lawo:** changes tempaltes to new structure ([29bf666](https://github.com/nrkno/tv-automation-server-core/commit/29bf666)) +- **lawo:** more generic timeline object ([b0418ab](https://github.com/nrkno/tv-automation-server-core/commit/b0418ab)) +- **lookahead:** clear inGroup in a better fashion ([60541cc](https://github.com/nrkno/tv-automation-server-core/commit/60541cc)) +- **lookahead:** consider transitions properly in lookahead ([c78c6fa](https://github.com/nrkno/tv-automation-server-core/commit/c78c6fa)) +- **lookahead:** Dont run lookahead on abs0 sli if there is an active transition. ([bb4123a](https://github.com/nrkno/tv-automation-server-core/commit/bb4123a)) +- **lookahead:** Dont run lookahead on abs0 sli if there is an active transition. ([191df09](https://github.com/nrkno/tv-automation-server-core/commit/191df09)) +- **lookahead:** Fix lookahead when transition does not define clip. Fix duplicate key exception when using hold multiple times at the same point ([a1bb026](https://github.com/nrkno/tv-automation-server-core/commit/a1bb026)) +- **lookahead:** Fix lookahead when transition object starts at abs0 ([bd3edbd](https://github.com/nrkno/tv-automation-server-core/commit/bd3edbd)) +- **lookahead:** Fix lookahead when transition object starts at abs0 ([c88c830](https://github.com/nrkno/tv-automation-server-core/commit/c88c830)) +- **lookahead:** Give lookahead the correct limit when in the next SegmentLine during autonext ([a3a299a](https://github.com/nrkno/tv-automation-server-core/commit/a3a299a)) +- **lookahead:** Give lookahead the correct limit when in the next SegmentLine during autonext ([0b20b9e](https://github.com/nrkno/tv-automation-server-core/commit/0b20b9e)) +- **lookahead:** Ignore transition if this is the first sl and so no transition will be used ([3df2e1e](https://github.com/nrkno/tv-automation-server-core/commit/3df2e1e)) +- **lookahead:** Not using transition info when in a segmentline with no previous segmentline ([917b34e](https://github.com/nrkno/tv-automation-server-core/commit/917b34e)) +- **lookahead:** Produced objects not resolving properly ([7660bf5](https://github.com/nrkno/tv-automation-server-core/commit/7660bf5)) +- **lookahead:** Produced objects not resolving properly ([322a94f](https://github.com/nrkno/tv-automation-server-core/commit/322a94f)) +- **lookahead:** Resolving an object for both transition clip and main clip causing an extra loadbg ([875bd1a](https://github.com/nrkno/tv-automation-server-core/commit/875bd1a)) +- **lookahead:** Resolving an object for both transition clip and main clip causing an extra loadbg ([739b5e4](https://github.com/nrkno/tv-automation-server-core/commit/739b5e4)) +- **lookahead:** RETAIN mode now follows the WHEN_CLEAR behaviour instead of PRELOAD ([f0df41c](https://github.com/nrkno/tv-automation-server-core/commit/f0df41c)) +- **media formats:** do not 2x interlaced frame rates ([1639c32](https://github.com/nrkno/tv-automation-server-core/commit/1639c32)) +- **media manager:** label on MM workFlow ([fc2e8d5](https://github.com/nrkno/tv-automation-server-core/commit/fc2e8d5)) +- **media manager ui:** display work step labels correctly ([05cce78](https://github.com/nrkno/tv-automation-server-core/commit/05cce78)) +- **media manager ui:** fix task list layout issue ([9902dc1](https://github.com/nrkno/tv-automation-server-core/commit/9902dc1)) +- **media manager ui:** media manager flow order ([1eb1c48](https://github.com/nrkno/tv-automation-server-core/commit/1eb1c48)) +- **migration:** Missing studio0_audio_bed ([1c6edcc](https://github.com/nrkno/tv-automation-server-core/commit/1c6edcc)) +- **migration:** overrideSteps should be applied before .validate() is run, so overrideSteps works independent of the validation result. ([c9c1f25](https://github.com/nrkno/tv-automation-server-core/commit/c9c1f25)) +- **migrations:** Broken StudioContext.updateDevice method ([7311d10](https://github.com/nrkno/tv-automation-server-core/commit/7311d10)) +- **migrations:** Broken StudioContext.updateDevice method ([d882e8b](https://github.com/nrkno/tv-automation-server-core/commit/d882e8b)) +- **migrations:** Check migrate function exists before trying to run it ([cf076f5](https://github.com/nrkno/tv-automation-server-core/commit/cf076f5)) +- **migrations:** Create ShowStyleVariant with ShowStyleBase in the migrations and setup studio to use it as its default ([75073d4](https://github.com/nrkno/tv-automation-server-core/commit/75073d4)) +- **migrations:** DependOnResultFrom id was not being prefixed causing it to never work ([602740c](https://github.com/nrkno/tv-automation-server-core/commit/602740c)) +- **migrations:** DependOnResultFrom id was not being prefixed causing it to never work ([5830754](https://github.com/nrkno/tv-automation-server-core/commit/5830754)) +- **migrations:** Ensure there are migrations to run before running another batch ([3b703e5](https://github.com/nrkno/tv-automation-server-core/commit/3b703e5)) +- **migrations:** Ensure there are migrations to run before running another batch ([c3d77b5](https://github.com/nrkno/tv-automation-server-core/commit/c3d77b5)) +- **migrations:** Uncomment mos check migration ([c262fff](https://github.com/nrkno/tv-automation-server-core/commit/c262fff)) +- **migrations:** Various problems when running from empty ([11d1d0b](https://github.com/nrkno/tv-automation-server-core/commit/11d1d0b)) +- **mos:** Mos ingest typing errors ([8f08f6e](https://github.com/nrkno/tv-automation-server-core/commit/8f08f6e)) +- **mos:** move stories. Refactor updating next-part to be seperately testable ([19b2d05](https://github.com/nrkno/tv-automation-server-core/commit/19b2d05)) +- **mos:** Segment externalId is now based on externalId of first part, instead of rank ([0916113](https://github.com/nrkno/tv-automation-server-core/commit/0916113)) +- **mos:** Set next part logic after story updates ([2b8cf47](https://github.com/nrkno/tv-automation-server-core/commit/2b8cf47)) +- **notification center:** fix notification center toggle button in RO view ([894c1e2](https://github.com/nrkno/tv-automation-server-core/commit/894c1e2)) +- **notification center:** fix running order overview to line up with the Segments column ([0906cab](https://github.com/nrkno/tv-automation-server-core/commit/0906cab)) +- **notification center:** notification count position ([1d8d2cb](https://github.com/nrkno/tv-automation-server-core/commit/1d8d2cb)) +- **notification center:** reintroduce RunningOrderNotifier into RunningOrderView ([e70e5c9](https://github.com/nrkno/tv-automation-server-core/commit/e70e5c9)) +- **notifications:** change unknown to any ([7ac8008](https://github.com/nrkno/tv-automation-server-core/commit/7ac8008)) +- **Notifications refresh:** limit amount of reactive vars ([2c01e66](https://github.com/nrkno/tv-automation-server-core/commit/2c01e66)) +- **NRK Template:** Use LLayers Enum ([84ed5df](https://github.com/nrkno/tv-automation-server-core/commit/84ed5df)) +- **pharos:** add missing settingsType and migration step ([9f73a8e](https://github.com/nrkno/tv-automation-server-core/commit/9f73a8e)) +- **pharos:** add missing settingsType and migration step ([be618d2](https://github.com/nrkno/tv-automation-server-core/commit/be618d2)) +- **playout:** bad timing during autonext ([5524e3b](https://github.com/nrkno/tv-automation-server-core/commit/5524e3b)) +- **playout:** Better account for duration and overlaps with transitions etc. ([dc249a3](https://github.com/nrkno/tv-automation-server-core/commit/dc249a3)) +- **playout:** Double head2 headline out animation ([165e2c0](https://github.com/nrkno/tv-automation-server-core/commit/165e2c0)) +- **playout:** Double head2 headline out animation ([7ec91ff](https://github.com/nrkno/tv-automation-server-core/commit/7ec91ff)) +- **playout:** Ensure that infinite segmentLineItems are reset correctly after being removed by some hotkeys ([e4f8a83](https://github.com/nrkno/tv-automation-server-core/commit/e4f8a83)) +- **playout:** Fix overlap tests ([15628a2](https://github.com/nrkno/tv-automation-server-core/commit/15628a2)) +- **playout:** ID prefixing did not handle logical object id references ([44f2883](https://github.com/nrkno/tv-automation-server-core/commit/44f2883)) +- **playout:** Infinite item continuations were not always updated correctly ([7a7aed6](https://github.com/nrkno/tv-automation-server-core/commit/7a7aed6)) +- **playout:** Objects being written out without an id ([b05a851](https://github.com/nrkno/tv-automation-server-core/commit/b05a851)) +- userAction: increased timeout value for "waiting for..." notification ([f00e273](https://github.com/nrkno/tv-automation-server-core/commit/f00e273)) +- **playout:** Optimise layers of promises in infinite generation logic, and reorder function parameters ([e400c7c](https://github.com/nrkno/tv-automation-server-core/commit/e400c7c)) +- **playout:** R4 only partial merge of dc249a31b342e8bdbeb7faac064dd97cec15c3e8. Fix sl duration with autonext and no transitions ([17175c3](https://github.com/nrkno/tv-automation-server-core/commit/17175c3)) +- **playout:** Refactor setting object siId ([48de044](https://github.com/nrkno/tv-automation-server-core/commit/48de044)) +- **playout:** sl with autoNextOverlap not getting applied properly ([eb22967](https://github.com/nrkno/tv-automation-server-core/commit/eb22967)) +- **playout:** StatObj not being generated ([581d99d](https://github.com/nrkno/tv-automation-server-core/commit/581d99d)) +- **playout:** Typo in ID prefixing ([249b35d](https://github.com/nrkno/tv-automation-server-core/commit/249b35d)) +- **playout:** Use original sli id when adding infinite to the timeline, to ensure that any triggers on other objects resolve ([c0382ec](https://github.com/nrkno/tv-automation-server-core/commit/c0382ec)) +- **playout:** Use original sli id when adding infinite to the timeline, to ensure that any triggers on other objects resolve ([e7eb871](https://github.com/nrkno/tv-automation-server-core/commit/e7eb871)) +- **presenter screen:** display hours correctly ([e242a9e](https://github.com/nrkno/tv-automation-server-core/commit/e242a9e)) +- **presenter screen:** split background + text spacing ([9aad750](https://github.com/nrkno/tv-automation-server-core/commit/9aad750)) +- **rabbitmq:** send persistant messages ([ff8d375](https://github.com/nrkno/tv-automation-server-core/commit/ff8d375)) +- **record:** CR changes ([b3adbec](https://github.com/nrkno/tv-automation-server-core/commit/b3adbec)) +- **record:** Hide internal layer mappings ([24dfef1](https://github.com/nrkno/tv-automation-server-core/commit/24dfef1)) +- **refactor:** existing runningOrders were not migrated to the new data structure ([b20bc2d](https://github.com/nrkno/tv-automation-server-core/commit/b20bc2d)) +- **refactor:** remove stray debugger calls ([3be5c22](https://github.com/nrkno/tv-automation-server-core/commit/3be5c22)) +- **ro list:** translatify & hide 'Unsynced from MOS' label when no unsynced items ([fa56ecd](https://github.com/nrkno/tv-automation-server-core/commit/fa56ecd)) +- **ro list:** translatify & hide 'Unsynced from MOS' label when no unsynced items ([11b0f29](https://github.com/nrkno/tv-automation-server-core/commit/11b0f29)) +- **RO view:** Always persist original event in user-action methods ([6ba7df8](https://github.com/nrkno/tv-automation-server-core/commit/6ba7df8)) +- **rundown layout:** don't display segment headers when currentSegemnt filter is on ([9b09858](https://github.com/nrkno/tv-automation-server-core/commit/9b09858)) +- **rundown layouts:** issue with layer type filtering ([c41bd5a](https://github.com/nrkno/tv-automation-server-core/commit/c41bd5a)) +- **RundownView:** don't wrap on system status header ([0daaa6a](https://github.com/nrkno/tv-automation-server-core/commit/0daaa6a)) +- **runtimeArgs:** Removing infinite items from changed sl and anything following ([28ffd5d](https://github.com/nrkno/tv-automation-server-core/commit/28ffd5d)) +- **scroll:** fix issues with non-jQuery scroll methods ([4b5afb2](https://github.com/nrkno/tv-automation-server-core/commit/4b5afb2)) +- **snapshot:** SegmentLines were not being included in the snapshot ([d9a427e](https://github.com/nrkno/tv-automation-server-core/commit/d9a427e)) +- **snapshot:** SegmentLines were not being included in the snapshot ([224f806](https://github.com/nrkno/tv-automation-server-core/commit/224f806)) +- **sticky:** Fix sticky items with objects using relative triggers or durations ([0c47cff](https://github.com/nrkno/tv-automation-server-core/commit/0c47cff)) +- **template:** Caspar portion of in-transition for segmentline rerun whenever timeline was recalculated ([3373457](https://github.com/nrkno/tv-automation-server-core/commit/3373457)) +- **template:** graphic supers group using wrong trigger. ([e28d1ef](https://github.com/nrkno/tv-automation-server-core/commit/e28d1ef)) +- **template:** Reduce volume of head wipes ([b2092cc](https://github.com/nrkno/tv-automation-server-core/commit/b2092cc)) +- **template:** setup dsk properly ([2e8309c](https://github.com/nrkno/tv-automation-server-core/commit/2e8309c)) +- **templates:** Fix incorrect camera number used with head transition. Hook in sluttvignett. Fix segments not respecting overlapduration if no transition is used ([00b7cdd](https://github.com/nrkno/tv-automation-server-core/commit/00b7cdd)) +- **templates:** use enum for nora channels ([55c0cfc](https://github.com/nrkno/tv-automation-server-core/commit/55c0cfc)) +- **templates:** Various tweaks ([eb93c6a](https://github.com/nrkno/tv-automation-server-core/commit/eb93c6a)) +- **Test:** Verifying build and deploy script ([0b13e18](https://github.com/nrkno/tv-automation-server-core/commit/0b13e18)) +- **timeline:** don't round items in relative mode ([2938819](https://github.com/nrkno/tv-automation-server-core/commit/2938819)) +- timesync: better retry strategy on startup sync ([eda632a](https://github.com/nrkno/tv-automation-server-core/commit/eda632a)) +- toc trace message ([c53124f](https://github.com/nrkno/tv-automation-server-core/commit/c53124f)) +- Toggle hotkeys legend in support panel ([e6f4769](https://github.com/nrkno/tv-automation-server-core/commit/e6f4769)) +- too long script out-words could overlap with previous items ([8f8a9a2](https://github.com/nrkno/tv-automation-server-core/commit/8f8a9a2)) +- Tooltip import ([cd2b65a](https://github.com/nrkno/tv-automation-server-core/commit/cd2b65a)) +- tooltips after import change ([a82140f](https://github.com/nrkno/tv-automation-server-core/commit/a82140f)) +- top RO overview labels clipped in wrong places ([5e5c228](https://github.com/nrkno/tv-automation-server-core/commit/5e5c228)) +- Tweaked styling of evaluation form, warning messages, color of the next lines, translations, capialized warning icon file name, and optimized png and svg icons. ([50d2753](https://github.com/nrkno/tv-automation-server-core/commit/50d2753)) +- tweaks on externalMessage send function, limiting the number of messages sent in one go ([046ae38](https://github.com/nrkno/tv-automation-server-core/commit/046ae38)) +- type bug ([de43835](https://github.com/nrkno/tv-automation-server-core/commit/de43835)) +- type error in SegmentTimelineContainer ([c4d6b4d](https://github.com/nrkno/tv-automation-server-core/commit/c4d6b4d)) +- type error, ensure string ([76da25d](https://github.com/nrkno/tv-automation-server-core/commit/76da25d)) +- typing ([7c21efe](https://github.com/nrkno/tv-automation-server-core/commit/7c21efe)) +- typing fix: cannot find name 'monaco' ([3ad88ce](https://github.com/nrkno/tv-automation-server-core/commit/3ad88ce)) +- typing fixes, to work with updated packages ([b4362f7](https://github.com/nrkno/tv-automation-server-core/commit/b4362f7)) +- typings error, ensuring string ([1e25345](https://github.com/nrkno/tv-automation-server-core/commit/1e25345)) +- typings issue ([4f96c3d](https://github.com/nrkno/tv-automation-server-core/commit/4f96c3d)) +- typo ([2efc829](https://github.com/nrkno/tv-automation-server-core/commit/2efc829)) +- typo bug in performanceMonitor ([6a5eeb4](https://github.com/nrkno/tv-automation-server-core/commit/6a5eeb4)) +- typo bug in performanceMonitor ([797c393](https://github.com/nrkno/tv-automation-server-core/commit/797c393)) +- typo MediaResolutions vs mediaResolutions ([6a72e09](https://github.com/nrkno/tv-automation-server-core/commit/6a72e09)) +- Typographic tweaks for prompter. ([068d535](https://github.com/nrkno/tv-automation-server-core/commit/068d535)) +- UI bug: key in

missing ([b957660](https://github.com/nrkno/tv-automation-server-core/commit/b957660)) +- UI crash when outputLayer is undefined ([e6dd558](https://github.com/nrkno/tv-automation-server-core/commit/e6dd558)) +- UI fixes for some margins in the migrations view ([4dc6fef](https://github.com/nrkno/tv-automation-server-core/commit/4dc6fef)) +- ui manualPlayback key ([5d4e49f](https://github.com/nrkno/tv-automation-server-core/commit/5d4e49f)) +- ui manualPlayback key ([ca1a943](https://github.com/nrkno/tv-automation-server-core/commit/ca1a943)) +- UI tweaks for messages status view. so it doesn't break when having long error messages ([ca1e3ae](https://github.com/nrkno/tv-automation-server-core/commit/ca1e3ae)) +- UI: improve shapshot comment edit field ([093e6cb](https://github.com/nrkno/tv-automation-server-core/commit/093e6cb)) +- upd meteor typings ([53f17d2](https://github.com/nrkno/tv-automation-server-core/commit/53f17d2)) +- upd query-string dependency & fixed typings issue ([e0d3f12](https://github.com/nrkno/tv-automation-server-core/commit/e0d3f12)) +- update all data in roReplaceMetadata ([8a5a671](https://github.com/nrkno/tv-automation-server-core/commit/8a5a671)) +- update asRunLog typings ([5d18c66](https://github.com/nrkno/tv-automation-server-core/commit/5d18c66)) +- update blueprints-integration ([5b247f8](https://github.com/nrkno/tv-automation-server-core/commit/5b247f8)) +- update blueprints-integration ([28d17c2](https://github.com/nrkno/tv-automation-server-core/commit/28d17c2)) +- update blueprints-integration ([59c29f6](https://github.com/nrkno/tv-automation-server-core/commit/59c29f6)) +- Update blueprints-integration ([9870256](https://github.com/nrkno/tv-automation-server-core/commit/9870256)) +- update blueprints-integration depencendy & update getHashId to match ([e1c12d2](https://github.com/nrkno/tv-automation-server-core/commit/e1c12d2)) +- update design of presenter screen ([4f41195](https://github.com/nrkno/tv-automation-server-core/commit/4f41195)) +- update device last data timestamp ([ac82ebd](https://github.com/nrkno/tv-automation-server-core/commit/ac82ebd)) +- Update names passed to SegmentLineItems ([ed0fc0d](https://github.com/nrkno/tv-automation-server-core/commit/ed0fc0d)) +- update Next-line when inserting story just before it, also added property to track if the next point was set manually ([d82dbc6](https://github.com/nrkno/tv-automation-server-core/commit/d82dbc6)) +- update package versions to fix audit issues ([be3cae5](https://github.com/nrkno/tv-automation-server-core/commit/be3cae5)) +- update Part & Rundown classes from inherited interface ([956f4c6](https://github.com/nrkno/tv-automation-server-core/commit/956f4c6)) +- Update RO change notification on an interval, to ensure it catches changes to other document types ([79d8c05](https://github.com/nrkno/tv-automation-server-core/commit/79d8c05)) +- update ro data cache when getting new metadata ([d700783](https://github.com/nrkno/tv-automation-server-core/commit/d700783)) +- Update some playout timelineobj types ([fe883a8](https://github.com/nrkno/tv-automation-server-core/commit/fe883a8)) +- update supertimeline ([28bccfe](https://github.com/nrkno/tv-automation-server-core/commit/28bccfe)) +- update timeline dependency ([b83f6be](https://github.com/nrkno/tv-automation-server-core/commit/b83f6be)) +- Update timeline on new ingest data ([80ac1ed](https://github.com/nrkno/tv-automation-server-core/commit/80ac1ed)) +- Update timeline on removing a mos story ([fd3d443](https://github.com/nrkno/tv-automation-server-core/commit/fd3d443)) +- update timeline-visualizer ([8e46981](https://github.com/nrkno/tv-automation-server-core/commit/8e46981)) +- update timeline-visualizer ([a43166c](https://github.com/nrkno/tv-automation-server-core/commit/a43166c)) +- Update TimelineObjCCGRoute. ([203ef91](https://github.com/nrkno/tv-automation-server-core/commit/203ef91)) +- update ts-jest dependency ([69c3c64](https://github.com/nrkno/tv-automation-server-core/commit/69c3c64)) +- Update tsr version ([92359bd](https://github.com/nrkno/tv-automation-server-core/commit/92359bd)) +- update typings ([d536ad1](https://github.com/nrkno/tv-automation-server-core/commit/d536ad1)) +- update typings ([4accaea](https://github.com/nrkno/tv-automation-server-core/commit/4accaea)) +- update typings to match blueprints-integration ([f97f177](https://github.com/nrkno/tv-automation-server-core/commit/f97f177)) +- updated health endpoint according to spec ([c196382](https://github.com/nrkno/tv-automation-server-core/commit/c196382)) +- updated health endpoint according to spec ([900728b](https://github.com/nrkno/tv-automation-server-core/commit/900728b)) +- updated mock data ([a7a4ae5](https://github.com/nrkno/tv-automation-server-core/commit/a7a4ae5)) +- updated mock data ([3e140c6](https://github.com/nrkno/tv-automation-server-core/commit/3e140c6)) +- updated nightly cronjob: restart casparcg devices, to work with new restartCasparCG function implementation ([edbc186](https://github.com/nrkno/tv-automation-server-core/commit/edbc186)) +- updated nightly cronjob: restart casparcg devices, to work with new restartCasparCG function implementation ([3f9344d](https://github.com/nrkno/tv-automation-server-core/commit/3f9344d)) +- updated package-lock.json ([bf0cfde](https://github.com/nrkno/tv-automation-server-core/commit/bf0cfde)) +- updated systemTime endpoint ([503d2c8](https://github.com/nrkno/tv-automation-server-core/commit/503d2c8)) +- updated timeline dep (bugfixes) ([ff29ce6](https://github.com/nrkno/tv-automation-server-core/commit/ff29ce6)) +- updated versions file ([f6c9869](https://github.com/nrkno/tv-automation-server-core/commit/f6c9869)) +- updateExpectedMediaItems failing was causing the post-process blueprint to not be run. Errors from this are still logged, but no longer block blueprint execution ([2fe22bb](https://github.com/nrkno/tv-automation-server-core/commit/2fe22bb)) +- usage of logging.warning didn't work (use logging.warn() ) ([fbf7528](https://github.com/nrkno/tv-automation-server-core/commit/fbf7528)) +- use a single setState in updateVersions in MigrationsView ([afd730a](https://github.com/nrkno/tv-automation-server-core/commit/afd730a)) +- use admin as parameter instead of all ([20751b4](https://github.com/nrkno/tv-automation-server-core/commit/20751b4)) +- use DisplayName field for graphic elements ([e2e9014](https://github.com/nrkno/tv-automation-server-core/commit/e2e9014)) +- use floor for all positioning and sizing of segment lines ([8a84a7e](https://github.com/nrkno/tv-automation-server-core/commit/8a84a7e)) +- Use more consistent inputs in Blueprints page ([d223d11](https://github.com/nrkno/tv-automation-server-core/commit/d223d11)) +- Use new mediaPreviewsUrl setting ([1bd0ba4](https://github.com/nrkno/tv-automation-server-core/commit/1bd0ba4)) +- use parseRange for expected versions ([1604bea](https://github.com/nrkno/tv-automation-server-core/commit/1604bea)) +- use Range check instead of Version for minimumCoreVersion ([392c646](https://github.com/nrkno/tv-automation-server-core/commit/392c646)) +- use studioInstallationId of parent peripheralDevice ([7dedf9b](https://github.com/nrkno/tv-automation-server-core/commit/7dedf9b)) +- Use thin styling for a solo 'AUTO' label ([0c26d38](https://github.com/nrkno/tv-automation-server-core/commit/0c26d38)) +- Use thin styling for a solo 'AUTO' label ([74b5f15](https://github.com/nrkno/tv-automation-server-core/commit/74b5f15)) +- use unique id for baseline items cache entries ([cf89409](https://github.com/nrkno/tv-automation-server-core/commit/cf89409)) +- useractions: proper handling of the this keyword ([a2686db](https://github.com/nrkno/tv-automation-server-core/commit/a2686db)) +- useractions: proper handling of the this keyword ([49a44a7](https://github.com/nrkno/tv-automation-server-core/commit/49a44a7)) +- userActivity executionTime logging ([a3e763e](https://github.com/nrkno/tv-automation-server-core/commit/a3e763e)) +- Using object as notification message ([f06aee6](https://github.com/nrkno/tv-automation-server-core/commit/f06aee6)) +- **timeline:** Infinite sli do not update properly on new mos data. Fix detection of the end of the chain, and ensure the last is set to not infinite ([61b2930](https://github.com/nrkno/tv-automation-server-core/commit/61b2930)) +- various fixes after refactoring ([1a17414](https://github.com/nrkno/tv-automation-server-core/commit/1a17414)) +- **timeline:** Infinite sli do not update properly on new mos data. Fix detection of the end of the chain, and ensure the last is set to not infinite ([16d9715](https://github.com/nrkno/tv-automation-server-core/commit/16d9715)) +- **Timeline:** Corrects the angle of the gradient indication mix-in-transition on a segmentLineItem ([151ecf9](https://github.com/nrkno/tv-automation-server-core/commit/151ecf9)) +- **transition:** Delay sli not contents, to ensure relative triggers against the sli are correct (fixes sluttvignett with transition) ([856da4b](https://github.com/nrkno/tv-automation-server-core/commit/856da4b)) +- **transition:** reverses direction of wipe transitions ([9961a3f](https://github.com/nrkno/tv-automation-server-core/commit/9961a3f)) +- **transition:** Using wrong overlap when combined with autonext ([4c56102](https://github.com/nrkno/tv-automation-server-core/commit/4c56102)) +- **transitions:** Ensure they are run with the correct overlap on autonext ([bbc6ca2](https://github.com/nrkno/tv-automation-server-core/commit/bbc6ca2)) +- **transitions:** Timed graphics being run wrong ([8b39960](https://github.com/nrkno/tv-automation-server-core/commit/8b39960)) +- when restoring a runningOrder, use the .active property of the database (or false) ([b5e5b05](https://github.com/nrkno/tv-automation-server-core/commit/b5e5b05)) +- **UI:** Improves device settings and status page by removing information ([267c10c](https://github.com/nrkno/tv-automation-server-core/commit/267c10c)) +- **unsync:** refactor, add method to unsync runningOrder ([d54c147](https://github.com/nrkno/tv-automation-server-core/commit/d54c147)) +- **vignett:** do not preload vignett, as it is risky business preloading sluttvignett. Could be done better by separating vignett and sluttvignett ([b0da067](https://github.com/nrkno/tv-automation-server-core/commit/b0da067)) +- **vignett:** do not preload vignett, as it is risky business preloading sluttvignett. Could be done better by separating vignett and sluttvignett ([8bf7ff8](https://github.com/nrkno/tv-automation-server-core/commit/8bf7ff8)) +- Wrong icon for split in presenter view ([1ec1c56](https://github.com/nrkno/tv-automation-server-core/commit/1ec1c56)) +- **zoom:** moved zoom modifier for scroll action to ctrl ([80829f2](https://github.com/nrkno/tv-automation-server-core/commit/80829f2)) +- **zoom:** moved zoom modifier for scroll action to ctrl ([863d81e](https://github.com/nrkno/tv-automation-server-core/commit/863d81e)) +- various fixes for mocks ([aebcfc7](https://github.com/nrkno/tv-automation-server-core/commit/aebcfc7)) +- version handling ([4b9863a](https://github.com/nrkno/tv-automation-server-core/commit/4b9863a)) +- wait for response from MOS device until resolving segmentLineItemSetInOutPoints ([2572a11](https://github.com/nrkno/tv-automation-server-core/commit/2572a11)) +- when (for some reason) the currently playing part is missing in db, it was impossible to continue. ([e3ba048](https://github.com/nrkno/tv-automation-server-core/commit/e3ba048)) +- when activating, set Next if not set ([c9f71a1](https://github.com/nrkno/tv-automation-server-core/commit/c9f71a1)) +- when overriding componentWillUnmount, we need to call this.\_cleanup() ([0f39cd4](https://github.com/nrkno/tv-automation-server-core/commit/0f39cd4)) +- wrap all MeteorReactComponent.autoruns in nonreactive. ([9020c96](https://github.com/nrkno/tv-automation-server-core/commit/9020c96)) +- wrap ntpClient.getNetworkTime() in try/catch, as an attempt to fix fatal error thrown ([cd44862](https://github.com/nrkno/tv-automation-server-core/commit/cd44862)) +- write back TimeBase when changing EditorialStart/Duration ([8012cea](https://github.com/nrkno/tv-automation-server-core/commit/8012cea)) +- write back TimeBase with EditorialStart/Duration ([96f8e21](https://github.com/nrkno/tv-automation-server-core/commit/96f8e21)) +- Wrong icon for split in presenter view ([08c8df8](https://github.com/nrkno/tv-automation-server-core/commit/08c8df8)) ### Features -* add & remove studios ([81749b4](https://github.com/nrkno/tv-automation-server-core/commit/81749b4)) -* add a label of the source Piece on the ExpectedMediaItems ([bad1576](https://github.com/nrkno/tv-automation-server-core/commit/bad1576)) -* add a subtle line underneath segment title when has-remote-items and has-guest-items ([a02b50d](https://github.com/nrkno/tv-automation-server-core/commit/a02b50d)) -* add a subtle line underneath segment title when has-remote-items and has-guest-items ([4b1d582](https://github.com/nrkno/tv-automation-server-core/commit/4b1d582)) -* add a user-definable CoreSystem.name that is displayed in the header and title bar ([493568e](https://github.com/nrkno/tv-automation-server-core/commit/493568e)) -* add a user-definable CoreSystem.name that is displayed in the header and title bar ([717ee45](https://github.com/nrkno/tv-automation-server-core/commit/717ee45)) -* Add backup link to backup only active template data ([cdfffdf](https://github.com/nrkno/tv-automation-server-core/commit/cdfffdf)) -* Add backup restore method to import mock rundowns similar to the embedded mocks ([d71d9c7](https://github.com/nrkno/tv-automation-server-core/commit/d71d9c7)) -* Add backup restore method to import mock rundowns similar to the embedded mocks ([251555b](https://github.com/nrkno/tv-automation-server-core/commit/251555b)) -* **notification-center:** move expand notification center to right-hand status bar ([635c09d](https://github.com/nrkno/tv-automation-server-core/commit/635c09d)) -* add buttons to restart CasparCG servers ([c1396b4](https://github.com/nrkno/tv-automation-server-core/commit/c1396b4)) -* add category, type & subType to peripheralDevice ([34469f5](https://github.com/nrkno/tv-automation-server-core/commit/34469f5)) -* add checkbox for debugLogging in media manager ([64b80e9](https://github.com/nrkno/tv-automation-server-core/commit/64b80e9)) -* add default mocks ([2985af8](https://github.com/nrkno/tv-automation-server-core/commit/2985af8)) -* add editorconfig ([296f71d](https://github.com/nrkno/tv-automation-server-core/commit/296f71d)) -* add expected media items collection ([931536e](https://github.com/nrkno/tv-automation-server-core/commit/931536e)) -* Add expected media items collection ([04c15a9](https://github.com/nrkno/tv-automation-server-core/commit/04c15a9)) -* add fetchFrom() as a wrapper for fetch(), to handle non-200 responses as errors ([4e3734c](https://github.com/nrkno/tv-automation-server-core/commit/4e3734c)) -* add fonts ([e617d60](https://github.com/nrkno/tv-automation-server-core/commit/e617d60)) -* Add http put request timeline object ([14f391c](https://github.com/nrkno/tv-automation-server-core/commit/14f391c)) -* add httpWatcher settings ([fbb91d9](https://github.com/nrkno/tv-automation-server-core/commit/fbb91d9)) -* add IngestActions.regenerateRundown, for debugging & resetting of rundown ([ebefd42](https://github.com/nrkno/tv-automation-server-core/commit/ebefd42)) -* add jest ([3fab0ed](https://github.com/nrkno/tv-automation-server-core/commit/3fab0ed)) -* add link to compatible studios from ShowStyle page ([4be495c](https://github.com/nrkno/tv-automation-server-core/commit/4be495c)) -* Add LOG_FILE env var to specify the file to log to ([8a192bc](https://github.com/nrkno/tv-automation-server-core/commit/8a192bc)) -* Add LOG_FILE env var to specify the file to log to ([d2ad941](https://github.com/nrkno/tv-automation-server-core/commit/d2ad941)) -* Add Media_Manager DeviceType ([2b612c7](https://github.com/nrkno/tv-automation-server-core/commit/2b612c7)) -* add methods for insert/remove blueprints ([8acb72b](https://github.com/nrkno/tv-automation-server-core/commit/8acb72b)) -* add migration steps, logging ([96aae63](https://github.com/nrkno/tv-automation-server-core/commit/96aae63)) -* add migrations for 0.25.0 ([9165255](https://github.com/nrkno/tv-automation-server-core/commit/9165255)) -* add nn translation and update nb translation ([922b93b](https://github.com/nrkno/tv-automation-server-core/commit/922b93b)) -* add nn-nynorsk and update nb-bokmal translation ([6db7a99](https://github.com/nrkno/tv-automation-server-core/commit/6db7a99)) -* add notes to RunningOrder ([6100b0c](https://github.com/nrkno/tv-automation-server-core/commit/6100b0c)) -* add option to input data into a ModalDialogue ([ef54b74](https://github.com/nrkno/tv-automation-server-core/commit/ef54b74)) -* Add OSC Playout device type ([bf426b5](https://github.com/nrkno/tv-automation-server-core/commit/bf426b5)) -* add performance monitor and track all server-side methods ([385f703](https://github.com/nrkno/tv-automation-server-core/commit/385f703)) -* add performance monitor and track all server-side methods ([2733d74](https://github.com/nrkno/tv-automation-server-core/commit/2733d74)) -* add peripheralDevice expectedVersions, to throw error if device version is too low. Refactor /health endpoint. ([51ed4c3](https://github.com/nrkno/tv-automation-server-core/commit/51ed4c3)) -* add property .deviceId to MediaWorkFlow & MedieWorkFlowStep, to indicate ownership. (preliminary implementation) ([62ac066](https://github.com/nrkno/tv-automation-server-core/commit/62ac066)) -* add restart button ([6083145](https://github.com/nrkno/tv-automation-server-core/commit/6083145)) -* add restart button ([9b43d6f](https://github.com/nrkno/tv-automation-server-core/commit/9b43d6f)) -* add retryDuration for external messages. ([c19d84b](https://github.com/nrkno/tv-automation-server-core/commit/c19d84b)) -* add rewind button ([f235a25](https://github.com/nrkno/tv-automation-server-core/commit/f235a25)) -* add rewind button ([9fd61b5](https://github.com/nrkno/tv-automation-server-core/commit/9fd61b5)) -* Add runHelper method to template context ([ebc477a](https://github.com/nrkno/tv-automation-server-core/commit/ebc477a)) -* Add running order name to top of run page ([674c392](https://github.com/nrkno/tv-automation-server-core/commit/674c392)) -* Add SegmentLineItem.infiniteMode value for items which are infinite within the SegmentLine ([e99c661](https://github.com/nrkno/tv-automation-server-core/commit/e99c661)) -* add setting for playout device: multiThreadedResolver ([37f2aa7](https://github.com/nrkno/tv-automation-server-core/commit/37f2aa7)) -* add snapshot restore statistics to logging ([45115f3](https://github.com/nrkno/tv-automation-server-core/commit/45115f3)) -* Add some new template config data for sources information ([3e48508](https://github.com/nrkno/tv-automation-server-core/commit/3e48508)) -* add some responsive styling to the RD view ([a133947](https://github.com/nrkno/tv-automation-server-core/commit/a133947)) -* add sourceLayerType.LIGHTS ([0554251](https://github.com/nrkno/tv-automation-server-core/commit/0554251)) -* add stoppedPlayback tracking ([ddbdd66](https://github.com/nrkno/tv-automation-server-core/commit/ddbdd66)) -* add stoppedPlayback tracking ([7345856](https://github.com/nrkno/tv-automation-server-core/commit/7345856)) -* add studioInstallation.settings, mediaPreviewsUrl and sofieUrl, to replace configs ([adc6cb5](https://github.com/nrkno/tv-automation-server-core/commit/adc6cb5)) -* add support for Config References (to be used for referencing usernames & passwords) ([6df8c6e](https://github.com/nrkno/tv-automation-server-core/commit/6df8c6e)) -* add support for refs in rabbitMQ-messages (for username & password) ([5b3ea33](https://github.com/nrkno/tv-automation-server-core/commit/5b3ea33)) -* add support for refs in rabbitMQ-messages (for username & password) ([e34ee34](https://github.com/nrkno/tv-automation-server-core/commit/e34ee34)) -* Add support for RuntimeArguments in blueprint migrations ([82e5286](https://github.com/nrkno/tv-automation-server-core/commit/82e5286)) -* Add support panel in Running Order View ([e3cee77](https://github.com/nrkno/tv-automation-server-core/commit/e3cee77)) -* Add typeSubVariant field to SegmentLine. ([#46](https://github.com/nrkno/tv-automation-server-core/issues/46)) ([82bd4bd](https://github.com/nrkno/tv-automation-server-core/commit/82bd4bd)) -* Add typeSubVariant field to SegmentLine. ([#46](https://github.com/nrkno/tv-automation-server-core/issues/46)) ([4af88d3](https://github.com/nrkno/tv-automation-server-core/commit/4af88d3)) -* add utility CSS classes for support message ([95e1424](https://github.com/nrkno/tv-automation-server-core/commit/95e1424)) -* Add version string field to blueprint collection ([869dd02](https://github.com/nrkno/tv-automation-server-core/commit/869dd02)) -* add versions to /health endpoint ([a324213](https://github.com/nrkno/tv-automation-server-core/commit/a324213)) -* add warning of unsent messages to rundown notifications ([f65309f](https://github.com/nrkno/tv-automation-server-core/commit/f65309f)) -* Add warning to rundown when config changed ([#69](https://github.com/nrkno/tv-automation-server-core/issues/69)) ([4f5e6a9](https://github.com/nrkno/tv-automation-server-core/commit/4f5e6a9)) -* add warnings for wrong field order ([c4d23d8](https://github.com/nrkno/tv-automation-server-core/commit/c4d23d8)) -* added .timings object to SegmentLine, to track take/playout times during playout ([5d860b3](https://github.com/nrkno/tv-automation-server-core/commit/5d860b3)) -* added "develop=1" to url, which re-enables right-click, for dev ([b73522c](https://github.com/nrkno/tv-automation-server-core/commit/b73522c)) -* added afterBroadcast form ([e98b59e](https://github.com/nrkno/tv-automation-server-core/commit/e98b59e)) -* added async database functions ([a754a24](https://github.com/nrkno/tv-automation-server-core/commit/a754a24)) -* added client-side logging wrapper ([06597be](https://github.com/nrkno/tv-automation-server-core/commit/06597be)) -* added connection status of peripheralDevices ([c0e0a94](https://github.com/nrkno/tv-automation-server-core/commit/c0e0a94)) -* added context.runningOrder, for blueprints to use ([855f6d4](https://github.com/nrkno/tv-automation-server-core/commit/855f6d4)) -* added device version to status page ([ed0acda](https://github.com/nrkno/tv-automation-server-core/commit/ed0acda)) -* Added dynamic template context ([0ea4849](https://github.com/nrkno/tv-automation-server-core/commit/0ea4849)) -* added executionTime to userAction ([1ca92c1](https://github.com/nrkno/tv-automation-server-core/commit/1ca92c1)) -* added getAllSegments, to use in metadata-template ([f8a5514](https://github.com/nrkno/tv-automation-server-core/commit/f8a5514)) -* added indexes for all collections ([6ef324c](https://github.com/nrkno/tv-automation-server-core/commit/6ef324c)) -* added kill process buttons to device status UI ([6fdab68](https://github.com/nrkno/tv-automation-server-core/commit/6fdab68)) -* added killProcess method, to be used by integration tests of gateways in closed environments ([7f2b42c](https://github.com/nrkno/tv-automation-server-core/commit/7f2b42c)) -* added MeteorReactComponent, which exposes subscribe & autorun, which will stop automatically on component unmount ([cf11808](https://github.com/nrkno/tv-automation-server-core/commit/cf11808)) -* added name and type to peripheralDevice ([915c518](https://github.com/nrkno/tv-automation-server-core/commit/915c518)) -* added packages: mocha and typescript ([8b19269](https://github.com/nrkno/tv-automation-server-core/commit/8b19269)) -* added peripheralDevice.lastConnected, to be used for sorting so they wont jump around in the UI ([08e97f7](https://github.com/nrkno/tv-automation-server-core/commit/08e97f7)) -* added pingWithCommand method, used by watchdog ([6f6427b](https://github.com/nrkno/tv-automation-server-core/commit/6f6427b)) -* Added publications for all running order data, and changed some interfaces ([2365fd2](https://github.com/nrkno/tv-automation-server-core/commit/2365fd2)) -* added SegmentLine.timings.stoppedPlayback property ([2121245](https://github.com/nrkno/tv-automation-server-core/commit/2121245)) -* added SegmentLine.timings.takeDone property ([d18d539](https://github.com/nrkno/tv-automation-server-core/commit/d18d539)) -* added some shadow to the status dots ([04df33c](https://github.com/nrkno/tv-automation-server-core/commit/04df33c)) -* added support for typescript ([d3471b3](https://github.com/nrkno/tv-automation-server-core/commit/d3471b3)) -* added temporary deploy script ([244fb5b](https://github.com/nrkno/tv-automation-server-core/commit/244fb5b)) -* added test-data for testing and mocking ([b277c3c](https://github.com/nrkno/tv-automation-server-core/commit/b277c3c)) -* added tests stub ([edd4b6e](https://github.com/nrkno/tv-automation-server-core/commit/edd4b6e)) -* added tictac for troubleshooting timings ([df91cea](https://github.com/nrkno/tv-automation-server-core/commit/df91cea)) -* added Timeline data structure ([35ce6db](https://github.com/nrkno/tv-automation-server-core/commit/35ce6db)) -* added Timeline.objectType and implemented the typing changes all around ([a69e626](https://github.com/nrkno/tv-automation-server-core/commit/a69e626)) -* added timestamp to externalMessage error ([e13d1d8](https://github.com/nrkno/tv-automation-server-core/commit/e13d1d8)) -* added timings property to adlig segmentLineItems ([b333bf1](https://github.com/nrkno/tv-automation-server-core/commit/b333bf1)) -* added unsyncedTime ([8fcffb5](https://github.com/nrkno/tv-automation-server-core/commit/8fcffb5)) -* added updateStoryStatus. The yellow line will only be driven when this is set to true ([c7ec8da](https://github.com/nrkno/tv-automation-server-core/commit/c7ec8da)) -* Adjust split box values ([680eb11](https://github.com/nrkno/tv-automation-server-core/commit/680eb11)) -* allow ? as 'any' field/frame type ([c950fba](https://github.com/nrkno/tv-automation-server-core/commit/c950fba)) -* allow a place to store MediaWorkFlow comments ([a2c54fb](https://github.com/nrkno/tv-automation-server-core/commit/a2c54fb)) -* allow a string array as mediaFlowIds in SLI content ([7ac6fb5](https://github.com/nrkno/tv-automation-server-core/commit/7ac6fb5)) -* allow admins to delete non-unsynced running orders ([190ca36](https://github.com/nrkno/tv-automation-server-core/commit/190ca36)) -* allow reconnection action on click ([3575f4f](https://github.com/nrkno/tv-automation-server-core/commit/3575f4f)) -* Allow StudioInstallation to define entries in the hotkey legend ([74c1c1c](https://github.com/nrkno/tv-automation-server-core/commit/74c1c1c)) -* Allow to specify blueprint name in request query string ([e8c2dc9](https://github.com/nrkno/tv-automation-server-core/commit/e8c2dc9)) -* ask before closing an active RO (if allowed by browser) ([16ee66b](https://github.com/nrkno/tv-automation-server-core/commit/16ee66b)) -* Atem SuperSource properties support ([2688142](https://github.com/nrkno/tv-automation-server-core/commit/2688142)) -* autonext property is defined on the current SegmentLine rather than the next ([09441db](https://github.com/nrkno/tv-automation-server-core/commit/09441db)) -* backend implementation of migration (wip) ([8762ca3](https://github.com/nrkno/tv-automation-server-core/commit/8762ca3)) -* backup and restore show styles (including templates) through ui ([9758b2c](https://github.com/nrkno/tv-automation-server-core/commit/9758b2c)) -* basic setup of jest ([6dd0fcd](https://github.com/nrkno/tv-automation-server-core/commit/6dd0fcd)) -* Batch uploading of blueprints in one http request ([5a707e1](https://github.com/nrkno/tv-automation-server-core/commit/5a707e1)) -* be able to remove stored snapshots ([849f906](https://github.com/nrkno/tv-automation-server-core/commit/849f906)) -* beautify "Upload blueprints" button ([2dce2c8](https://github.com/nrkno/tv-automation-server-core/commit/2dce2c8)) -* begin implementation of new blueprint interface (wip) ([d7aa2e4](https://github.com/nrkno/tv-automation-server-core/commit/d7aa2e4)) -* better return type from post-process ([a971b43](https://github.com/nrkno/tv-automation-server-core/commit/a971b43)) -* BIG refactoring of Core ([9d6ae9e](https://github.com/nrkno/tv-automation-server-core/commit/9d6ae9e)) -* black / freeze frame detection warnings ([7166177](https://github.com/nrkno/tv-automation-server-core/commit/7166177)) -* block take if duration since startedPlayback/take less than X ([99d41b9](https://github.com/nrkno/tv-automation-server-core/commit/99d41b9)) -* blueprint migration implementation (it works now) ([15250b2](https://github.com/nrkno/tv-automation-server-core/commit/15250b2)) -* blueprint migration, continued implementation ([ff507ab](https://github.com/nrkno/tv-automation-server-core/commit/ff507ab)) -* blueprintMigrations ([9527cae](https://github.com/nrkno/tv-automation-server-core/commit/9527cae)) -* blueprints context: handle notes externally (to ro notes) or internally (to logger) ([63640f2](https://github.com/nrkno/tv-automation-server-core/commit/63640f2)) -* Break nrk templates into seperate files. Parse KAM templates better ([2ec0433](https://github.com/nrkno/tv-automation-server-core/commit/2ec0433)) -* bump blueprints-integration version ([6f2c46d](https://github.com/nrkno/tv-automation-server-core/commit/6f2c46d)) -* Button to assign/unassign system blueprint ([edef22a](https://github.com/nrkno/tv-automation-server-core/commit/edef22a)) -* change heavy-light display style ([91a1931](https://github.com/nrkno/tv-automation-server-core/commit/91a1931)) -* change heavy-light display style ([329e2c6](https://github.com/nrkno/tv-automation-server-core/commit/329e2c6)) -* change labeled buttons to icons with tooltips in Media Transfer Status ([c5e582b](https://github.com/nrkno/tv-automation-server-core/commit/c5e582b)) -* Change styling for video monitors ([5de76fc](https://github.com/nrkno/tv-automation-server-core/commit/5de76fc)) -* Change styling for video monitors ([a01de7d](https://github.com/nrkno/tv-automation-server-core/commit/a01de7d)) -* change VideoEditMonitors behavior from hoverScrub to click-and-drag ([77327fe](https://github.com/nrkno/tv-automation-server-core/commit/77327fe)) -* change VideoEditMonitors behavior from hoverScrub to click-and-drag ([bc1ed2c](https://github.com/nrkno/tv-automation-server-core/commit/bc1ed2c)) -* changed keyboard shortcuts ([ef02f7c](https://github.com/nrkno/tv-automation-server-core/commit/ef02f7c)) -* changed restart CasparCG functionality ([dd567c2](https://github.com/nrkno/tv-automation-server-core/commit/dd567c2)) -* changed to retryUntil, added button ([1b31374](https://github.com/nrkno/tv-automation-server-core/commit/1b31374)) -* Changes for blueprints-integration typings ([8d1f37d](https://github.com/nrkno/tv-automation-server-core/commit/8d1f37d)) -* check AdLib media object status and display in Shelf ([3bacb40](https://github.com/nrkno/tv-automation-server-core/commit/3bacb40)) -* cherry-pick changes from the UI feature branch ([dfbb3b4](https://github.com/nrkno/tv-automation-server-core/commit/dfbb3b4)) -* clean up: show style, blueprint, blueprint logic names in UI ([e1ae6a7](https://github.com/nrkno/tv-automation-server-core/commit/e1ae6a7)) -* ClientAPI test suite ([69cad3f](https://github.com/nrkno/tv-automation-server-core/commit/69cad3f)) -* clip trim panel WIP ([36e79dc](https://github.com/nrkno/tv-automation-server-core/commit/36e79dc)) -* clip trim panel WIP ([9d01c2b](https://github.com/nrkno/tv-automation-server-core/commit/9d01c2b)) -* clip trim panel working, hide video monitor under a flag ([72ee490](https://github.com/nrkno/tv-automation-server-core/commit/72ee490)) -* codeControl: create syncFunctions which finer grained execution control based on arguments ([f53607f](https://github.com/nrkno/tv-automation-server-core/commit/f53607f)) -* componentize WorkFlow item ([f920e4b](https://github.com/nrkno/tv-automation-server-core/commit/f920e4b)) -* configuration UI for media manager ([b1883ec](https://github.com/nrkno/tv-automation-server-core/commit/b1883ec)) -* Consider transitions applied to objects via keyframes ([e911760](https://github.com/nrkno/tv-automation-server-core/commit/e911760)) -* Consider transitions applied to objects via keyframes ([eb65a3c](https://github.com/nrkno/tv-automation-server-core/commit/eb65a3c)) -* continue implementation of new blueprint interface ([b7d013d](https://github.com/nrkno/tv-automation-server-core/commit/b7d013d)) -* continue refactor of mos ingest logic ([ad6cbb1](https://github.com/nrkno/tv-automation-server-core/commit/ad6cbb1)) -* continue refactor of mos ingest logic ([c5b775a](https://github.com/nrkno/tv-automation-server-core/commit/c5b775a)) -* continued implementation of Migration (wip) ([72fbcb5](https://github.com/nrkno/tv-automation-server-core/commit/72fbcb5)) -* continued refactoring of ingest / mos data flow ([4ffe93a](https://github.com/nrkno/tv-automation-server-core/commit/4ffe93a)) -* converted app.js to typescript and added an example subscription-implementation ([da439af](https://github.com/nrkno/tv-automation-server-core/commit/da439af)) -* converted more subscriptions (WIP) ([e047fef](https://github.com/nrkno/tv-automation-server-core/commit/e047fef)) -* converted StudioInstallation into a class, adding getConfigValue as member method, a step towards DRY ([4af278e](https://github.com/nrkno/tv-automation-server-core/commit/4af278e)) -* CoreSystem initial implementation ([06369b2](https://github.com/nrkno/tv-automation-server-core/commit/06369b2)) -* countdown to running order expectedStart ([7b505c5](https://github.com/nrkno/tv-automation-server-core/commit/7b505c5)) -* create action buttons in the Support PopUp for reset PG, take snapshot, show hotkeys ([be89893](https://github.com/nrkno/tv-automation-server-core/commit/be89893)) -* cron job for restarting casparcg ([19898d1](https://github.com/nrkno/tv-automation-server-core/commit/19898d1)) -* Crude UI to rerun studio baseline ([25b2395](https://github.com/nrkno/tv-automation-server-core/commit/25b2395)) -* Crude ui to visualise generated timeline ([6e55382](https://github.com/nrkno/tv-automation-server-core/commit/6e55382)) -* css: import and use fonts in prompter ([97a8037](https://github.com/nrkno/tv-automation-server-core/commit/97a8037)) -* Define all special blueprints as options in the showstyle ([7e1da16](https://github.com/nrkno/tv-automation-server-core/commit/7e1da16)) -* disable in next segmentLine & refactoring ([669166c](https://github.com/nrkno/tv-automation-server-core/commit/669166c)) -* disable shortcut-keys when modalDialog is open ([24bab3f](https://github.com/nrkno/tv-automation-server-core/commit/24bab3f)) -* dismiss all notifcations ([896dbb5](https://github.com/nrkno/tv-automation-server-core/commit/896dbb5)) -* display ms in user activity log ([5172f2e](https://github.com/nrkno/tv-automation-server-core/commit/5172f2e)) -* display ms in user activity log ([7fc2744](https://github.com/nrkno/tv-automation-server-core/commit/7fc2744)) -* do not block click-to-take when trigger is absolute 0 ([cec86ca](https://github.com/nrkno/tv-automation-server-core/commit/cec86ca)) -* don't restore from old snapshots ([bab8bbb](https://github.com/nrkno/tv-automation-server-core/commit/bab8bbb)) -* ensure each sli has a mosId set ([57c977d](https://github.com/nrkno/tv-automation-server-core/commit/57c977d)) -* expected audioTracks property ([250dc79](https://github.com/nrkno/tv-automation-server-core/commit/250dc79)) -* expose moment to templates ([c2a1cc5](https://github.com/nrkno/tv-automation-server-core/commit/c2a1cc5)) -* externalMessage: allow for multiple messages to be generated at the same time ([284efbe](https://github.com/nrkno/tv-automation-server-core/commit/284efbe)) -* externalMessages implementation (it works now) ([3b8e88a](https://github.com/nrkno/tv-automation-server-core/commit/3b8e88a)) -* f9, f10 buttons step next forward & down (shift reverses direction) ([a3be0cf](https://github.com/nrkno/tv-automation-server-core/commit/a3be0cf)) -* First draft at uploading a blueprints blob into a new db collection, and running it instead of the existing baseline ([31c56d8](https://github.com/nrkno/tv-automation-server-core/commit/31c56d8)) -* force some function to run synchronously. experimental, WIP! ([55a064c](https://github.com/nrkno/tv-automation-server-core/commit/55a064c)) -* force some function to run synchronously. experimental, WIP! ([54d83dd](https://github.com/nrkno/tv-automation-server-core/commit/54d83dd)) -* full implementation of mos-functions, profile 0 & 2 ([4bafeeb](https://github.com/nrkno/tv-automation-server-core/commit/4bafeeb)) -* Generate full sl & sli data on create/update of both ro and segment ([7969c2e](https://github.com/nrkno/tv-automation-server-core/commit/7969c2e)) -* Grafikk lookahead/preload ([30a6b03](https://github.com/nrkno/tv-automation-server-core/commit/30a6b03)) -* Grafikk lookahead/preload ([78828fe](https://github.com/nrkno/tv-automation-server-core/commit/78828fe)) -* handle mos updates with dynamicallyInserted segmentLines ([1d292c0](https://github.com/nrkno/tv-automation-server-core/commit/1d292c0)) -* handle roList reply on reload RunningOrder data, also more refactoring & cleanup ([cee70c5](https://github.com/nrkno/tv-automation-server-core/commit/cee70c5)) -* Handle SegmentLine data operations, with the help of an improved data cache ([9c84271](https://github.com/nrkno/tv-automation-server-core/commit/9c84271)) -* handle situation when reloading rundown and rundown is missing ([9138a2b](https://github.com/nrkno/tv-automation-server-core/commit/9138a2b)) -* HOLD mode ([ae1dacf](https://github.com/nrkno/tv-automation-server-core/commit/ae1dacf)) -* HOLD mode ([e41c5a4](https://github.com/nrkno/tv-automation-server-core/commit/e41c5a4)) -* Hold state UI ([d835efc](https://github.com/nrkno/tv-automation-server-core/commit/d835efc)) -* Hold state UI ([c7a17c7](https://github.com/nrkno/tv-automation-server-core/commit/c7a17c7)) -* hyperdeck device ([#49](https://github.com/nrkno/tv-automation-server-core/issues/49)) ([c706628](https://github.com/nrkno/tv-automation-server-core/commit/c706628)) -* if template 'getId' returns null, don't throw an error. Also when templateId is not found, send warning instead of an error ([d98f09d](https://github.com/nrkno/tv-automation-server-core/commit/d98f09d)) -* implement (upcoming) blueprint API ([d86faa5](https://github.com/nrkno/tv-automation-server-core/commit/d86faa5)) -* implement AdLib filters in RundownView ([b88ef64](https://github.com/nrkno/tv-automation-server-core/commit/b88ef64)) -* implement camera number-device mapping for PTZ ([374568d](https://github.com/nrkno/tv-automation-server-core/commit/374568d)) -* implement click-to-adlib completely ([577dcac](https://github.com/nrkno/tv-automation-server-core/commit/577dcac)) -* implement client-side error reporting to Core ([f747057](https://github.com/nrkno/tv-automation-server-core/commit/f747057)) -* implement fibers support when testing in Jest ([bb99e97](https://github.com/nrkno/tv-automation-server-core/commit/bb99e97)) -* implement mosRoStoryMove ([ab76cfb](https://github.com/nrkno/tv-automation-server-core/commit/ab76cfb)) -* implement Panasonic PTZ device ([42d8534](https://github.com/nrkno/tv-automation-server-core/commit/42d8534)) -* implement Panasonic PTZ settings ([f7840da](https://github.com/nrkno/tv-automation-server-core/commit/f7840da)) -* implement spliting long scripts into beginning and end in popup ([9fa8006](https://github.com/nrkno/tv-automation-server-core/commit/9fa8006)) -* implement support for Spreadsheet gateway ([44dab01](https://github.com/nrkno/tv-automation-server-core/commit/44dab01)) -* implement timeline-visualizer view ([e725618](https://github.com/nrkno/tv-automation-server-core/commit/e725618)) -* implementation of blueprint migrations ([5fec7a2](https://github.com/nrkno/tv-automation-server-core/commit/5fec7a2)) -* implementation of disable-next-segmentLineItem ([a06d196](https://github.com/nrkno/tv-automation-server-core/commit/a06d196)) -* implementation of invalid segmentLine & invalid segmentLineItem (adLib) ([7ddcede](https://github.com/nrkno/tv-automation-server-core/commit/7ddcede)) -* implementation of new blueprint API ([34f905f](https://github.com/nrkno/tv-automation-server-core/commit/34f905f)) -* implemented mos profiles 0-2 ([d803da1](https://github.com/nrkno/tv-automation-server-core/commit/d803da1)) -* Implemented Notes into data structure & GUI ([735b8c5](https://github.com/nrkno/tv-automation-server-core/commit/735b8c5)) -* implemented partial timeline fix ([c8b56e4](https://github.com/nrkno/tv-automation-server-core/commit/c8b56e4)) -* implemented stricter typing & changed classes to ReactMeteorComponent where applicable ([9d2166e](https://github.com/nrkno/tv-automation-server-core/commit/9d2166e)) -* implemented userActions ([2b343e6](https://github.com/nrkno/tv-automation-server-core/commit/2b343e6)) -* import MOS snapshot ([ad11dd6](https://github.com/nrkno/tv-automation-server-core/commit/ad11dd6)) -* improve code quality (switch div's to buttons where they should be) ([70d9348](https://github.com/nrkno/tv-automation-server-core/commit/70d9348)) -* improved layout for presenter countdowns ([2bd61cc](https://github.com/nrkno/tv-automation-server-core/commit/2bd61cc)) -* include expectedMediaItems in RunningOrder snapshots ([9fcbba0](https://github.com/nrkno/tv-automation-server-core/commit/9fcbba0)) -* Infinite segmentlineitem ([c02a641](https://github.com/nrkno/tv-automation-server-core/commit/c02a641)) -* initial implementation of externalMessages, (not working yet) ([ace91f1](https://github.com/nrkno/tv-automation-server-core/commit/ace91f1)) -* Initial implementation of importing a running order from spreadsheet gateway (wip) ([870a500](https://github.com/nrkno/tv-automation-server-core/commit/870a500)) -* initial implementation of new general data ingest API ([a2b4987](https://github.com/nrkno/tv-automation-server-core/commit/a2b4987)) -* initial implementation of Take with Offset functionality ([9c860ca](https://github.com/nrkno/tv-automation-server-core/commit/9c860ca)) -* Initial timings for opening templates ([a9bfb66](https://github.com/nrkno/tv-automation-server-core/commit/a9bfb66)) -* Interfaces for describing the timeline, segments (titles), layers ([ea96dfb](https://github.com/nrkno/tv-automation-server-core/commit/ea96dfb)) -* jest config & example implementation of module mocks ([43ac8fa](https://github.com/nrkno/tv-automation-server-core/commit/43ac8fa)) -* jest mocks ([9fdadf3](https://github.com/nrkno/tv-automation-server-core/commit/9fdadf3)) -* KAM SLUTT variant ([e819269](https://github.com/nrkno/tv-automation-server-core/commit/e819269)) -* List, start and stop test recordings ([df552ab](https://github.com/nrkno/tv-automation-server-core/commit/df552ab)) -* load atem ssrc background when activating RO ([0eda9b4](https://github.com/nrkno/tv-automation-server-core/commit/0eda9b4)) -* log ClientResonseErrors as errors in userActionLog ([4bc10b5](https://github.com/nrkno/tv-automation-server-core/commit/4bc10b5)) -* log message on startup ([c715266](https://github.com/nrkno/tv-automation-server-core/commit/c715266)) -* log warning message when trying to access a studio.config value that hasn't been set. ([7e706c6](https://github.com/nrkno/tv-automation-server-core/commit/7e706c6)) -* log WorkFlow success or failure ([8e7d9d7](https://github.com/nrkno/tv-automation-server-core/commit/8e7d9d7)) -* lookahead ([5ed0f13](https://github.com/nrkno/tv-automation-server-core/commit/5ed0f13)) -* manipulator methods for inserting & removing showStyleBase & showStyleVariant ([6bb4e00](https://github.com/nrkno/tv-automation-server-core/commit/6bb4e00)) -* mark segmentline as invalid ([bd1f20c](https://github.com/nrkno/tv-automation-server-core/commit/bd1f20c)) -* Media Manager actions to restart & abort workflows ([6c94ad6](https://github.com/nrkno/tv-automation-server-core/commit/6c94ad6)) -* Media manager UI ([c83e1ff](https://github.com/nrkno/tv-automation-server-core/commit/c83e1ff)) -* media scanner & casparcg launcher hostnames ([02ec8be](https://github.com/nrkno/tv-automation-server-core/commit/02ec8be)) -* mediamanager: GUI support for SKIPPED step status ([1c39867](https://github.com/nrkno/tv-automation-server-core/commit/1c39867)) -* message queue retry button working with with retryUntil ([2fa05bb](https://github.com/nrkno/tv-automation-server-core/commit/2fa05bb)) -* MeteorReactComponent: return subscription & computation handle ([e20e6de](https://github.com/nrkno/tv-automation-server-core/commit/e20e6de)) -* method "ping" to be called by devices every now and then, to update lastSeen ([41a996c](https://github.com/nrkno/tv-automation-server-core/commit/41a996c)) -* Migration UI & started adding migration steps ([2a117ad](https://github.com/nrkno/tv-automation-server-core/commit/2a117ad)) -* Migration: added more migration steps for 0.16.0 ([2ac06ea](https://github.com/nrkno/tv-automation-server-core/commit/2ac06ea)) -* Migration: continued impl. ([8982701](https://github.com/nrkno/tv-automation-server-core/commit/8982701)) -* monitor externalMessageQueue for system status ([e92f5be](https://github.com/nrkno/tv-automation-server-core/commit/e92f5be)) -* more WIP for support panel ([b23c855](https://github.com/nrkno/tv-automation-server-core/commit/b23c855)) -* more work on notification center ([a34ccd0](https://github.com/nrkno/tv-automation-server-core/commit/a34ccd0)) -* more work on notification center ([92196ca](https://github.com/nrkno/tv-automation-server-core/commit/92196ca)) -* more work on peripheralDevices notifications ([692b1b2](https://github.com/nrkno/tv-automation-server-core/commit/692b1b2)) -* more work on peripheralDevices notifications ([36a0a4b](https://github.com/nrkno/tv-automation-server-core/commit/36a0a4b)) -* mos-actions ([248db8a](https://github.com/nrkno/tv-automation-server-core/commit/248db8a)) -* Move all device specific TimelineObj types to tsr-types ([55766a5](https://github.com/nrkno/tv-automation-server-core/commit/55766a5)) -* move delete button to peripheralDevice page ([46647c1](https://github.com/nrkno/tv-automation-server-core/commit/46647c1)) -* move delete button to peripheralDevice page ([286d12f](https://github.com/nrkno/tv-automation-server-core/commit/286d12f)) -* Move Mapping types to tsr-types package ([67bd838](https://github.com/nrkno/tv-automation-server-core/commit/67bd838)) -* move new timeline visualizer to replace the old broken one ([174dd7e](https://github.com/nrkno/tv-automation-server-core/commit/174dd7e)) -* Move SegmentLine duration calculation into templates ([315eb42](https://github.com/nrkno/tv-automation-server-core/commit/315eb42)) -* Move sofie and metadata urls from templates to config ([af8e388](https://github.com/nrkno/tv-automation-server-core/commit/af8e388)) -* Move some lawo and nora specific processing to blueprints ([a7a6aad](https://github.com/nrkno/tv-automation-server-core/commit/a7a6aad)) -* Move types to blueprint-integration ([c305061](https://github.com/nrkno/tv-automation-server-core/commit/c305061)) -* moved nightly cronjob to run after 4am ([8eb4e12](https://github.com/nrkno/tv-automation-server-core/commit/8eb4e12)) -* multiSelect component for selecting compatible Show Styles ([e1a5c35](https://github.com/nrkno/tv-automation-server-core/commit/e1a5c35)) -* only log logger.debug() when in developer mode ([8ed8e71](https://github.com/nrkno/tv-automation-server-core/commit/8ed8e71)) -* optimization: add cache of blueprints, to avoid having to parse text-functions all the time ([1e469d9](https://github.com/nrkno/tv-automation-server-core/commit/1e469d9)) -* output evaluation to log ([f95cfbf](https://github.com/nrkno/tv-automation-server-core/commit/f95cfbf)) -* output evaluation to log ([7deca0f](https://github.com/nrkno/tv-automation-server-core/commit/7deca0f)) -* Part EndState persistance ([a84f74b](https://github.com/nrkno/tv-automation-server-core/commit/a84f74b)) -* place all collections in Collections object, for debugging purposes ([9682a89](https://github.com/nrkno/tv-automation-server-core/commit/9682a89)) -* playout device debugLogging (wip) ([7ab4ec6](https://github.com/nrkno/tv-automation-server-core/commit/7ab4ec6)) -* preliminary mongo mock implementation ([498b88f](https://github.com/nrkno/tv-automation-server-core/commit/498b88f)) -* prevent next:ing of currently playing segmentLine ([b9c9ea1](https://github.com/nrkno/tv-automation-server-core/commit/b9c9ea1)) -* prompter-view ([f45a923](https://github.com/nrkno/tv-automation-server-core/commit/f45a923)) -* prompter: add ^ and v indicators to where current take & next point is ([5c545e5](https://github.com/nrkno/tv-automation-server-core/commit/5c545e5)) -* prompter: continued implementation, url parameters etc ([785d0c0](https://github.com/nrkno/tv-automation-server-core/commit/785d0c0)) -* Prompter: New scroll mode: Smooth scrolling, which allows the user to use scroll wheel naturally ([e25ae40](https://github.com/nrkno/tv-automation-server-core/commit/e25ae40)) -* quick-n-dirty implementation of a preliminary REST-API, using existing methods and publications ([7ba8896](https://github.com/nrkno/tv-automation-server-core/commit/7ba8896)) -* rabbitMQ: add support for headers ([e3e3d48](https://github.com/nrkno/tv-automation-server-core/commit/e3e3d48)) -* rabbitMQ: headers ([087bb2e](https://github.com/nrkno/tv-automation-server-core/commit/087bb2e)) -* Read all templates from database ([3287f63](https://github.com/nrkno/tv-automation-server-core/commit/3287f63)) -* Refactor blueprint contexts so be different per type to limit exposed api ([f0d1c7c](https://github.com/nrkno/tv-automation-server-core/commit/f0d1c7c)) -* Refactor external message template code ([21ac50e](https://github.com/nrkno/tv-automation-server-core/commit/21ac50e)) -* refactor of subscriptions (WIP) ([2b6f994](https://github.com/nrkno/tv-automation-server-core/commit/2b6f994)) -* refactor prompter view, prepare for modular controllers ([eb1ac27](https://github.com/nrkno/tv-automation-server-core/commit/eb1ac27)) -* Refactor story template code to use new blueprint structure ([104982b](https://github.com/nrkno/tv-automation-server-core/commit/104982b)) -* refactor systemStatus & add status messages on front page ([14da61a](https://github.com/nrkno/tv-automation-server-core/commit/14da61a)) -* refactor to use relative durations. affects infinite segmentlineitems, autonext, segmentline overlapduration property ([67c5444](https://github.com/nrkno/tv-automation-server-core/commit/67c5444)) -* refactored initDB into 2 separate methods, so we can easilly update just the layers and not the infrastructure ([d4fcc3f](https://github.com/nrkno/tv-automation-server-core/commit/d4fcc3f)) -* Reference blueprints-integration api file ([dc1cdb8](https://github.com/nrkno/tv-automation-server-core/commit/dc1cdb8)) -* Reference blueprints-integration utils file ([d94c97b](https://github.com/nrkno/tv-automation-server-core/commit/d94c97b)) -* Reference device options in tsr-types ([049b9bc](https://github.com/nrkno/tv-automation-server-core/commit/049b9bc)) -* reimplement fullscreen/on air button ([4b8658d](https://github.com/nrkno/tv-automation-server-core/commit/4b8658d)) -* Reimplement mock ro importing for new ingest data flow ([4b5ce20](https://github.com/nrkno/tv-automation-server-core/commit/4b5ce20)) -* reimplement remaining mos methods ([43b7ba1](https://github.com/nrkno/tv-automation-server-core/commit/43b7ba1)) -* Remove monaco ([e417548](https://github.com/nrkno/tv-automation-server-core/commit/e417548)) -* rename /clock into /countdowns/presenter ([96c3136](https://github.com/nrkno/tv-automation-server-core/commit/96c3136)) -* rename files according to new naming convention ([406fad2](https://github.com/nrkno/tv-automation-server-core/commit/406fad2)) -* reset 'dirty' segment lines by re-running blueprints on them ([064a84d](https://github.com/nrkno/tv-automation-server-core/commit/064a84d)) -* restart CasparCG from UI ([64509c3](https://github.com/nrkno/tv-automation-server-core/commit/64509c3)) -* reworked externalMessages page ([3b87242](https://github.com/nrkno/tv-automation-server-core/commit/3b87242)) -* reworked the whole activate/deacticate/reset/reload logic ([1fea56e](https://github.com/nrkno/tv-automation-server-core/commit/1fea56e)) -* Rewrite debug rerun blueprints helper to use new ingest data cache ([29692e4](https://github.com/nrkno/tv-automation-server-core/commit/29692e4)) -* Rewrite templateContext.getConfigValue to get default values from defaultConfig 'blueprint' and to cache values ([6ce0f97](https://github.com/nrkno/tv-automation-server-core/commit/6ce0f97)) -* run automatic migration when starting up a fresh system, if possible. ([4fb4759](https://github.com/nrkno/tv-automation-server-core/commit/4fb4759)) -* rundown layout editor in Settings ([df206e5](https://github.com/nrkno/tv-automation-server-core/commit/df206e5)) -* running order full-screen marker ([03010ec](https://github.com/nrkno/tv-automation-server-core/commit/03010ec)) -* RunningOrder unsynced notification ([9effce5](https://github.com/nrkno/tv-automation-server-core/commit/9effce5)) -* RunningOrderDataImport tidying and unsync guards ([d0a12d8](https://github.com/nrkno/tv-automation-server-core/commit/d0a12d8)) -* second upload to atem ([6697a80](https://github.com/nrkno/tv-automation-server-core/commit/6697a80)) -* segment line arguments ([3c5313a](https://github.com/nrkno/tv-automation-server-core/commit/3c5313a)) -* send evaluation message to slack. WIP ([3dcbe3a](https://github.com/nrkno/tv-automation-server-core/commit/3dcbe3a)) -* send evaluation message to slack. WIP ([96e8b81](https://github.com/nrkno/tv-automation-server-core/commit/96e8b81)) -* send the window url in the client error report ([807ccc9](https://github.com/nrkno/tv-automation-server-core/commit/807ccc9)) -* separate RO list into synced and unsynced lists ([6b92f40](https://github.com/nrkno/tv-automation-server-core/commit/6b92f40)) -* server side implementation of queueabilified adlibs ([0527b3b](https://github.com/nrkno/tv-automation-server-core/commit/0527b3b)) -* set in/out points through itemReplace ([4d31d70](https://github.com/nrkno/tv-automation-server-core/commit/4d31d70)) -* set triggerValue to lawo-TimelineObjs, so it triggers upon Nexting ([e3df655](https://github.com/nrkno/tv-automation-server-core/commit/e3df655)) -* settings: add workflow linger time ([9beefda](https://github.com/nrkno/tv-automation-server-core/commit/9beefda)) -* SH-121-Double-clicking zoom-scrubber should mean "zoom to show everything in this segment" ([aeadc46](https://github.com/nrkno/tv-automation-server-core/commit/aeadc46)) -* show 99+ instead of actual number for notifications ([1f84e67](https://github.com/nrkno/tv-automation-server-core/commit/1f84e67)) -* show a restart button in the notification if a parentDevice is connected and there is an issue with subdevice ([67e75b0](https://github.com/nrkno/tv-automation-server-core/commit/67e75b0)) -* show a restart button in the notification if a parentDevice is connected and there is an issue with subdevice ([bde803b](https://github.com/nrkno/tv-automation-server-core/commit/bde803b)) -* Show assignment in blueprint settings ([2816d45](https://github.com/nrkno/tv-automation-server-core/commit/2816d45)) -* show blueprint id in select options in Show Styles, hyphenated show-styles doesn't seem right ([e19802f](https://github.com/nrkno/tv-automation-server-core/commit/e19802f)) -* show changed timestamp on script items ([f2955e1](https://github.com/nrkno/tv-automation-server-core/commit/f2955e1)) -* show RO notes as notifications ([0ebc3fe](https://github.com/nrkno/tv-automation-server-core/commit/0ebc3fe)) -* show timecodes in SegmentLineContextMenus ([5df6e15](https://github.com/nrkno/tv-automation-server-core/commit/5df6e15)) -* show user activity log for timeslot of recording ([5c75305](https://github.com/nrkno/tv-automation-server-core/commit/5c75305)) -* show user name in evaluations ([c59d7ee](https://github.com/nrkno/tv-automation-server-core/commit/c59d7ee)) -* Simplify RunningOrderBaseItem type ([2b8257b](https://github.com/nrkno/tv-automation-server-core/commit/2b8257b)) -* **onlySelectedFiles:** support only selected files flag on shared storage options ([dee11d2](https://github.com/nrkno/tv-automation-server-core/commit/dee11d2)) -* ShowStyle templates can be marked as helpers and accessed from other templates ([a20ffa7](https://github.com/nrkno/tv-automation-server-core/commit/a20ffa7)) -* sketch interfaces for RundownLayouts ([69b37d9](https://github.com/nrkno/tv-automation-server-core/commit/69b37d9)) -* some work on notification center ([8e2c269](https://github.com/nrkno/tv-automation-server-core/commit/8e2c269)) -* some work on notification center ([58ad599](https://github.com/nrkno/tv-automation-server-core/commit/58ad599)) -* some work on updating the next part on data changes ([5551707](https://github.com/nrkno/tv-automation-server-core/commit/5551707)) -* SOURCE_NOT_SET for SLI Status ([cff64e1](https://github.com/nrkno/tv-automation-server-core/commit/cff64e1)) -* specific implementation: append Note on RunningOrder if segmentLine is not found ([a2ff6a2](https://github.com/nrkno/tv-automation-server-core/commit/a2ff6a2)) -* speech synthesis ([eb9643a](https://github.com/nrkno/tv-automation-server-core/commit/eb9643a)) -* Split (DVE 2LIKE) template ([8ccf23e](https://github.com/nrkno/tv-automation-server-core/commit/8ccf23e)) -* Start moving some migrations to blueprints ([9d4949e](https://github.com/nrkno/tv-automation-server-core/commit/9d4949e)) -* Start of stk and grafikk templates ([0458e3e](https://github.com/nrkno/tv-automation-server-core/commit/0458e3e)) -* start on migration for 0.25.0 ([104a867](https://github.com/nrkno/tv-automation-server-core/commit/104a867)) -* Start using types from sofie-blueprints-integration ([6106d99](https://github.com/nrkno/tv-automation-server-core/commit/6106d99)) -* started on mos device data implementation ([1d3b19a](https://github.com/nrkno/tv-automation-server-core/commit/1d3b19a)) -* started working on integration tests, added a client-side stub ([c4cbadc](https://github.com/nrkno/tv-automation-server-core/commit/c4cbadc)) -* status endpoint /health updated to use device statuses ([2c4b7fa](https://github.com/nrkno/tv-automation-server-core/commit/2c4b7fa)) -* store last shelf tab, rework UIStateStorage ([7ab0f3f](https://github.com/nrkno/tv-automation-server-core/commit/7ab0f3f)) -* Strip out old runtime functions ([880a885](https://github.com/nrkno/tv-automation-server-core/commit/880a885)) -* stub of setting in & out points ([0852b42](https://github.com/nrkno/tv-automation-server-core/commit/0852b42)) -* studio and system blueprints ([5ed64cf](https://github.com/nrkno/tv-automation-server-core/commit/5ed64cf)) -* Studio blueprint now selects variant to use for ROs ([6131057](https://github.com/nrkno/tv-automation-server-core/commit/6131057)) -* StudioInstallation key-value config store for template settings ([b37ea17](https://github.com/nrkno/tv-automation-server-core/commit/b37ea17)) -* StudioInstallation key-value config store for template settings ([812c313](https://github.com/nrkno/tv-automation-server-core/commit/812c313)) -* support displayDurationGroups in RO view ([460df8d](https://github.com/nrkno/tv-automation-server-core/commit/460df8d)) -* support for multiple notification actions ([09be9c1](https://github.com/nrkno/tv-automation-server-core/commit/09be9c1)) -* support for Pharos device ([4a99fb3](https://github.com/nrkno/tv-automation-server-core/commit/4a99fb3)) -* support media manager integration ([dcbf282](https://github.com/nrkno/tv-automation-server-core/commit/dcbf282)) -* Support panel WIP ([6955fdc](https://github.com/nrkno/tv-automation-server-core/commit/6955fdc)) -* support preload lookahead mode for nora, which swaps out take commands for cue ([4cfd4fe](https://github.com/nrkno/tv-automation-server-core/commit/4cfd4fe)) -* support timeline v2 by Johan & Julian ([fd039d8](https://github.com/nrkno/tv-automation-server-core/commit/fd039d8)) -* support workFlow comments ([6181006](https://github.com/nrkno/tv-automation-server-core/commit/6181006)) -* Switch to single-device design ([a268c40](https://github.com/nrkno/tv-automation-server-core/commit/a268c40)) -* syncFunction priorities ([4c99c11](https://github.com/nrkno/tv-automation-server-core/commit/4c99c11)) -* System snapshot ([006027b](https://github.com/nrkno/tv-automation-server-core/commit/006027b)) -* system version status monitoring ([1c96263](https://github.com/nrkno/tv-automation-server-core/commit/1c96263)) -* system-wide message ([d7305df](https://github.com/nrkno/tv-automation-server-core/commit/d7305df)) -* take from here UI item ([ca26660](https://github.com/nrkno/tv-automation-server-core/commit/ca26660)) -* take snapshot before running migration ([3ae4e92](https://github.com/nrkno/tv-automation-server-core/commit/3ae4e92)) -* take snapshot when saving evaluation form ([df318bb](https://github.com/nrkno/tv-automation-server-core/commit/df318bb)) -* take snapshot when saving evaluation form ([b98d68f](https://github.com/nrkno/tv-automation-server-core/commit/b98d68f)) -* templates: added format functions for timecode ([ea38081](https://github.com/nrkno/tv-automation-server-core/commit/ea38081)) -* this did not look right button ([1e01a10](https://github.com/nrkno/tv-automation-server-core/commit/1e01a10)) -* timeline-visualizer: add details-on-click ([c81243c](https://github.com/nrkno/tv-automation-server-core/commit/c81243c)) -* timings page ([6bc325a](https://github.com/nrkno/tv-automation-server-core/commit/6bc325a)) -* toggle running order argument on an SL with a hotkey ([258c3b3](https://github.com/nrkno/tv-automation-server-core/commit/258c3b3)) -* Transition as a seperate SegmentLineItem, which is not run if the first SegmentLine in the show, or the previous SegmentLine instructs it to not ([e676a43](https://github.com/nrkno/tv-automation-server-core/commit/e676a43)) -* translation improvements ([d3a535d](https://github.com/nrkno/tv-automation-server-core/commit/d3a535d)) -* Treat sli marked as virtual solely as markers for the timeline. They are hidden from the ui and are not allowed to place any contents on the timeline ([25e0f42](https://github.com/nrkno/tv-automation-server-core/commit/25e0f42)) -* trim config values (strings) ([d41e07e](https://github.com/nrkno/tv-automation-server-core/commit/d41e07e)) -* UI: Add Getting Started message on fresh system startup ([febe8ff](https://github.com/nrkno/tv-automation-server-core/commit/febe8ff)) -* unsynced mode ([#51](https://github.com/nrkno/tv-automation-server-core/issues/51)) ([7e0a263](https://github.com/nrkno/tv-automation-server-core/commit/7e0a263)) -* Update baseline generation for new blueprint api ([79767bf](https://github.com/nrkno/tv-automation-server-core/commit/79767bf)) -* update blueprint contexts to match new API ([ab6fc5a](https://github.com/nrkno/tv-automation-server-core/commit/ab6fc5a)) -* update dependencies ([6766d18](https://github.com/nrkno/tv-automation-server-core/commit/6766d18)) -* update meteor typings ([49b6969](https://github.com/nrkno/tv-automation-server-core/commit/49b6969)) -* Update template to use correct media files and durations. Adjust transitions from head to kam ([18f6c44](https://github.com/nrkno/tv-automation-server-core/commit/18f6c44)) -* Update timeline and infinite items on enps update ([db0c041](https://github.com/nrkno/tv-automation-server-core/commit/db0c041)) -* update type dependencies and type references. Removed dependency of mos-connection and replaced it with references to the blueprints-integration. ([85bd795](https://github.com/nrkno/tv-automation-server-core/commit/85bd795)) -* update types deps & API methods ([7d1a49b](https://github.com/nrkno/tv-automation-server-core/commit/7d1a49b)) -* **asRunLog:** collection implementation ([0e63c36](https://github.com/nrkno/tv-automation-server-core/commit/0e63c36)) -* **asRunLog:** implementation of asRunLog ([62f5b8c](https://github.com/nrkno/tv-automation-server-core/commit/62f5b8c)) -* **aux:** Adds tecnical error aux 2 ([34ce710](https://github.com/nrkno/tv-automation-server-core/commit/34ce710)) -* **AUX:** adds clock aux ([45479da](https://github.com/nrkno/tv-automation-server-core/commit/45479da)) -* **AUXes:** New AUX-mapping introducing more previews and moves the cleanfeed ([548bd8c](https://github.com/nrkno/tv-automation-server-core/commit/548bd8c)) -* **blueprint:** refactor getConfigValue into the blueprints, with context exposing the raw array as getConfig instead ([5b0ac39](https://github.com/nrkno/tv-automation-server-core/commit/5b0ac39)) -* **blueprints:** Add minimum core version to blueprints. Move blueprint restore code to api/blueprints ([2453a16](https://github.com/nrkno/tv-automation-server-core/commit/2453a16)) -* **blueprints:** Add section of studio settings based off a manifest from the blueprints ([4866a79](https://github.com/nrkno/tv-automation-server-core/commit/4866a79)) -* **blueprints:** Allow the post-process blueprint to modify a select few properties on the segmentLines ([ee02813](https://github.com/nrkno/tv-automation-server-core/commit/ee02813)) -* **blueprints:** Expose version string and uploading in the ui ([00875a4](https://github.com/nrkno/tv-automation-server-core/commit/00875a4)) -* **Capabilities:** Added basic Lawo and ATEM capabilities ([90d6edd](https://github.com/nrkno/tv-automation-server-core/commit/90d6edd)) -* **click-to-take:** initial WIP ([8e63808](https://github.com/nrkno/tv-automation-server-core/commit/8e63808)) -* **click-to-take:** more work in progress ([e3549e0](https://github.com/nrkno/tv-automation-server-core/commit/e3549e0)) -* **clip trim:** WIP on styling Clip trimmer components ([1af8ff4](https://github.com/nrkno/tv-automation-server-core/commit/1af8ff4)) -* **clip trim dialog:** add an icon to mark a trimmed clip ([371ddb8](https://github.com/nrkno/tv-automation-server-core/commit/371ddb8)) -* **clip trim dialog:** implement timecode encoder ([32e8f89](https://github.com/nrkno/tv-automation-server-core/commit/32e8f89)) -* **clip trim panel:** more WIP on components ([05daa8f](https://github.com/nrkno/tv-automation-server-core/commit/05daa8f)) -* **config:** Add support for enum config entries ([b4ae4b5](https://github.com/nrkno/tv-automation-server-core/commit/b4ae4b5)) -* **countdowns:** display autonext ([1405a89](https://github.com/nrkno/tv-automation-server-core/commit/1405a89)) -* **device:** Custom make-ready commands for httpsend device ([410a2ef](https://github.com/nrkno/tv-automation-server-core/commit/410a2ef)) -* **endstate:** Use intermediary states for adlib pieces ([5117a33](https://github.com/nrkno/tv-automation-server-core/commit/5117a33)) -* **ENV:** adds ENV vars for default devices - casparcg, atem and lawo ([9bf8eee](https://github.com/nrkno/tv-automation-server-core/commit/9bf8eee)) -* **evaluation:** adds logging of evaluation level to keep statistics ([5da33a0](https://github.com/nrkno/tv-automation-server-core/commit/5da33a0)) -* **evaluation:** sends positive evaluations too ([d6c0bff](https://github.com/nrkno/tv-automation-server-core/commit/d6c0bff)) -* **expected media items:** updateExpectedMediaItems function ([e1ad692](https://github.com/nrkno/tv-automation-server-core/commit/e1ad692)) -* **expected media items:** use segmentLineId as key ([3803e87](https://github.com/nrkno/tv-automation-server-core/commit/3803e87)) -* **externalMessages:** add hold property, to be able to pause sending of messages ([adc69d8](https://github.com/nrkno/tv-automation-server-core/commit/adc69d8)) -* **Guest input:** use isGuestInput like isRemoteInput ([2d40e87](https://github.com/nrkno/tv-automation-server-core/commit/2d40e87)) -* **health check:** statusMessage implementation ([b01ac48](https://github.com/nrkno/tv-automation-server-core/commit/b01ac48)) -* **health check:** statusMessage implementation ([9bcf95a](https://github.com/nrkno/tv-automation-server-core/commit/9bcf95a)) -* **hotkeys:** optional cool down ([c9c2743](https://github.com/nrkno/tv-automation-server-core/commit/c9c2743)) -* **ingest:** First pass at ensuring all playout and ingest functions share a global rundown lock to avoid concurrent updates ([4b0cb56](https://github.com/nrkno/tv-automation-server-core/commit/4b0cb56)) -* **init:** adds clear shortcuts + skippabloe ([f824ae5](https://github.com/nrkno/tv-automation-server-core/commit/f824ae5)) -* **init:** adds multiple bak source layers ([c812510](https://github.com/nrkno/tv-automation-server-core/commit/c812510)) -* **init:** Adds RM 4,5,6 ([0021d7b](https://github.com/nrkno/tv-automation-server-core/commit/0021d7b)) -* **init:** Adds RM 4,5,6 ([dd59d47](https://github.com/nrkno/tv-automation-server-core/commit/dd59d47)) -* **init:** adds studio monitor html player to casparcg ([6533b0f](https://github.com/nrkno/tv-automation-server-core/commit/6533b0f)) -* **init:** bakskjerm type ([8ffe776](https://github.com/nrkno/tv-automation-server-core/commit/8ffe776)) -* **init:** moves countdown to casparcg machine 2, channel 1 ([6c93464](https://github.com/nrkno/tv-automation-server-core/commit/6c93464)) -* **init:** moves countdown to casparcg machine 2, channel 1 ([18c354b](https://github.com/nrkno/tv-automation-server-core/commit/18c354b)) -* **iterateDeeply:** exports iterateDeeply to template context ([42cc886](https://github.com/nrkno/tv-automation-server-core/commit/42cc886)) -* **lawo:** New structure to lawo devices and mappings ([35d812b](https://github.com/nrkno/tv-automation-server-core/commit/35d812b)) -* **loggin:** uses logger for better kibana logs ([8d31691](https://github.com/nrkno/tv-automation-server-core/commit/8d31691)) -* **lookahead:** Delay lookahead after an object by 1s if it is labelled by a class ([2c595fb](https://github.com/nrkno/tv-automation-server-core/commit/2c595fb)) -* **Media manager settings:** add 'mediaPath' property to storages ([50185b2](https://github.com/nrkno/tv-automation-server-core/commit/50185b2)) -* **media manager ui:** fix animations ([10a38de](https://github.com/nrkno/tv-automation-server-core/commit/10a38de)) -* **media manager ui:** nearly finishing the styling ([1bb3116](https://github.com/nrkno/tv-automation-server-core/commit/1bb3116)) -* **media manager ui:** show workflow creation time ([84a4b71](https://github.com/nrkno/tv-automation-server-core/commit/84a4b71)) -* **media manager UI:** WIP ([ccb54f0](https://github.com/nrkno/tv-automation-server-core/commit/ccb54f0)) -* **migration:** add previousVersion and buttons in GUI to revert database version ([61525a5](https://github.com/nrkno/tv-automation-server-core/commit/61525a5)) -* **migration:** display returned error message in GUI ([6169048](https://github.com/nrkno/tv-automation-server-core/commit/6169048)) -* **migration:** reafactor migrations and add new migration steps ([0966ef6](https://github.com/nrkno/tv-automation-server-core/commit/0966ef6)) -* **migrations:** automatically continue partialMigrations when possible ([f75e907](https://github.com/nrkno/tv-automation-server-core/commit/f75e907)) -* **migrations:** Move playout-device migrations to blueprints ([04029d4](https://github.com/nrkno/tv-automation-server-core/commit/04029d4)) -* **multi-step success:** introduce keyStep property ([fc8aebd](https://github.com/nrkno/tv-automation-server-core/commit/fc8aebd)) -* **Next:** Adds warning/fallback of not loaded clips ([e20bc2f](https://github.com/nrkno/tv-automation-server-core/commit/e20bc2f)) -* **notification center:** hot-links to RO note notifications ([f3e9f59](https://github.com/nrkno/tv-automation-server-core/commit/f3e9f59)) -* **notification center:** notification count ([b8fbcac](https://github.com/nrkno/tv-automation-server-core/commit/b8fbcac)) -* **notification center:** squish segments in RO view when NC is open ([36b514f](https://github.com/nrkno/tv-automation-server-core/commit/36b514f)) -* **notification-center:** connection status notifier et al. ([5aefd52](https://github.com/nrkno/tv-automation-server-core/commit/5aefd52)) -* **notification-center:** connection status notifier et al. ([e529e94](https://github.com/nrkno/tv-automation-server-core/commit/e529e94)) -* **notification-center:** move expand notification center to right-hand status bar ([2750fab](https://github.com/nrkno/tv-automation-server-core/commit/2750fab)) -* **notification-center:** NotificationCenterPanel et al. ([9283909](https://github.com/nrkno/tv-automation-server-core/commit/9283909)) -* **notification-center:** NotificationCenterPanel et al. ([c4794c8](https://github.com/nrkno/tv-automation-server-core/commit/c4794c8)) -* **notification-center:** segment warning tweak ([e956488](https://github.com/nrkno/tv-automation-server-core/commit/e956488)) -* **notification-center:** segment warning tweak ([d4fc5e7](https://github.com/nrkno/tv-automation-server-core/commit/d4fc5e7)) -* **notifications-center:** notification center in other pages than ROV ([5250aab](https://github.com/nrkno/tv-automation-server-core/commit/5250aab)) -* **notifications-center:** notification center in other pages than ROV ([0620115](https://github.com/nrkno/tv-automation-server-core/commit/0620115)) -* **peripheralDevices:** added collection, publication, api, access control and tests ([794b5be](https://github.com/nrkno/tv-automation-server-core/commit/794b5be)) -* **playout:** Add class to sli first_object to indicate if sli is from the current or previous sl ([8de6004](https://github.com/nrkno/tv-automation-server-core/commit/8de6004)) -* **playout:** Add class to sli first_object when the sli is a continuation of another ([d53f06b](https://github.com/nrkno/tv-automation-server-core/commit/d53f06b)) -* **playout:** Add classes to sl-firstobject from the current and prev sl. This will allow for some logical triggers which can be influenced by the prev sl ([632326f](https://github.com/nrkno/tv-automation-server-core/commit/632326f)) -* **playout:** Add object to timeline to indicate whether ro is active or in rehersal ([d0e850d](https://github.com/nrkno/tv-automation-server-core/commit/d0e850d)) -* **playout:** Block take during transitions ([d0628a2](https://github.com/nrkno/tv-automation-server-core/commit/d0628a2)) -* **prompter:** add anchor points & movement tweaks ([c4ababe](https://github.com/nrkno/tv-automation-server-core/commit/c4ababe)) -* **prompter:** Add keyboard-controller, for control by keyboard-like devices ([c6e307d](https://github.com/nrkno/tv-automation-server-core/commit/c6e307d)) -* **prompter:** add mouse-ish controller, for control by mouse-like devices ([00a924f](https://github.com/nrkno/tv-automation-server-core/commit/00a924f)) -* **Prompter:** implement a simple mirror mode ([8d0be4e](https://github.com/nrkno/tv-automation-server-core/commit/8d0be4e)) -* **rabbit:** initial commit (wip) ([7ed3223](https://github.com/nrkno/tv-automation-server-core/commit/7ed3223)) -* **rabbitmq:** Implementation of RabbitMQ external message queue ([b31e15f](https://github.com/nrkno/tv-automation-server-core/commit/b31e15f)) -* **rabbitmq:** message id ([7ce9e5a](https://github.com/nrkno/tv-automation-server-core/commit/7ce9e5a)) -* **record:** basic video player page ([138b8b9](https://github.com/nrkno/tv-automation-server-core/commit/138b8b9)) -* **record:** Controls to delete files ([4236db2](https://github.com/nrkno/tv-automation-server-core/commit/4236db2)) -* **record:** Create timelineobjects to control recording to the timeline. Add config to the db, and ui to edit it ([b5e4ebf](https://github.com/nrkno/tv-automation-server-core/commit/b5e4ebf)) -* **record:** Input field for user to give recording a name ([116ea9f](https://github.com/nrkno/tv-automation-server-core/commit/116ea9f)) -* **refactor:** move Runtime Arguments for Blueprints from StudioInstallation to ShowStyleBase ([9b2c2d8](https://github.com/nrkno/tv-automation-server-core/commit/9b2c2d8)) -* **RO view:** Introduce a 'duration settling' state to delay the UI update until the actual playout duration is received from playout ([28823c3](https://github.com/nrkno/tv-automation-server-core/commit/28823c3)) -* **RundownLayouts:** allow for default tabs ([bdd7403](https://github.com/nrkno/tv-automation-server-core/commit/bdd7403)) -* **Setting:** adds lawo setting to studio and devices ([5ab1717](https://github.com/nrkno/tv-automation-server-core/commit/5ab1717)) -* **settings:** playout devices have threadUsage ([b74410c](https://github.com/nrkno/tv-automation-server-core/commit/b74410c)) -* **shortcuts:** adds shortcuts to remove various graphic layers ([0d1a83d](https://github.com/nrkno/tv-automation-server-core/commit/0d1a83d)) -* **shortcuts:** standarize shortcut label display, support numpad ([4c5ba74](https://github.com/nrkno/tv-automation-server-core/commit/4c5ba74)) -* **snapshot:** continued implementation ([009e9e5](https://github.com/nrkno/tv-automation-server-core/commit/009e9e5)) -* **snapshot:** edit snapshot comments ([264638a](https://github.com/nrkno/tv-automation-server-core/commit/264638a)) -* **snapshot:** Implement snapshots, API endpoints & restore ([72e1a83](https://github.com/nrkno/tv-automation-server-core/commit/72e1a83)) -* **snapshot:** implement support for taking snapshot of settings related to a single studio ([d177113](https://github.com/nrkno/tv-automation-server-core/commit/d177113)) -* **snapshot:** snapshot restore/backup GUI ([c414f70](https://github.com/nrkno/tv-automation-server-core/commit/c414f70)) -* **snapshot:** take snapshot of runningOrder & restore ([fc34f73](https://github.com/nrkno/tv-automation-server-core/commit/fc34f73)) -* User log player ([e80f665](https://github.com/nrkno/tv-automation-server-core/commit/e80f665)) -* **template:** setup atem wipe transition ([f0c576c](https://github.com/nrkno/tv-automation-server-core/commit/f0c576c)) -* **template:** temporary env variable for nora group (MESOS_NORA_GROUP) ([8b00bc4](https://github.com/nrkno/tv-automation-server-core/commit/8b00bc4)) -* **template:** use upstream keyer for vignett playback. Adds some more layers for atem defaults, and overrides to stack changes better ([76b1e10](https://github.com/nrkno/tv-automation-server-core/commit/76b1e10)) -* **Template doc:** Added CasparCG resources ([80f98d5](https://github.com/nrkno/tv-automation-server-core/commit/80f98d5)) -* **templates:** Use ShowStyle to define default/fallback state. Play and stop head supers ([8375363](https://github.com/nrkno/tv-automation-server-core/commit/8375363)) -* **Templates:** Start parsing some new mos data. Process mesos based graphics. Set some lawo audio states ([df4b670](https://github.com/nrkno/tv-automation-server-core/commit/df4b670)) -* validatedMethod mock ([2f3a641](https://github.com/nrkno/tv-automation-server-core/commit/2f3a641)) -* **timeline:** Remove deviceId field from timeline objects ([85c4b89](https://github.com/nrkno/tv-automation-server-core/commit/85c4b89)) -* Update typings for blueprints to be more specific ([53f7281](https://github.com/nrkno/tv-automation-server-core/commit/53f7281)) -* Update typings for message blueprint ([cf13fc9](https://github.com/nrkno/tv-automation-server-core/commit/cf13fc9)) -* updated timeline dependency ([6ef9eb7](https://github.com/nrkno/tv-automation-server-core/commit/6ef9eb7)) -* updated to match blueprints-integration /develop, started on new message-flow, WIP ([6b84b75](https://github.com/nrkno/tv-automation-server-core/commit/6b84b75)) -* url parameter "all" configures ui modes ([586d5f4](https://github.com/nrkno/tv-automation-server-core/commit/586d5f4)) -* use date-picker for user-activity-log ([5e2c218](https://github.com/nrkno/tv-automation-server-core/commit/5e2c218)) -* warn media status for interlacing and fps ([fc3ac4b](https://github.com/nrkno/tv-automation-server-core/commit/fc3ac4b)) -* **timeline:** some initial work on labels taking account of liveline ([3086eec](https://github.com/nrkno/tv-automation-server-core/commit/3086eec)) -* **Timeline:** more work on new marker style ([570e408](https://github.com/nrkno/tv-automation-server-core/commit/570e408)) -* use default renderer for MIC sourceLayerType ([ce845d4](https://github.com/nrkno/tv-automation-server-core/commit/ce845d4)) -* use default renderer for MIC sourceLayerType ([6ab97b7](https://github.com/nrkno/tv-automation-server-core/commit/6ab97b7)) -* use generated svg as icons in countdown ([843ad10](https://github.com/nrkno/tv-automation-server-core/commit/843ad10)) -* Use studio baseline when no ro is active ([8353615](https://github.com/nrkno/tv-automation-server-core/commit/8353615)) -* warnings for media in wrong resolution ([55135c1](https://github.com/nrkno/tv-automation-server-core/commit/55135c1)) -* WIP: VERY preliminary implementation of quick and dirty manual playback ([a9ec948](https://github.com/nrkno/tv-automation-server-core/commit/a9ec948)) -* wrap blueprint functions, to emit better errors ([14873f1](https://github.com/nrkno/tv-automation-server-core/commit/14873f1)) -* zoom control buttons ([41c1c92](https://github.com/nrkno/tv-automation-server-core/commit/41c1c92)) - - +- add & remove studios ([81749b4](https://github.com/nrkno/tv-automation-server-core/commit/81749b4)) +- add a label of the source Piece on the ExpectedMediaItems ([bad1576](https://github.com/nrkno/tv-automation-server-core/commit/bad1576)) +- add a subtle line underneath segment title when has-remote-items and has-guest-items ([a02b50d](https://github.com/nrkno/tv-automation-server-core/commit/a02b50d)) +- add a subtle line underneath segment title when has-remote-items and has-guest-items ([4b1d582](https://github.com/nrkno/tv-automation-server-core/commit/4b1d582)) +- add a user-definable CoreSystem.name that is displayed in the header and title bar ([493568e](https://github.com/nrkno/tv-automation-server-core/commit/493568e)) +- add a user-definable CoreSystem.name that is displayed in the header and title bar ([717ee45](https://github.com/nrkno/tv-automation-server-core/commit/717ee45)) +- Add backup link to backup only active template data ([cdfffdf](https://github.com/nrkno/tv-automation-server-core/commit/cdfffdf)) +- Add backup restore method to import mock rundowns similar to the embedded mocks ([d71d9c7](https://github.com/nrkno/tv-automation-server-core/commit/d71d9c7)) +- Add backup restore method to import mock rundowns similar to the embedded mocks ([251555b](https://github.com/nrkno/tv-automation-server-core/commit/251555b)) +- **notification-center:** move expand notification center to right-hand status bar ([635c09d](https://github.com/nrkno/tv-automation-server-core/commit/635c09d)) +- add buttons to restart CasparCG servers ([c1396b4](https://github.com/nrkno/tv-automation-server-core/commit/c1396b4)) +- add category, type & subType to peripheralDevice ([34469f5](https://github.com/nrkno/tv-automation-server-core/commit/34469f5)) +- add checkbox for debugLogging in media manager ([64b80e9](https://github.com/nrkno/tv-automation-server-core/commit/64b80e9)) +- add default mocks ([2985af8](https://github.com/nrkno/tv-automation-server-core/commit/2985af8)) +- add editorconfig ([296f71d](https://github.com/nrkno/tv-automation-server-core/commit/296f71d)) +- add expected media items collection ([931536e](https://github.com/nrkno/tv-automation-server-core/commit/931536e)) +- Add expected media items collection ([04c15a9](https://github.com/nrkno/tv-automation-server-core/commit/04c15a9)) +- add fetchFrom() as a wrapper for fetch(), to handle non-200 responses as errors ([4e3734c](https://github.com/nrkno/tv-automation-server-core/commit/4e3734c)) +- add fonts ([e617d60](https://github.com/nrkno/tv-automation-server-core/commit/e617d60)) +- Add http put request timeline object ([14f391c](https://github.com/nrkno/tv-automation-server-core/commit/14f391c)) +- add httpWatcher settings ([fbb91d9](https://github.com/nrkno/tv-automation-server-core/commit/fbb91d9)) +- add IngestActions.regenerateRundown, for debugging & resetting of rundown ([ebefd42](https://github.com/nrkno/tv-automation-server-core/commit/ebefd42)) +- add jest ([3fab0ed](https://github.com/nrkno/tv-automation-server-core/commit/3fab0ed)) +- add link to compatible studios from ShowStyle page ([4be495c](https://github.com/nrkno/tv-automation-server-core/commit/4be495c)) +- Add LOG_FILE env var to specify the file to log to ([8a192bc](https://github.com/nrkno/tv-automation-server-core/commit/8a192bc)) +- Add LOG_FILE env var to specify the file to log to ([d2ad941](https://github.com/nrkno/tv-automation-server-core/commit/d2ad941)) +- Add Media_Manager DeviceType ([2b612c7](https://github.com/nrkno/tv-automation-server-core/commit/2b612c7)) +- add methods for insert/remove blueprints ([8acb72b](https://github.com/nrkno/tv-automation-server-core/commit/8acb72b)) +- add migration steps, logging ([96aae63](https://github.com/nrkno/tv-automation-server-core/commit/96aae63)) +- add migrations for 0.25.0 ([9165255](https://github.com/nrkno/tv-automation-server-core/commit/9165255)) +- add nn translation and update nb translation ([922b93b](https://github.com/nrkno/tv-automation-server-core/commit/922b93b)) +- add nn-nynorsk and update nb-bokmal translation ([6db7a99](https://github.com/nrkno/tv-automation-server-core/commit/6db7a99)) +- add notes to RunningOrder ([6100b0c](https://github.com/nrkno/tv-automation-server-core/commit/6100b0c)) +- add option to input data into a ModalDialogue ([ef54b74](https://github.com/nrkno/tv-automation-server-core/commit/ef54b74)) +- Add OSC Playout device type ([bf426b5](https://github.com/nrkno/tv-automation-server-core/commit/bf426b5)) +- add performance monitor and track all server-side methods ([385f703](https://github.com/nrkno/tv-automation-server-core/commit/385f703)) +- add performance monitor and track all server-side methods ([2733d74](https://github.com/nrkno/tv-automation-server-core/commit/2733d74)) +- add peripheralDevice expectedVersions, to throw error if device version is too low. Refactor /health endpoint. ([51ed4c3](https://github.com/nrkno/tv-automation-server-core/commit/51ed4c3)) +- add property .deviceId to MediaWorkFlow & MedieWorkFlowStep, to indicate ownership. (preliminary implementation) ([62ac066](https://github.com/nrkno/tv-automation-server-core/commit/62ac066)) +- add restart button ([6083145](https://github.com/nrkno/tv-automation-server-core/commit/6083145)) +- add restart button ([9b43d6f](https://github.com/nrkno/tv-automation-server-core/commit/9b43d6f)) +- add retryDuration for external messages. ([c19d84b](https://github.com/nrkno/tv-automation-server-core/commit/c19d84b)) +- add rewind button ([f235a25](https://github.com/nrkno/tv-automation-server-core/commit/f235a25)) +- add rewind button ([9fd61b5](https://github.com/nrkno/tv-automation-server-core/commit/9fd61b5)) +- Add runHelper method to template context ([ebc477a](https://github.com/nrkno/tv-automation-server-core/commit/ebc477a)) +- Add running order name to top of run page ([674c392](https://github.com/nrkno/tv-automation-server-core/commit/674c392)) +- Add SegmentLineItem.infiniteMode value for items which are infinite within the SegmentLine ([e99c661](https://github.com/nrkno/tv-automation-server-core/commit/e99c661)) +- add setting for playout device: multiThreadedResolver ([37f2aa7](https://github.com/nrkno/tv-automation-server-core/commit/37f2aa7)) +- add snapshot restore statistics to logging ([45115f3](https://github.com/nrkno/tv-automation-server-core/commit/45115f3)) +- Add some new template config data for sources information ([3e48508](https://github.com/nrkno/tv-automation-server-core/commit/3e48508)) +- add some responsive styling to the RD view ([a133947](https://github.com/nrkno/tv-automation-server-core/commit/a133947)) +- add sourceLayerType.LIGHTS ([0554251](https://github.com/nrkno/tv-automation-server-core/commit/0554251)) +- add stoppedPlayback tracking ([ddbdd66](https://github.com/nrkno/tv-automation-server-core/commit/ddbdd66)) +- add stoppedPlayback tracking ([7345856](https://github.com/nrkno/tv-automation-server-core/commit/7345856)) +- add studioInstallation.settings, mediaPreviewsUrl and sofieUrl, to replace configs ([adc6cb5](https://github.com/nrkno/tv-automation-server-core/commit/adc6cb5)) +- add support for Config References (to be used for referencing usernames & passwords) ([6df8c6e](https://github.com/nrkno/tv-automation-server-core/commit/6df8c6e)) +- add support for refs in rabbitMQ-messages (for username & password) ([5b3ea33](https://github.com/nrkno/tv-automation-server-core/commit/5b3ea33)) +- add support for refs in rabbitMQ-messages (for username & password) ([e34ee34](https://github.com/nrkno/tv-automation-server-core/commit/e34ee34)) +- Add support for RuntimeArguments in blueprint migrations ([82e5286](https://github.com/nrkno/tv-automation-server-core/commit/82e5286)) +- Add support panel in Running Order View ([e3cee77](https://github.com/nrkno/tv-automation-server-core/commit/e3cee77)) +- Add typeSubVariant field to SegmentLine. ([#46](https://github.com/nrkno/tv-automation-server-core/issues/46)) ([82bd4bd](https://github.com/nrkno/tv-automation-server-core/commit/82bd4bd)) +- Add typeSubVariant field to SegmentLine. ([#46](https://github.com/nrkno/tv-automation-server-core/issues/46)) ([4af88d3](https://github.com/nrkno/tv-automation-server-core/commit/4af88d3)) +- add utility CSS classes for support message ([95e1424](https://github.com/nrkno/tv-automation-server-core/commit/95e1424)) +- Add version string field to blueprint collection ([869dd02](https://github.com/nrkno/tv-automation-server-core/commit/869dd02)) +- add versions to /health endpoint ([a324213](https://github.com/nrkno/tv-automation-server-core/commit/a324213)) +- add warning of unsent messages to rundown notifications ([f65309f](https://github.com/nrkno/tv-automation-server-core/commit/f65309f)) +- Add warning to rundown when config changed ([#69](https://github.com/nrkno/tv-automation-server-core/issues/69)) ([4f5e6a9](https://github.com/nrkno/tv-automation-server-core/commit/4f5e6a9)) +- add warnings for wrong field order ([c4d23d8](https://github.com/nrkno/tv-automation-server-core/commit/c4d23d8)) +- added .timings object to SegmentLine, to track take/playout times during playout ([5d860b3](https://github.com/nrkno/tv-automation-server-core/commit/5d860b3)) +- added "develop=1" to url, which re-enables right-click, for dev ([b73522c](https://github.com/nrkno/tv-automation-server-core/commit/b73522c)) +- added afterBroadcast form ([e98b59e](https://github.com/nrkno/tv-automation-server-core/commit/e98b59e)) +- added async database functions ([a754a24](https://github.com/nrkno/tv-automation-server-core/commit/a754a24)) +- added client-side logging wrapper ([06597be](https://github.com/nrkno/tv-automation-server-core/commit/06597be)) +- added connection status of peripheralDevices ([c0e0a94](https://github.com/nrkno/tv-automation-server-core/commit/c0e0a94)) +- added context.runningOrder, for blueprints to use ([855f6d4](https://github.com/nrkno/tv-automation-server-core/commit/855f6d4)) +- added device version to status page ([ed0acda](https://github.com/nrkno/tv-automation-server-core/commit/ed0acda)) +- Added dynamic template context ([0ea4849](https://github.com/nrkno/tv-automation-server-core/commit/0ea4849)) +- added executionTime to userAction ([1ca92c1](https://github.com/nrkno/tv-automation-server-core/commit/1ca92c1)) +- added getAllSegments, to use in metadata-template ([f8a5514](https://github.com/nrkno/tv-automation-server-core/commit/f8a5514)) +- added indexes for all collections ([6ef324c](https://github.com/nrkno/tv-automation-server-core/commit/6ef324c)) +- added kill process buttons to device status UI ([6fdab68](https://github.com/nrkno/tv-automation-server-core/commit/6fdab68)) +- added killProcess method, to be used by integration tests of gateways in closed environments ([7f2b42c](https://github.com/nrkno/tv-automation-server-core/commit/7f2b42c)) +- added MeteorReactComponent, which exposes subscribe & autorun, which will stop automatically on component unmount ([cf11808](https://github.com/nrkno/tv-automation-server-core/commit/cf11808)) +- added name and type to peripheralDevice ([915c518](https://github.com/nrkno/tv-automation-server-core/commit/915c518)) +- added packages: mocha and typescript ([8b19269](https://github.com/nrkno/tv-automation-server-core/commit/8b19269)) +- added peripheralDevice.lastConnected, to be used for sorting so they wont jump around in the UI ([08e97f7](https://github.com/nrkno/tv-automation-server-core/commit/08e97f7)) +- added pingWithCommand method, used by watchdog ([6f6427b](https://github.com/nrkno/tv-automation-server-core/commit/6f6427b)) +- Added publications for all running order data, and changed some interfaces ([2365fd2](https://github.com/nrkno/tv-automation-server-core/commit/2365fd2)) +- added SegmentLine.timings.stoppedPlayback property ([2121245](https://github.com/nrkno/tv-automation-server-core/commit/2121245)) +- added SegmentLine.timings.takeDone property ([d18d539](https://github.com/nrkno/tv-automation-server-core/commit/d18d539)) +- added some shadow to the status dots ([04df33c](https://github.com/nrkno/tv-automation-server-core/commit/04df33c)) +- added support for typescript ([d3471b3](https://github.com/nrkno/tv-automation-server-core/commit/d3471b3)) +- added temporary deploy script ([244fb5b](https://github.com/nrkno/tv-automation-server-core/commit/244fb5b)) +- added test-data for testing and mocking ([b277c3c](https://github.com/nrkno/tv-automation-server-core/commit/b277c3c)) +- added tests stub ([edd4b6e](https://github.com/nrkno/tv-automation-server-core/commit/edd4b6e)) +- added tictac for troubleshooting timings ([df91cea](https://github.com/nrkno/tv-automation-server-core/commit/df91cea)) +- added Timeline data structure ([35ce6db](https://github.com/nrkno/tv-automation-server-core/commit/35ce6db)) +- added Timeline.objectType and implemented the typing changes all around ([a69e626](https://github.com/nrkno/tv-automation-server-core/commit/a69e626)) +- added timestamp to externalMessage error ([e13d1d8](https://github.com/nrkno/tv-automation-server-core/commit/e13d1d8)) +- added timings property to adlig segmentLineItems ([b333bf1](https://github.com/nrkno/tv-automation-server-core/commit/b333bf1)) +- added unsyncedTime ([8fcffb5](https://github.com/nrkno/tv-automation-server-core/commit/8fcffb5)) +- added updateStoryStatus. The yellow line will only be driven when this is set to true ([c7ec8da](https://github.com/nrkno/tv-automation-server-core/commit/c7ec8da)) +- Adjust split box values ([680eb11](https://github.com/nrkno/tv-automation-server-core/commit/680eb11)) +- allow ? as 'any' field/frame type ([c950fba](https://github.com/nrkno/tv-automation-server-core/commit/c950fba)) +- allow a place to store MediaWorkFlow comments ([a2c54fb](https://github.com/nrkno/tv-automation-server-core/commit/a2c54fb)) +- allow a string array as mediaFlowIds in SLI content ([7ac6fb5](https://github.com/nrkno/tv-automation-server-core/commit/7ac6fb5)) +- allow admins to delete non-unsynced running orders ([190ca36](https://github.com/nrkno/tv-automation-server-core/commit/190ca36)) +- allow reconnection action on click ([3575f4f](https://github.com/nrkno/tv-automation-server-core/commit/3575f4f)) +- Allow StudioInstallation to define entries in the hotkey legend ([74c1c1c](https://github.com/nrkno/tv-automation-server-core/commit/74c1c1c)) +- Allow to specify blueprint name in request query string ([e8c2dc9](https://github.com/nrkno/tv-automation-server-core/commit/e8c2dc9)) +- ask before closing an active RO (if allowed by browser) ([16ee66b](https://github.com/nrkno/tv-automation-server-core/commit/16ee66b)) +- Atem SuperSource properties support ([2688142](https://github.com/nrkno/tv-automation-server-core/commit/2688142)) +- autonext property is defined on the current SegmentLine rather than the next ([09441db](https://github.com/nrkno/tv-automation-server-core/commit/09441db)) +- backend implementation of migration (wip) ([8762ca3](https://github.com/nrkno/tv-automation-server-core/commit/8762ca3)) +- backup and restore show styles (including templates) through ui ([9758b2c](https://github.com/nrkno/tv-automation-server-core/commit/9758b2c)) +- basic setup of jest ([6dd0fcd](https://github.com/nrkno/tv-automation-server-core/commit/6dd0fcd)) +- Batch uploading of blueprints in one http request ([5a707e1](https://github.com/nrkno/tv-automation-server-core/commit/5a707e1)) +- be able to remove stored snapshots ([849f906](https://github.com/nrkno/tv-automation-server-core/commit/849f906)) +- beautify "Upload blueprints" button ([2dce2c8](https://github.com/nrkno/tv-automation-server-core/commit/2dce2c8)) +- begin implementation of new blueprint interface (wip) ([d7aa2e4](https://github.com/nrkno/tv-automation-server-core/commit/d7aa2e4)) +- better return type from post-process ([a971b43](https://github.com/nrkno/tv-automation-server-core/commit/a971b43)) +- BIG refactoring of Core ([9d6ae9e](https://github.com/nrkno/tv-automation-server-core/commit/9d6ae9e)) +- black / freeze frame detection warnings ([7166177](https://github.com/nrkno/tv-automation-server-core/commit/7166177)) +- block take if duration since startedPlayback/take less than X ([99d41b9](https://github.com/nrkno/tv-automation-server-core/commit/99d41b9)) +- blueprint migration implementation (it works now) ([15250b2](https://github.com/nrkno/tv-automation-server-core/commit/15250b2)) +- blueprint migration, continued implementation ([ff507ab](https://github.com/nrkno/tv-automation-server-core/commit/ff507ab)) +- blueprintMigrations ([9527cae](https://github.com/nrkno/tv-automation-server-core/commit/9527cae)) +- blueprints context: handle notes externally (to ro notes) or internally (to logger) ([63640f2](https://github.com/nrkno/tv-automation-server-core/commit/63640f2)) +- Break nrk templates into seperate files. Parse KAM templates better ([2ec0433](https://github.com/nrkno/tv-automation-server-core/commit/2ec0433)) +- bump blueprints-integration version ([6f2c46d](https://github.com/nrkno/tv-automation-server-core/commit/6f2c46d)) +- Button to assign/unassign system blueprint ([edef22a](https://github.com/nrkno/tv-automation-server-core/commit/edef22a)) +- change heavy-light display style ([91a1931](https://github.com/nrkno/tv-automation-server-core/commit/91a1931)) +- change heavy-light display style ([329e2c6](https://github.com/nrkno/tv-automation-server-core/commit/329e2c6)) +- change labeled buttons to icons with tooltips in Media Transfer Status ([c5e582b](https://github.com/nrkno/tv-automation-server-core/commit/c5e582b)) +- Change styling for video monitors ([5de76fc](https://github.com/nrkno/tv-automation-server-core/commit/5de76fc)) +- Change styling for video monitors ([a01de7d](https://github.com/nrkno/tv-automation-server-core/commit/a01de7d)) +- change VideoEditMonitors behavior from hoverScrub to click-and-drag ([77327fe](https://github.com/nrkno/tv-automation-server-core/commit/77327fe)) +- change VideoEditMonitors behavior from hoverScrub to click-and-drag ([bc1ed2c](https://github.com/nrkno/tv-automation-server-core/commit/bc1ed2c)) +- changed keyboard shortcuts ([ef02f7c](https://github.com/nrkno/tv-automation-server-core/commit/ef02f7c)) +- changed restart CasparCG functionality ([dd567c2](https://github.com/nrkno/tv-automation-server-core/commit/dd567c2)) +- changed to retryUntil, added button ([1b31374](https://github.com/nrkno/tv-automation-server-core/commit/1b31374)) +- Changes for blueprints-integration typings ([8d1f37d](https://github.com/nrkno/tv-automation-server-core/commit/8d1f37d)) +- check AdLib media object status and display in Shelf ([3bacb40](https://github.com/nrkno/tv-automation-server-core/commit/3bacb40)) +- cherry-pick changes from the UI feature branch ([dfbb3b4](https://github.com/nrkno/tv-automation-server-core/commit/dfbb3b4)) +- clean up: show style, blueprint, blueprint logic names in UI ([e1ae6a7](https://github.com/nrkno/tv-automation-server-core/commit/e1ae6a7)) +- ClientAPI test suite ([69cad3f](https://github.com/nrkno/tv-automation-server-core/commit/69cad3f)) +- clip trim panel WIP ([36e79dc](https://github.com/nrkno/tv-automation-server-core/commit/36e79dc)) +- clip trim panel WIP ([9d01c2b](https://github.com/nrkno/tv-automation-server-core/commit/9d01c2b)) +- clip trim panel working, hide video monitor under a flag ([72ee490](https://github.com/nrkno/tv-automation-server-core/commit/72ee490)) +- codeControl: create syncFunctions which finer grained execution control based on arguments ([f53607f](https://github.com/nrkno/tv-automation-server-core/commit/f53607f)) +- componentize WorkFlow item ([f920e4b](https://github.com/nrkno/tv-automation-server-core/commit/f920e4b)) +- configuration UI for media manager ([b1883ec](https://github.com/nrkno/tv-automation-server-core/commit/b1883ec)) +- Consider transitions applied to objects via keyframes ([e911760](https://github.com/nrkno/tv-automation-server-core/commit/e911760)) +- Consider transitions applied to objects via keyframes ([eb65a3c](https://github.com/nrkno/tv-automation-server-core/commit/eb65a3c)) +- continue implementation of new blueprint interface ([b7d013d](https://github.com/nrkno/tv-automation-server-core/commit/b7d013d)) +- continue refactor of mos ingest logic ([ad6cbb1](https://github.com/nrkno/tv-automation-server-core/commit/ad6cbb1)) +- continue refactor of mos ingest logic ([c5b775a](https://github.com/nrkno/tv-automation-server-core/commit/c5b775a)) +- continued implementation of Migration (wip) ([72fbcb5](https://github.com/nrkno/tv-automation-server-core/commit/72fbcb5)) +- continued refactoring of ingest / mos data flow ([4ffe93a](https://github.com/nrkno/tv-automation-server-core/commit/4ffe93a)) +- converted app.js to typescript and added an example subscription-implementation ([da439af](https://github.com/nrkno/tv-automation-server-core/commit/da439af)) +- converted more subscriptions (WIP) ([e047fef](https://github.com/nrkno/tv-automation-server-core/commit/e047fef)) +- converted StudioInstallation into a class, adding getConfigValue as member method, a step towards DRY ([4af278e](https://github.com/nrkno/tv-automation-server-core/commit/4af278e)) +- CoreSystem initial implementation ([06369b2](https://github.com/nrkno/tv-automation-server-core/commit/06369b2)) +- countdown to running order expectedStart ([7b505c5](https://github.com/nrkno/tv-automation-server-core/commit/7b505c5)) +- create action buttons in the Support PopUp for reset PG, take snapshot, show hotkeys ([be89893](https://github.com/nrkno/tv-automation-server-core/commit/be89893)) +- cron job for restarting casparcg ([19898d1](https://github.com/nrkno/tv-automation-server-core/commit/19898d1)) +- Crude UI to rerun studio baseline ([25b2395](https://github.com/nrkno/tv-automation-server-core/commit/25b2395)) +- Crude ui to visualise generated timeline ([6e55382](https://github.com/nrkno/tv-automation-server-core/commit/6e55382)) +- css: import and use fonts in prompter ([97a8037](https://github.com/nrkno/tv-automation-server-core/commit/97a8037)) +- Define all special blueprints as options in the showstyle ([7e1da16](https://github.com/nrkno/tv-automation-server-core/commit/7e1da16)) +- disable in next segmentLine & refactoring ([669166c](https://github.com/nrkno/tv-automation-server-core/commit/669166c)) +- disable shortcut-keys when modalDialog is open ([24bab3f](https://github.com/nrkno/tv-automation-server-core/commit/24bab3f)) +- dismiss all notifcations ([896dbb5](https://github.com/nrkno/tv-automation-server-core/commit/896dbb5)) +- display ms in user activity log ([5172f2e](https://github.com/nrkno/tv-automation-server-core/commit/5172f2e)) +- display ms in user activity log ([7fc2744](https://github.com/nrkno/tv-automation-server-core/commit/7fc2744)) +- do not block click-to-take when trigger is absolute 0 ([cec86ca](https://github.com/nrkno/tv-automation-server-core/commit/cec86ca)) +- don't restore from old snapshots ([bab8bbb](https://github.com/nrkno/tv-automation-server-core/commit/bab8bbb)) +- ensure each sli has a mosId set ([57c977d](https://github.com/nrkno/tv-automation-server-core/commit/57c977d)) +- expected audioTracks property ([250dc79](https://github.com/nrkno/tv-automation-server-core/commit/250dc79)) +- expose moment to templates ([c2a1cc5](https://github.com/nrkno/tv-automation-server-core/commit/c2a1cc5)) +- externalMessage: allow for multiple messages to be generated at the same time ([284efbe](https://github.com/nrkno/tv-automation-server-core/commit/284efbe)) +- externalMessages implementation (it works now) ([3b8e88a](https://github.com/nrkno/tv-automation-server-core/commit/3b8e88a)) +- f9, f10 buttons step next forward & down (shift reverses direction) ([a3be0cf](https://github.com/nrkno/tv-automation-server-core/commit/a3be0cf)) +- First draft at uploading a blueprints blob into a new db collection, and running it instead of the existing baseline ([31c56d8](https://github.com/nrkno/tv-automation-server-core/commit/31c56d8)) +- force some function to run synchronously. experimental, WIP! ([55a064c](https://github.com/nrkno/tv-automation-server-core/commit/55a064c)) +- force some function to run synchronously. experimental, WIP! ([54d83dd](https://github.com/nrkno/tv-automation-server-core/commit/54d83dd)) +- full implementation of mos-functions, profile 0 & 2 ([4bafeeb](https://github.com/nrkno/tv-automation-server-core/commit/4bafeeb)) +- Generate full sl & sli data on create/update of both ro and segment ([7969c2e](https://github.com/nrkno/tv-automation-server-core/commit/7969c2e)) +- Grafikk lookahead/preload ([30a6b03](https://github.com/nrkno/tv-automation-server-core/commit/30a6b03)) +- Grafikk lookahead/preload ([78828fe](https://github.com/nrkno/tv-automation-server-core/commit/78828fe)) +- handle mos updates with dynamicallyInserted segmentLines ([1d292c0](https://github.com/nrkno/tv-automation-server-core/commit/1d292c0)) +- handle roList reply on reload RunningOrder data, also more refactoring & cleanup ([cee70c5](https://github.com/nrkno/tv-automation-server-core/commit/cee70c5)) +- Handle SegmentLine data operations, with the help of an improved data cache ([9c84271](https://github.com/nrkno/tv-automation-server-core/commit/9c84271)) +- handle situation when reloading rundown and rundown is missing ([9138a2b](https://github.com/nrkno/tv-automation-server-core/commit/9138a2b)) +- HOLD mode ([ae1dacf](https://github.com/nrkno/tv-automation-server-core/commit/ae1dacf)) +- HOLD mode ([e41c5a4](https://github.com/nrkno/tv-automation-server-core/commit/e41c5a4)) +- Hold state UI ([d835efc](https://github.com/nrkno/tv-automation-server-core/commit/d835efc)) +- Hold state UI ([c7a17c7](https://github.com/nrkno/tv-automation-server-core/commit/c7a17c7)) +- hyperdeck device ([#49](https://github.com/nrkno/tv-automation-server-core/issues/49)) ([c706628](https://github.com/nrkno/tv-automation-server-core/commit/c706628)) +- if template 'getId' returns null, don't throw an error. Also when templateId is not found, send warning instead of an error ([d98f09d](https://github.com/nrkno/tv-automation-server-core/commit/d98f09d)) +- implement (upcoming) blueprint API ([d86faa5](https://github.com/nrkno/tv-automation-server-core/commit/d86faa5)) +- implement AdLib filters in RundownView ([b88ef64](https://github.com/nrkno/tv-automation-server-core/commit/b88ef64)) +- implement camera number-device mapping for PTZ ([374568d](https://github.com/nrkno/tv-automation-server-core/commit/374568d)) +- implement click-to-adlib completely ([577dcac](https://github.com/nrkno/tv-automation-server-core/commit/577dcac)) +- implement client-side error reporting to Core ([f747057](https://github.com/nrkno/tv-automation-server-core/commit/f747057)) +- implement fibers support when testing in Jest ([bb99e97](https://github.com/nrkno/tv-automation-server-core/commit/bb99e97)) +- implement mosRoStoryMove ([ab76cfb](https://github.com/nrkno/tv-automation-server-core/commit/ab76cfb)) +- implement Panasonic PTZ device ([42d8534](https://github.com/nrkno/tv-automation-server-core/commit/42d8534)) +- implement Panasonic PTZ settings ([f7840da](https://github.com/nrkno/tv-automation-server-core/commit/f7840da)) +- implement spliting long scripts into beginning and end in popup ([9fa8006](https://github.com/nrkno/tv-automation-server-core/commit/9fa8006)) +- implement support for Spreadsheet gateway ([44dab01](https://github.com/nrkno/tv-automation-server-core/commit/44dab01)) +- implement timeline-visualizer view ([e725618](https://github.com/nrkno/tv-automation-server-core/commit/e725618)) +- implementation of blueprint migrations ([5fec7a2](https://github.com/nrkno/tv-automation-server-core/commit/5fec7a2)) +- implementation of disable-next-segmentLineItem ([a06d196](https://github.com/nrkno/tv-automation-server-core/commit/a06d196)) +- implementation of invalid segmentLine & invalid segmentLineItem (adLib) ([7ddcede](https://github.com/nrkno/tv-automation-server-core/commit/7ddcede)) +- implementation of new blueprint API ([34f905f](https://github.com/nrkno/tv-automation-server-core/commit/34f905f)) +- implemented mos profiles 0-2 ([d803da1](https://github.com/nrkno/tv-automation-server-core/commit/d803da1)) +- Implemented Notes into data structure & GUI ([735b8c5](https://github.com/nrkno/tv-automation-server-core/commit/735b8c5)) +- implemented partial timeline fix ([c8b56e4](https://github.com/nrkno/tv-automation-server-core/commit/c8b56e4)) +- implemented stricter typing & changed classes to ReactMeteorComponent where applicable ([9d2166e](https://github.com/nrkno/tv-automation-server-core/commit/9d2166e)) +- implemented userActions ([2b343e6](https://github.com/nrkno/tv-automation-server-core/commit/2b343e6)) +- import MOS snapshot ([ad11dd6](https://github.com/nrkno/tv-automation-server-core/commit/ad11dd6)) +- improve code quality (switch div's to buttons where they should be) ([70d9348](https://github.com/nrkno/tv-automation-server-core/commit/70d9348)) +- improved layout for presenter countdowns ([2bd61cc](https://github.com/nrkno/tv-automation-server-core/commit/2bd61cc)) +- include expectedMediaItems in RunningOrder snapshots ([9fcbba0](https://github.com/nrkno/tv-automation-server-core/commit/9fcbba0)) +- Infinite segmentlineitem ([c02a641](https://github.com/nrkno/tv-automation-server-core/commit/c02a641)) +- initial implementation of externalMessages, (not working yet) ([ace91f1](https://github.com/nrkno/tv-automation-server-core/commit/ace91f1)) +- Initial implementation of importing a running order from spreadsheet gateway (wip) ([870a500](https://github.com/nrkno/tv-automation-server-core/commit/870a500)) +- initial implementation of new general data ingest API ([a2b4987](https://github.com/nrkno/tv-automation-server-core/commit/a2b4987)) +- initial implementation of Take with Offset functionality ([9c860ca](https://github.com/nrkno/tv-automation-server-core/commit/9c860ca)) +- Initial timings for opening templates ([a9bfb66](https://github.com/nrkno/tv-automation-server-core/commit/a9bfb66)) +- Interfaces for describing the timeline, segments (titles), layers ([ea96dfb](https://github.com/nrkno/tv-automation-server-core/commit/ea96dfb)) +- jest config & example implementation of module mocks ([43ac8fa](https://github.com/nrkno/tv-automation-server-core/commit/43ac8fa)) +- jest mocks ([9fdadf3](https://github.com/nrkno/tv-automation-server-core/commit/9fdadf3)) +- KAM SLUTT variant ([e819269](https://github.com/nrkno/tv-automation-server-core/commit/e819269)) +- List, start and stop test recordings ([df552ab](https://github.com/nrkno/tv-automation-server-core/commit/df552ab)) +- load atem ssrc background when activating RO ([0eda9b4](https://github.com/nrkno/tv-automation-server-core/commit/0eda9b4)) +- log ClientResonseErrors as errors in userActionLog ([4bc10b5](https://github.com/nrkno/tv-automation-server-core/commit/4bc10b5)) +- log message on startup ([c715266](https://github.com/nrkno/tv-automation-server-core/commit/c715266)) +- log warning message when trying to access a studio.config value that hasn't been set. ([7e706c6](https://github.com/nrkno/tv-automation-server-core/commit/7e706c6)) +- log WorkFlow success or failure ([8e7d9d7](https://github.com/nrkno/tv-automation-server-core/commit/8e7d9d7)) +- lookahead ([5ed0f13](https://github.com/nrkno/tv-automation-server-core/commit/5ed0f13)) +- manipulator methods for inserting & removing showStyleBase & showStyleVariant ([6bb4e00](https://github.com/nrkno/tv-automation-server-core/commit/6bb4e00)) +- mark segmentline as invalid ([bd1f20c](https://github.com/nrkno/tv-automation-server-core/commit/bd1f20c)) +- Media Manager actions to restart & abort workflows ([6c94ad6](https://github.com/nrkno/tv-automation-server-core/commit/6c94ad6)) +- Media manager UI ([c83e1ff](https://github.com/nrkno/tv-automation-server-core/commit/c83e1ff)) +- media scanner & casparcg launcher hostnames ([02ec8be](https://github.com/nrkno/tv-automation-server-core/commit/02ec8be)) +- mediamanager: GUI support for SKIPPED step status ([1c39867](https://github.com/nrkno/tv-automation-server-core/commit/1c39867)) +- message queue retry button working with with retryUntil ([2fa05bb](https://github.com/nrkno/tv-automation-server-core/commit/2fa05bb)) +- MeteorReactComponent: return subscription & computation handle ([e20e6de](https://github.com/nrkno/tv-automation-server-core/commit/e20e6de)) +- method "ping" to be called by devices every now and then, to update lastSeen ([41a996c](https://github.com/nrkno/tv-automation-server-core/commit/41a996c)) +- Migration UI & started adding migration steps ([2a117ad](https://github.com/nrkno/tv-automation-server-core/commit/2a117ad)) +- Migration: added more migration steps for 0.16.0 ([2ac06ea](https://github.com/nrkno/tv-automation-server-core/commit/2ac06ea)) +- Migration: continued impl. ([8982701](https://github.com/nrkno/tv-automation-server-core/commit/8982701)) +- monitor externalMessageQueue for system status ([e92f5be](https://github.com/nrkno/tv-automation-server-core/commit/e92f5be)) +- more WIP for support panel ([b23c855](https://github.com/nrkno/tv-automation-server-core/commit/b23c855)) +- more work on notification center ([a34ccd0](https://github.com/nrkno/tv-automation-server-core/commit/a34ccd0)) +- more work on notification center ([92196ca](https://github.com/nrkno/tv-automation-server-core/commit/92196ca)) +- more work on peripheralDevices notifications ([692b1b2](https://github.com/nrkno/tv-automation-server-core/commit/692b1b2)) +- more work on peripheralDevices notifications ([36a0a4b](https://github.com/nrkno/tv-automation-server-core/commit/36a0a4b)) +- mos-actions ([248db8a](https://github.com/nrkno/tv-automation-server-core/commit/248db8a)) +- Move all device specific TimelineObj types to tsr-types ([55766a5](https://github.com/nrkno/tv-automation-server-core/commit/55766a5)) +- move delete button to peripheralDevice page ([46647c1](https://github.com/nrkno/tv-automation-server-core/commit/46647c1)) +- move delete button to peripheralDevice page ([286d12f](https://github.com/nrkno/tv-automation-server-core/commit/286d12f)) +- Move Mapping types to tsr-types package ([67bd838](https://github.com/nrkno/tv-automation-server-core/commit/67bd838)) +- move new timeline visualizer to replace the old broken one ([174dd7e](https://github.com/nrkno/tv-automation-server-core/commit/174dd7e)) +- Move SegmentLine duration calculation into templates ([315eb42](https://github.com/nrkno/tv-automation-server-core/commit/315eb42)) +- Move sofie and metadata urls from templates to config ([af8e388](https://github.com/nrkno/tv-automation-server-core/commit/af8e388)) +- Move some lawo and nora specific processing to blueprints ([a7a6aad](https://github.com/nrkno/tv-automation-server-core/commit/a7a6aad)) +- Move types to blueprint-integration ([c305061](https://github.com/nrkno/tv-automation-server-core/commit/c305061)) +- moved nightly cronjob to run after 4am ([8eb4e12](https://github.com/nrkno/tv-automation-server-core/commit/8eb4e12)) +- multiSelect component for selecting compatible Show Styles ([e1a5c35](https://github.com/nrkno/tv-automation-server-core/commit/e1a5c35)) +- only log logger.debug() when in developer mode ([8ed8e71](https://github.com/nrkno/tv-automation-server-core/commit/8ed8e71)) +- optimization: add cache of blueprints, to avoid having to parse text-functions all the time ([1e469d9](https://github.com/nrkno/tv-automation-server-core/commit/1e469d9)) +- output evaluation to log ([f95cfbf](https://github.com/nrkno/tv-automation-server-core/commit/f95cfbf)) +- output evaluation to log ([7deca0f](https://github.com/nrkno/tv-automation-server-core/commit/7deca0f)) +- Part EndState persistance ([a84f74b](https://github.com/nrkno/tv-automation-server-core/commit/a84f74b)) +- place all collections in Collections object, for debugging purposes ([9682a89](https://github.com/nrkno/tv-automation-server-core/commit/9682a89)) +- playout device debugLogging (wip) ([7ab4ec6](https://github.com/nrkno/tv-automation-server-core/commit/7ab4ec6)) +- preliminary mongo mock implementation ([498b88f](https://github.com/nrkno/tv-automation-server-core/commit/498b88f)) +- prevent next:ing of currently playing segmentLine ([b9c9ea1](https://github.com/nrkno/tv-automation-server-core/commit/b9c9ea1)) +- prompter-view ([f45a923](https://github.com/nrkno/tv-automation-server-core/commit/f45a923)) +- prompter: add ^ and v indicators to where current take & next point is ([5c545e5](https://github.com/nrkno/tv-automation-server-core/commit/5c545e5)) +- prompter: continued implementation, url parameters etc ([785d0c0](https://github.com/nrkno/tv-automation-server-core/commit/785d0c0)) +- Prompter: New scroll mode: Smooth scrolling, which allows the user to use scroll wheel naturally ([e25ae40](https://github.com/nrkno/tv-automation-server-core/commit/e25ae40)) +- quick-n-dirty implementation of a preliminary REST-API, using existing methods and publications ([7ba8896](https://github.com/nrkno/tv-automation-server-core/commit/7ba8896)) +- rabbitMQ: add support for headers ([e3e3d48](https://github.com/nrkno/tv-automation-server-core/commit/e3e3d48)) +- rabbitMQ: headers ([087bb2e](https://github.com/nrkno/tv-automation-server-core/commit/087bb2e)) +- Read all templates from database ([3287f63](https://github.com/nrkno/tv-automation-server-core/commit/3287f63)) +- Refactor blueprint contexts so be different per type to limit exposed api ([f0d1c7c](https://github.com/nrkno/tv-automation-server-core/commit/f0d1c7c)) +- Refactor external message template code ([21ac50e](https://github.com/nrkno/tv-automation-server-core/commit/21ac50e)) +- refactor of subscriptions (WIP) ([2b6f994](https://github.com/nrkno/tv-automation-server-core/commit/2b6f994)) +- refactor prompter view, prepare for modular controllers ([eb1ac27](https://github.com/nrkno/tv-automation-server-core/commit/eb1ac27)) +- Refactor story template code to use new blueprint structure ([104982b](https://github.com/nrkno/tv-automation-server-core/commit/104982b)) +- refactor systemStatus & add status messages on front page ([14da61a](https://github.com/nrkno/tv-automation-server-core/commit/14da61a)) +- refactor to use relative durations. affects infinite segmentlineitems, autonext, segmentline overlapduration property ([67c5444](https://github.com/nrkno/tv-automation-server-core/commit/67c5444)) +- refactored initDB into 2 separate methods, so we can easilly update just the layers and not the infrastructure ([d4fcc3f](https://github.com/nrkno/tv-automation-server-core/commit/d4fcc3f)) +- Reference blueprints-integration api file ([dc1cdb8](https://github.com/nrkno/tv-automation-server-core/commit/dc1cdb8)) +- Reference blueprints-integration utils file ([d94c97b](https://github.com/nrkno/tv-automation-server-core/commit/d94c97b)) +- Reference device options in tsr-types ([049b9bc](https://github.com/nrkno/tv-automation-server-core/commit/049b9bc)) +- reimplement fullscreen/on air button ([4b8658d](https://github.com/nrkno/tv-automation-server-core/commit/4b8658d)) +- Reimplement mock ro importing for new ingest data flow ([4b5ce20](https://github.com/nrkno/tv-automation-server-core/commit/4b5ce20)) +- reimplement remaining mos methods ([43b7ba1](https://github.com/nrkno/tv-automation-server-core/commit/43b7ba1)) +- Remove monaco ([e417548](https://github.com/nrkno/tv-automation-server-core/commit/e417548)) +- rename /clock into /countdowns/presenter ([96c3136](https://github.com/nrkno/tv-automation-server-core/commit/96c3136)) +- rename files according to new naming convention ([406fad2](https://github.com/nrkno/tv-automation-server-core/commit/406fad2)) +- reset 'dirty' segment lines by re-running blueprints on them ([064a84d](https://github.com/nrkno/tv-automation-server-core/commit/064a84d)) +- restart CasparCG from UI ([64509c3](https://github.com/nrkno/tv-automation-server-core/commit/64509c3)) +- reworked externalMessages page ([3b87242](https://github.com/nrkno/tv-automation-server-core/commit/3b87242)) +- reworked the whole activate/deacticate/reset/reload logic ([1fea56e](https://github.com/nrkno/tv-automation-server-core/commit/1fea56e)) +- Rewrite debug rerun blueprints helper to use new ingest data cache ([29692e4](https://github.com/nrkno/tv-automation-server-core/commit/29692e4)) +- Rewrite templateContext.getConfigValue to get default values from defaultConfig 'blueprint' and to cache values ([6ce0f97](https://github.com/nrkno/tv-automation-server-core/commit/6ce0f97)) +- run automatic migration when starting up a fresh system, if possible. ([4fb4759](https://github.com/nrkno/tv-automation-server-core/commit/4fb4759)) +- rundown layout editor in Settings ([df206e5](https://github.com/nrkno/tv-automation-server-core/commit/df206e5)) +- running order full-screen marker ([03010ec](https://github.com/nrkno/tv-automation-server-core/commit/03010ec)) +- RunningOrder unsynced notification ([9effce5](https://github.com/nrkno/tv-automation-server-core/commit/9effce5)) +- RunningOrderDataImport tidying and unsync guards ([d0a12d8](https://github.com/nrkno/tv-automation-server-core/commit/d0a12d8)) +- second upload to atem ([6697a80](https://github.com/nrkno/tv-automation-server-core/commit/6697a80)) +- segment line arguments ([3c5313a](https://github.com/nrkno/tv-automation-server-core/commit/3c5313a)) +- send evaluation message to slack. WIP ([3dcbe3a](https://github.com/nrkno/tv-automation-server-core/commit/3dcbe3a)) +- send evaluation message to slack. WIP ([96e8b81](https://github.com/nrkno/tv-automation-server-core/commit/96e8b81)) +- send the window url in the client error report ([807ccc9](https://github.com/nrkno/tv-automation-server-core/commit/807ccc9)) +- separate RO list into synced and unsynced lists ([6b92f40](https://github.com/nrkno/tv-automation-server-core/commit/6b92f40)) +- server side implementation of queueabilified adlibs ([0527b3b](https://github.com/nrkno/tv-automation-server-core/commit/0527b3b)) +- set in/out points through itemReplace ([4d31d70](https://github.com/nrkno/tv-automation-server-core/commit/4d31d70)) +- set triggerValue to lawo-TimelineObjs, so it triggers upon Nexting ([e3df655](https://github.com/nrkno/tv-automation-server-core/commit/e3df655)) +- settings: add workflow linger time ([9beefda](https://github.com/nrkno/tv-automation-server-core/commit/9beefda)) +- SH-121-Double-clicking zoom-scrubber should mean "zoom to show everything in this segment" ([aeadc46](https://github.com/nrkno/tv-automation-server-core/commit/aeadc46)) +- show 99+ instead of actual number for notifications ([1f84e67](https://github.com/nrkno/tv-automation-server-core/commit/1f84e67)) +- show a restart button in the notification if a parentDevice is connected and there is an issue with subdevice ([67e75b0](https://github.com/nrkno/tv-automation-server-core/commit/67e75b0)) +- show a restart button in the notification if a parentDevice is connected and there is an issue with subdevice ([bde803b](https://github.com/nrkno/tv-automation-server-core/commit/bde803b)) +- Show assignment in blueprint settings ([2816d45](https://github.com/nrkno/tv-automation-server-core/commit/2816d45)) +- show blueprint id in select options in Show Styles, hyphenated show-styles doesn't seem right ([e19802f](https://github.com/nrkno/tv-automation-server-core/commit/e19802f)) +- show changed timestamp on script items ([f2955e1](https://github.com/nrkno/tv-automation-server-core/commit/f2955e1)) +- show RO notes as notifications ([0ebc3fe](https://github.com/nrkno/tv-automation-server-core/commit/0ebc3fe)) +- show timecodes in SegmentLineContextMenus ([5df6e15](https://github.com/nrkno/tv-automation-server-core/commit/5df6e15)) +- show user activity log for timeslot of recording ([5c75305](https://github.com/nrkno/tv-automation-server-core/commit/5c75305)) +- show user name in evaluations ([c59d7ee](https://github.com/nrkno/tv-automation-server-core/commit/c59d7ee)) +- Simplify RunningOrderBaseItem type ([2b8257b](https://github.com/nrkno/tv-automation-server-core/commit/2b8257b)) +- **onlySelectedFiles:** support only selected files flag on shared storage options ([dee11d2](https://github.com/nrkno/tv-automation-server-core/commit/dee11d2)) +- ShowStyle templates can be marked as helpers and accessed from other templates ([a20ffa7](https://github.com/nrkno/tv-automation-server-core/commit/a20ffa7)) +- sketch interfaces for RundownLayouts ([69b37d9](https://github.com/nrkno/tv-automation-server-core/commit/69b37d9)) +- some work on notification center ([8e2c269](https://github.com/nrkno/tv-automation-server-core/commit/8e2c269)) +- some work on notification center ([58ad599](https://github.com/nrkno/tv-automation-server-core/commit/58ad599)) +- some work on updating the next part on data changes ([5551707](https://github.com/nrkno/tv-automation-server-core/commit/5551707)) +- SOURCE_NOT_SET for SLI Status ([cff64e1](https://github.com/nrkno/tv-automation-server-core/commit/cff64e1)) +- specific implementation: append Note on RunningOrder if segmentLine is not found ([a2ff6a2](https://github.com/nrkno/tv-automation-server-core/commit/a2ff6a2)) +- speech synthesis ([eb9643a](https://github.com/nrkno/tv-automation-server-core/commit/eb9643a)) +- Split (DVE 2LIKE) template ([8ccf23e](https://github.com/nrkno/tv-automation-server-core/commit/8ccf23e)) +- Start moving some migrations to blueprints ([9d4949e](https://github.com/nrkno/tv-automation-server-core/commit/9d4949e)) +- Start of stk and grafikk templates ([0458e3e](https://github.com/nrkno/tv-automation-server-core/commit/0458e3e)) +- start on migration for 0.25.0 ([104a867](https://github.com/nrkno/tv-automation-server-core/commit/104a867)) +- Start using types from sofie-blueprints-integration ([6106d99](https://github.com/nrkno/tv-automation-server-core/commit/6106d99)) +- started on mos device data implementation ([1d3b19a](https://github.com/nrkno/tv-automation-server-core/commit/1d3b19a)) +- started working on integration tests, added a client-side stub ([c4cbadc](https://github.com/nrkno/tv-automation-server-core/commit/c4cbadc)) +- status endpoint /health updated to use device statuses ([2c4b7fa](https://github.com/nrkno/tv-automation-server-core/commit/2c4b7fa)) +- store last shelf tab, rework UIStateStorage ([7ab0f3f](https://github.com/nrkno/tv-automation-server-core/commit/7ab0f3f)) +- Strip out old runtime functions ([880a885](https://github.com/nrkno/tv-automation-server-core/commit/880a885)) +- stub of setting in & out points ([0852b42](https://github.com/nrkno/tv-automation-server-core/commit/0852b42)) +- studio and system blueprints ([5ed64cf](https://github.com/nrkno/tv-automation-server-core/commit/5ed64cf)) +- Studio blueprint now selects variant to use for ROs ([6131057](https://github.com/nrkno/tv-automation-server-core/commit/6131057)) +- StudioInstallation key-value config store for template settings ([b37ea17](https://github.com/nrkno/tv-automation-server-core/commit/b37ea17)) +- StudioInstallation key-value config store for template settings ([812c313](https://github.com/nrkno/tv-automation-server-core/commit/812c313)) +- support displayDurationGroups in RO view ([460df8d](https://github.com/nrkno/tv-automation-server-core/commit/460df8d)) +- support for multiple notification actions ([09be9c1](https://github.com/nrkno/tv-automation-server-core/commit/09be9c1)) +- support for Pharos device ([4a99fb3](https://github.com/nrkno/tv-automation-server-core/commit/4a99fb3)) +- support media manager integration ([dcbf282](https://github.com/nrkno/tv-automation-server-core/commit/dcbf282)) +- Support panel WIP ([6955fdc](https://github.com/nrkno/tv-automation-server-core/commit/6955fdc)) +- support preload lookahead mode for nora, which swaps out take commands for cue ([4cfd4fe](https://github.com/nrkno/tv-automation-server-core/commit/4cfd4fe)) +- support timeline v2 by Johan & Julian ([fd039d8](https://github.com/nrkno/tv-automation-server-core/commit/fd039d8)) +- support workFlow comments ([6181006](https://github.com/nrkno/tv-automation-server-core/commit/6181006)) +- Switch to single-device design ([a268c40](https://github.com/nrkno/tv-automation-server-core/commit/a268c40)) +- syncFunction priorities ([4c99c11](https://github.com/nrkno/tv-automation-server-core/commit/4c99c11)) +- System snapshot ([006027b](https://github.com/nrkno/tv-automation-server-core/commit/006027b)) +- system version status monitoring ([1c96263](https://github.com/nrkno/tv-automation-server-core/commit/1c96263)) +- system-wide message ([d7305df](https://github.com/nrkno/tv-automation-server-core/commit/d7305df)) +- take from here UI item ([ca26660](https://github.com/nrkno/tv-automation-server-core/commit/ca26660)) +- take snapshot before running migration ([3ae4e92](https://github.com/nrkno/tv-automation-server-core/commit/3ae4e92)) +- take snapshot when saving evaluation form ([df318bb](https://github.com/nrkno/tv-automation-server-core/commit/df318bb)) +- take snapshot when saving evaluation form ([b98d68f](https://github.com/nrkno/tv-automation-server-core/commit/b98d68f)) +- templates: added format functions for timecode ([ea38081](https://github.com/nrkno/tv-automation-server-core/commit/ea38081)) +- this did not look right button ([1e01a10](https://github.com/nrkno/tv-automation-server-core/commit/1e01a10)) +- timeline-visualizer: add details-on-click ([c81243c](https://github.com/nrkno/tv-automation-server-core/commit/c81243c)) +- timings page ([6bc325a](https://github.com/nrkno/tv-automation-server-core/commit/6bc325a)) +- toggle running order argument on an SL with a hotkey ([258c3b3](https://github.com/nrkno/tv-automation-server-core/commit/258c3b3)) +- Transition as a seperate SegmentLineItem, which is not run if the first SegmentLine in the show, or the previous SegmentLine instructs it to not ([e676a43](https://github.com/nrkno/tv-automation-server-core/commit/e676a43)) +- translation improvements ([d3a535d](https://github.com/nrkno/tv-automation-server-core/commit/d3a535d)) +- Treat sli marked as virtual solely as markers for the timeline. They are hidden from the ui and are not allowed to place any contents on the timeline ([25e0f42](https://github.com/nrkno/tv-automation-server-core/commit/25e0f42)) +- trim config values (strings) ([d41e07e](https://github.com/nrkno/tv-automation-server-core/commit/d41e07e)) +- UI: Add Getting Started message on fresh system startup ([febe8ff](https://github.com/nrkno/tv-automation-server-core/commit/febe8ff)) +- unsynced mode ([#51](https://github.com/nrkno/tv-automation-server-core/issues/51)) ([7e0a263](https://github.com/nrkno/tv-automation-server-core/commit/7e0a263)) +- Update baseline generation for new blueprint api ([79767bf](https://github.com/nrkno/tv-automation-server-core/commit/79767bf)) +- update blueprint contexts to match new API ([ab6fc5a](https://github.com/nrkno/tv-automation-server-core/commit/ab6fc5a)) +- update dependencies ([6766d18](https://github.com/nrkno/tv-automation-server-core/commit/6766d18)) +- update meteor typings ([49b6969](https://github.com/nrkno/tv-automation-server-core/commit/49b6969)) +- Update template to use correct media files and durations. Adjust transitions from head to kam ([18f6c44](https://github.com/nrkno/tv-automation-server-core/commit/18f6c44)) +- Update timeline and infinite items on enps update ([db0c041](https://github.com/nrkno/tv-automation-server-core/commit/db0c041)) +- update type dependencies and type references. Removed dependency of mos-connection and replaced it with references to the blueprints-integration. ([85bd795](https://github.com/nrkno/tv-automation-server-core/commit/85bd795)) +- update types deps & API methods ([7d1a49b](https://github.com/nrkno/tv-automation-server-core/commit/7d1a49b)) +- **asRunLog:** collection implementation ([0e63c36](https://github.com/nrkno/tv-automation-server-core/commit/0e63c36)) +- **asRunLog:** implementation of asRunLog ([62f5b8c](https://github.com/nrkno/tv-automation-server-core/commit/62f5b8c)) +- **aux:** Adds tecnical error aux 2 ([34ce710](https://github.com/nrkno/tv-automation-server-core/commit/34ce710)) +- **AUX:** adds clock aux ([45479da](https://github.com/nrkno/tv-automation-server-core/commit/45479da)) +- **AUXes:** New AUX-mapping introducing more previews and moves the cleanfeed ([548bd8c](https://github.com/nrkno/tv-automation-server-core/commit/548bd8c)) +- **blueprint:** refactor getConfigValue into the blueprints, with context exposing the raw array as getConfig instead ([5b0ac39](https://github.com/nrkno/tv-automation-server-core/commit/5b0ac39)) +- **blueprints:** Add minimum core version to blueprints. Move blueprint restore code to api/blueprints ([2453a16](https://github.com/nrkno/tv-automation-server-core/commit/2453a16)) +- **blueprints:** Add section of studio settings based off a manifest from the blueprints ([4866a79](https://github.com/nrkno/tv-automation-server-core/commit/4866a79)) +- **blueprints:** Allow the post-process blueprint to modify a select few properties on the segmentLines ([ee02813](https://github.com/nrkno/tv-automation-server-core/commit/ee02813)) +- **blueprints:** Expose version string and uploading in the ui ([00875a4](https://github.com/nrkno/tv-automation-server-core/commit/00875a4)) +- **Capabilities:** Added basic Lawo and ATEM capabilities ([90d6edd](https://github.com/nrkno/tv-automation-server-core/commit/90d6edd)) +- **click-to-take:** initial WIP ([8e63808](https://github.com/nrkno/tv-automation-server-core/commit/8e63808)) +- **click-to-take:** more work in progress ([e3549e0](https://github.com/nrkno/tv-automation-server-core/commit/e3549e0)) +- **clip trim:** WIP on styling Clip trimmer components ([1af8ff4](https://github.com/nrkno/tv-automation-server-core/commit/1af8ff4)) +- **clip trim dialog:** add an icon to mark a trimmed clip ([371ddb8](https://github.com/nrkno/tv-automation-server-core/commit/371ddb8)) +- **clip trim dialog:** implement timecode encoder ([32e8f89](https://github.com/nrkno/tv-automation-server-core/commit/32e8f89)) +- **clip trim panel:** more WIP on components ([05daa8f](https://github.com/nrkno/tv-automation-server-core/commit/05daa8f)) +- **config:** Add support for enum config entries ([b4ae4b5](https://github.com/nrkno/tv-automation-server-core/commit/b4ae4b5)) +- **countdowns:** display autonext ([1405a89](https://github.com/nrkno/tv-automation-server-core/commit/1405a89)) +- **device:** Custom make-ready commands for httpsend device ([410a2ef](https://github.com/nrkno/tv-automation-server-core/commit/410a2ef)) +- **endstate:** Use intermediary states for adlib pieces ([5117a33](https://github.com/nrkno/tv-automation-server-core/commit/5117a33)) +- **ENV:** adds ENV vars for default devices - casparcg, atem and lawo ([9bf8eee](https://github.com/nrkno/tv-automation-server-core/commit/9bf8eee)) +- **evaluation:** adds logging of evaluation level to keep statistics ([5da33a0](https://github.com/nrkno/tv-automation-server-core/commit/5da33a0)) +- **evaluation:** sends positive evaluations too ([d6c0bff](https://github.com/nrkno/tv-automation-server-core/commit/d6c0bff)) +- **expected media items:** updateExpectedMediaItems function ([e1ad692](https://github.com/nrkno/tv-automation-server-core/commit/e1ad692)) +- **expected media items:** use segmentLineId as key ([3803e87](https://github.com/nrkno/tv-automation-server-core/commit/3803e87)) +- **externalMessages:** add hold property, to be able to pause sending of messages ([adc69d8](https://github.com/nrkno/tv-automation-server-core/commit/adc69d8)) +- **Guest input:** use isGuestInput like isRemoteInput ([2d40e87](https://github.com/nrkno/tv-automation-server-core/commit/2d40e87)) +- **health check:** statusMessage implementation ([b01ac48](https://github.com/nrkno/tv-automation-server-core/commit/b01ac48)) +- **health check:** statusMessage implementation ([9bcf95a](https://github.com/nrkno/tv-automation-server-core/commit/9bcf95a)) +- **hotkeys:** optional cool down ([c9c2743](https://github.com/nrkno/tv-automation-server-core/commit/c9c2743)) +- **ingest:** First pass at ensuring all playout and ingest functions share a global rundown lock to avoid concurrent updates ([4b0cb56](https://github.com/nrkno/tv-automation-server-core/commit/4b0cb56)) +- **init:** adds clear shortcuts + skippabloe ([f824ae5](https://github.com/nrkno/tv-automation-server-core/commit/f824ae5)) +- **init:** adds multiple bak source layers ([c812510](https://github.com/nrkno/tv-automation-server-core/commit/c812510)) +- **init:** Adds RM 4,5,6 ([0021d7b](https://github.com/nrkno/tv-automation-server-core/commit/0021d7b)) +- **init:** Adds RM 4,5,6 ([dd59d47](https://github.com/nrkno/tv-automation-server-core/commit/dd59d47)) +- **init:** adds studio monitor html player to casparcg ([6533b0f](https://github.com/nrkno/tv-automation-server-core/commit/6533b0f)) +- **init:** bakskjerm type ([8ffe776](https://github.com/nrkno/tv-automation-server-core/commit/8ffe776)) +- **init:** moves countdown to casparcg machine 2, channel 1 ([6c93464](https://github.com/nrkno/tv-automation-server-core/commit/6c93464)) +- **init:** moves countdown to casparcg machine 2, channel 1 ([18c354b](https://github.com/nrkno/tv-automation-server-core/commit/18c354b)) +- **iterateDeeply:** exports iterateDeeply to template context ([42cc886](https://github.com/nrkno/tv-automation-server-core/commit/42cc886)) +- **lawo:** New structure to lawo devices and mappings ([35d812b](https://github.com/nrkno/tv-automation-server-core/commit/35d812b)) +- **loggin:** uses logger for better kibana logs ([8d31691](https://github.com/nrkno/tv-automation-server-core/commit/8d31691)) +- **lookahead:** Delay lookahead after an object by 1s if it is labelled by a class ([2c595fb](https://github.com/nrkno/tv-automation-server-core/commit/2c595fb)) +- **Media manager settings:** add 'mediaPath' property to storages ([50185b2](https://github.com/nrkno/tv-automation-server-core/commit/50185b2)) +- **media manager ui:** fix animations ([10a38de](https://github.com/nrkno/tv-automation-server-core/commit/10a38de)) +- **media manager ui:** nearly finishing the styling ([1bb3116](https://github.com/nrkno/tv-automation-server-core/commit/1bb3116)) +- **media manager ui:** show workflow creation time ([84a4b71](https://github.com/nrkno/tv-automation-server-core/commit/84a4b71)) +- **media manager UI:** WIP ([ccb54f0](https://github.com/nrkno/tv-automation-server-core/commit/ccb54f0)) +- **migration:** add previousVersion and buttons in GUI to revert database version ([61525a5](https://github.com/nrkno/tv-automation-server-core/commit/61525a5)) +- **migration:** display returned error message in GUI ([6169048](https://github.com/nrkno/tv-automation-server-core/commit/6169048)) +- **migration:** reafactor migrations and add new migration steps ([0966ef6](https://github.com/nrkno/tv-automation-server-core/commit/0966ef6)) +- **migrations:** automatically continue partialMigrations when possible ([f75e907](https://github.com/nrkno/tv-automation-server-core/commit/f75e907)) +- **migrations:** Move playout-device migrations to blueprints ([04029d4](https://github.com/nrkno/tv-automation-server-core/commit/04029d4)) +- **multi-step success:** introduce keyStep property ([fc8aebd](https://github.com/nrkno/tv-automation-server-core/commit/fc8aebd)) +- **Next:** Adds warning/fallback of not loaded clips ([e20bc2f](https://github.com/nrkno/tv-automation-server-core/commit/e20bc2f)) +- **notification center:** hot-links to RO note notifications ([f3e9f59](https://github.com/nrkno/tv-automation-server-core/commit/f3e9f59)) +- **notification center:** notification count ([b8fbcac](https://github.com/nrkno/tv-automation-server-core/commit/b8fbcac)) +- **notification center:** squish segments in RO view when NC is open ([36b514f](https://github.com/nrkno/tv-automation-server-core/commit/36b514f)) +- **notification-center:** connection status notifier et al. ([5aefd52](https://github.com/nrkno/tv-automation-server-core/commit/5aefd52)) +- **notification-center:** connection status notifier et al. ([e529e94](https://github.com/nrkno/tv-automation-server-core/commit/e529e94)) +- **notification-center:** move expand notification center to right-hand status bar ([2750fab](https://github.com/nrkno/tv-automation-server-core/commit/2750fab)) +- **notification-center:** NotificationCenterPanel et al. ([9283909](https://github.com/nrkno/tv-automation-server-core/commit/9283909)) +- **notification-center:** NotificationCenterPanel et al. ([c4794c8](https://github.com/nrkno/tv-automation-server-core/commit/c4794c8)) +- **notification-center:** segment warning tweak ([e956488](https://github.com/nrkno/tv-automation-server-core/commit/e956488)) +- **notification-center:** segment warning tweak ([d4fc5e7](https://github.com/nrkno/tv-automation-server-core/commit/d4fc5e7)) +- **notifications-center:** notification center in other pages than ROV ([5250aab](https://github.com/nrkno/tv-automation-server-core/commit/5250aab)) +- **notifications-center:** notification center in other pages than ROV ([0620115](https://github.com/nrkno/tv-automation-server-core/commit/0620115)) +- **peripheralDevices:** added collection, publication, api, access control and tests ([794b5be](https://github.com/nrkno/tv-automation-server-core/commit/794b5be)) +- **playout:** Add class to sli first_object to indicate if sli is from the current or previous sl ([8de6004](https://github.com/nrkno/tv-automation-server-core/commit/8de6004)) +- **playout:** Add class to sli first_object when the sli is a continuation of another ([d53f06b](https://github.com/nrkno/tv-automation-server-core/commit/d53f06b)) +- **playout:** Add classes to sl-firstobject from the current and prev sl. This will allow for some logical triggers which can be influenced by the prev sl ([632326f](https://github.com/nrkno/tv-automation-server-core/commit/632326f)) +- **playout:** Add object to timeline to indicate whether ro is active or in rehersal ([d0e850d](https://github.com/nrkno/tv-automation-server-core/commit/d0e850d)) +- **playout:** Block take during transitions ([d0628a2](https://github.com/nrkno/tv-automation-server-core/commit/d0628a2)) +- **prompter:** add anchor points & movement tweaks ([c4ababe](https://github.com/nrkno/tv-automation-server-core/commit/c4ababe)) +- **prompter:** Add keyboard-controller, for control by keyboard-like devices ([c6e307d](https://github.com/nrkno/tv-automation-server-core/commit/c6e307d)) +- **prompter:** add mouse-ish controller, for control by mouse-like devices ([00a924f](https://github.com/nrkno/tv-automation-server-core/commit/00a924f)) +- **Prompter:** implement a simple mirror mode ([8d0be4e](https://github.com/nrkno/tv-automation-server-core/commit/8d0be4e)) +- **rabbit:** initial commit (wip) ([7ed3223](https://github.com/nrkno/tv-automation-server-core/commit/7ed3223)) +- **rabbitmq:** Implementation of RabbitMQ external message queue ([b31e15f](https://github.com/nrkno/tv-automation-server-core/commit/b31e15f)) +- **rabbitmq:** message id ([7ce9e5a](https://github.com/nrkno/tv-automation-server-core/commit/7ce9e5a)) +- **record:** basic video player page ([138b8b9](https://github.com/nrkno/tv-automation-server-core/commit/138b8b9)) +- **record:** Controls to delete files ([4236db2](https://github.com/nrkno/tv-automation-server-core/commit/4236db2)) +- **record:** Create timelineobjects to control recording to the timeline. Add config to the db, and ui to edit it ([b5e4ebf](https://github.com/nrkno/tv-automation-server-core/commit/b5e4ebf)) +- **record:** Input field for user to give recording a name ([116ea9f](https://github.com/nrkno/tv-automation-server-core/commit/116ea9f)) +- **refactor:** move Runtime Arguments for Blueprints from StudioInstallation to ShowStyleBase ([9b2c2d8](https://github.com/nrkno/tv-automation-server-core/commit/9b2c2d8)) +- **RO view:** Introduce a 'duration settling' state to delay the UI update until the actual playout duration is received from playout ([28823c3](https://github.com/nrkno/tv-automation-server-core/commit/28823c3)) +- **RundownLayouts:** allow for default tabs ([bdd7403](https://github.com/nrkno/tv-automation-server-core/commit/bdd7403)) +- **Setting:** adds lawo setting to studio and devices ([5ab1717](https://github.com/nrkno/tv-automation-server-core/commit/5ab1717)) +- **settings:** playout devices have threadUsage ([b74410c](https://github.com/nrkno/tv-automation-server-core/commit/b74410c)) +- **shortcuts:** adds shortcuts to remove various graphic layers ([0d1a83d](https://github.com/nrkno/tv-automation-server-core/commit/0d1a83d)) +- **shortcuts:** standarize shortcut label display, support numpad ([4c5ba74](https://github.com/nrkno/tv-automation-server-core/commit/4c5ba74)) +- **snapshot:** continued implementation ([009e9e5](https://github.com/nrkno/tv-automation-server-core/commit/009e9e5)) +- **snapshot:** edit snapshot comments ([264638a](https://github.com/nrkno/tv-automation-server-core/commit/264638a)) +- **snapshot:** Implement snapshots, API endpoints & restore ([72e1a83](https://github.com/nrkno/tv-automation-server-core/commit/72e1a83)) +- **snapshot:** implement support for taking snapshot of settings related to a single studio ([d177113](https://github.com/nrkno/tv-automation-server-core/commit/d177113)) +- **snapshot:** snapshot restore/backup GUI ([c414f70](https://github.com/nrkno/tv-automation-server-core/commit/c414f70)) +- **snapshot:** take snapshot of runningOrder & restore ([fc34f73](https://github.com/nrkno/tv-automation-server-core/commit/fc34f73)) +- User log player ([e80f665](https://github.com/nrkno/tv-automation-server-core/commit/e80f665)) +- **template:** setup atem wipe transition ([f0c576c](https://github.com/nrkno/tv-automation-server-core/commit/f0c576c)) +- **template:** temporary env variable for nora group (MESOS_NORA_GROUP) ([8b00bc4](https://github.com/nrkno/tv-automation-server-core/commit/8b00bc4)) +- **template:** use upstream keyer for vignett playback. Adds some more layers for atem defaults, and overrides to stack changes better ([76b1e10](https://github.com/nrkno/tv-automation-server-core/commit/76b1e10)) +- **Template doc:** Added CasparCG resources ([80f98d5](https://github.com/nrkno/tv-automation-server-core/commit/80f98d5)) +- **templates:** Use ShowStyle to define default/fallback state. Play and stop head supers ([8375363](https://github.com/nrkno/tv-automation-server-core/commit/8375363)) +- **Templates:** Start parsing some new mos data. Process mesos based graphics. Set some lawo audio states ([df4b670](https://github.com/nrkno/tv-automation-server-core/commit/df4b670)) +- validatedMethod mock ([2f3a641](https://github.com/nrkno/tv-automation-server-core/commit/2f3a641)) +- **timeline:** Remove deviceId field from timeline objects ([85c4b89](https://github.com/nrkno/tv-automation-server-core/commit/85c4b89)) +- Update typings for blueprints to be more specific ([53f7281](https://github.com/nrkno/tv-automation-server-core/commit/53f7281)) +- Update typings for message blueprint ([cf13fc9](https://github.com/nrkno/tv-automation-server-core/commit/cf13fc9)) +- updated timeline dependency ([6ef9eb7](https://github.com/nrkno/tv-automation-server-core/commit/6ef9eb7)) +- updated to match blueprints-integration /develop, started on new message-flow, WIP ([6b84b75](https://github.com/nrkno/tv-automation-server-core/commit/6b84b75)) +- url parameter "all" configures ui modes ([586d5f4](https://github.com/nrkno/tv-automation-server-core/commit/586d5f4)) +- use date-picker for user-activity-log ([5e2c218](https://github.com/nrkno/tv-automation-server-core/commit/5e2c218)) +- warn media status for interlacing and fps ([fc3ac4b](https://github.com/nrkno/tv-automation-server-core/commit/fc3ac4b)) +- **timeline:** some initial work on labels taking account of liveline ([3086eec](https://github.com/nrkno/tv-automation-server-core/commit/3086eec)) +- **Timeline:** more work on new marker style ([570e408](https://github.com/nrkno/tv-automation-server-core/commit/570e408)) +- use default renderer for MIC sourceLayerType ([ce845d4](https://github.com/nrkno/tv-automation-server-core/commit/ce845d4)) +- use default renderer for MIC sourceLayerType ([6ab97b7](https://github.com/nrkno/tv-automation-server-core/commit/6ab97b7)) +- use generated svg as icons in countdown ([843ad10](https://github.com/nrkno/tv-automation-server-core/commit/843ad10)) +- Use studio baseline when no ro is active ([8353615](https://github.com/nrkno/tv-automation-server-core/commit/8353615)) +- warnings for media in wrong resolution ([55135c1](https://github.com/nrkno/tv-automation-server-core/commit/55135c1)) +- WIP: VERY preliminary implementation of quick and dirty manual playback ([a9ec948](https://github.com/nrkno/tv-automation-server-core/commit/a9ec948)) +- wrap blueprint functions, to emit better errors ([14873f1](https://github.com/nrkno/tv-automation-server-core/commit/14873f1)) +- zoom control buttons ([41c1c92](https://github.com/nrkno/tv-automation-server-core/commit/41c1c92)) -# 0.25.0 (2019-07-05) +# 0.25.0 (2019-07-05) ### Bug Fixes -* &nbps; in a string instead of A0 ([299ba28](https://github.com/nrkno/tv-automation-server-core/commit/299ba28)) -* a bug where DEFAULT_DISPLAY_DURATION would be added to a 0-duration member of a displayDurationGroup ([5f2ed62](https://github.com/nrkno/tv-automation-server-core/commit/5f2ed62)) -* a bug where DEFAULT_DISPLAY_DURATION would be added to a 0-duration member of a displayDurationGroup ([13f784d](https://github.com/nrkno/tv-automation-server-core/commit/13f784d)) -* accepted resolutions should not be separated by space. ([1b80a2c](https://github.com/nrkno/tv-automation-server-core/commit/1b80a2c)) -* activate past ROs ([c20af5d](https://github.com/nrkno/tv-automation-server-core/commit/c20af5d)) -* activate past ROs ([4b128a5](https://github.com/nrkno/tv-automation-server-core/commit/4b128a5)) -* add (preliminary) security rules for all collections ([6fd60e2](https://github.com/nrkno/tv-automation-server-core/commit/6fd60e2)) -* Add code documentation to the Notification Center ([ec03358](https://github.com/nrkno/tv-automation-server-core/commit/ec03358)) -* Add default exclusivity groups to InitDB ([dfd1782](https://github.com/nrkno/tv-automation-server-core/commit/dfd1782)) -* add dependency: timeline-state-resolver-types ([cd2db55](https://github.com/nrkno/tv-automation-server-core/commit/cd2db55)) -* Add exception handlers for timeline vizualiser page ([6bb56d8](https://github.com/nrkno/tv-automation-server-core/commit/6bb56d8)) -* Add exception handlers for timeline vizualiser page ([d9103dd](https://github.com/nrkno/tv-automation-server-core/commit/d9103dd)) -* Add migration to set type on existing blueprints ([f1b4f3c](https://github.com/nrkno/tv-automation-server-core/commit/f1b4f3c)) -* add missing translation json-file ([6059965](https://github.com/nrkno/tv-automation-server-core/commit/6059965)) -* add missing _id ([c948d09](https://github.com/nrkno/tv-automation-server-core/commit/c948d09)) -* add missing _id ([970fbf8](https://github.com/nrkno/tv-automation-server-core/commit/970fbf8)) -* Add missing _rank field to SegmentLineAdLibItem ([9cd15fa](https://github.com/nrkno/tv-automation-server-core/commit/9cd15fa)) -* add missing $ne (not equal) in mongoWhere ([53c76a8](https://github.com/nrkno/tv-automation-server-core/commit/53c76a8)) -* add missing asRunEvent in AsRunEventContext ([b8def27](https://github.com/nrkno/tv-automation-server-core/commit/b8def27)) -* add missing core version ([8ad3a9e](https://github.com/nrkno/tv-automation-server-core/commit/8ad3a9e)) -* add missing function ([de2b81f](https://github.com/nrkno/tv-automation-server-core/commit/de2b81f)) -* Add missing layers to initdb. Use readtime as possible duration of segmentline when calculating story length ([e388d63](https://github.com/nrkno/tv-automation-server-core/commit/e388d63)) -* add missing parameter in callback ([fc4f690](https://github.com/nrkno/tv-automation-server-core/commit/fc4f690)) -* add new timeline visualizer ([9cad423](https://github.com/nrkno/tv-automation-server-core/commit/9cad423)) -* add new timeline visualizer ([f240aab](https://github.com/nrkno/tv-automation-server-core/commit/f240aab)) -* add nn translation to whitelist ([4663e3b](https://github.com/nrkno/tv-automation-server-core/commit/4663e3b)) -* add parseDateTime code hints to template editor ([c38b2f7](https://github.com/nrkno/tv-automation-server-core/commit/c38b2f7)) -* add postinstall script for Jest & Fibers to work ([2ad398d](https://github.com/nrkno/tv-automation-server-core/commit/2ad398d)) -* add shortcut ctrl+shift+enter-on-numpad to reload ([b9820ff](https://github.com/nrkno/tv-automation-server-core/commit/b9820ff)) -* add Studios migrations ([6e8f9f9](https://github.com/nrkno/tv-automation-server-core/commit/6e8f9f9)) -* added _valid: true to mock-data ([6c2775b](https://github.com/nrkno/tv-automation-server-core/commit/6c2775b)) -* added a place to run updateExpectedMediaItems ([c70704d](https://github.com/nrkno/tv-automation-server-core/commit/c70704d)) -* added missing "force" parameter ([7b50a97](https://github.com/nrkno/tv-automation-server-core/commit/7b50a97)) -* added missing debug-logging setting ([8f616ca](https://github.com/nrkno/tv-automation-server-core/commit/8f616ca)) -* added missing getRank import ([9d37eb8](https://github.com/nrkno/tv-automation-server-core/commit/9d37eb8)) -* added MomentFromNow, to use instead of ([aefea31](https://github.com/nrkno/tv-automation-server-core/commit/aefea31)) -* added peripheralDevices subscription, used by status display ([ccb309d](https://github.com/nrkno/tv-automation-server-core/commit/ccb309d)) -* added sorting of runtimeFunctions when generating backup, so diffing works ([b3ba3f6](https://github.com/nrkno/tv-automation-server-core/commit/b3ba3f6)) -* added sorting of runtimeFunctions when generating backup, so diffing works ([17639a0](https://github.com/nrkno/tv-automation-server-core/commit/17639a0)) -* added virtual lines to the generated function, so that line numbers add up in error messages ([df2366a](https://github.com/nrkno/tv-automation-server-core/commit/df2366a)) -* adlib items conflict with programmed content ([a304238](https://github.com/nrkno/tv-automation-server-core/commit/a304238)) -* after broadcast form failed to saveEvaluation ([f55546b](https://github.com/nrkno/tv-automation-server-core/commit/f55546b)) -* allow duration 0 of segmentLines ([11a18ae](https://github.com/nrkno/tv-automation-server-core/commit/11a18ae)) -* allow esc & enter in modalDialog ([cd511b6](https://github.com/nrkno/tv-automation-server-core/commit/cd511b6)) -* allow re-sync of unsynced RO while it is active ([b824d72](https://github.com/nrkno/tv-automation-server-core/commit/b824d72)) -* allow removing peripheralDevices from Settings page ([948675f](https://github.com/nrkno/tv-automation-server-core/commit/948675f)) -* allow removing peripheralDevices from Settings page ([b14e56a](https://github.com/nrkno/tv-automation-server-core/commit/b14e56a)) -* allow timelineobjs to be declared as abstract, and always route those with the core_abstract layer ([9bfa6c4](https://github.com/nrkno/tv-automation-server-core/commit/9bfa6c4)) -* allow translating actions ([af4dc78](https://github.com/nrkno/tv-automation-server-core/commit/af4dc78)) -* Allow translations of media warnings, show clip as broken until scan finished ([b693de7](https://github.com/nrkno/tv-automation-server-core/commit/b693de7)) -* also defer sendStoryStatus, as that's not critical for playback ([9417862](https://github.com/nrkno/tv-automation-server-core/commit/9417862)) -* always rewind GUI on roReset, roResetAndActivate ([4502d90](https://github.com/nrkno/tv-automation-server-core/commit/4502d90)) -* always rewind GUI on roReset, roResetAndActivate ([11744c9](https://github.com/nrkno/tv-automation-server-core/commit/11744c9)) -* an issue where the state would be updated after the component was unmounted ([6ccf413](https://github.com/nrkno/tv-automation-server-core/commit/6ccf413)) -* anomaly timings as numbers ([d0c0d36](https://github.com/nrkno/tv-automation-server-core/commit/d0c0d36)) -* another bugfix ([c7ed208](https://github.com/nrkno/tv-automation-server-core/commit/c7ed208)) -* apning with no heads ([dfb1976](https://github.com/nrkno/tv-automation-server-core/commit/dfb1976)) -* apparently componentwillmount is running in a reactive context and causes issues ([a8e53b6](https://github.com/nrkno/tv-automation-server-core/commit/a8e53b6)) -* apply some fixes when restoring a RO ([b04bf53](https://github.com/nrkno/tv-automation-server-core/commit/b04bf53)) -* asRunLog: defer handleEvent, to make sure all events have been reported before running. ([6c56ec7](https://github.com/nrkno/tv-automation-server-core/commit/6c56ec7)) -* Assign ids for timeline object keyframes ([f56218a](https://github.com/nrkno/tv-automation-server-core/commit/f56218a)) -* Assign ids for timeline object keyframes ([2ce1318](https://github.com/nrkno/tv-automation-server-core/commit/2ce1318)) -* atem mappings ([8d4ea2d](https://github.com/nrkno/tv-automation-server-core/commit/8d4ea2d)) -* attach upload handler in RundownLayoutEditor ([c8feeb2](https://github.com/nrkno/tv-automation-server-core/commit/c8feeb2)) -* autoNext should update yellow line (it didn't) ([ff42a81](https://github.com/nrkno/tv-automation-server-core/commit/ff42a81)) -* backport timing changes for play-from-anywhere from R10 ([5d96b1e](https://github.com/nrkno/tv-automation-server-core/commit/5d96b1e)) -* baselineTemplates not being calculated correctly for showstyle ([e4799b4](https://github.com/nrkno/tv-automation-server-core/commit/e4799b4)) -* basic fiber test ([2419397](https://github.com/nrkno/tv-automation-server-core/commit/2419397)) -* Basic rundown playback ([3b88d2a](https://github.com/nrkno/tv-automation-server-core/commit/3b88d2a)) -* be able to reset & activate inactivated RO ([18e01f4](https://github.com/nrkno/tv-automation-server-core/commit/18e01f4)) -* be able to reset & activate inactivated RO ([e7d52da](https://github.com/nrkno/tv-automation-server-core/commit/e7d52da)) -* better debug message ([17e1b4e](https://github.com/nrkno/tv-automation-server-core/commit/17e1b4e)) -* better handling of template-errors ([9f98100](https://github.com/nrkno/tv-automation-server-core/commit/9f98100)) -* better implementation of push update to local objects ([d692c96](https://github.com/nrkno/tv-automation-server-core/commit/d692c96)) -* Better syncFunction loging for anonymous functions, or in a timeout ([3633e4a](https://github.com/nrkno/tv-automation-server-core/commit/3633e4a)) -* BIG optimization in roTake and affected functions, made database fetches async & parallel where possible. This should not affect the functionality, though testing is needed. ([aa6f4bd](https://github.com/nrkno/tv-automation-server-core/commit/aa6f4bd)) -* bind keydown for any keyup events to prevent their default behaviour ([83e42e4](https://github.com/nrkno/tv-automation-server-core/commit/83e42e4)) -* blueprint config from manifest is reenabled and used for show style base and variant ([59b2f2f](https://github.com/nrkno/tv-automation-server-core/commit/59b2f2f)) -* Blueprint selection input in studio settings ([fc80da1](https://github.com/nrkno/tv-automation-server-core/commit/fc80da1)) -* blueprint settings page ([5697afe](https://github.com/nrkno/tv-automation-server-core/commit/5697afe)) -* break long script better in hoverscrub ([5697493](https://github.com/nrkno/tv-automation-server-core/commit/5697493)) -* break long script better in hoverscrub ([2d2f26d](https://github.com/nrkno/tv-automation-server-core/commit/2d2f26d)) -* broken GUI SegmentLineItems resolution, when simulating timeline output ([60fb843](https://github.com/nrkno/tv-automation-server-core/commit/60fb843)) -* broken logging + message ([ffe4fb4](https://github.com/nrkno/tv-automation-server-core/commit/ffe4fb4)) -* broken settings page ([1e99ff7](https://github.com/nrkno/tv-automation-server-core/commit/1e99ff7)) -* broken tests ([aa71eda](https://github.com/nrkno/tv-automation-server-core/commit/aa71eda)) -* broken tests ([0e107bd](https://github.com/nrkno/tv-automation-server-core/commit/0e107bd)) -* broken tests ([b92a8a6](https://github.com/nrkno/tv-automation-server-core/commit/b92a8a6)) -* broken tests ([69a4472](https://github.com/nrkno/tv-automation-server-core/commit/69a4472)) -* broken timing on continued piece during HOLD ([8c0d81f](https://github.com/nrkno/tv-automation-server-core/commit/8c0d81f)) -* broken timing on continued piece during HOLD ([bbd7528](https://github.com/nrkno/tv-automation-server-core/commit/bbd7528)) -* bug in logic, migrations should run if there are any steps left ([87ec102](https://github.com/nrkno/tv-automation-server-core/commit/87ec102)) -* bug in popup: nora payload can be deep objects, causing ui crash ([30bfca9](https://github.com/nrkno/tv-automation-server-core/commit/30bfca9)) -* bug in storePath migration step ([b623973](https://github.com/nrkno/tv-automation-server-core/commit/b623973)) -* bug that caused unhandledPromiseRejection. Also added logging of result of user action ([e799277](https://github.com/nrkno/tv-automation-server-core/commit/e799277)) -* bug when moving story to last ([83cef62](https://github.com/nrkno/tv-automation-server-core/commit/83cef62)) -* bug when moving story to last ([2b86f1a](https://github.com/nrkno/tv-automation-server-core/commit/2b86f1a)) -* bugfix ([943ff72](https://github.com/nrkno/tv-automation-server-core/commit/943ff72)) -* bugfix, broke stuff when renaming ([22c4eb1](https://github.com/nrkno/tv-automation-server-core/commit/22c4eb1)) -* bugfix, some keys didn't work in text inputs ([36e99cb](https://github.com/nrkno/tv-automation-server-core/commit/36e99cb)) -* bugfix: changed property ([a7710ad](https://github.com/nrkno/tv-automation-server-core/commit/a7710ad)) -* bugfix: didn't correctly find the right segmentLineItem in next segmentLine ([0f9313f](https://github.com/nrkno/tv-automation-server-core/commit/0f9313f)) -* bugfix: executeFunction didn't really time out ([acba08c](https://github.com/nrkno/tv-automation-server-core/commit/acba08c)) -* bugfix: timeline wasn't updated when going rehersal => roResetAndActivate ([ca76732](https://github.com/nrkno/tv-automation-server-core/commit/ca76732)) -* bugfix: undefined storePath ([cbfdde5](https://github.com/nrkno/tv-automation-server-core/commit/cbfdde5)) -* bugfix: update local object when updating database ([9d3b05b](https://github.com/nrkno/tv-automation-server-core/commit/9d3b05b)) -* bugfix: updateExpectedMediaItems used all segmentLineItems in RO, not just in segmmentLine ([406829b](https://github.com/nrkno/tv-automation-server-core/commit/406829b)) -* bugfix: When updating collection, documents with removed properties didn't get their properties removed. ([237b8ff](https://github.com/nrkno/tv-automation-server-core/commit/237b8ff)) -* bugfix: When updating collection, documents with removed properties didn't get their properties removed. ([93dd81e](https://github.com/nrkno/tv-automation-server-core/commit/93dd81e)) -* build errors ([34889b9](https://github.com/nrkno/tv-automation-server-core/commit/34889b9)) -* build errors ([81382f7](https://github.com/nrkno/tv-automation-server-core/commit/81382f7)) -* bumps expected version ([bd06edc](https://github.com/nrkno/tv-automation-server-core/commit/bd06edc)) -* Call ShowStyleBlueprint.onTimelineGenerate when the timeline is being generated for any extra post-processing ([cd22af3](https://github.com/nrkno/tv-automation-server-core/commit/cd22af3)) -* catch scroll events properly in later Chrome versions. ([7396973](https://github.com/nrkno/tv-automation-server-core/commit/7396973)) -* change lawo enum & interface ([3959761](https://github.com/nrkno/tv-automation-server-core/commit/3959761)) -* change logging to info on device state change ([1cc9429](https://github.com/nrkno/tv-automation-server-core/commit/1cc9429)) -* changed backup sorting to use templateId instead of _id ([d7047a5](https://github.com/nrkno/tv-automation-server-core/commit/d7047a5)) -* changed default chortcuts ([ba33bb7](https://github.com/nrkno/tv-automation-server-core/commit/ba33bb7)) -* changed from promise to not ([6261cdc](https://github.com/nrkno/tv-automation-server-core/commit/6261cdc)) -* changed header colors ([b9efc61](https://github.com/nrkno/tv-automation-server-core/commit/b9efc61)) -* changed how i18n is initialized & exported ([cc674aa](https://github.com/nrkno/tv-automation-server-core/commit/cc674aa)) -* Changed the color of the top bar during Rehearsal mode to something a little less hideous. ([1e887e3](https://github.com/nrkno/tv-automation-server-core/commit/1e887e3)) -* changed timeline ids to use both _id (globally unnique) and id (unique within a studio) ([d637fb0](https://github.com/nrkno/tv-automation-server-core/commit/d637fb0)) -* changes attr. paths in lawo source objs ([55f8c7b](https://github.com/nrkno/tv-automation-server-core/commit/55f8c7b)) -* changes lawo mapping with the effects change ([dbe58fe](https://github.com/nrkno/tv-automation-server-core/commit/dbe58fe)) -* check blueprint during upload & return it ([29c0600](https://github.com/nrkno/tv-automation-server-core/commit/29c0600)) -* check category of rundown-ingest-device ([b4f95a7](https://github.com/nrkno/tv-automation-server-core/commit/b4f95a7)) -* check content.path before creating an ExpectedMediaItem ([0914e98](https://github.com/nrkno/tv-automation-server-core/commit/0914e98)) -* check if the component didn't get unmounted mid-call ([5cbfc58](https://github.com/nrkno/tv-automation-server-core/commit/5cbfc58)) -* check that blueprint type stays the same on upload ([c2e4c10](https://github.com/nrkno/tv-automation-server-core/commit/c2e4c10)) -* chore: clean up in peripheralDevice typings ([09c8f4a](https://github.com/nrkno/tv-automation-server-core/commit/09c8f4a)) -* circular imports caused mocks to go haywire. ([210e6a3](https://github.com/nrkno/tv-automation-server-core/commit/210e6a3)) -* circular imports caused mocks to go haywire. ([976b89d](https://github.com/nrkno/tv-automation-server-core/commit/976b89d)) -* clean up expectedMediaItems when removing RDs, also include a clean-up step in the migration for 0.25.0 ([e401741](https://github.com/nrkno/tv-automation-server-core/commit/e401741)) -* clean up imports in ROV ([58067a6](https://github.com/nrkno/tv-automation-server-core/commit/58067a6)) -* clean up more collections when removing RO ([b84ed59](https://github.com/nrkno/tv-automation-server-core/commit/b84ed59)) -* clean up onBeforeUnload handler ([51adbba](https://github.com/nrkno/tv-automation-server-core/commit/51adbba)) -* clear queued adlibs when resetting running order ([83ed11a](https://github.com/nrkno/tv-automation-server-core/commit/83ed11a)) -* clear runtimeArguments on resetRunningOrder ([350dd45](https://github.com/nrkno/tv-automation-server-core/commit/350dd45)) -* clip floating inspector values ([d4c7430](https://github.com/nrkno/tv-automation-server-core/commit/d4c7430)) -* collection name ([e014558](https://github.com/nrkno/tv-automation-server-core/commit/e014558)) -* comment out dropping the rundownBaselineObjs ([d7679aa](https://github.com/nrkno/tv-automation-server-core/commit/d7679aa)) -* Comment out some code that is currently unused ([070081d](https://github.com/nrkno/tv-automation-server-core/commit/070081d)) -* ConfigRef fix ([f557052](https://github.com/nrkno/tv-automation-server-core/commit/f557052)) -* copy retryUntil from blueprint to core message ([72546b6](https://github.com/nrkno/tv-automation-server-core/commit/72546b6)) -* correct handling of blueprint.minimumCoreVersion ([19b2130](https://github.com/nrkno/tv-automation-server-core/commit/19b2130)) -* correct names of some ingest api methods ([6a87c9b](https://github.com/nrkno/tv-automation-server-core/commit/6a87c9b)) -* Correct some TimelineObj typings ([eb36ef9](https://github.com/nrkno/tv-automation-server-core/commit/eb36ef9)) -* corrects the default baseline template ([bf4eb03](https://github.com/nrkno/tv-automation-server-core/commit/bf4eb03)) -* Creating blueprints in UI ([8419ecf](https://github.com/nrkno/tv-automation-server-core/commit/8419ecf)) -* Ctrl-S in template editor triggers a save ([bacbc3e](https://github.com/nrkno/tv-automation-server-core/commit/bacbc3e)) -* default duration for KAM in timing group ([adf63cb](https://github.com/nrkno/tv-automation-server-core/commit/adf63cb)) -* defer triggerExternalMessage so as not to block timelineUpdate's ([ba7383f](https://github.com/nrkno/tv-automation-server-core/commit/ba7383f)) -* delete & sync buttons in RO-list ([9fbc875](https://github.com/nrkno/tv-automation-server-core/commit/9fbc875)) -* detect and discard double as-run events ([98f65a2](https://github.com/nrkno/tv-automation-server-core/commit/98f65a2)) -* dev Collections bug, due to collections being filled in later ([43e8856](https://github.com/nrkno/tv-automation-server-core/commit/43e8856)) -* dev debug data function ([e4570e2](https://github.com/nrkno/tv-automation-server-core/commit/e4570e2)) -* device is first created as Abstract ([98dca79](https://github.com/nrkno/tv-automation-server-core/commit/98dca79)) -* device status notifications ([7ab4a4c](https://github.com/nrkno/tv-automation-server-core/commit/7ab4a4c)) -* disable client-side RO updates ([72ba831](https://github.com/nrkno/tv-automation-server-core/commit/72ba831)) -* disable fullscreen overlay in developer mode ([7cc2e43](https://github.com/nrkno/tv-automation-server-core/commit/7cc2e43)) -* disable runtimeFunction caching during code-test & save ([74d6d34](https://github.com/nrkno/tv-automation-server-core/commit/74d6d34)) -* disable runtimeFunction caching during code-test & save ([e21f8dd](https://github.com/nrkno/tv-automation-server-core/commit/e21f8dd)) -* do full rundown update when recieve rundown metadata ([11ae325](https://github.com/nrkno/tv-automation-server-core/commit/11ae325)) -* Do not allow queue ad lib during hold mode ([c378fc8](https://github.com/nrkno/tv-automation-server-core/commit/c378fc8)) -* do not allow toggling sl arguments during hold mode ([3311f0a](https://github.com/nrkno/tv-automation-server-core/commit/3311f0a)) -* do not display notification count if = 0 ([1fe9a39](https://github.com/nrkno/tv-automation-server-core/commit/1fe9a39)) -* do not error CountdownItemLabel when sourceLayer is not found ([9451d1c](https://github.com/nrkno/tv-automation-server-core/commit/9451d1c)) -* do not refresh RO notifications if RO/showStyleBase/studioInstallation changes ([5702939](https://github.com/nrkno/tv-automation-server-core/commit/5702939)) -* do not show empty string values in L3rd popup ([b0c6c8e](https://github.com/nrkno/tv-automation-server-core/commit/b0c6c8e)) -* Don't remove enable.duration when setting enable.start to an absolute time instead of now for pieces ([991f2ba](https://github.com/nrkno/tv-automation-server-core/commit/991f2ba)) -* don't send devicesMakeReady until verified no other runningOrders are active ([953a1a7](https://github.com/nrkno/tv-automation-server-core/commit/953a1a7)) -* don't update device name if already got one ([833196a](https://github.com/nrkno/tv-automation-server-core/commit/833196a)) -* don't wait for subscriptions before rendering ([2bbfa20](https://github.com/nrkno/tv-automation-server-core/commit/2bbfa20)) -* Dont generate ui outputlayers for sli which are virtual ([c0ad368](https://github.com/nrkno/tv-automation-server-core/commit/c0ad368)) -* dont set nora_* config values in initDB ([1330008](https://github.com/nrkno/tv-automation-server-core/commit/1330008)) -* Dont show unset optional config in the config list ([5689865](https://github.com/nrkno/tv-automation-server-core/commit/5689865)) -* duration settling ([0648f57](https://github.com/nrkno/tv-automation-server-core/commit/0648f57)) -* Editattribute type typing ([1206d0c](https://github.com/nrkno/tv-automation-server-core/commit/1206d0c)) -* Editattribute type typing ([392f4aa](https://github.com/nrkno/tv-automation-server-core/commit/392f4aa)) -* EditAttribute: dropdown options was always strings ([814cdf7](https://github.com/nrkno/tv-automation-server-core/commit/814cdf7)) -* End of Show marker line doesn't end where it should ([e188c97](https://github.com/nrkno/tv-automation-server-core/commit/e188c97)) -* enforce workflow data structure ([d01245f](https://github.com/nrkno/tv-automation-server-core/commit/d01245f)) -* Ensure lookahead ids are always unique ([26f6637](https://github.com/nrkno/tv-automation-server-core/commit/26f6637)) -* Ensure PeripheralDevice.executeFunction doesnt timeout during callback execution ([087a6f8](https://github.com/nrkno/tv-automation-server-core/commit/087a6f8)) -* ensure that mediaFlowId and studioId are both indices ([5744ff3](https://github.com/nrkno/tv-automation-server-core/commit/5744ff3)) -* ensure that the connection notification is always on top ([662cd7a](https://github.com/nrkno/tv-automation-server-core/commit/662cd7a)) -* ensure that VideoEditMonitor is comfortably scrubbable at any window width ([ece3dfb](https://github.com/nrkno/tv-automation-server-core/commit/ece3dfb)) -* ensure that VideoEditMonitor is comfortably scrubbable at any window width ([a5e882a](https://github.com/nrkno/tv-automation-server-core/commit/a5e882a)) -* ensure the same overlap is used for autonext and the previous sl ([efb39e6](https://github.com/nrkno/tv-automation-server-core/commit/efb39e6)) -* Ensure the sl overlapDuration is respected on autonext. ([8c3bf3e](https://github.com/nrkno/tv-automation-server-core/commit/8c3bf3e)) -* Ensure typeVariant on SegmentLine is preserved when a roList is received ([98b224c](https://github.com/nrkno/tv-automation-server-core/commit/98b224c)) -* error in GUI (devices was added twice to list) ([80c4128](https://github.com/nrkno/tv-automation-server-core/commit/80c4128)) -* error when content.boxSourceConfiguration is undefined ([fc7ec40](https://github.com/nrkno/tv-automation-server-core/commit/fc7ec40)) -* error when content.boxSourceConfiguration is undefined ([81c896b](https://github.com/nrkno/tv-automation-server-core/commit/81c896b)) -* expectedMediaItems should work again ([a3bb4e9](https://github.com/nrkno/tv-automation-server-core/commit/a3bb4e9)) -* expectedMediaItems should work again ([f33467d](https://github.com/nrkno/tv-automation-server-core/commit/f33467d)) -* expectedMediaItems: make ids uniquer ([e16594a](https://github.com/nrkno/tv-automation-server-core/commit/e16594a)) -* externalMessage: priority of messages to send ([cffcd97](https://github.com/nrkno/tv-automation-server-core/commit/cffcd97)) -* externalMessage: update status on removed document ([75a1053](https://github.com/nrkno/tv-automation-server-core/commit/75a1053)) -* externalMessageQueue id ([5c8c39d](https://github.com/nrkno/tv-automation-server-core/commit/5c8c39d)) -* externalMessages upd ([a803882](https://github.com/nrkno/tv-automation-server-core/commit/a803882)) -* failing on startup if dp property missing ([041fc3e](https://github.com/nrkno/tv-automation-server-core/commit/041fc3e)) -* fetch from collections in EMI API ([73a3bd1](https://github.com/nrkno/tv-automation-server-core/commit/73a3bd1)) -* filter on json files on restore backup file selector ([1a0b867](https://github.com/nrkno/tv-automation-server-core/commit/1a0b867)) -* First pass of implementing mosRoFullStory and mosRoStoryDelete ([47602d1](https://github.com/nrkno/tv-automation-server-core/commit/47602d1)) -* fix a missing colon ([9f2aab9](https://github.com/nrkno/tv-automation-server-core/commit/9f2aab9)) -* fix according to updated interface ([e372a66](https://github.com/nrkno/tv-automation-server-core/commit/e372a66)) -* fix an issue where some of the snapshot restores would not be recognized as JSON ([57d31bc](https://github.com/nrkno/tv-automation-server-core/commit/57d31bc)) -* fix an issue where the message for clip ingested would be "null, Clip is being ingested" ([7ac5672](https://github.com/nrkno/tv-automation-server-core/commit/7ac5672)) -* fix an issue with overlapping labels on pieces when an infinite item was cropped by another item at 0 point. ([7599f64](https://github.com/nrkno/tv-automation-server-core/commit/7599f64)) -* fix an issue with scene, black and freeze information only showing up after a hover ([3505514](https://github.com/nrkno/tv-automation-server-core/commit/3505514)) -* Fix broken syncFunction and infinite loop in afterRemoveParts. Add test for rundownSyncFunction ([95ec0cc](https://github.com/nrkno/tv-automation-server-core/commit/95ec0cc)) -* Fix context.runHelper not working in templates. ([36ca5f3](https://github.com/nrkno/tv-automation-server-core/commit/36ca5f3)) -* Fix device status notifications ([b9f274e](https://github.com/nrkno/tv-automation-server-core/commit/b9f274e)) -* fix expectVersion ([afeaa74](https://github.com/nrkno/tv-automation-server-core/commit/afeaa74)) -* fix for strange (temporary?) error about method missing ([0db30ae](https://github.com/nrkno/tv-automation-server-core/commit/0db30ae)) -* fix mocks ([3d64f0c](https://github.com/nrkno/tv-automation-server-core/commit/3d64f0c)) -* fix more typings and add some null checks in unusual places ([d0c53c3](https://github.com/nrkno/tv-automation-server-core/commit/d0c53c3)) -* fix MOS status indicators in RO header ([c0724cc](https://github.com/nrkno/tv-automation-server-core/commit/c0724cc)) -* fix notifications toggle button cursor ([402486b](https://github.com/nrkno/tv-automation-server-core/commit/402486b)) -* fix notifications toggle button cursor ([b0d8dcb](https://github.com/nrkno/tv-automation-server-core/commit/b0d8dcb)) -* fix PTZ Testing harness ([97bccc7](https://github.com/nrkno/tv-automation-server-core/commit/97bccc7)) -* Fix regenerateRundown when not sourced from mos ([292d6c5](https://github.com/nrkno/tv-automation-server-core/commit/292d6c5)) -* Fix regenerateRundown when not sourced from mos ([3f0191d](https://github.com/nrkno/tv-automation-server-core/commit/3f0191d)) -* fix Segment Line notifications ([3753250](https://github.com/nrkno/tv-automation-server-core/commit/3753250)) -* fix set offset working from UI ([91bc80d](https://github.com/nrkno/tv-automation-server-core/commit/91bc80d)) -* fix some subscriptions and naming ([3696183](https://github.com/nrkno/tv-automation-server-core/commit/3696183)) -* Fix some unstable tests ([c521b76](https://github.com/nrkno/tv-automation-server-core/commit/c521b76)) -* fix typings to match with the stronger typings ([ae1bd4f](https://github.com/nrkno/tv-automation-server-core/commit/ae1bd4f)) -* fix zoom area height ([24d2e38](https://github.com/nrkno/tv-automation-server-core/commit/24d2e38)) -* fixes ([2fc3802](https://github.com/nrkno/tv-automation-server-core/commit/2fc3802)) -* force lookahead inGroup field to be emptied. Fixes mismatched statobj ([c76209c](https://github.com/nrkno/tv-automation-server-core/commit/c76209c)) -* freeze/black in begin/end of mediafile gets special warning ([ea950e2](https://github.com/nrkno/tv-automation-server-core/commit/ea950e2)) -* generate statObject per device ([82a0736](https://github.com/nrkno/tv-automation-server-core/commit/82a0736)) -* Get some playout working ([161fca3](https://github.com/nrkno/tv-automation-server-core/commit/161fca3)) -* getHash undefined exception in asRunLog ([8faab78](https://github.com/nrkno/tv-automation-server-core/commit/8faab78)) -* getSnapshot: don't ask devices of type OTHER ([ea874d4](https://github.com/nrkno/tv-automation-server-core/commit/ea874d4)) -* getting monaco to work runtime while still having typings ([5db8218](https://github.com/nrkno/tv-automation-server-core/commit/5db8218)) -* global ad-lib order was wrong, basline blueprint did not set _rank ([ffbacc8](https://github.com/nrkno/tv-automation-server-core/commit/ffbacc8)) -* Guard against there being no next segmentline ([849d97f](https://github.com/nrkno/tv-automation-server-core/commit/849d97f)) -* GUI externalMessages json formatting ([0b7cd2c](https://github.com/nrkno/tv-automation-server-core/commit/0b7cd2c)) -* GUI: new try on rewinding the viewport on RO reset ([b0edaf4](https://github.com/nrkno/tv-automation-server-core/commit/b0edaf4)) -* GUI: round number of frames ([c90021f](https://github.com/nrkno/tv-automation-server-core/commit/c90021f)) -* GUI: settings: only show parent-devices in left menu (only they have settings on them) ([ecb164e](https://github.com/nrkno/tv-automation-server-core/commit/ecb164e)) -* GUI: unexpected behaviour in blueprint configuration ([f5bed4e](https://github.com/nrkno/tv-automation-server-core/commit/f5bed4e)) -* handle both update & insert of runningOrder ([3701bb3](https://github.com/nrkno/tv-automation-server-core/commit/3701bb3)) -* handle both update & insert of runningOrder ([84a6c53](https://github.com/nrkno/tv-automation-server-core/commit/84a6c53)) -* handle promises correctly.. ([2e57296](https://github.com/nrkno/tv-automation-server-core/commit/2e57296)) -* handle promises correctly.. ([b952e1d](https://github.com/nrkno/tv-automation-server-core/commit/b952e1d)) -* handle take situation better when having invalid segmentLines ([dacd3b0](https://github.com/nrkno/tv-automation-server-core/commit/dacd3b0)) -* handle when error is thrown in function in makePromise ([c287727](https://github.com/nrkno/tv-automation-server-core/commit/c287727)) -* handle when error is thrown in function in makePromise ([b7094dd](https://github.com/nrkno/tv-automation-server-core/commit/b7094dd)) -* handle when nexting before start or after end ([506bb8a](https://github.com/nrkno/tv-automation-server-core/commit/506bb8a)) -* has played styling shouldn't be applied to Guest and Remote segments ([18bdc82](https://github.com/nrkno/tv-automation-server-core/commit/18bdc82)) -* have both a cirtuclar button and a 'branch' to the panel ([1fa3cf9](https://github.com/nrkno/tv-automation-server-core/commit/1fa3cf9)) -* head mute audio and hold on last frame ([ceec7f6](https://github.com/nrkno/tv-automation-server-core/commit/ceec7f6)) -* header context menu z-order fix ([c68244b](https://github.com/nrkno/tv-automation-server-core/commit/c68244b)) -* hide "Restart playout" from support panel when not in studio mode ([34ba937](https://github.com/nrkno/tv-automation-server-core/commit/34ba937)) -* hide "Restart playout" from support panel when not in studio mode ([5820b00](https://github.com/nrkno/tv-automation-server-core/commit/5820b00)) -* Hide child devices from being added to the studio ([852ec9b](https://github.com/nrkno/tv-automation-server-core/commit/852ec9b)) -* Hide Keyboard focus marker when not in studio mode ([70dc6b0](https://github.com/nrkno/tv-automation-server-core/commit/70dc6b0)) -* HOLD add new llayer to initDB ([650b6e6](https://github.com/nrkno/tv-automation-server-core/commit/650b6e6)) -* hold-copy of the SLI should provide seek information to offset markers on the SLI ([3967d03](https://github.com/nrkno/tv-automation-server-core/commit/3967d03)) -* holdState = 0 displayed a status ([aacd140](https://github.com/nrkno/tv-automation-server-core/commit/aacd140)) -* holdState = 0 displayed a status ([49c7ead](https://github.com/nrkno/tv-automation-server-core/commit/49c7ead)) -* hot fix for rehearsal activation when an RO is already active ([648c02d](https://github.com/nrkno/tv-automation-server-core/commit/648c02d)) -* houskeeping: remove uneccessary logs ([0c054f9](https://github.com/nrkno/tv-automation-server-core/commit/0c054f9)) -* if the next:ed segment is removed, instead next the one in its place ([22597b3](https://github.com/nrkno/tv-automation-server-core/commit/22597b3)) -* ignore custom dependencies ([b9db526](https://github.com/nrkno/tv-automation-server-core/commit/b9db526)) -* implement Play from here ([bd79569](https://github.com/nrkno/tv-automation-server-core/commit/bd79569)) -* implement Play from here ([0dce2af](https://github.com/nrkno/tv-automation-server-core/commit/0dce2af)) -* Implement rerunning blueprints on resetPart if dirty ([b942323](https://github.com/nrkno/tv-automation-server-core/commit/b942323)) -* Importing of some mock running orders ([eadf225](https://github.com/nrkno/tv-automation-server-core/commit/eadf225)) -* improve elements in AdLibListItem ([e917c43](https://github.com/nrkno/tv-automation-server-core/commit/e917c43)) -* improve evaluation form visuals ([30af081](https://github.com/nrkno/tv-automation-server-core/commit/30af081)) -* Improve group label visuals ([39b43e1](https://github.com/nrkno/tv-automation-server-core/commit/39b43e1)) -* Improve missing mosId error message ([89695fb](https://github.com/nrkno/tv-automation-server-core/commit/89695fb)) -* improve notification center button ([0b4d082](https://github.com/nrkno/tv-automation-server-core/commit/0b4d082)) -* improve notifications highlighting animation ([afeb568](https://github.com/nrkno/tv-automation-server-core/commit/afeb568)) -* improve notifications highlighting animation ([abda2c3](https://github.com/nrkno/tv-automation-server-core/commit/abda2c3)) -* improve some error logging ([60af59b](https://github.com/nrkno/tv-automation-server-core/commit/60af59b)) -* improve status bar panel buttons look when panels open ([247c8ee](https://github.com/nrkno/tv-automation-server-core/commit/247c8ee)) -* Improve the segment diff logic ([1465890](https://github.com/nrkno/tv-automation-server-core/commit/1465890)) -* improve typings for Notification messages ([bed664b](https://github.com/nrkno/tv-automation-server-core/commit/bed664b)) -* improve uncaughtErrorHandler ([fa744f4](https://github.com/nrkno/tv-automation-server-core/commit/fa744f4)) -* improved queries & added index ([159f6d5](https://github.com/nrkno/tv-automation-server-core/commit/159f6d5)) -* Include rundown baseline in snapshots ([96fedcb](https://github.com/nrkno/tv-automation-server-core/commit/96fedcb)) -* incorrect typings for template editor ([9d021df](https://github.com/nrkno/tv-automation-server-core/commit/9d021df)) -* Increase size of template editor to make it better fill the screen ([3212d7b](https://github.com/nrkno/tv-automation-server-core/commit/3212d7b)) -* increase upload limit for backup files ([e658f12](https://github.com/nrkno/tv-automation-server-core/commit/e658f12)) -* increase upload limit for backup files ([5effaa9](https://github.com/nrkno/tv-automation-server-core/commit/5effaa9)) -* Infinite items dont stop against a absolute 0 item properly. ([78c1499](https://github.com/nrkno/tv-automation-server-core/commit/78c1499)) -* infinite segment line tidying and fixes ([8469ffb](https://github.com/nrkno/tv-automation-server-core/commit/8469ffb)) -* Infinite segmentline bad guard when calculating the current infinites that caused the process to stop early ([2f9abeb](https://github.com/nrkno/tv-automation-server-core/commit/2f9abeb)) -* infinite segmentlines crossing an autonext throwing a duplicate key exception ([93b2a30](https://github.com/nrkno/tv-automation-server-core/commit/93b2a30)) -* inGroup property of timeline objects should be id, not _id ([35b34c5](https://github.com/nrkno/tv-automation-server-core/commit/35b34c5)) -* init state properly ([2572cdc](https://github.com/nrkno/tv-automation-server-core/commit/2572cdc)) -* initDB for pharos lights ([57fbc73](https://github.com/nrkno/tv-automation-server-core/commit/57fbc73)) -* initial optimization of updateSourceLayerInfinitesAfterLine ([5cd8235](https://github.com/nrkno/tv-automation-server-core/commit/5cd8235)) -* initial optimization of updateSourceLayerInfinitesAfterLine ([871bdd2](https://github.com/nrkno/tv-automation-server-core/commit/871bdd2)) -* initiateDB update for PTZ ([e529782](https://github.com/nrkno/tv-automation-server-core/commit/e529782)) -* Invalid ids in PeripheralDeviceCommand responses. Not using cached ingest data when reloadingRundown. Adds tests for reloadingRundown ([cb59bbc](https://github.com/nrkno/tv-automation-server-core/commit/cb59bbc)) -* isClientResponseSuccess returned wrong values ([ce0b44e](https://github.com/nrkno/tv-automation-server-core/commit/ce0b44e)) -* Issue with duplicate ids ([ed27041](https://github.com/nrkno/tv-automation-server-core/commit/ed27041)) -* issue with rehearsal double-activation warning ([17b4e95](https://github.com/nrkno/tv-automation-server-core/commit/17b4e95)) -* issue with roPrepareForBroadcast ([c3ad30c](https://github.com/nrkno/tv-automation-server-core/commit/c3ad30c)) -* issue with segment context menu ([7a44deb](https://github.com/nrkno/tv-automation-server-core/commit/7a44deb)) -* issue with source layers marked as used even though they were used in the following segmentLine ([71acfb3](https://github.com/nrkno/tv-automation-server-core/commit/71acfb3)) -* issues with timelineTriggerTime ([0459729](https://github.com/nrkno/tv-automation-server-core/commit/0459729)) -* jest config ([e53663c](https://github.com/nrkno/tv-automation-server-core/commit/e53663c)) -* JSDoc-ify existing comments ([6825f00](https://github.com/nrkno/tv-automation-server-core/commit/6825f00)) -* JSX props typings fix in Header ([7596557](https://github.com/nrkno/tv-automation-server-core/commit/7596557)) -* keep device header in Mos parent properties settings ([2f2529d](https://github.com/nrkno/tv-automation-server-core/commit/2f2529d)) -* keep device header in Mos parent properties settings ([4ff9b91](https://github.com/nrkno/tv-automation-server-core/commit/4ff9b91)) -* Keep the devices header visible when editing device ([cb2d7d9](https://github.com/nrkno/tv-automation-server-core/commit/cb2d7d9)) -* Keep the devices header visible when editing device ([90dbe05](https://github.com/nrkno/tv-automation-server-core/commit/90dbe05)) -* keys should be handled at up, not down ([957f583](https://github.com/nrkno/tv-automation-server-core/commit/957f583)) -* label on Play From here in SegmentContextMenu ([8bfa631](https://github.com/nrkno/tv-automation-server-core/commit/8bfa631)) -* labels in modal dialogs ([3af18fc](https://github.com/nrkno/tv-automation-server-core/commit/3af18fc)) -* limit db fetches to active running order ([f3aca8f](https://github.com/nrkno/tv-automation-server-core/commit/f3aca8f)) -* lock down package.json & update package-lock, to get release2 to build ([472f8ab](https://github.com/nrkno/tv-automation-server-core/commit/472f8ab)) -* locked [@babel](https://github.com/babel)/runtime version & updated package-lock ([8e62d2f](https://github.com/nrkno/tv-automation-server-core/commit/8e62d2f)) -* Log unresolved ids when resolving pieces ([28691c6](https://github.com/nrkno/tv-automation-server-core/commit/28691c6)) -* logics bugfix after optimization ([fe85cd3](https://github.com/nrkno/tv-automation-server-core/commit/fe85cd3)) -* logics bugfix after optimization ([2b8fa3c](https://github.com/nrkno/tv-automation-server-core/commit/2b8fa3c)) -* lookahead object id not being set correctly ([594a1e7](https://github.com/nrkno/tv-automation-server-core/commit/594a1e7)) -* made editor height dynamic ([c68ac4f](https://github.com/nrkno/tv-automation-server-core/commit/c68ac4f)) -* made editor height dynamic ([7f5f40e](https://github.com/nrkno/tv-automation-server-core/commit/7f5f40e)) -* Made sure that the typography update for the prompter has a font fallback. ([6f2b20a](https://github.com/nrkno/tv-automation-server-core/commit/6f2b20a)) -* Major refactoring, splitting code into separate files depending on their areas: "rundown": General rundown manipulation, "media-scanner": Media-scanner, "mos": mos-specific functions ([db82375](https://github.com/nrkno/tv-automation-server-core/commit/db82375)) -* make 'Lights' source layer type translatable in the Settings ([65d5b76](https://github.com/nrkno/tv-automation-server-core/commit/65d5b76)) -* make most of the UI actually run ([45941d5](https://github.com/nrkno/tv-automation-server-core/commit/45941d5)) -* make RundownTiming reuse objects to limit the amount of GC done ([6e04daf](https://github.com/nrkno/tv-automation-server-core/commit/6e04daf)) -* make segmentLine.invalid optional ([c179e3c](https://github.com/nrkno/tv-automation-server-core/commit/c179e3c)) -* make sure that expectedMediaItems are purged along with the RO ([0d9dda1](https://github.com/nrkno/tv-automation-server-core/commit/0d9dda1)) -* make sure that the adlib shelf isn't obstructed by the right-hand bar ([8783819](https://github.com/nrkno/tv-automation-server-core/commit/8783819)) -* make sure that the OnAir line connects to the label ([3788672](https://github.com/nrkno/tv-automation-server-core/commit/3788672)) -* make the context menu available in the entire header ([0590f9d](https://github.com/nrkno/tv-automation-server-core/commit/0590f9d)) -* make the FullScreen detection more lenient ([215d73c](https://github.com/nrkno/tv-automation-server-core/commit/215d73c)) -* make the FullScreen detection more lenient ([28b689a](https://github.com/nrkno/tv-automation-server-core/commit/28b689a)) -* Make the head to kam wipe not use the mosartVariant field. Correct the head order checking ([6030755](https://github.com/nrkno/tv-automation-server-core/commit/6030755)) -* media-manager: rename keyStep => criticalStep ([77f4d6a](https://github.com/nrkno/tv-automation-server-core/commit/77f4d6a)) -* mediainfo typings & timebase ([67f16be](https://github.com/nrkno/tv-automation-server-core/commit/67f16be)) -* mediaobjects to use computed field ([39d13b5](https://github.com/nrkno/tv-automation-server-core/commit/39d13b5)) -* mediaobjects to use computed field ([dba858f](https://github.com/nrkno/tv-automation-server-core/commit/dba858f)) -* message came twice, wrong index for signature ([64aeafb](https://github.com/nrkno/tv-automation-server-core/commit/64aeafb)) -* Meteor mock ([dec64db](https://github.com/nrkno/tv-automation-server-core/commit/dec64db)) -* meteor mock error ([f005291](https://github.com/nrkno/tv-automation-server-core/commit/f005291)) -* Migration for stk&full audio remapping ([2491f52](https://github.com/nrkno/tv-automation-server-core/commit/2491f52)) -* migration helpers ([40228e8](https://github.com/nrkno/tv-automation-server-core/commit/40228e8)) -* Migration UI fixes ([b141243](https://github.com/nrkno/tv-automation-server-core/commit/b141243)) -* Migrations internal server error ([45d0238](https://github.com/nrkno/tv-automation-server-core/commit/45d0238)) -* minor ui fix on status page ([97fc3c2](https://github.com/nrkno/tv-automation-server-core/commit/97fc3c2)) -* miss in merge ([93106b1](https://github.com/nrkno/tv-automation-server-core/commit/93106b1)) -* missed line ([4f635b9](https://github.com/nrkno/tv-automation-server-core/commit/4f635b9)) -* missing argument for mediaStatusCheck ([658e82a](https://github.com/nrkno/tv-automation-server-core/commit/658e82a)) -* missing key property ([79fb3e6](https://github.com/nrkno/tv-automation-server-core/commit/79fb3e6)) -* missing sass import ([f1f10ff](https://github.com/nrkno/tv-automation-server-core/commit/f1f10ff)) -* Missing typings on ShowStyle ([a0a4e14](https://github.com/nrkno/tv-automation-server-core/commit/a0a4e14)) -* Mix transitions ([0ebf3e1](https://github.com/nrkno/tv-automation-server-core/commit/0ebf3e1)) -* Mix transitions ([5cf2314](https://github.com/nrkno/tv-automation-server-core/commit/5cf2314)) -* Mock Collection object ([a6976fa](https://github.com/nrkno/tv-automation-server-core/commit/a6976fa)) -* mode logging method, to avoid circular dependency ([4d55286](https://github.com/nrkno/tv-automation-server-core/commit/4d55286)) -* modified timestamp on imported blueprints was not being set, causing the cache to not be cleared properly ([2f3fd17](https://github.com/nrkno/tv-automation-server-core/commit/2f3fd17)) -* monaco typing error fix ([e73467e](https://github.com/nrkno/tv-automation-server-core/commit/e73467e)) -* more CSS fixes due to switching to buttons ([f3a939f](https://github.com/nrkno/tv-automation-server-core/commit/f3a939f)) -* more fixes for MOS status indicator in header ([97311b1](https://github.com/nrkno/tv-automation-server-core/commit/97311b1)) -* more optimizations ([df8c397](https://github.com/nrkno/tv-automation-server-core/commit/df8c397)) -* more performance subscription based on studioId and rundownId ([e1b8d77](https://github.com/nrkno/tv-automation-server-core/commit/e1b8d77)) -* more refactoring of the styles ([f5af269](https://github.com/nrkno/tv-automation-server-core/commit/f5af269)) -* MOS ingest fixes and tests ([233c523](https://github.com/nrkno/tv-automation-server-core/commit/233c523)) -* mos-gateway external functions names ([a3497df](https://github.com/nrkno/tv-automation-server-core/commit/a3497df)) -* move all segment notes away from header, show only summary, clickable summary ([aee3d01](https://github.com/nrkno/tv-automation-server-core/commit/aee3d01)) -* move all segment notes away from header, show only summary, clickable summary ([d0a4801](https://github.com/nrkno/tv-automation-server-core/commit/d0a4801)) -* move back executeFunction to peripheralDeviceAPI ([226289f](https://github.com/nrkno/tv-automation-server-core/commit/226289f)) -* move notifications pop-ups when NC is open ([d6ce260](https://github.com/nrkno/tv-automation-server-core/commit/d6ce260)) -* move notifications pop-ups when NC is open ([6f7759f](https://github.com/nrkno/tv-automation-server-core/commit/6f7759f)) -* Move remaining mos types into ingest/mosDevice ([904b3cb](https://github.com/nrkno/tv-automation-server-core/commit/904b3cb)) -* move wrapMethods, to avoid circular import ([df41959](https://github.com/nrkno/tv-automation-server-core/commit/df41959)) -* multiply inPoint/duration by timeBase before sending back to MOS ([b576f26](https://github.com/nrkno/tv-automation-server-core/commit/b576f26)) -* multiply inPoint/duration by timebase before storing to MOS ([d01b8d9](https://github.com/nrkno/tv-automation-server-core/commit/d01b8d9)) -* new implementation of runtime caching ([92e09be](https://github.com/nrkno/tv-automation-server-core/commit/92e09be)) -* new implementation of runtime caching ([767fbb7](https://github.com/nrkno/tv-automation-server-core/commit/767fbb7)) -* new lawo source mappings ([20f7d5a](https://github.com/nrkno/tv-automation-server-core/commit/20f7d5a)) -* next part not updating properly from ingest data changes ([1486e65](https://github.com/nrkno/tv-automation-server-core/commit/1486e65)) -* non-persistent pop-ups should be prioritized over persistent ones ([99f147a](https://github.com/nrkno/tv-automation-server-core/commit/99f147a)) -* normalize naming scheme to 'runtimeArguments', normalize hotkey labels ([528679d](https://github.com/nrkno/tv-automation-server-core/commit/528679d)) -* not able to run migration on empty database (to bump system version) ([f65fcfe](https://github.com/nrkno/tv-automation-server-core/commit/f65fcfe)) -* note type got lost ([863e49d](https://github.com/nrkno/tv-automation-server-core/commit/863e49d)) -* notification center panel shadow ([1010dda](https://github.com/nrkno/tv-automation-server-core/commit/1010dda)) -* Notification Center width calculations ([fa31d65](https://github.com/nrkno/tv-automation-server-core/commit/fa31d65)) -* notification equality check, resolves 'republished' RO notifications ([27b6102](https://github.com/nrkno/tv-automation-server-core/commit/27b6102)) -* NotificationCenter visual fix for other pages ([10b1afa](https://github.com/nrkno/tv-automation-server-core/commit/10b1afa)) -* NotificationCenter visual fix for other pages ([2c5da97](https://github.com/nrkno/tv-automation-server-core/commit/2c5da97)) -* Notifications panel styling fix ([7f7f5cb](https://github.com/nrkno/tv-automation-server-core/commit/7f7f5cb)) -* NymansPlayground caused issues in Timeline ([83e772d](https://github.com/nrkno/tv-automation-server-core/commit/83e772d)) -* on air label position ([00d4e20](https://github.com/nrkno/tv-automation-server-core/commit/00d4e20)) -* on startup, clear old connection statuses ([e9d7cba](https://github.com/nrkno/tv-automation-server-core/commit/e9d7cba)) -* onAir line jumping around on takes ([8330112](https://github.com/nrkno/tv-automation-server-core/commit/8330112)) -* optimizations during adlibs (thanks to [@baltedewit](https://github.com/baltedewit)) ([daa135b](https://github.com/nrkno/tv-automation-server-core/commit/daa135b)) -* optimizations during adlibs (thanks to [@baltedewit](https://github.com/baltedewit)) ([f50b60e](https://github.com/nrkno/tv-automation-server-core/commit/f50b60e)) -* optimizations in roTake ([3457e73](https://github.com/nrkno/tv-automation-server-core/commit/3457e73)) -* optimize saveIntoDB ([65c189e](https://github.com/nrkno/tv-automation-server-core/commit/65c189e)) -* Out of space build failures. Run circleci for tags ([53a5626](https://github.com/nrkno/tv-automation-server-core/commit/53a5626)) -* output version differ error ([8816ed3](https://github.com/nrkno/tv-automation-server-core/commit/8816ed3)) -* Pass SofieHostURL to blueprints config ([8c18821](https://github.com/nrkno/tv-automation-server-core/commit/8c18821)) -* peripheralDevices subscription for RO data ([90b4e13](https://github.com/nrkno/tv-automation-server-core/commit/90b4e13)) -* Persist SegmentLine.updateStoryStatus ([427b24c](https://github.com/nrkno/tv-automation-server-core/commit/427b24c)) -* playout ([969e316](https://github.com/nrkno/tv-automation-server-core/commit/969e316)) -* playout, lookahead: use the originalLayer instear of isAbstract ([30fe842](https://github.com/nrkno/tv-automation-server-core/commit/30fe842)) -* PR changes ([c877aad](https://github.com/nrkno/tv-automation-server-core/commit/c877aad)) -* prevent default action for f1 & f3 ([53b2f22](https://github.com/nrkno/tv-automation-server-core/commit/53b2f22)) -* prevent resetting rundown when on-air ([d842922](https://github.com/nrkno/tv-automation-server-core/commit/d842922)) -* prevent take + autotake bug ([b3d9a4d](https://github.com/nrkno/tv-automation-server-core/commit/b3d9a4d)) -* problem with viewing test recordings ([2e817ac](https://github.com/nrkno/tv-automation-server-core/commit/2e817ac)) -* Prompter: keyboard device interface ([540f47a](https://github.com/nrkno/tv-automation-server-core/commit/540f47a)) -* proper calls of IngestActions ([69121dc](https://github.com/nrkno/tv-automation-server-core/commit/69121dc)) -* proper dispose of executeFunction checkReply after execution is done ([523ec99](https://github.com/nrkno/tv-automation-server-core/commit/523ec99)) -* queued adlib should have infinite sli's ([75452dc](https://github.com/nrkno/tv-automation-server-core/commit/75452dc)) -* R3 ONLY: bugfix: reload data from ENPS ([cc6ed44](https://github.com/nrkno/tv-automation-server-core/commit/cc6ed44)) -* rabbitMQ sending messages ([df72c4c](https://github.com/nrkno/tv-automation-server-core/commit/df72c4c)) -* re-add blueprint & mosdatacache restore (to be deprecated later) ([886c756](https://github.com/nrkno/tv-automation-server-core/commit/886c756)) -* re-add jest-meteor-stubs ([86ede36](https://github.com/nrkno/tv-automation-server-core/commit/86ede36)) -* re-added monaco typings and disabled import, so it works client-side ([1226763](https://github.com/nrkno/tv-automation-server-core/commit/1226763)) -* re-timing vignett ([17fbced](https://github.com/nrkno/tv-automation-server-core/commit/17fbced)) -* react errors while rendering nymansPlayground ([0c245d3](https://github.com/nrkno/tv-automation-server-core/commit/0c245d3)) -* React unique keys ([4f728d9](https://github.com/nrkno/tv-automation-server-core/commit/4f728d9)) -* RecordedFiles index ([f1aae5e](https://github.com/nrkno/tv-automation-server-core/commit/f1aae5e)) -* refactor ([9e9d60a](https://github.com/nrkno/tv-automation-server-core/commit/9e9d60a)) -* refactor infinite generation logic into separate file ([84ef579](https://github.com/nrkno/tv-automation-server-core/commit/84ef579)) -* refactor storeSnapshot methods ([6e66394](https://github.com/nrkno/tv-automation-server-core/commit/6e66394)) -* refactor updateExternalMessageQueueStatus to avoid fatal startup bug ([b54b09d](https://github.com/nrkno/tv-automation-server-core/commit/b54b09d)) -* refactored execMethod, so it doesn't use promises and causes unhandled promise rejections ([24da71b](https://github.com/nrkno/tv-automation-server-core/commit/24da71b)) -* refactored reset-segmentLine further ([0523eb6](https://github.com/nrkno/tv-automation-server-core/commit/0523eb6)) -* refactored/DRYd adminMode & studioMode, disabled trashbin-button for externalMessages when not in adminMode ([b29dae1](https://github.com/nrkno/tv-automation-server-core/commit/b29dae1)) -* refactoring of mos-ingest functions ([ad26959](https://github.com/nrkno/tv-automation-server-core/commit/ad26959)) -* refator ingest API ([a9fa737](https://github.com/nrkno/tv-automation-server-core/commit/a9fa737)) -* rehaul of versions, WIP ([93dea2f](https://github.com/nrkno/tv-automation-server-core/commit/93dea2f)) -* Reimplement mosRoCreate via new ingest api ([34c3247](https://github.com/nrkno/tv-automation-server-core/commit/34c3247)) -* relative durations causing type warnings for ui code ([5249435](https://github.com/nrkno/tv-automation-server-core/commit/5249435)) -* Release 3 only: disable config missing warning ([921cc82](https://github.com/nrkno/tv-automation-server-core/commit/921cc82)) -* remount monaco ([4ce1566](https://github.com/nrkno/tv-automation-server-core/commit/4ce1566)) -* remove 'computation stopped' notifications ([bf4d8d8](https://github.com/nrkno/tv-automation-server-core/commit/bf4d8d8)) -* Remove all notifications from prompter (incl. connection) ([b13d561](https://github.com/nrkno/tv-automation-server-core/commit/b13d561)) -* remove check that didn't work ([fdc917f](https://github.com/nrkno/tv-automation-server-core/commit/fdc917f)) -* remove config didn't work ([893717e](https://github.com/nrkno/tv-automation-server-core/commit/893717e)) -* remove debug line in nightly cronjob ([dda3017](https://github.com/nrkno/tv-automation-server-core/commit/dda3017)) -* remove deprecated options ([ab7275b](https://github.com/nrkno/tv-automation-server-core/commit/ab7275b)) -* remove duplicate attributes ([31e4414](https://github.com/nrkno/tv-automation-server-core/commit/31e4414)) -* Remove empty translations ([d2f1bd0](https://github.com/nrkno/tv-automation-server-core/commit/d2f1bd0)) -* remove expectedMediaItems when ro is removed ([5230695](https://github.com/nrkno/tv-automation-server-core/commit/5230695)) -* remove full-screen button, add label ([5c9a3e5](https://github.com/nrkno/tv-automation-server-core/commit/5c9a3e5)) -* remove full-screen button, add label ([5e9826e](https://github.com/nrkno/tv-automation-server-core/commit/5e9826e)) -* remove internal methods from API ([1752bb1](https://github.com/nrkno/tv-automation-server-core/commit/1752bb1)) -* remove leftover debug info ([d475b76](https://github.com/nrkno/tv-automation-server-core/commit/d475b76)) -* remove memoization of RVars ([ca22155](https://github.com/nrkno/tv-automation-server-core/commit/ca22155)) -* remove minified timeline-visualizer ([1cd5552](https://github.com/nrkno/tv-automation-server-core/commit/1cd5552)) -* remove minified timeline-visualizer ([da85c89](https://github.com/nrkno/tv-automation-server-core/commit/da85c89)) -* remove queued adlibs when original part is reset ([812e19c](https://github.com/nrkno/tv-automation-server-core/commit/812e19c)) -* Remove some calls to rundownSyncFunction from inside another ([83eb955](https://github.com/nrkno/tv-automation-server-core/commit/83eb955)) -* remove some console.logs ([a9f3f53](https://github.com/nrkno/tv-automation-server-core/commit/a9f3f53)) -* remove systemStatus when removing blueprint ([1aa9b44](https://github.com/nrkno/tv-automation-server-core/commit/1aa9b44)) -* Remove timestamps from blueprint backups ([74fa1b3](https://github.com/nrkno/tv-automation-server-core/commit/74fa1b3)) -* remove trigger from the AdLibPieceUi setup in AdLibPanel ([847edb5](https://github.com/nrkno/tv-automation-server-core/commit/847edb5)) -* remove unneccessary margin in some headers ([b47ea11](https://github.com/nrkno/tv-automation-server-core/commit/b47ea11)) -* remove unneccessary margin in some headers ([32874a1](https://github.com/nrkno/tv-automation-server-core/commit/32874a1)) -* remove unused imports ([5fe6ac3](https://github.com/nrkno/tv-automation-server-core/commit/5fe6ac3)) -* remove unused imports ([59041fc](https://github.com/nrkno/tv-automation-server-core/commit/59041fc)) -* remove unused translation helper ([e545a9e](https://github.com/nrkno/tv-automation-server-core/commit/e545a9e)) -* removed autopublish and insecure packages, we'll implement publications and allow/deny rules from now on ([213998d](https://github.com/nrkno/tv-automation-server-core/commit/213998d)) -* removed ntp server debug code ([b9857e7](https://github.com/nrkno/tv-automation-server-core/commit/b9857e7)) -* removed old, deprecated attr ([bf0cdfd](https://github.com/nrkno/tv-automation-server-core/commit/bf0cdfd)) -* Removed the hard-coded link in the header that set the translation to Norwegian Bokmål. ([4515066](https://github.com/nrkno/tv-automation-server-core/commit/4515066)) -* removed uploadFileToAtem function, this should be done in devicesMakeReady ([4e96bb3](https://github.com/nrkno/tv-automation-server-core/commit/4e96bb3)) -* removed wrongful error throw ([852c495](https://github.com/nrkno/tv-automation-server-core/commit/852c495)) -* removed wrongful error throw ([b3deed1](https://github.com/nrkno/tv-automation-server-core/commit/b3deed1)) -* Removing trailing slashes in url defaults ([f6fa32c](https://github.com/nrkno/tv-automation-server-core/commit/f6fa32c)) -* rename "Edit" to "Trim" for clipTrimDialog ([3879a34](https://github.com/nrkno/tv-automation-server-core/commit/3879a34)) -* rename collection RundownBaselineItems => RundownBaselineObjs ([e471321](https://github.com/nrkno/tv-automation-server-core/commit/e471321)) -* rename InspectorDrawer to Shelf ([db6e778](https://github.com/nrkno/tv-automation-server-core/commit/db6e778)) -* rename method getShowStyleRef => getShowStyleConfigRef ([c8bbe95](https://github.com/nrkno/tv-automation-server-core/commit/c8bbe95)) -* rename restoreBackups page to Snapshots ([0c5103f](https://github.com/nrkno/tv-automation-server-core/commit/0c5103f)) -* rename rundownAPI => runningOrderAPI ([89d48d0](https://github.com/nrkno/tv-automation-server-core/commit/89d48d0)) -* rename rundownBaselineAdLibItem => rundownBaselineAdLibPiece ([82f8327](https://github.com/nrkno/tv-automation-server-core/commit/82f8327)) -* rename runningOrder => rundown ([4eab6de](https://github.com/nrkno/tv-automation-server-core/commit/4eab6de)) -* rename segmentLine => part ([b56b55b](https://github.com/nrkno/tv-automation-server-core/commit/b56b55b)) -* rename SegmentLineAdLibItem => AdLibPiece ([04c50a9](https://github.com/nrkno/tv-automation-server-core/commit/04c50a9)) -* rename segmentLineItem => piece ([bf61c48](https://github.com/nrkno/tv-automation-server-core/commit/bf61c48)) -* Rename shelf, more fixes ([898247e](https://github.com/nrkno/tv-automation-server-core/commit/898247e)) -* rename siId to studioId in Timeline ([88f6039](https://github.com/nrkno/tv-automation-server-core/commit/88f6039)) -* rename some methods in RundownNotifier ([1a5b6ea](https://github.com/nrkno/tv-automation-server-core/commit/1a5b6ea)) -* rename some segmentLine props to parts ([344f796](https://github.com/nrkno/tv-automation-server-core/commit/344f796)) -* rename StudioInstallation => Studio ([22d0786](https://github.com/nrkno/tv-automation-server-core/commit/22d0786)) -* rename version 0.20.0 => 0.21.0 (release 6) ([7b1ee3a](https://github.com/nrkno/tv-automation-server-core/commit/7b1ee3a)) -* renames ([b606907](https://github.com/nrkno/tv-automation-server-core/commit/b606907)) -* Rerunning blueprints losing part timings ([e6c35b4](https://github.com/nrkno/tv-automation-server-core/commit/e6c35b4)) -* resetRunningOrder functionality in GUI ([4eb096a](https://github.com/nrkno/tv-automation-server-core/commit/4eb096a)) -* resetRunningorder should update timeline ([0d01e6a](https://github.com/nrkno/tv-automation-server-core/commit/0d01e6a)) -* resetRunningorder should update timeline ([35451b1](https://github.com/nrkno/tv-automation-server-core/commit/35451b1)) -* resetting running order rewind ([a122f2c](https://github.com/nrkno/tv-automation-server-core/commit/a122f2c)) -* resolve a typo in rabbitMQ.ts ([3b36ae3](https://github.com/nrkno/tv-automation-server-core/commit/3b36ae3)) -* resolve an issue with dropdown EditAttribute not selecting the undefined option ([2658ed3](https://github.com/nrkno/tv-automation-server-core/commit/2658ed3)) -* resolve an issue with dropdown EditAttribute not selecting the undefined option ([9f85845](https://github.com/nrkno/tv-automation-server-core/commit/9f85845)) -* resolve an issue with missing media notification after floating a line ([00fedce](https://github.com/nrkno/tv-automation-server-core/commit/00fedce)) -* resolve issue with ContextMenus in RO view ([8d9ba96](https://github.com/nrkno/tv-automation-server-core/commit/8d9ba96)) -* resolve issue with hit-area of Notification Center ([1618619](https://github.com/nrkno/tv-automation-server-core/commit/1618619)) -* resolve issue with lowPriority cron jobs ([f7c3c83](https://github.com/nrkno/tv-automation-server-core/commit/f7c3c83)) -* resolve issue with segmentLineDisplayDuration & segment duration ([a73ed09](https://github.com/nrkno/tv-automation-server-core/commit/a73ed09)) -* resolve issues with how play-from-here is displayed in GUI ([ebdb549](https://github.com/nrkno/tv-automation-server-core/commit/ebdb549)) -* resolve Media Object Status notifications bug ([367dcce](https://github.com/nrkno/tv-automation-server-core/commit/367dcce)) -* resolve merge issue ([0cbc75a](https://github.com/nrkno/tv-automation-server-core/commit/0cbc75a)) -* resolve some sizing issues in the RD view ([f0c1826](https://github.com/nrkno/tv-automation-server-core/commit/f0c1826)) -* Respect disableOutTransition on SegmentLine during manual takes (not just autonext) ([f19788d](https://github.com/nrkno/tv-automation-server-core/commit/f19788d)) -* restore blueprint settings page ([faa7fdd](https://github.com/nrkno/tv-automation-server-core/commit/faa7fdd)) -* restore running order 'backup' fails if doesnt already exist ([87b3300](https://github.com/nrkno/tv-automation-server-core/commit/87b3300)) -* retry strategy for restart casparcg cronjob ([b54f0f6](https://github.com/nrkno/tv-automation-server-core/commit/b54f0f6)) -* reversed logic during refactoring by mistake ([694191e](https://github.com/nrkno/tv-automation-server-core/commit/694191e)) -* Revert 594a1e7 ([edeb166](https://github.com/nrkno/tv-automation-server-core/commit/edeb166)) -* rewind all segments when re-enabling follow on air ([a23b84c](https://github.com/nrkno/tv-automation-server-core/commit/a23b84c)) -* rewind icon was not responsive in ROFullscreenControls ([2e7c1d2](https://github.com/nrkno/tv-automation-server-core/commit/2e7c1d2)) -* rewind icon was not responsive in ROFullscreenControls ([0e494df](https://github.com/nrkno/tv-automation-server-core/commit/0e494df)) -* rewind UI even if reset returns error ([08c5d6b](https://github.com/nrkno/tv-automation-server-core/commit/08c5d6b)) -* rewind UI even if reset returns error ([3bd5417](https://github.com/nrkno/tv-automation-server-core/commit/3bd5417)) -* reworked systemStatus to use components instead ([cccfe3c](https://github.com/nrkno/tv-automation-server-core/commit/cccfe3c)) -* Rewrite piece durations to allow for specifying end instead of duration ([9dee8a6](https://github.com/nrkno/tv-automation-server-core/commit/9dee8a6)) -* RO buttons z-order ([3c53254](https://github.com/nrkno/tv-automation-server-core/commit/3c53254)) -* RO buttons z-order ([15e9da8](https://github.com/nrkno/tv-automation-server-core/commit/15e9da8)) -* RO config changed notification not updating when RO is updated ([f5c2540](https://github.com/nrkno/tv-automation-server-core/commit/f5c2540)) -* RO notification action ([36cf900](https://github.com/nrkno/tv-automation-server-core/commit/36cf900)) -* RO Notifications fixes attempt no. 3 ([f0eee1f](https://github.com/nrkno/tv-automation-server-core/commit/f0eee1f)) -* RO overview crashed during rebuild of RO ([d2c62a1](https://github.com/nrkno/tv-automation-server-core/commit/d2c62a1)) -* ro-reset does not reset properly ([6367658](https://github.com/nrkno/tv-automation-server-core/commit/6367658)) -* roReset should reset holdItems and infinites ([bdf8385](https://github.com/nrkno/tv-automation-server-core/commit/bdf8385)) -* run afterUpdateTimeline after timelineTriggerTime ([98ece60](https://github.com/nrkno/tv-automation-server-core/commit/98ece60)) -* Rundown name dissappearing from view ([91dcc21](https://github.com/nrkno/tv-automation-server-core/commit/91dcc21)) -* running blueprint migrations ([fe1e7fd](https://github.com/nrkno/tv-automation-server-core/commit/fe1e7fd)) -* Running blueprints and migrations ([3b29df3](https://github.com/nrkno/tv-automation-server-core/commit/3b29df3)) -* running order closing prompt ([3024543](https://github.com/nrkno/tv-automation-server-core/commit/3024543)) -* running order closing prompt ([7074cc3](https://github.com/nrkno/tv-automation-server-core/commit/7074cc3)) -* Running Order Notifications in activeRo view ([63658b1](https://github.com/nrkno/tv-automation-server-core/commit/63658b1)) -* Running order status notifying wrong dep ([e6b84e5](https://github.com/nrkno/tv-automation-server-core/commit/e6b84e5)) -* running order view notifications in production build ([b593323](https://github.com/nrkno/tv-automation-server-core/commit/b593323)) -* seek support in VT, STK, hoverscrub ([43e413b](https://github.com/nrkno/tv-automation-server-core/commit/43e413b)) -* semver.clean cannot handle undefined input parameter ([333588a](https://github.com/nrkno/tv-automation-server-core/commit/333588a)) -* send utf-8 filenames properly in Content-Disposition ([60eb521](https://github.com/nrkno/tv-automation-server-core/commit/60eb521)) -* separate warnings for black frames & freeze frames ([e2acad5](https://github.com/nrkno/tv-automation-server-core/commit/e2acad5)) -* Set KAM source layer, and a probably incorrect duration (but its now non-zero) ([6e152f0](https://github.com/nrkno/tv-automation-server-core/commit/6e152f0)) -* set tsr multithreading from UI instead of CLI ([c8be25b](https://github.com/nrkno/tv-automation-server-core/commit/c8be25b)) -* setAsNext on previous ([6ced09b](https://github.com/nrkno/tv-automation-server-core/commit/6ced09b)) -* setAsNext on previous ([4ffe665](https://github.com/nrkno/tv-automation-server-core/commit/4ffe665)) -* setAsNext on previous line no longer shows default state, but now instead stalls when attempting to take ([e441aaf](https://github.com/nrkno/tv-automation-server-core/commit/e441aaf)) -* settings styling improvements, code fixes ([d9484cd](https://github.com/nrkno/tv-automation-server-core/commit/d9484cd)) -* shelf height would not change ([123b407](https://github.com/nrkno/tv-automation-server-core/commit/123b407)) -* show connected devices in RO view ([e804d1e](https://github.com/nrkno/tv-automation-server-core/commit/e804d1e)) -* show full timecode for set with of offset ([0954ce6](https://github.com/nrkno/tv-automation-server-core/commit/0954ce6)) -* show media errors in segment header ([3775d2e](https://github.com/nrkno/tv-automation-server-core/commit/3775d2e)) -* show ShowStyleBase name as a part of the ShowStyleVariant name in Studios ([ba67011](https://github.com/nrkno/tv-automation-server-core/commit/ba67011)) -* ShowStyleVariant settings not saving changes ([e90137b](https://github.com/nrkno/tv-automation-server-core/commit/e90137b)) -* simplify getRSourceLayer - unnecessary null check ([0405f35](https://github.com/nrkno/tv-automation-server-core/commit/0405f35)) -* since afterUpdateTimeline is called in from a syncFunctionIgnore-function, we can remove the timeout ([e7f8f25](https://github.com/nrkno/tv-automation-server-core/commit/e7f8f25)) -* skip an allocation in RundownTiming ([db83682](https://github.com/nrkno/tv-automation-server-core/commit/db83682)) -* skip untranslated strings from po files, update i18next-conv to latest version ([1de4ccb](https://github.com/nrkno/tv-automation-server-core/commit/1de4ccb)) -* sl prod init ([2ff4a46](https://github.com/nrkno/tv-automation-server-core/commit/2ff4a46)) -* smoother handling when reloading ENPS data ([83be7cb](https://github.com/nrkno/tv-automation-server-core/commit/83be7cb)) -* snapshots ([182c221](https://github.com/nrkno/tv-automation-server-core/commit/182c221)) -* SOAP message encoding ([63d8634](https://github.com/nrkno/tv-automation-server-core/commit/63d8634)) -* SOAP message encoding ([b19ea77](https://github.com/nrkno/tv-automation-server-core/commit/b19ea77)) -* solve a problem with viewing recordings ([09aa112](https://github.com/nrkno/tv-automation-server-core/commit/09aa112)) -* solve a problem with viewing recordings ([01c165b](https://github.com/nrkno/tv-automation-server-core/commit/01c165b)) -* solve an issue with content trimmed icon ([461617f](https://github.com/nrkno/tv-automation-server-core/commit/461617f)) -* Some durations using removed self references ([b3b7776](https://github.com/nrkno/tv-automation-server-core/commit/b3b7776)) -* Some fatal bugs in a clean installation ([b311ae1](https://github.com/nrkno/tv-automation-server-core/commit/b311ae1)) -* some minor react errors in the settings ([d7bb849](https://github.com/nrkno/tv-automation-server-core/commit/d7bb849)) -* some more linting and refactoring due to deprecation of certain lifecycle methods ([a6d1cc6](https://github.com/nrkno/tv-automation-server-core/commit/a6d1cc6)) -* some more margin touch-ups ([71a291a](https://github.com/nrkno/tv-automation-server-core/commit/71a291a)) -* some more margin touch-ups ([c8b6f1e](https://github.com/nrkno/tv-automation-server-core/commit/c8b6f1e)) -* Some mos typing errors, and references to old runningorderdatacache ([3722a86](https://github.com/nrkno/tv-automation-server-core/commit/3722a86)) -* some playout and rundown issues ([c235fda](https://github.com/nrkno/tv-automation-server-core/commit/c235fda)) -* some playout bugs ([065de84](https://github.com/nrkno/tv-automation-server-core/commit/065de84)) -* Some playout bugs ([08ec090](https://github.com/nrkno/tv-automation-server-core/commit/08ec090)) -* Some playout timeline bugs ([f4ad363](https://github.com/nrkno/tv-automation-server-core/commit/f4ad363)) -* split abbreviation spacing ([43ea9d5](https://github.com/nrkno/tv-automation-server-core/commit/43ea9d5)) -* Start on template for KAM ÅPNING ([4cd682f](https://github.com/nrkno/tv-automation-server-core/commit/4cd682f)) -* status colors ([46fdaf1](https://github.com/nrkno/tv-automation-server-core/commit/46fdaf1)) -* strip blueprint manifest versions of '^' ([54a5ecf](https://github.com/nrkno/tv-automation-server-core/commit/54a5ecf)) -* StudioInstallation key-value config tidying ([4b0bc1a](https://github.com/nrkno/tv-automation-server-core/commit/4b0bc1a)) -* styling fix for z-order with menu and RO buttons ([1b0717e](https://github.com/nrkno/tv-automation-server-core/commit/1b0717e)) -* subscription handling ([8aaa3ec](https://github.com/nrkno/tv-automation-server-core/commit/8aaa3ec)) -* super.componentWillUnmount is required ([2342e48](https://github.com/nrkno/tv-automation-server-core/commit/2342e48)) -* suppress console.errors, display notifications whenever possible ([5918886](https://github.com/nrkno/tv-automation-server-core/commit/5918886)) -* syncFunction only timing out when any other syncFunction gets queued ([2d45122](https://github.com/nrkno/tv-automation-server-core/commit/2d45122)) -* syntax errors in test file ([a8f5d1e](https://github.com/nrkno/tv-automation-server-core/commit/a8f5d1e)) -* systemStatus _internal messages ([d150f54](https://github.com/nrkno/tv-automation-server-core/commit/d150f54)) -* systemStatus _internal messages ([05fd6c8](https://github.com/nrkno/tv-automation-server-core/commit/05fd6c8)) -* systemStatus messages ([e595e5b](https://github.com/nrkno/tv-automation-server-core/commit/e595e5b)) -* systemStatus messages ([17420cc](https://github.com/nrkno/tv-automation-server-core/commit/17420cc)) -* systemStatus versions ([62bfa9a](https://github.com/nrkno/tv-automation-server-core/commit/62bfa9a)) -* take action should not throw as nasty errors when called by user. ([6791d50](https://github.com/nrkno/tv-automation-server-core/commit/6791d50)) -* take playOffset into account for timing ([422783a](https://github.com/nrkno/tv-automation-server-core/commit/422783a)) -* templates with wipe. Readd seperate audio file ([5be2802](https://github.com/nrkno/tv-automation-server-core/commit/5be2802)) -* temporary fix for the "UnhandledPromiseRejectionWarning" bug, supressing the error when used ([7aa7cf8](https://github.com/nrkno/tv-automation-server-core/commit/7aa7cf8)) -* temporary fix of typing error ([73bf56d](https://github.com/nrkno/tv-automation-server-core/commit/73bf56d)) -* test-tools decklink input format dropdown has no options ([b02f447](https://github.com/nrkno/tv-automation-server-core/commit/b02f447)) -* text shadow in SegmentLineLabels ([3a310b1](https://github.com/nrkno/tv-automation-server-core/commit/3a310b1)) -* tie snapshot to evaluation ([ec18370](https://github.com/nrkno/tv-automation-server-core/commit/ec18370)) -* Timeline always being built without previous segmentline ([a077805](https://github.com/nrkno/tv-automation-server-core/commit/a077805)) -* timeline dep ([b26eecb](https://github.com/nrkno/tv-automation-server-core/commit/b26eecb)) -* timeline resolution bug for non-infinite items ([35fc40a](https://github.com/nrkno/tv-automation-server-core/commit/35fc40a)) -* timeline statobj didn't update on inactivate (empty timeline) ([839b906](https://github.com/nrkno/tv-automation-server-core/commit/839b906)) -* timeline statObject: updated hashing function ([e00a01c](https://github.com/nrkno/tv-automation-server-core/commit/e00a01c)) -* Timeline viewer infinite loop ([74856df](https://github.com/nrkno/tv-automation-server-core/commit/74856df)) -* timelineObj _id missing ([1dcedbf](https://github.com/nrkno/tv-automation-server-core/commit/1dcedbf)) -* timelineObj _id missing ([0f8e0da](https://github.com/nrkno/tv-automation-server-core/commit/0f8e0da)) -* timesync: better retry strategy on startup sync ([eda632a](https://github.com/nrkno/tv-automation-server-core/commit/eda632a)) -* toc trace message ([c53124f](https://github.com/nrkno/tv-automation-server-core/commit/c53124f)) -* Toggle hotkeys legend in support panel ([e6f4769](https://github.com/nrkno/tv-automation-server-core/commit/e6f4769)) -* too long script out-words could overlap with previous items ([8f8a9a2](https://github.com/nrkno/tv-automation-server-core/commit/8f8a9a2)) -* Tooltip import ([cd2b65a](https://github.com/nrkno/tv-automation-server-core/commit/cd2b65a)) -* tooltips after import change ([a82140f](https://github.com/nrkno/tv-automation-server-core/commit/a82140f)) -* top RO overview labels clipped in wrong places ([5e5c228](https://github.com/nrkno/tv-automation-server-core/commit/5e5c228)) -* Tweaked styling of evaluation form, warning messages, color of the next lines, translations, capialized warning icon file name, and optimized png and svg icons. ([50d2753](https://github.com/nrkno/tv-automation-server-core/commit/50d2753)) -* tweaks on externalMessage send function, limiting the number of messages sent in one go ([046ae38](https://github.com/nrkno/tv-automation-server-core/commit/046ae38)) -* type bug ([de43835](https://github.com/nrkno/tv-automation-server-core/commit/de43835)) -* type error in SegmentTimelineContainer ([c4d6b4d](https://github.com/nrkno/tv-automation-server-core/commit/c4d6b4d)) -* type error, ensure string ([76da25d](https://github.com/nrkno/tv-automation-server-core/commit/76da25d)) -* typing ([7c21efe](https://github.com/nrkno/tv-automation-server-core/commit/7c21efe)) -* typing fix: cannot find name 'monaco' ([3ad88ce](https://github.com/nrkno/tv-automation-server-core/commit/3ad88ce)) -* typing fixes, to work with updated packages ([b4362f7](https://github.com/nrkno/tv-automation-server-core/commit/b4362f7)) -* typings error, ensuring string ([1e25345](https://github.com/nrkno/tv-automation-server-core/commit/1e25345)) -* typo ([2efc829](https://github.com/nrkno/tv-automation-server-core/commit/2efc829)) -* typo bug in performanceMonitor ([6a5eeb4](https://github.com/nrkno/tv-automation-server-core/commit/6a5eeb4)) -* typo bug in performanceMonitor ([797c393](https://github.com/nrkno/tv-automation-server-core/commit/797c393)) -* typo MediaResolutions vs mediaResolutions ([6a72e09](https://github.com/nrkno/tv-automation-server-core/commit/6a72e09)) -* Typographic tweaks for prompter. ([068d535](https://github.com/nrkno/tv-automation-server-core/commit/068d535)) -* UI bug: key in

missing ([b957660](https://github.com/nrkno/tv-automation-server-core/commit/b957660)) -* UI crash when outputLayer is undefined ([e6dd558](https://github.com/nrkno/tv-automation-server-core/commit/e6dd558)) -* UI fixes for some margins in the migrations view ([4dc6fef](https://github.com/nrkno/tv-automation-server-core/commit/4dc6fef)) -* ui manualPlayback key ([ca1a943](https://github.com/nrkno/tv-automation-server-core/commit/ca1a943)) -* ui manualPlayback key ([5d4e49f](https://github.com/nrkno/tv-automation-server-core/commit/5d4e49f)) -* UI tweaks for messages status view. so it doesn't break when having long error messages ([ca1e3ae](https://github.com/nrkno/tv-automation-server-core/commit/ca1e3ae)) -* UI: improve shapshot comment edit field ([093e6cb](https://github.com/nrkno/tv-automation-server-core/commit/093e6cb)) -* upd meteor typings ([53f17d2](https://github.com/nrkno/tv-automation-server-core/commit/53f17d2)) -* upd query-string dependency & fixed typings issue ([e0d3f12](https://github.com/nrkno/tv-automation-server-core/commit/e0d3f12)) -* update all data in roReplaceMetadata ([8a5a671](https://github.com/nrkno/tv-automation-server-core/commit/8a5a671)) -* update asRunLog typings ([5d18c66](https://github.com/nrkno/tv-automation-server-core/commit/5d18c66)) -* update blueprints-integration ([28d17c2](https://github.com/nrkno/tv-automation-server-core/commit/28d17c2)) -* update blueprints-integration ([59c29f6](https://github.com/nrkno/tv-automation-server-core/commit/59c29f6)) -* Update blueprints-integration ([9870256](https://github.com/nrkno/tv-automation-server-core/commit/9870256)) -* update blueprints-integration depencendy & update getHashId to match ([e1c12d2](https://github.com/nrkno/tv-automation-server-core/commit/e1c12d2)) -* update design of presenter screen ([4f41195](https://github.com/nrkno/tv-automation-server-core/commit/4f41195)) -* update device last data timestamp ([ac82ebd](https://github.com/nrkno/tv-automation-server-core/commit/ac82ebd)) -* Update names passed to SegmentLineItems ([ed0fc0d](https://github.com/nrkno/tv-automation-server-core/commit/ed0fc0d)) -* update Next-line when inserting story just before it, also added property to track if the next point was set manually ([d82dbc6](https://github.com/nrkno/tv-automation-server-core/commit/d82dbc6)) -* update package versions to fix audit issues ([be3cae5](https://github.com/nrkno/tv-automation-server-core/commit/be3cae5)) -* update Part & Rundown classes from inherited interface ([956f4c6](https://github.com/nrkno/tv-automation-server-core/commit/956f4c6)) -* Update RO change notification on an interval, to ensure it catches changes to other document types ([79d8c05](https://github.com/nrkno/tv-automation-server-core/commit/79d8c05)) -* update ro data cache when getting new metadata ([d700783](https://github.com/nrkno/tv-automation-server-core/commit/d700783)) -* Update some playout timelineobj types ([fe883a8](https://github.com/nrkno/tv-automation-server-core/commit/fe883a8)) -* update supertimeline ([28bccfe](https://github.com/nrkno/tv-automation-server-core/commit/28bccfe)) -* update timeline dependency ([b83f6be](https://github.com/nrkno/tv-automation-server-core/commit/b83f6be)) -* Update timeline on new ingest data ([80ac1ed](https://github.com/nrkno/tv-automation-server-core/commit/80ac1ed)) -* Update timeline on removing a mos story ([fd3d443](https://github.com/nrkno/tv-automation-server-core/commit/fd3d443)) -* update timeline-visualizer ([8e46981](https://github.com/nrkno/tv-automation-server-core/commit/8e46981)) -* Update TimelineObjCCGRoute. ([203ef91](https://github.com/nrkno/tv-automation-server-core/commit/203ef91)) -* update ts-jest dependency ([69c3c64](https://github.com/nrkno/tv-automation-server-core/commit/69c3c64)) -* Update tsr version ([92359bd](https://github.com/nrkno/tv-automation-server-core/commit/92359bd)) -* update typings ([d536ad1](https://github.com/nrkno/tv-automation-server-core/commit/d536ad1)) -* update typings to match blueprints-integration ([f97f177](https://github.com/nrkno/tv-automation-server-core/commit/f97f177)) -* updated health endpoint according to spec ([900728b](https://github.com/nrkno/tv-automation-server-core/commit/900728b)) -* updated health endpoint according to spec ([c196382](https://github.com/nrkno/tv-automation-server-core/commit/c196382)) -* updated mock data ([3e140c6](https://github.com/nrkno/tv-automation-server-core/commit/3e140c6)) -* updated mock data ([a7a4ae5](https://github.com/nrkno/tv-automation-server-core/commit/a7a4ae5)) -* updated nightly cronjob: restart casparcg devices, to work with new restartCasparCG function implementation ([edbc186](https://github.com/nrkno/tv-automation-server-core/commit/edbc186)) -* updated nightly cronjob: restart casparcg devices, to work with new restartCasparCG function implementation ([3f9344d](https://github.com/nrkno/tv-automation-server-core/commit/3f9344d)) -* updated package-lock.json ([bf0cfde](https://github.com/nrkno/tv-automation-server-core/commit/bf0cfde)) -* updated systemTime endpoint ([503d2c8](https://github.com/nrkno/tv-automation-server-core/commit/503d2c8)) -* updated timeline dep (bugfixes) ([ff29ce6](https://github.com/nrkno/tv-automation-server-core/commit/ff29ce6)) -* updated versions file ([f6c9869](https://github.com/nrkno/tv-automation-server-core/commit/f6c9869)) -* updateExpectedMediaItems failing was causing the post-process blueprint to not be run. Errors from this are still logged, but no longer block blueprint execution ([2fe22bb](https://github.com/nrkno/tv-automation-server-core/commit/2fe22bb)) -* usage of logging.warning didn't work (use logging.warn() ) ([fbf7528](https://github.com/nrkno/tv-automation-server-core/commit/fbf7528)) -* use a single setState in updateVersions in MigrationsView ([afd730a](https://github.com/nrkno/tv-automation-server-core/commit/afd730a)) -* **adlib:** Allow for overlap of adlib sli to give preload time ([d2f0dcd](https://github.com/nrkno/tv-automation-server-core/commit/d2f0dcd)) -* **adlib:** An adlib replacing the main sli of a sl would not adjust the length of the original. F5/F6 sometimes failed to insert a sli correctly, causing black ([fca6f05](https://github.com/nrkno/tv-automation-server-core/commit/fca6f05)) -* **adlib:** Set as next on SL after using F5/F6 would not restore correctly ([3829293](https://github.com/nrkno/tv-automation-server-core/commit/3829293)) -* **asRunLog:** wrong id, typo ([636fc41](https://github.com/nrkno/tv-automation-server-core/commit/636fc41)) -* **backup:** make restore running order less strict ([e78313f](https://github.com/nrkno/tv-automation-server-core/commit/e78313f)) -* **blueprint:** Fill in missing TimelineObj fields ([0ed7663](https://github.com/nrkno/tv-automation-server-core/commit/0ed7663)) -* **blueprint:** fix manifest config add item showing an 'undefined' option ([fa6182a](https://github.com/nrkno/tv-automation-server-core/commit/fa6182a)) -* **blueprint:** Remove invalid backup restore code ([2e00eca](https://github.com/nrkno/tv-automation-server-core/commit/2e00eca)) -* **blueprints:** Ensure ids are not duplicated ([fbd0a04](https://github.com/nrkno/tv-automation-server-core/commit/fbd0a04)) -* **blueprints:** Ensure the object ids generated by the post-process blueprint are unique ([bdee540](https://github.com/nrkno/tv-automation-server-core/commit/bdee540)) -* **cam/dir:** clear hotkeys ([2545de8](https://github.com/nrkno/tv-automation-server-core/commit/2545de8)) -* **clip metadata:** timebase info ([5c39ea8](https://github.com/nrkno/tv-automation-server-core/commit/5c39ea8)) -* **countdowns:** ignore sourceLayers that we don't have an icon for ([27b2ac0](https://github.com/nrkno/tv-automation-server-core/commit/27b2ac0)) -* **countdowns:** split text parsing ([9a174ae](https://github.com/nrkno/tv-automation-server-core/commit/9a174ae)) -* **Devices:** Better strings and device list layouts (less details) ([be26a18](https://github.com/nrkno/tv-automation-server-core/commit/be26a18)) -* **displayDurationGroup:** fix GUI clocks for displayDurationGroups ([10ac255](https://github.com/nrkno/tv-automation-server-core/commit/10ac255)) -* **displayDurationGroup:** fix GUI clocks for displayDurationGroups ([76e217e](https://github.com/nrkno/tv-automation-server-core/commit/76e217e)) -* **displayDurationGroup:** use displayDurationGroup timing in presenter's screen ([9138845](https://github.com/nrkno/tv-automation-server-core/commit/9138845)) -* **displayDurationGroup:** use displayDurationGroup timing in presenter's screen ([61e04f9](https://github.com/nrkno/tv-automation-server-core/commit/61e04f9)) -* **emberplus:** changes intiDB mapping to new .-delimited string format ([b6d8bc7](https://github.com/nrkno/tv-automation-server-core/commit/b6d8bc7)) -* **expected media items:** use a function instead of fat arrow ([fa23c05](https://github.com/nrkno/tv-automation-server-core/commit/fa23c05)) -* **externalMessage:** encode proper html-entities in strings ([243995c](https://github.com/nrkno/tv-automation-server-core/commit/243995c)) -* **FirstObjects:** Reverts regression introduced by removing isAbstract from firstObject items ([8f1608b](https://github.com/nrkno/tv-automation-server-core/commit/8f1608b)) -* **GUI:** bug in EditAttribute dropdown, causing NaN to be written if optionsAreNumbers is not set ([4b17853](https://github.com/nrkno/tv-automation-server-core/commit/4b17853)) -* **hold:** Disable transition when in HOLD ([cfcb141](https://github.com/nrkno/tv-automation-server-core/commit/cfcb141)) -* **hold:** Disable transition when leaving HOLD ([809dd34](https://github.com/nrkno/tv-automation-server-core/commit/809dd34)) -* **hold:** Disable transition when leaving HOLD ([6b7184c](https://github.com/nrkno/tv-automation-server-core/commit/6b7184c)) -* **hold:** Disable transition when leaving or leaving HOLD ([ef5cbcb](https://github.com/nrkno/tv-automation-server-core/commit/ef5cbcb)) -* **hold:** Ensure the original stk does not get picked up as a dynamic object when setting the sl as next ([225304d](https://github.com/nrkno/tv-automation-server-core/commit/225304d)) -* **hold:** Ensure the original stk does not get picked up as a dynamic object when setting the sl as next ([b10f48d](https://github.com/nrkno/tv-automation-server-core/commit/b10f48d)) -* **hold:** Ensure the original stk does not get picked up as a dynamic object when setting the sl as next ([22da4d8](https://github.com/nrkno/tv-automation-server-core/commit/22da4d8)) -* **hold:** keep showing any infinite items that existed on the previous sl ([21a9973](https://github.com/nrkno/tv-automation-server-core/commit/21a9973)) -* **hold:** Too many sli being extended for hold mode ([f644e32](https://github.com/nrkno/tv-automation-server-core/commit/f644e32)) -* **hold:** When extending a sli during hold, use the original id to make any triggers on the sli work ([669a4b2](https://github.com/nrkno/tv-automation-server-core/commit/669a4b2)) -* **hold:** When extending a sli during hold, use the original id to make any triggers on the sli work ([a3fd1a6](https://github.com/nrkno/tv-automation-server-core/commit/a3fd1a6)) -* **infinite:** Persist overrideDuration when updating infinites ([72670d5](https://github.com/nrkno/tv-automation-server-core/commit/72670d5)) -* **infinite:** Persist overrideDuration when updating infinites ([b15bfa3](https://github.com/nrkno/tv-automation-server-core/commit/b15bfa3)) -* **infinite items:** removes infinite icon from outOnNextSegment ([4a75d7d](https://github.com/nrkno/tv-automation-server-core/commit/4a75d7d)) -* **ingest:** Error when removeSegment doesnt remove anything. Call updateDynamicPartRanks after importing ingest data ([5bf0c95](https://github.com/nrkno/tv-automation-server-core/commit/5bf0c95)) -* **ingest:** Rewrite portions of the removeX and afterRemoveX functions to allow batching changes and make more durable ([2457a29](https://github.com/nrkno/tv-automation-server-core/commit/2457a29)) -* **ingest:** Save notes generated by blueprints ([06fac36](https://github.com/nrkno/tv-automation-server-core/commit/06fac36)) -* **ingest:** Some syncFunction timeouts. Finish a bit more of the mos ingest ([38e7576](https://github.com/nrkno/tv-automation-server-core/commit/38e7576)) -* **ingest:** Tidy up the peripheraldevice api ingest method parameters and expect valid Ingest types to be sent by the gateway ([a49fb7c](https://github.com/nrkno/tv-automation-server-core/commit/a49fb7c)) -* **ingest:** Use Ingest types for the peripheraldevice ingest api methods (Some mangling is still done internally to fix up spreadsheet gateway data) ([4a5421b](https://github.com/nrkno/tv-automation-server-core/commit/4a5421b)) -* **init:** Adds default lawo device settings ([28759df](https://github.com/nrkno/tv-automation-server-core/commit/28759df)) -* **init:** adds qwerty to bakskjerm ([a45de4d](https://github.com/nrkno/tv-automation-server-core/commit/a45de4d)) -* **init:** adds qwerty to bakskjerm ([7329976](https://github.com/nrkno/tv-automation-server-core/commit/7329976)) -* **init:** adds qwerty to bakskjerm ([78198c9](https://github.com/nrkno/tv-automation-server-core/commit/78198c9)) -* userAction: increased timeout value for "waiting for..." notification ([f00e273](https://github.com/nrkno/tv-automation-server-core/commit/f00e273)) -* **init:** hides klokke and logo layers by default ([1847ca4](https://github.com/nrkno/tv-automation-server-core/commit/1847ca4)) -* **init:** Layer names ([221b374](https://github.com/nrkno/tv-automation-server-core/commit/221b374)) -* **init:** Layer names ([16a504c](https://github.com/nrkno/tv-automation-server-core/commit/16a504c)) -* **init:** Splits init_layers and init_config. ([e056e5a](https://github.com/nrkno/tv-automation-server-core/commit/e056e5a)) -* **init:** swaps MP2 and MP1NXT layers ([b8a370c](https://github.com/nrkno/tv-automation-server-core/commit/b8a370c)) -* **init:** updated channel orders after 2-caspar setup ([3404b9b](https://github.com/nrkno/tv-automation-server-core/commit/3404b9b)) -* **Init:** Creat empty settings for Nora ([f8d0669](https://github.com/nrkno/tv-automation-server-core/commit/f8d0669)) -* **Init:** fixes wrong mapping of Lawo RMs ([ee68432](https://github.com/nrkno/tv-automation-server-core/commit/ee68432)) -* **Init:** Sets init defaults to xpro ([fd9c182](https://github.com/nrkno/tv-automation-server-core/commit/fd9c182)) -* **Initdb:** Preload vignett ([156a454](https://github.com/nrkno/tv-automation-server-core/commit/156a454)) -* **Initdb:** Preload vignett ([9470318](https://github.com/nrkno/tv-automation-server-core/commit/9470318)) -* **iterateDeeply:** typos ([c9198f1](https://github.com/nrkno/tv-automation-server-core/commit/c9198f1)) -* **L3rd pop-up:** filter out properties starting with @ ([c85ebeb](https://github.com/nrkno/tv-automation-server-core/commit/c85ebeb)) -* **L3rd pop-up:** filter out properties starting with @ ([19977e7](https://github.com/nrkno/tv-automation-server-core/commit/19977e7)) -* **lawo:** changes tempaltes to new structure ([29bf666](https://github.com/nrkno/tv-automation-server-core/commit/29bf666)) -* **lawo:** more generic timeline object ([b0418ab](https://github.com/nrkno/tv-automation-server-core/commit/b0418ab)) -* **lookahead:** clear inGroup in a better fashion ([60541cc](https://github.com/nrkno/tv-automation-server-core/commit/60541cc)) -* **lookahead:** consider transitions properly in lookahead ([c78c6fa](https://github.com/nrkno/tv-automation-server-core/commit/c78c6fa)) -* **lookahead:** Dont run lookahead on abs0 sli if there is an active transition. ([bb4123a](https://github.com/nrkno/tv-automation-server-core/commit/bb4123a)) -* **lookahead:** Dont run lookahead on abs0 sli if there is an active transition. ([191df09](https://github.com/nrkno/tv-automation-server-core/commit/191df09)) -* **lookahead:** Fix lookahead when transition does not define clip. Fix duplicate key exception when using hold multiple times at the same point ([a1bb026](https://github.com/nrkno/tv-automation-server-core/commit/a1bb026)) -* **lookahead:** Fix lookahead when transition object starts at abs0 ([c88c830](https://github.com/nrkno/tv-automation-server-core/commit/c88c830)) -* **lookahead:** Fix lookahead when transition object starts at abs0 ([bd3edbd](https://github.com/nrkno/tv-automation-server-core/commit/bd3edbd)) -* **lookahead:** Give lookahead the correct limit when in the next SegmentLine during autonext ([a3a299a](https://github.com/nrkno/tv-automation-server-core/commit/a3a299a)) -* **lookahead:** Give lookahead the correct limit when in the next SegmentLine during autonext ([0b20b9e](https://github.com/nrkno/tv-automation-server-core/commit/0b20b9e)) -* **lookahead:** Ignore transition if this is the first sl and so no transition will be used ([3df2e1e](https://github.com/nrkno/tv-automation-server-core/commit/3df2e1e)) -* **lookahead:** Not using transition info when in a segmentline with no previous segmentline ([917b34e](https://github.com/nrkno/tv-automation-server-core/commit/917b34e)) -* **lookahead:** Produced objects not resolving properly ([7660bf5](https://github.com/nrkno/tv-automation-server-core/commit/7660bf5)) -* **lookahead:** Produced objects not resolving properly ([322a94f](https://github.com/nrkno/tv-automation-server-core/commit/322a94f)) -* **lookahead:** Resolving an object for both transition clip and main clip causing an extra loadbg ([875bd1a](https://github.com/nrkno/tv-automation-server-core/commit/875bd1a)) -* **lookahead:** Resolving an object for both transition clip and main clip causing an extra loadbg ([739b5e4](https://github.com/nrkno/tv-automation-server-core/commit/739b5e4)) -* **lookahead:** RETAIN mode now follows the WHEN_CLEAR behaviour instead of PRELOAD ([f0df41c](https://github.com/nrkno/tv-automation-server-core/commit/f0df41c)) -* **media formats:** do not 2x interlaced frame rates ([1639c32](https://github.com/nrkno/tv-automation-server-core/commit/1639c32)) -* **media manager:** label on MM workFlow ([fc2e8d5](https://github.com/nrkno/tv-automation-server-core/commit/fc2e8d5)) -* **media manager ui:** display work step labels correctly ([05cce78](https://github.com/nrkno/tv-automation-server-core/commit/05cce78)) -* **media manager ui:** fix task list layout issue ([9902dc1](https://github.com/nrkno/tv-automation-server-core/commit/9902dc1)) -* **media manager ui:** media manager flow order ([1eb1c48](https://github.com/nrkno/tv-automation-server-core/commit/1eb1c48)) -* **migration:** Missing studio0_audio_bed ([1c6edcc](https://github.com/nrkno/tv-automation-server-core/commit/1c6edcc)) -* **migration:** overrideSteps should be applied before .validate() is run, so overrideSteps works independent of the validation result. ([c9c1f25](https://github.com/nrkno/tv-automation-server-core/commit/c9c1f25)) -* **migrations:** Broken StudioContext.updateDevice method ([d882e8b](https://github.com/nrkno/tv-automation-server-core/commit/d882e8b)) -* **migrations:** Broken StudioContext.updateDevice method ([7311d10](https://github.com/nrkno/tv-automation-server-core/commit/7311d10)) -* **migrations:** Check migrate function exists before trying to run it ([cf076f5](https://github.com/nrkno/tv-automation-server-core/commit/cf076f5)) -* **migrations:** Create ShowStyleVariant with ShowStyleBase in the migrations and setup studio to use it as its default ([75073d4](https://github.com/nrkno/tv-automation-server-core/commit/75073d4)) -* **migrations:** DependOnResultFrom id was not being prefixed causing it to never work ([5830754](https://github.com/nrkno/tv-automation-server-core/commit/5830754)) -* **migrations:** DependOnResultFrom id was not being prefixed causing it to never work ([602740c](https://github.com/nrkno/tv-automation-server-core/commit/602740c)) -* **migrations:** Ensure there are migrations to run before running another batch ([c3d77b5](https://github.com/nrkno/tv-automation-server-core/commit/c3d77b5)) -* **migrations:** Ensure there are migrations to run before running another batch ([3b703e5](https://github.com/nrkno/tv-automation-server-core/commit/3b703e5)) -* **migrations:** Uncomment mos check migration ([c262fff](https://github.com/nrkno/tv-automation-server-core/commit/c262fff)) -* **migrations:** Various problems when running from empty ([11d1d0b](https://github.com/nrkno/tv-automation-server-core/commit/11d1d0b)) -* **mos:** Mos ingest typing errors ([8f08f6e](https://github.com/nrkno/tv-automation-server-core/commit/8f08f6e)) -* **mos:** move stories. Refactor updating next-part to be seperately testable ([19b2d05](https://github.com/nrkno/tv-automation-server-core/commit/19b2d05)) -* **mos:** Segment externalId is now based on externalId of first part, instead of rank ([0916113](https://github.com/nrkno/tv-automation-server-core/commit/0916113)) -* **mos:** Set next part logic after story updates ([2b8cf47](https://github.com/nrkno/tv-automation-server-core/commit/2b8cf47)) -* **notification center:** fix notification center toggle button in RO view ([894c1e2](https://github.com/nrkno/tv-automation-server-core/commit/894c1e2)) -* **notification center:** fix running order overview to line up with the Segments column ([0906cab](https://github.com/nrkno/tv-automation-server-core/commit/0906cab)) -* **notification center:** notification count position ([1d8d2cb](https://github.com/nrkno/tv-automation-server-core/commit/1d8d2cb)) -* **notification center:** reintroduce RunningOrderNotifier into RunningOrderView ([e70e5c9](https://github.com/nrkno/tv-automation-server-core/commit/e70e5c9)) -* **notifications:** change unknown to any ([7ac8008](https://github.com/nrkno/tv-automation-server-core/commit/7ac8008)) -* **Notifications refresh:** limit amount of reactive vars ([2c01e66](https://github.com/nrkno/tv-automation-server-core/commit/2c01e66)) -* **NRK Template:** Use LLayers Enum ([84ed5df](https://github.com/nrkno/tv-automation-server-core/commit/84ed5df)) -* **pharos:** add missing settingsType and migration step ([9f73a8e](https://github.com/nrkno/tv-automation-server-core/commit/9f73a8e)) -* **pharos:** add missing settingsType and migration step ([be618d2](https://github.com/nrkno/tv-automation-server-core/commit/be618d2)) -* **playout:** bad timing during autonext ([5524e3b](https://github.com/nrkno/tv-automation-server-core/commit/5524e3b)) -* **playout:** Better account for duration and overlaps with transitions etc. ([dc249a3](https://github.com/nrkno/tv-automation-server-core/commit/dc249a3)) -* **playout:** Double head2 headline out animation ([7ec91ff](https://github.com/nrkno/tv-automation-server-core/commit/7ec91ff)) -* **playout:** Double head2 headline out animation ([165e2c0](https://github.com/nrkno/tv-automation-server-core/commit/165e2c0)) -* **playout:** Ensure that infinite segmentLineItems are reset correctly after being removed by some hotkeys ([e4f8a83](https://github.com/nrkno/tv-automation-server-core/commit/e4f8a83)) -* **playout:** Ensure that infinite segmentLineItems are reset correctly after being removed by some hotkeys ([045c9b1](https://github.com/nrkno/tv-automation-server-core/commit/045c9b1)) -* **playout:** Fix overlap tests ([15628a2](https://github.com/nrkno/tv-automation-server-core/commit/15628a2)) -* **playout:** ID prefixing did not handle logical object id references ([44f2883](https://github.com/nrkno/tv-automation-server-core/commit/44f2883)) -* **playout:** Infinite item continuations were not always updated correctly ([7a7aed6](https://github.com/nrkno/tv-automation-server-core/commit/7a7aed6)) -* **playout:** Objects being written out without an id ([b05a851](https://github.com/nrkno/tv-automation-server-core/commit/b05a851)) -* **playout:** Optimise layers of promises in infinite generation logic, and reorder function parameters ([e400c7c](https://github.com/nrkno/tv-automation-server-core/commit/e400c7c)) -* **playout:** R4 only partial merge of dc249a31b342e8bdbeb7faac064dd97cec15c3e8. Fix sl duration with autonext and no transitions ([17175c3](https://github.com/nrkno/tv-automation-server-core/commit/17175c3)) -* **playout:** Refactor setting object siId ([48de044](https://github.com/nrkno/tv-automation-server-core/commit/48de044)) -* **playout:** sl with autoNextOverlap not getting applied properly ([eb22967](https://github.com/nrkno/tv-automation-server-core/commit/eb22967)) -* **playout:** StatObj not being generated ([581d99d](https://github.com/nrkno/tv-automation-server-core/commit/581d99d)) -* **playout:** Typo in ID prefixing ([249b35d](https://github.com/nrkno/tv-automation-server-core/commit/249b35d)) -* **playout:** Use original sli id when adding infinite to the timeline, to ensure that any triggers on other objects resolve ([e7eb871](https://github.com/nrkno/tv-automation-server-core/commit/e7eb871)) -* **playout:** Use original sli id when adding infinite to the timeline, to ensure that any triggers on other objects resolve ([c0382ec](https://github.com/nrkno/tv-automation-server-core/commit/c0382ec)) -* **presenter screen:** display hours correctly ([e242a9e](https://github.com/nrkno/tv-automation-server-core/commit/e242a9e)) -* **presenter screen:** split background + text spacing ([9aad750](https://github.com/nrkno/tv-automation-server-core/commit/9aad750)) -* **rabbitmq:** send persistant messages ([ff8d375](https://github.com/nrkno/tv-automation-server-core/commit/ff8d375)) -* **record:** CR changes ([b3adbec](https://github.com/nrkno/tv-automation-server-core/commit/b3adbec)) -* **record:** Hide internal layer mappings ([24dfef1](https://github.com/nrkno/tv-automation-server-core/commit/24dfef1)) -* **refactor:** existing runningOrders were not migrated to the new data structure ([b20bc2d](https://github.com/nrkno/tv-automation-server-core/commit/b20bc2d)) -* **refactor:** remove stray debugger calls ([3be5c22](https://github.com/nrkno/tv-automation-server-core/commit/3be5c22)) -* use Range check instead of Version for minimumCoreVersion ([392c646](https://github.com/nrkno/tv-automation-server-core/commit/392c646)) -* **ro list:** translatify & hide 'Unsynced from MOS' label when no unsynced items ([fa56ecd](https://github.com/nrkno/tv-automation-server-core/commit/fa56ecd)) -* **ro list:** translatify & hide 'Unsynced from MOS' label when no unsynced items ([11b0f29](https://github.com/nrkno/tv-automation-server-core/commit/11b0f29)) -* **RO view:** Always persist original event in user-action methods ([6ba7df8](https://github.com/nrkno/tv-automation-server-core/commit/6ba7df8)) -* use admin as parameter instead of all ([20751b4](https://github.com/nrkno/tv-automation-server-core/commit/20751b4)) -* use DisplayName field for graphic elements ([e2e9014](https://github.com/nrkno/tv-automation-server-core/commit/e2e9014)) -* use floor for all positioning and sizing of segment lines ([8a84a7e](https://github.com/nrkno/tv-automation-server-core/commit/8a84a7e)) -* Use more consistent inputs in Blueprints page ([d223d11](https://github.com/nrkno/tv-automation-server-core/commit/d223d11)) -* wait for response from MOS device until resolving segmentLineItemSetInOutPoints ([2572a11](https://github.com/nrkno/tv-automation-server-core/commit/2572a11)) -* **vignett:** do not preload vignett, as it is risky business preloading sluttvignett. Could be done better by separating vignett and sluttvignett ([b0da067](https://github.com/nrkno/tv-automation-server-core/commit/b0da067)) -* Use new mediaPreviewsUrl setting ([1bd0ba4](https://github.com/nrkno/tv-automation-server-core/commit/1bd0ba4)) -* use parseRange for expected versions ([1604bea](https://github.com/nrkno/tv-automation-server-core/commit/1604bea)) -* use studioInstallationId of parent peripheralDevice ([7dedf9b](https://github.com/nrkno/tv-automation-server-core/commit/7dedf9b)) -* Use thin styling for a solo 'AUTO' label ([74b5f15](https://github.com/nrkno/tv-automation-server-core/commit/74b5f15)) -* Use thin styling for a solo 'AUTO' label ([0c26d38](https://github.com/nrkno/tv-automation-server-core/commit/0c26d38)) -* use unique id for baseline items cache entries ([cf89409](https://github.com/nrkno/tv-automation-server-core/commit/cf89409)) -* useractions: proper handling of the this keyword ([49a44a7](https://github.com/nrkno/tv-automation-server-core/commit/49a44a7)) -* useractions: proper handling of the this keyword ([a2686db](https://github.com/nrkno/tv-automation-server-core/commit/a2686db)) -* userActivity executionTime logging ([a3e763e](https://github.com/nrkno/tv-automation-server-core/commit/a3e763e)) -* Using object as notification message ([f06aee6](https://github.com/nrkno/tv-automation-server-core/commit/f06aee6)) -* various fixes after refactoring ([1a17414](https://github.com/nrkno/tv-automation-server-core/commit/1a17414)) -* various fixes for mocks ([aebcfc7](https://github.com/nrkno/tv-automation-server-core/commit/aebcfc7)) -* version handling ([4b9863a](https://github.com/nrkno/tv-automation-server-core/commit/4b9863a)) -* when (for some reason) the currently playing part is missing in db, it was impossible to continue. ([e3ba048](https://github.com/nrkno/tv-automation-server-core/commit/e3ba048)) -* when activating, set Next if not set ([c9f71a1](https://github.com/nrkno/tv-automation-server-core/commit/c9f71a1)) -* when overriding componentWillUnmount, we need to call this._cleanup() ([0f39cd4](https://github.com/nrkno/tv-automation-server-core/commit/0f39cd4)) -* when restoring a runningOrder, use the .active property of the database (or false) ([b5e5b05](https://github.com/nrkno/tv-automation-server-core/commit/b5e5b05)) -* wrap all MeteorReactComponent.autoruns in nonreactive. ([9020c96](https://github.com/nrkno/tv-automation-server-core/commit/9020c96)) -* wrap ntpClient.getNetworkTime() in try/catch, as an attempt to fix fatal error thrown ([cd44862](https://github.com/nrkno/tv-automation-server-core/commit/cd44862)) -* write back TimeBase when changing EditorialStart/Duration ([8012cea](https://github.com/nrkno/tv-automation-server-core/commit/8012cea)) -* **templates:** Fix incorrect camera number used with head transition. Hook in sluttvignett. Fix segments not respecting overlapduration if no transition is used ([00b7cdd](https://github.com/nrkno/tv-automation-server-core/commit/00b7cdd)) -* write back TimeBase with EditorialStart/Duration ([96f8e21](https://github.com/nrkno/tv-automation-server-core/commit/96f8e21)) -* **rundown layout:** don't display segment headers when currentSegemnt filter is on ([9b09858](https://github.com/nrkno/tv-automation-server-core/commit/9b09858)) -* **rundown layouts:** issue with layer type filtering ([c41bd5a](https://github.com/nrkno/tv-automation-server-core/commit/c41bd5a)) -* **RundownView:** don't wrap on system status header ([0daaa6a](https://github.com/nrkno/tv-automation-server-core/commit/0daaa6a)) -* **runtimeArgs:** Removing infinite items from changed sl and anything following ([28ffd5d](https://github.com/nrkno/tv-automation-server-core/commit/28ffd5d)) -* **snapshot:** SegmentLines were not being included in the snapshot ([d9a427e](https://github.com/nrkno/tv-automation-server-core/commit/d9a427e)) -* **snapshot:** SegmentLines were not being included in the snapshot ([224f806](https://github.com/nrkno/tv-automation-server-core/commit/224f806)) -* **sticky:** Fix sticky items with objects using relative triggers or durations ([0c47cff](https://github.com/nrkno/tv-automation-server-core/commit/0c47cff)) -* **template:** Caspar portion of in-transition for segmentline rerun whenever timeline was recalculated ([3373457](https://github.com/nrkno/tv-automation-server-core/commit/3373457)) -* **template:** graphic supers group using wrong trigger. ([e28d1ef](https://github.com/nrkno/tv-automation-server-core/commit/e28d1ef)) -* **template:** Reduce volume of head wipes ([b2092cc](https://github.com/nrkno/tv-automation-server-core/commit/b2092cc)) -* **template:** setup dsk properly ([2e8309c](https://github.com/nrkno/tv-automation-server-core/commit/2e8309c)) -* **templates:** use enum for nora channels ([55c0cfc](https://github.com/nrkno/tv-automation-server-core/commit/55c0cfc)) -* **templates:** Various tweaks ([eb93c6a](https://github.com/nrkno/tv-automation-server-core/commit/eb93c6a)) -* **Test:** Verifying build and deploy script ([0b13e18](https://github.com/nrkno/tv-automation-server-core/commit/0b13e18)) -* **timeline:** don't round items in relative mode ([2938819](https://github.com/nrkno/tv-automation-server-core/commit/2938819)) -* **timeline:** Infinite sli do not update properly on new mos data. Fix detection of the end of the chain, and ensure the last is set to not infinite ([16d9715](https://github.com/nrkno/tv-automation-server-core/commit/16d9715)) -* **timeline:** Infinite sli do not update properly on new mos data. Fix detection of the end of the chain, and ensure the last is set to not infinite ([61b2930](https://github.com/nrkno/tv-automation-server-core/commit/61b2930)) -* **Timeline:** Corrects the angle of the gradient indication mix-in-transition on a segmentLineItem ([151ecf9](https://github.com/nrkno/tv-automation-server-core/commit/151ecf9)) -* **transition:** Delay sli not contents, to ensure relative triggers against the sli are correct (fixes sluttvignett with transition) ([856da4b](https://github.com/nrkno/tv-automation-server-core/commit/856da4b)) -* **transition:** reverses direction of wipe transitions ([9961a3f](https://github.com/nrkno/tv-automation-server-core/commit/9961a3f)) -* **transition:** Using wrong overlap when combined with autonext ([4c56102](https://github.com/nrkno/tv-automation-server-core/commit/4c56102)) -* **transitions:** Ensure they are run with the correct overlap on autonext ([bbc6ca2](https://github.com/nrkno/tv-automation-server-core/commit/bbc6ca2)) -* **transitions:** Timed graphics being run wrong ([8b39960](https://github.com/nrkno/tv-automation-server-core/commit/8b39960)) -* **UI:** Improves device settings and status page by removing information ([267c10c](https://github.com/nrkno/tv-automation-server-core/commit/267c10c)) -* **unsync:** refactor, add method to unsync runningOrder ([d54c147](https://github.com/nrkno/tv-automation-server-core/commit/d54c147)) -* Wrong icon for split in presenter view ([1ec1c56](https://github.com/nrkno/tv-automation-server-core/commit/1ec1c56)) -* Wrong icon for split in presenter view ([08c8df8](https://github.com/nrkno/tv-automation-server-core/commit/08c8df8)) -* **vignett:** do not preload vignett, as it is risky business preloading sluttvignett. Could be done better by separating vignett and sluttvignett ([8bf7ff8](https://github.com/nrkno/tv-automation-server-core/commit/8bf7ff8)) -* **zoom:** moved zoom modifier for scroll action to ctrl ([863d81e](https://github.com/nrkno/tv-automation-server-core/commit/863d81e)) -* **zoom:** moved zoom modifier for scroll action to ctrl ([80829f2](https://github.com/nrkno/tv-automation-server-core/commit/80829f2)) - +- &nbps; in a string instead of A0 ([299ba28](https://github.com/nrkno/tv-automation-server-core/commit/299ba28)) +- a bug where DEFAULT_DISPLAY_DURATION would be added to a 0-duration member of a displayDurationGroup ([5f2ed62](https://github.com/nrkno/tv-automation-server-core/commit/5f2ed62)) +- a bug where DEFAULT_DISPLAY_DURATION would be added to a 0-duration member of a displayDurationGroup ([13f784d](https://github.com/nrkno/tv-automation-server-core/commit/13f784d)) +- accepted resolutions should not be separated by space. ([1b80a2c](https://github.com/nrkno/tv-automation-server-core/commit/1b80a2c)) +- activate past ROs ([c20af5d](https://github.com/nrkno/tv-automation-server-core/commit/c20af5d)) +- activate past ROs ([4b128a5](https://github.com/nrkno/tv-automation-server-core/commit/4b128a5)) +- add (preliminary) security rules for all collections ([6fd60e2](https://github.com/nrkno/tv-automation-server-core/commit/6fd60e2)) +- Add code documentation to the Notification Center ([ec03358](https://github.com/nrkno/tv-automation-server-core/commit/ec03358)) +- Add default exclusivity groups to InitDB ([dfd1782](https://github.com/nrkno/tv-automation-server-core/commit/dfd1782)) +- add dependency: timeline-state-resolver-types ([cd2db55](https://github.com/nrkno/tv-automation-server-core/commit/cd2db55)) +- Add exception handlers for timeline vizualiser page ([6bb56d8](https://github.com/nrkno/tv-automation-server-core/commit/6bb56d8)) +- Add exception handlers for timeline vizualiser page ([d9103dd](https://github.com/nrkno/tv-automation-server-core/commit/d9103dd)) +- Add migration to set type on existing blueprints ([f1b4f3c](https://github.com/nrkno/tv-automation-server-core/commit/f1b4f3c)) +- add missing translation json-file ([6059965](https://github.com/nrkno/tv-automation-server-core/commit/6059965)) +- add missing \_id ([c948d09](https://github.com/nrkno/tv-automation-server-core/commit/c948d09)) +- add missing \_id ([970fbf8](https://github.com/nrkno/tv-automation-server-core/commit/970fbf8)) +- Add missing \_rank field to SegmentLineAdLibItem ([9cd15fa](https://github.com/nrkno/tv-automation-server-core/commit/9cd15fa)) +- add missing $ne (not equal) in mongoWhere ([53c76a8](https://github.com/nrkno/tv-automation-server-core/commit/53c76a8)) +- add missing asRunEvent in AsRunEventContext ([b8def27](https://github.com/nrkno/tv-automation-server-core/commit/b8def27)) +- add missing core version ([8ad3a9e](https://github.com/nrkno/tv-automation-server-core/commit/8ad3a9e)) +- add missing function ([de2b81f](https://github.com/nrkno/tv-automation-server-core/commit/de2b81f)) +- Add missing layers to initdb. Use readtime as possible duration of segmentline when calculating story length ([e388d63](https://github.com/nrkno/tv-automation-server-core/commit/e388d63)) +- add missing parameter in callback ([fc4f690](https://github.com/nrkno/tv-automation-server-core/commit/fc4f690)) +- add new timeline visualizer ([9cad423](https://github.com/nrkno/tv-automation-server-core/commit/9cad423)) +- add new timeline visualizer ([f240aab](https://github.com/nrkno/tv-automation-server-core/commit/f240aab)) +- add nn translation to whitelist ([4663e3b](https://github.com/nrkno/tv-automation-server-core/commit/4663e3b)) +- add parseDateTime code hints to template editor ([c38b2f7](https://github.com/nrkno/tv-automation-server-core/commit/c38b2f7)) +- add postinstall script for Jest & Fibers to work ([2ad398d](https://github.com/nrkno/tv-automation-server-core/commit/2ad398d)) +- add shortcut ctrl+shift+enter-on-numpad to reload ([b9820ff](https://github.com/nrkno/tv-automation-server-core/commit/b9820ff)) +- add Studios migrations ([6e8f9f9](https://github.com/nrkno/tv-automation-server-core/commit/6e8f9f9)) +- added \_valid: true to mock-data ([6c2775b](https://github.com/nrkno/tv-automation-server-core/commit/6c2775b)) +- added a place to run updateExpectedMediaItems ([c70704d](https://github.com/nrkno/tv-automation-server-core/commit/c70704d)) +- added missing "force" parameter ([7b50a97](https://github.com/nrkno/tv-automation-server-core/commit/7b50a97)) +- added missing debug-logging setting ([8f616ca](https://github.com/nrkno/tv-automation-server-core/commit/8f616ca)) +- added missing getRank import ([9d37eb8](https://github.com/nrkno/tv-automation-server-core/commit/9d37eb8)) +- added MomentFromNow, to use instead of ([aefea31](https://github.com/nrkno/tv-automation-server-core/commit/aefea31)) +- added peripheralDevices subscription, used by status display ([ccb309d](https://github.com/nrkno/tv-automation-server-core/commit/ccb309d)) +- added sorting of runtimeFunctions when generating backup, so diffing works ([b3ba3f6](https://github.com/nrkno/tv-automation-server-core/commit/b3ba3f6)) +- added sorting of runtimeFunctions when generating backup, so diffing works ([17639a0](https://github.com/nrkno/tv-automation-server-core/commit/17639a0)) +- added virtual lines to the generated function, so that line numbers add up in error messages ([df2366a](https://github.com/nrkno/tv-automation-server-core/commit/df2366a)) +- adlib items conflict with programmed content ([a304238](https://github.com/nrkno/tv-automation-server-core/commit/a304238)) +- after broadcast form failed to saveEvaluation ([f55546b](https://github.com/nrkno/tv-automation-server-core/commit/f55546b)) +- allow duration 0 of segmentLines ([11a18ae](https://github.com/nrkno/tv-automation-server-core/commit/11a18ae)) +- allow esc & enter in modalDialog ([cd511b6](https://github.com/nrkno/tv-automation-server-core/commit/cd511b6)) +- allow re-sync of unsynced RO while it is active ([b824d72](https://github.com/nrkno/tv-automation-server-core/commit/b824d72)) +- allow removing peripheralDevices from Settings page ([948675f](https://github.com/nrkno/tv-automation-server-core/commit/948675f)) +- allow removing peripheralDevices from Settings page ([b14e56a](https://github.com/nrkno/tv-automation-server-core/commit/b14e56a)) +- allow timelineobjs to be declared as abstract, and always route those with the core_abstract layer ([9bfa6c4](https://github.com/nrkno/tv-automation-server-core/commit/9bfa6c4)) +- allow translating actions ([af4dc78](https://github.com/nrkno/tv-automation-server-core/commit/af4dc78)) +- Allow translations of media warnings, show clip as broken until scan finished ([b693de7](https://github.com/nrkno/tv-automation-server-core/commit/b693de7)) +- also defer sendStoryStatus, as that's not critical for playback ([9417862](https://github.com/nrkno/tv-automation-server-core/commit/9417862)) +- always rewind GUI on roReset, roResetAndActivate ([4502d90](https://github.com/nrkno/tv-automation-server-core/commit/4502d90)) +- always rewind GUI on roReset, roResetAndActivate ([11744c9](https://github.com/nrkno/tv-automation-server-core/commit/11744c9)) +- an issue where the state would be updated after the component was unmounted ([6ccf413](https://github.com/nrkno/tv-automation-server-core/commit/6ccf413)) +- anomaly timings as numbers ([d0c0d36](https://github.com/nrkno/tv-automation-server-core/commit/d0c0d36)) +- another bugfix ([c7ed208](https://github.com/nrkno/tv-automation-server-core/commit/c7ed208)) +- apning with no heads ([dfb1976](https://github.com/nrkno/tv-automation-server-core/commit/dfb1976)) +- apparently componentwillmount is running in a reactive context and causes issues ([a8e53b6](https://github.com/nrkno/tv-automation-server-core/commit/a8e53b6)) +- apply some fixes when restoring a RO ([b04bf53](https://github.com/nrkno/tv-automation-server-core/commit/b04bf53)) +- asRunLog: defer handleEvent, to make sure all events have been reported before running. ([6c56ec7](https://github.com/nrkno/tv-automation-server-core/commit/6c56ec7)) +- Assign ids for timeline object keyframes ([f56218a](https://github.com/nrkno/tv-automation-server-core/commit/f56218a)) +- Assign ids for timeline object keyframes ([2ce1318](https://github.com/nrkno/tv-automation-server-core/commit/2ce1318)) +- atem mappings ([8d4ea2d](https://github.com/nrkno/tv-automation-server-core/commit/8d4ea2d)) +- attach upload handler in RundownLayoutEditor ([c8feeb2](https://github.com/nrkno/tv-automation-server-core/commit/c8feeb2)) +- autoNext should update yellow line (it didn't) ([ff42a81](https://github.com/nrkno/tv-automation-server-core/commit/ff42a81)) +- backport timing changes for play-from-anywhere from R10 ([5d96b1e](https://github.com/nrkno/tv-automation-server-core/commit/5d96b1e)) +- baselineTemplates not being calculated correctly for showstyle ([e4799b4](https://github.com/nrkno/tv-automation-server-core/commit/e4799b4)) +- basic fiber test ([2419397](https://github.com/nrkno/tv-automation-server-core/commit/2419397)) +- Basic rundown playback ([3b88d2a](https://github.com/nrkno/tv-automation-server-core/commit/3b88d2a)) +- be able to reset & activate inactivated RO ([18e01f4](https://github.com/nrkno/tv-automation-server-core/commit/18e01f4)) +- be able to reset & activate inactivated RO ([e7d52da](https://github.com/nrkno/tv-automation-server-core/commit/e7d52da)) +- better debug message ([17e1b4e](https://github.com/nrkno/tv-automation-server-core/commit/17e1b4e)) +- better handling of template-errors ([9f98100](https://github.com/nrkno/tv-automation-server-core/commit/9f98100)) +- better implementation of push update to local objects ([d692c96](https://github.com/nrkno/tv-automation-server-core/commit/d692c96)) +- Better syncFunction loging for anonymous functions, or in a timeout ([3633e4a](https://github.com/nrkno/tv-automation-server-core/commit/3633e4a)) +- BIG optimization in roTake and affected functions, made database fetches async & parallel where possible. This should not affect the functionality, though testing is needed. ([aa6f4bd](https://github.com/nrkno/tv-automation-server-core/commit/aa6f4bd)) +- bind keydown for any keyup events to prevent their default behaviour ([83e42e4](https://github.com/nrkno/tv-automation-server-core/commit/83e42e4)) +- blueprint config from manifest is reenabled and used for show style base and variant ([59b2f2f](https://github.com/nrkno/tv-automation-server-core/commit/59b2f2f)) +- Blueprint selection input in studio settings ([fc80da1](https://github.com/nrkno/tv-automation-server-core/commit/fc80da1)) +- blueprint settings page ([5697afe](https://github.com/nrkno/tv-automation-server-core/commit/5697afe)) +- break long script better in hoverscrub ([5697493](https://github.com/nrkno/tv-automation-server-core/commit/5697493)) +- break long script better in hoverscrub ([2d2f26d](https://github.com/nrkno/tv-automation-server-core/commit/2d2f26d)) +- broken GUI SegmentLineItems resolution, when simulating timeline output ([60fb843](https://github.com/nrkno/tv-automation-server-core/commit/60fb843)) +- broken logging + message ([ffe4fb4](https://github.com/nrkno/tv-automation-server-core/commit/ffe4fb4)) +- broken settings page ([1e99ff7](https://github.com/nrkno/tv-automation-server-core/commit/1e99ff7)) +- broken tests ([aa71eda](https://github.com/nrkno/tv-automation-server-core/commit/aa71eda)) +- broken tests ([0e107bd](https://github.com/nrkno/tv-automation-server-core/commit/0e107bd)) +- broken tests ([b92a8a6](https://github.com/nrkno/tv-automation-server-core/commit/b92a8a6)) +- broken tests ([69a4472](https://github.com/nrkno/tv-automation-server-core/commit/69a4472)) +- broken timing on continued piece during HOLD ([8c0d81f](https://github.com/nrkno/tv-automation-server-core/commit/8c0d81f)) +- broken timing on continued piece during HOLD ([bbd7528](https://github.com/nrkno/tv-automation-server-core/commit/bbd7528)) +- bug in logic, migrations should run if there are any steps left ([87ec102](https://github.com/nrkno/tv-automation-server-core/commit/87ec102)) +- bug in popup: nora payload can be deep objects, causing ui crash ([30bfca9](https://github.com/nrkno/tv-automation-server-core/commit/30bfca9)) +- bug in storePath migration step ([b623973](https://github.com/nrkno/tv-automation-server-core/commit/b623973)) +- bug that caused unhandledPromiseRejection. Also added logging of result of user action ([e799277](https://github.com/nrkno/tv-automation-server-core/commit/e799277)) +- bug when moving story to last ([83cef62](https://github.com/nrkno/tv-automation-server-core/commit/83cef62)) +- bug when moving story to last ([2b86f1a](https://github.com/nrkno/tv-automation-server-core/commit/2b86f1a)) +- bugfix ([943ff72](https://github.com/nrkno/tv-automation-server-core/commit/943ff72)) +- bugfix, broke stuff when renaming ([22c4eb1](https://github.com/nrkno/tv-automation-server-core/commit/22c4eb1)) +- bugfix, some keys didn't work in text inputs ([36e99cb](https://github.com/nrkno/tv-automation-server-core/commit/36e99cb)) +- bugfix: changed property ([a7710ad](https://github.com/nrkno/tv-automation-server-core/commit/a7710ad)) +- bugfix: didn't correctly find the right segmentLineItem in next segmentLine ([0f9313f](https://github.com/nrkno/tv-automation-server-core/commit/0f9313f)) +- bugfix: executeFunction didn't really time out ([acba08c](https://github.com/nrkno/tv-automation-server-core/commit/acba08c)) +- bugfix: timeline wasn't updated when going rehersal => roResetAndActivate ([ca76732](https://github.com/nrkno/tv-automation-server-core/commit/ca76732)) +- bugfix: undefined storePath ([cbfdde5](https://github.com/nrkno/tv-automation-server-core/commit/cbfdde5)) +- bugfix: update local object when updating database ([9d3b05b](https://github.com/nrkno/tv-automation-server-core/commit/9d3b05b)) +- bugfix: updateExpectedMediaItems used all segmentLineItems in RO, not just in segmmentLine ([406829b](https://github.com/nrkno/tv-automation-server-core/commit/406829b)) +- bugfix: When updating collection, documents with removed properties didn't get their properties removed. ([237b8ff](https://github.com/nrkno/tv-automation-server-core/commit/237b8ff)) +- bugfix: When updating collection, documents with removed properties didn't get their properties removed. ([93dd81e](https://github.com/nrkno/tv-automation-server-core/commit/93dd81e)) +- build errors ([34889b9](https://github.com/nrkno/tv-automation-server-core/commit/34889b9)) +- build errors ([81382f7](https://github.com/nrkno/tv-automation-server-core/commit/81382f7)) +- bumps expected version ([bd06edc](https://github.com/nrkno/tv-automation-server-core/commit/bd06edc)) +- Call ShowStyleBlueprint.onTimelineGenerate when the timeline is being generated for any extra post-processing ([cd22af3](https://github.com/nrkno/tv-automation-server-core/commit/cd22af3)) +- catch scroll events properly in later Chrome versions. ([7396973](https://github.com/nrkno/tv-automation-server-core/commit/7396973)) +- change lawo enum & interface ([3959761](https://github.com/nrkno/tv-automation-server-core/commit/3959761)) +- change logging to info on device state change ([1cc9429](https://github.com/nrkno/tv-automation-server-core/commit/1cc9429)) +- changed backup sorting to use templateId instead of \_id ([d7047a5](https://github.com/nrkno/tv-automation-server-core/commit/d7047a5)) +- changed default chortcuts ([ba33bb7](https://github.com/nrkno/tv-automation-server-core/commit/ba33bb7)) +- changed from promise to not ([6261cdc](https://github.com/nrkno/tv-automation-server-core/commit/6261cdc)) +- changed header colors ([b9efc61](https://github.com/nrkno/tv-automation-server-core/commit/b9efc61)) +- changed how i18n is initialized & exported ([cc674aa](https://github.com/nrkno/tv-automation-server-core/commit/cc674aa)) +- Changed the color of the top bar during Rehearsal mode to something a little less hideous. ([1e887e3](https://github.com/nrkno/tv-automation-server-core/commit/1e887e3)) +- changed timeline ids to use both \_id (globally unnique) and id (unique within a studio) ([d637fb0](https://github.com/nrkno/tv-automation-server-core/commit/d637fb0)) +- changes attr. paths in lawo source objs ([55f8c7b](https://github.com/nrkno/tv-automation-server-core/commit/55f8c7b)) +- changes lawo mapping with the effects change ([dbe58fe](https://github.com/nrkno/tv-automation-server-core/commit/dbe58fe)) +- check blueprint during upload & return it ([29c0600](https://github.com/nrkno/tv-automation-server-core/commit/29c0600)) +- check category of rundown-ingest-device ([b4f95a7](https://github.com/nrkno/tv-automation-server-core/commit/b4f95a7)) +- check content.path before creating an ExpectedMediaItem ([0914e98](https://github.com/nrkno/tv-automation-server-core/commit/0914e98)) +- check if the component didn't get unmounted mid-call ([5cbfc58](https://github.com/nrkno/tv-automation-server-core/commit/5cbfc58)) +- check that blueprint type stays the same on upload ([c2e4c10](https://github.com/nrkno/tv-automation-server-core/commit/c2e4c10)) +- chore: clean up in peripheralDevice typings ([09c8f4a](https://github.com/nrkno/tv-automation-server-core/commit/09c8f4a)) +- circular imports caused mocks to go haywire. ([210e6a3](https://github.com/nrkno/tv-automation-server-core/commit/210e6a3)) +- circular imports caused mocks to go haywire. ([976b89d](https://github.com/nrkno/tv-automation-server-core/commit/976b89d)) +- clean up expectedMediaItems when removing RDs, also include a clean-up step in the migration for 0.25.0 ([e401741](https://github.com/nrkno/tv-automation-server-core/commit/e401741)) +- clean up imports in ROV ([58067a6](https://github.com/nrkno/tv-automation-server-core/commit/58067a6)) +- clean up more collections when removing RO ([b84ed59](https://github.com/nrkno/tv-automation-server-core/commit/b84ed59)) +- clean up onBeforeUnload handler ([51adbba](https://github.com/nrkno/tv-automation-server-core/commit/51adbba)) +- clear queued adlibs when resetting running order ([83ed11a](https://github.com/nrkno/tv-automation-server-core/commit/83ed11a)) +- clear runtimeArguments on resetRunningOrder ([350dd45](https://github.com/nrkno/tv-automation-server-core/commit/350dd45)) +- clip floating inspector values ([d4c7430](https://github.com/nrkno/tv-automation-server-core/commit/d4c7430)) +- collection name ([e014558](https://github.com/nrkno/tv-automation-server-core/commit/e014558)) +- comment out dropping the rundownBaselineObjs ([d7679aa](https://github.com/nrkno/tv-automation-server-core/commit/d7679aa)) +- Comment out some code that is currently unused ([070081d](https://github.com/nrkno/tv-automation-server-core/commit/070081d)) +- ConfigRef fix ([f557052](https://github.com/nrkno/tv-automation-server-core/commit/f557052)) +- copy retryUntil from blueprint to core message ([72546b6](https://github.com/nrkno/tv-automation-server-core/commit/72546b6)) +- correct handling of blueprint.minimumCoreVersion ([19b2130](https://github.com/nrkno/tv-automation-server-core/commit/19b2130)) +- correct names of some ingest api methods ([6a87c9b](https://github.com/nrkno/tv-automation-server-core/commit/6a87c9b)) +- Correct some TimelineObj typings ([eb36ef9](https://github.com/nrkno/tv-automation-server-core/commit/eb36ef9)) +- corrects the default baseline template ([bf4eb03](https://github.com/nrkno/tv-automation-server-core/commit/bf4eb03)) +- Creating blueprints in UI ([8419ecf](https://github.com/nrkno/tv-automation-server-core/commit/8419ecf)) +- Ctrl-S in template editor triggers a save ([bacbc3e](https://github.com/nrkno/tv-automation-server-core/commit/bacbc3e)) +- default duration for KAM in timing group ([adf63cb](https://github.com/nrkno/tv-automation-server-core/commit/adf63cb)) +- defer triggerExternalMessage so as not to block timelineUpdate's ([ba7383f](https://github.com/nrkno/tv-automation-server-core/commit/ba7383f)) +- delete & sync buttons in RO-list ([9fbc875](https://github.com/nrkno/tv-automation-server-core/commit/9fbc875)) +- detect and discard double as-run events ([98f65a2](https://github.com/nrkno/tv-automation-server-core/commit/98f65a2)) +- dev Collections bug, due to collections being filled in later ([43e8856](https://github.com/nrkno/tv-automation-server-core/commit/43e8856)) +- dev debug data function ([e4570e2](https://github.com/nrkno/tv-automation-server-core/commit/e4570e2)) +- device is first created as Abstract ([98dca79](https://github.com/nrkno/tv-automation-server-core/commit/98dca79)) +- device status notifications ([7ab4a4c](https://github.com/nrkno/tv-automation-server-core/commit/7ab4a4c)) +- disable client-side RO updates ([72ba831](https://github.com/nrkno/tv-automation-server-core/commit/72ba831)) +- disable fullscreen overlay in developer mode ([7cc2e43](https://github.com/nrkno/tv-automation-server-core/commit/7cc2e43)) +- disable runtimeFunction caching during code-test & save ([74d6d34](https://github.com/nrkno/tv-automation-server-core/commit/74d6d34)) +- disable runtimeFunction caching during code-test & save ([e21f8dd](https://github.com/nrkno/tv-automation-server-core/commit/e21f8dd)) +- do full rundown update when recieve rundown metadata ([11ae325](https://github.com/nrkno/tv-automation-server-core/commit/11ae325)) +- Do not allow queue ad lib during hold mode ([c378fc8](https://github.com/nrkno/tv-automation-server-core/commit/c378fc8)) +- do not allow toggling sl arguments during hold mode ([3311f0a](https://github.com/nrkno/tv-automation-server-core/commit/3311f0a)) +- do not display notification count if = 0 ([1fe9a39](https://github.com/nrkno/tv-automation-server-core/commit/1fe9a39)) +- do not error CountdownItemLabel when sourceLayer is not found ([9451d1c](https://github.com/nrkno/tv-automation-server-core/commit/9451d1c)) +- do not refresh RO notifications if RO/showStyleBase/studioInstallation changes ([5702939](https://github.com/nrkno/tv-automation-server-core/commit/5702939)) +- do not show empty string values in L3rd popup ([b0c6c8e](https://github.com/nrkno/tv-automation-server-core/commit/b0c6c8e)) +- Don't remove enable.duration when setting enable.start to an absolute time instead of now for pieces ([991f2ba](https://github.com/nrkno/tv-automation-server-core/commit/991f2ba)) +- don't send devicesMakeReady until verified no other runningOrders are active ([953a1a7](https://github.com/nrkno/tv-automation-server-core/commit/953a1a7)) +- don't update device name if already got one ([833196a](https://github.com/nrkno/tv-automation-server-core/commit/833196a)) +- don't wait for subscriptions before rendering ([2bbfa20](https://github.com/nrkno/tv-automation-server-core/commit/2bbfa20)) +- Dont generate ui outputlayers for sli which are virtual ([c0ad368](https://github.com/nrkno/tv-automation-server-core/commit/c0ad368)) +- dont set nora\_\* config values in initDB ([1330008](https://github.com/nrkno/tv-automation-server-core/commit/1330008)) +- Dont show unset optional config in the config list ([5689865](https://github.com/nrkno/tv-automation-server-core/commit/5689865)) +- duration settling ([0648f57](https://github.com/nrkno/tv-automation-server-core/commit/0648f57)) +- Editattribute type typing ([1206d0c](https://github.com/nrkno/tv-automation-server-core/commit/1206d0c)) +- Editattribute type typing ([392f4aa](https://github.com/nrkno/tv-automation-server-core/commit/392f4aa)) +- EditAttribute: dropdown options was always strings ([814cdf7](https://github.com/nrkno/tv-automation-server-core/commit/814cdf7)) +- End of Show marker line doesn't end where it should ([e188c97](https://github.com/nrkno/tv-automation-server-core/commit/e188c97)) +- enforce workflow data structure ([d01245f](https://github.com/nrkno/tv-automation-server-core/commit/d01245f)) +- Ensure lookahead ids are always unique ([26f6637](https://github.com/nrkno/tv-automation-server-core/commit/26f6637)) +- Ensure PeripheralDevice.executeFunction doesnt timeout during callback execution ([087a6f8](https://github.com/nrkno/tv-automation-server-core/commit/087a6f8)) +- ensure that mediaFlowId and studioId are both indices ([5744ff3](https://github.com/nrkno/tv-automation-server-core/commit/5744ff3)) +- ensure that the connection notification is always on top ([662cd7a](https://github.com/nrkno/tv-automation-server-core/commit/662cd7a)) +- ensure that VideoEditMonitor is comfortably scrubbable at any window width ([ece3dfb](https://github.com/nrkno/tv-automation-server-core/commit/ece3dfb)) +- ensure that VideoEditMonitor is comfortably scrubbable at any window width ([a5e882a](https://github.com/nrkno/tv-automation-server-core/commit/a5e882a)) +- ensure the same overlap is used for autonext and the previous sl ([efb39e6](https://github.com/nrkno/tv-automation-server-core/commit/efb39e6)) +- Ensure the sl overlapDuration is respected on autonext. ([8c3bf3e](https://github.com/nrkno/tv-automation-server-core/commit/8c3bf3e)) +- Ensure typeVariant on SegmentLine is preserved when a roList is received ([98b224c](https://github.com/nrkno/tv-automation-server-core/commit/98b224c)) +- error in GUI (devices was added twice to list) ([80c4128](https://github.com/nrkno/tv-automation-server-core/commit/80c4128)) +- error when content.boxSourceConfiguration is undefined ([fc7ec40](https://github.com/nrkno/tv-automation-server-core/commit/fc7ec40)) +- error when content.boxSourceConfiguration is undefined ([81c896b](https://github.com/nrkno/tv-automation-server-core/commit/81c896b)) +- expectedMediaItems should work again ([a3bb4e9](https://github.com/nrkno/tv-automation-server-core/commit/a3bb4e9)) +- expectedMediaItems should work again ([f33467d](https://github.com/nrkno/tv-automation-server-core/commit/f33467d)) +- expectedMediaItems: make ids uniquer ([e16594a](https://github.com/nrkno/tv-automation-server-core/commit/e16594a)) +- externalMessage: priority of messages to send ([cffcd97](https://github.com/nrkno/tv-automation-server-core/commit/cffcd97)) +- externalMessage: update status on removed document ([75a1053](https://github.com/nrkno/tv-automation-server-core/commit/75a1053)) +- externalMessageQueue id ([5c8c39d](https://github.com/nrkno/tv-automation-server-core/commit/5c8c39d)) +- externalMessages upd ([a803882](https://github.com/nrkno/tv-automation-server-core/commit/a803882)) +- failing on startup if dp property missing ([041fc3e](https://github.com/nrkno/tv-automation-server-core/commit/041fc3e)) +- fetch from collections in EMI API ([73a3bd1](https://github.com/nrkno/tv-automation-server-core/commit/73a3bd1)) +- filter on json files on restore backup file selector ([1a0b867](https://github.com/nrkno/tv-automation-server-core/commit/1a0b867)) +- First pass of implementing mosRoFullStory and mosRoStoryDelete ([47602d1](https://github.com/nrkno/tv-automation-server-core/commit/47602d1)) +- fix a missing colon ([9f2aab9](https://github.com/nrkno/tv-automation-server-core/commit/9f2aab9)) +- fix according to updated interface ([e372a66](https://github.com/nrkno/tv-automation-server-core/commit/e372a66)) +- fix an issue where some of the snapshot restores would not be recognized as JSON ([57d31bc](https://github.com/nrkno/tv-automation-server-core/commit/57d31bc)) +- fix an issue where the message for clip ingested would be "null, Clip is being ingested" ([7ac5672](https://github.com/nrkno/tv-automation-server-core/commit/7ac5672)) +- fix an issue with overlapping labels on pieces when an infinite item was cropped by another item at 0 point. ([7599f64](https://github.com/nrkno/tv-automation-server-core/commit/7599f64)) +- fix an issue with scene, black and freeze information only showing up after a hover ([3505514](https://github.com/nrkno/tv-automation-server-core/commit/3505514)) +- Fix broken syncFunction and infinite loop in afterRemoveParts. Add test for rundownSyncFunction ([95ec0cc](https://github.com/nrkno/tv-automation-server-core/commit/95ec0cc)) +- Fix context.runHelper not working in templates. ([36ca5f3](https://github.com/nrkno/tv-automation-server-core/commit/36ca5f3)) +- Fix device status notifications ([b9f274e](https://github.com/nrkno/tv-automation-server-core/commit/b9f274e)) +- fix expectVersion ([afeaa74](https://github.com/nrkno/tv-automation-server-core/commit/afeaa74)) +- fix for strange (temporary?) error about method missing ([0db30ae](https://github.com/nrkno/tv-automation-server-core/commit/0db30ae)) +- fix mocks ([3d64f0c](https://github.com/nrkno/tv-automation-server-core/commit/3d64f0c)) +- fix more typings and add some null checks in unusual places ([d0c53c3](https://github.com/nrkno/tv-automation-server-core/commit/d0c53c3)) +- fix MOS status indicators in RO header ([c0724cc](https://github.com/nrkno/tv-automation-server-core/commit/c0724cc)) +- fix notifications toggle button cursor ([402486b](https://github.com/nrkno/tv-automation-server-core/commit/402486b)) +- fix notifications toggle button cursor ([b0d8dcb](https://github.com/nrkno/tv-automation-server-core/commit/b0d8dcb)) +- fix PTZ Testing harness ([97bccc7](https://github.com/nrkno/tv-automation-server-core/commit/97bccc7)) +- Fix regenerateRundown when not sourced from mos ([292d6c5](https://github.com/nrkno/tv-automation-server-core/commit/292d6c5)) +- Fix regenerateRundown when not sourced from mos ([3f0191d](https://github.com/nrkno/tv-automation-server-core/commit/3f0191d)) +- fix Segment Line notifications ([3753250](https://github.com/nrkno/tv-automation-server-core/commit/3753250)) +- fix set offset working from UI ([91bc80d](https://github.com/nrkno/tv-automation-server-core/commit/91bc80d)) +- fix some subscriptions and naming ([3696183](https://github.com/nrkno/tv-automation-server-core/commit/3696183)) +- Fix some unstable tests ([c521b76](https://github.com/nrkno/tv-automation-server-core/commit/c521b76)) +- fix typings to match with the stronger typings ([ae1bd4f](https://github.com/nrkno/tv-automation-server-core/commit/ae1bd4f)) +- fix zoom area height ([24d2e38](https://github.com/nrkno/tv-automation-server-core/commit/24d2e38)) +- fixes ([2fc3802](https://github.com/nrkno/tv-automation-server-core/commit/2fc3802)) +- force lookahead inGroup field to be emptied. Fixes mismatched statobj ([c76209c](https://github.com/nrkno/tv-automation-server-core/commit/c76209c)) +- freeze/black in begin/end of mediafile gets special warning ([ea950e2](https://github.com/nrkno/tv-automation-server-core/commit/ea950e2)) +- generate statObject per device ([82a0736](https://github.com/nrkno/tv-automation-server-core/commit/82a0736)) +- Get some playout working ([161fca3](https://github.com/nrkno/tv-automation-server-core/commit/161fca3)) +- getHash undefined exception in asRunLog ([8faab78](https://github.com/nrkno/tv-automation-server-core/commit/8faab78)) +- getSnapshot: don't ask devices of type OTHER ([ea874d4](https://github.com/nrkno/tv-automation-server-core/commit/ea874d4)) +- getting monaco to work runtime while still having typings ([5db8218](https://github.com/nrkno/tv-automation-server-core/commit/5db8218)) +- global ad-lib order was wrong, basline blueprint did not set \_rank ([ffbacc8](https://github.com/nrkno/tv-automation-server-core/commit/ffbacc8)) +- Guard against there being no next segmentline ([849d97f](https://github.com/nrkno/tv-automation-server-core/commit/849d97f)) +- GUI externalMessages json formatting ([0b7cd2c](https://github.com/nrkno/tv-automation-server-core/commit/0b7cd2c)) +- GUI: new try on rewinding the viewport on RO reset ([b0edaf4](https://github.com/nrkno/tv-automation-server-core/commit/b0edaf4)) +- GUI: round number of frames ([c90021f](https://github.com/nrkno/tv-automation-server-core/commit/c90021f)) +- GUI: settings: only show parent-devices in left menu (only they have settings on them) ([ecb164e](https://github.com/nrkno/tv-automation-server-core/commit/ecb164e)) +- GUI: unexpected behaviour in blueprint configuration ([f5bed4e](https://github.com/nrkno/tv-automation-server-core/commit/f5bed4e)) +- handle both update & insert of runningOrder ([3701bb3](https://github.com/nrkno/tv-automation-server-core/commit/3701bb3)) +- handle both update & insert of runningOrder ([84a6c53](https://github.com/nrkno/tv-automation-server-core/commit/84a6c53)) +- handle promises correctly.. ([2e57296](https://github.com/nrkno/tv-automation-server-core/commit/2e57296)) +- handle promises correctly.. ([b952e1d](https://github.com/nrkno/tv-automation-server-core/commit/b952e1d)) +- handle take situation better when having invalid segmentLines ([dacd3b0](https://github.com/nrkno/tv-automation-server-core/commit/dacd3b0)) +- handle when error is thrown in function in makePromise ([c287727](https://github.com/nrkno/tv-automation-server-core/commit/c287727)) +- handle when error is thrown in function in makePromise ([b7094dd](https://github.com/nrkno/tv-automation-server-core/commit/b7094dd)) +- handle when nexting before start or after end ([506bb8a](https://github.com/nrkno/tv-automation-server-core/commit/506bb8a)) +- has played styling shouldn't be applied to Guest and Remote segments ([18bdc82](https://github.com/nrkno/tv-automation-server-core/commit/18bdc82)) +- have both a cirtuclar button and a 'branch' to the panel ([1fa3cf9](https://github.com/nrkno/tv-automation-server-core/commit/1fa3cf9)) +- head mute audio and hold on last frame ([ceec7f6](https://github.com/nrkno/tv-automation-server-core/commit/ceec7f6)) +- header context menu z-order fix ([c68244b](https://github.com/nrkno/tv-automation-server-core/commit/c68244b)) +- hide "Restart playout" from support panel when not in studio mode ([34ba937](https://github.com/nrkno/tv-automation-server-core/commit/34ba937)) +- hide "Restart playout" from support panel when not in studio mode ([5820b00](https://github.com/nrkno/tv-automation-server-core/commit/5820b00)) +- Hide child devices from being added to the studio ([852ec9b](https://github.com/nrkno/tv-automation-server-core/commit/852ec9b)) +- Hide Keyboard focus marker when not in studio mode ([70dc6b0](https://github.com/nrkno/tv-automation-server-core/commit/70dc6b0)) +- HOLD add new llayer to initDB ([650b6e6](https://github.com/nrkno/tv-automation-server-core/commit/650b6e6)) +- hold-copy of the SLI should provide seek information to offset markers on the SLI ([3967d03](https://github.com/nrkno/tv-automation-server-core/commit/3967d03)) +- holdState = 0 displayed a status ([aacd140](https://github.com/nrkno/tv-automation-server-core/commit/aacd140)) +- holdState = 0 displayed a status ([49c7ead](https://github.com/nrkno/tv-automation-server-core/commit/49c7ead)) +- hot fix for rehearsal activation when an RO is already active ([648c02d](https://github.com/nrkno/tv-automation-server-core/commit/648c02d)) +- houskeeping: remove uneccessary logs ([0c054f9](https://github.com/nrkno/tv-automation-server-core/commit/0c054f9)) +- if the next:ed segment is removed, instead next the one in its place ([22597b3](https://github.com/nrkno/tv-automation-server-core/commit/22597b3)) +- ignore custom dependencies ([b9db526](https://github.com/nrkno/tv-automation-server-core/commit/b9db526)) +- implement Play from here ([bd79569](https://github.com/nrkno/tv-automation-server-core/commit/bd79569)) +- implement Play from here ([0dce2af](https://github.com/nrkno/tv-automation-server-core/commit/0dce2af)) +- Implement rerunning blueprints on resetPart if dirty ([b942323](https://github.com/nrkno/tv-automation-server-core/commit/b942323)) +- Importing of some mock running orders ([eadf225](https://github.com/nrkno/tv-automation-server-core/commit/eadf225)) +- improve elements in AdLibListItem ([e917c43](https://github.com/nrkno/tv-automation-server-core/commit/e917c43)) +- improve evaluation form visuals ([30af081](https://github.com/nrkno/tv-automation-server-core/commit/30af081)) +- Improve group label visuals ([39b43e1](https://github.com/nrkno/tv-automation-server-core/commit/39b43e1)) +- Improve missing mosId error message ([89695fb](https://github.com/nrkno/tv-automation-server-core/commit/89695fb)) +- improve notification center button ([0b4d082](https://github.com/nrkno/tv-automation-server-core/commit/0b4d082)) +- improve notifications highlighting animation ([afeb568](https://github.com/nrkno/tv-automation-server-core/commit/afeb568)) +- improve notifications highlighting animation ([abda2c3](https://github.com/nrkno/tv-automation-server-core/commit/abda2c3)) +- improve some error logging ([60af59b](https://github.com/nrkno/tv-automation-server-core/commit/60af59b)) +- improve status bar panel buttons look when panels open ([247c8ee](https://github.com/nrkno/tv-automation-server-core/commit/247c8ee)) +- Improve the segment diff logic ([1465890](https://github.com/nrkno/tv-automation-server-core/commit/1465890)) +- improve typings for Notification messages ([bed664b](https://github.com/nrkno/tv-automation-server-core/commit/bed664b)) +- improve uncaughtErrorHandler ([fa744f4](https://github.com/nrkno/tv-automation-server-core/commit/fa744f4)) +- improved queries & added index ([159f6d5](https://github.com/nrkno/tv-automation-server-core/commit/159f6d5)) +- Include rundown baseline in snapshots ([96fedcb](https://github.com/nrkno/tv-automation-server-core/commit/96fedcb)) +- incorrect typings for template editor ([9d021df](https://github.com/nrkno/tv-automation-server-core/commit/9d021df)) +- Increase size of template editor to make it better fill the screen ([3212d7b](https://github.com/nrkno/tv-automation-server-core/commit/3212d7b)) +- increase upload limit for backup files ([e658f12](https://github.com/nrkno/tv-automation-server-core/commit/e658f12)) +- increase upload limit for backup files ([5effaa9](https://github.com/nrkno/tv-automation-server-core/commit/5effaa9)) +- Infinite items dont stop against a absolute 0 item properly. ([78c1499](https://github.com/nrkno/tv-automation-server-core/commit/78c1499)) +- infinite segment line tidying and fixes ([8469ffb](https://github.com/nrkno/tv-automation-server-core/commit/8469ffb)) +- Infinite segmentline bad guard when calculating the current infinites that caused the process to stop early ([2f9abeb](https://github.com/nrkno/tv-automation-server-core/commit/2f9abeb)) +- infinite segmentlines crossing an autonext throwing a duplicate key exception ([93b2a30](https://github.com/nrkno/tv-automation-server-core/commit/93b2a30)) +- inGroup property of timeline objects should be id, not \_id ([35b34c5](https://github.com/nrkno/tv-automation-server-core/commit/35b34c5)) +- init state properly ([2572cdc](https://github.com/nrkno/tv-automation-server-core/commit/2572cdc)) +- initDB for pharos lights ([57fbc73](https://github.com/nrkno/tv-automation-server-core/commit/57fbc73)) +- initial optimization of updateSourceLayerInfinitesAfterLine ([5cd8235](https://github.com/nrkno/tv-automation-server-core/commit/5cd8235)) +- initial optimization of updateSourceLayerInfinitesAfterLine ([871bdd2](https://github.com/nrkno/tv-automation-server-core/commit/871bdd2)) +- initiateDB update for PTZ ([e529782](https://github.com/nrkno/tv-automation-server-core/commit/e529782)) +- Invalid ids in PeripheralDeviceCommand responses. Not using cached ingest data when reloadingRundown. Adds tests for reloadingRundown ([cb59bbc](https://github.com/nrkno/tv-automation-server-core/commit/cb59bbc)) +- isClientResponseSuccess returned wrong values ([ce0b44e](https://github.com/nrkno/tv-automation-server-core/commit/ce0b44e)) +- Issue with duplicate ids ([ed27041](https://github.com/nrkno/tv-automation-server-core/commit/ed27041)) +- issue with rehearsal double-activation warning ([17b4e95](https://github.com/nrkno/tv-automation-server-core/commit/17b4e95)) +- issue with roPrepareForBroadcast ([c3ad30c](https://github.com/nrkno/tv-automation-server-core/commit/c3ad30c)) +- issue with segment context menu ([7a44deb](https://github.com/nrkno/tv-automation-server-core/commit/7a44deb)) +- issue with source layers marked as used even though they were used in the following segmentLine ([71acfb3](https://github.com/nrkno/tv-automation-server-core/commit/71acfb3)) +- issues with timelineTriggerTime ([0459729](https://github.com/nrkno/tv-automation-server-core/commit/0459729)) +- jest config ([e53663c](https://github.com/nrkno/tv-automation-server-core/commit/e53663c)) +- JSDoc-ify existing comments ([6825f00](https://github.com/nrkno/tv-automation-server-core/commit/6825f00)) +- JSX props typings fix in Header ([7596557](https://github.com/nrkno/tv-automation-server-core/commit/7596557)) +- keep device header in Mos parent properties settings ([2f2529d](https://github.com/nrkno/tv-automation-server-core/commit/2f2529d)) +- keep device header in Mos parent properties settings ([4ff9b91](https://github.com/nrkno/tv-automation-server-core/commit/4ff9b91)) +- Keep the devices header visible when editing device ([cb2d7d9](https://github.com/nrkno/tv-automation-server-core/commit/cb2d7d9)) +- Keep the devices header visible when editing device ([90dbe05](https://github.com/nrkno/tv-automation-server-core/commit/90dbe05)) +- keys should be handled at up, not down ([957f583](https://github.com/nrkno/tv-automation-server-core/commit/957f583)) +- label on Play From here in SegmentContextMenu ([8bfa631](https://github.com/nrkno/tv-automation-server-core/commit/8bfa631)) +- labels in modal dialogs ([3af18fc](https://github.com/nrkno/tv-automation-server-core/commit/3af18fc)) +- limit db fetches to active running order ([f3aca8f](https://github.com/nrkno/tv-automation-server-core/commit/f3aca8f)) +- lock down package.json & update package-lock, to get release2 to build ([472f8ab](https://github.com/nrkno/tv-automation-server-core/commit/472f8ab)) +- locked [@babel](https://github.com/babel)/runtime version & updated package-lock ([8e62d2f](https://github.com/nrkno/tv-automation-server-core/commit/8e62d2f)) +- Log unresolved ids when resolving pieces ([28691c6](https://github.com/nrkno/tv-automation-server-core/commit/28691c6)) +- logics bugfix after optimization ([fe85cd3](https://github.com/nrkno/tv-automation-server-core/commit/fe85cd3)) +- logics bugfix after optimization ([2b8fa3c](https://github.com/nrkno/tv-automation-server-core/commit/2b8fa3c)) +- lookahead object id not being set correctly ([594a1e7](https://github.com/nrkno/tv-automation-server-core/commit/594a1e7)) +- made editor height dynamic ([c68ac4f](https://github.com/nrkno/tv-automation-server-core/commit/c68ac4f)) +- made editor height dynamic ([7f5f40e](https://github.com/nrkno/tv-automation-server-core/commit/7f5f40e)) +- Made sure that the typography update for the prompter has a font fallback. ([6f2b20a](https://github.com/nrkno/tv-automation-server-core/commit/6f2b20a)) +- Major refactoring, splitting code into separate files depending on their areas: "rundown": General rundown manipulation, "media-scanner": Media-scanner, "mos": mos-specific functions ([db82375](https://github.com/nrkno/tv-automation-server-core/commit/db82375)) +- make 'Lights' source layer type translatable in the Settings ([65d5b76](https://github.com/nrkno/tv-automation-server-core/commit/65d5b76)) +- make most of the UI actually run ([45941d5](https://github.com/nrkno/tv-automation-server-core/commit/45941d5)) +- make RundownTiming reuse objects to limit the amount of GC done ([6e04daf](https://github.com/nrkno/tv-automation-server-core/commit/6e04daf)) +- make segmentLine.invalid optional ([c179e3c](https://github.com/nrkno/tv-automation-server-core/commit/c179e3c)) +- make sure that expectedMediaItems are purged along with the RO ([0d9dda1](https://github.com/nrkno/tv-automation-server-core/commit/0d9dda1)) +- make sure that the adlib shelf isn't obstructed by the right-hand bar ([8783819](https://github.com/nrkno/tv-automation-server-core/commit/8783819)) +- make sure that the OnAir line connects to the label ([3788672](https://github.com/nrkno/tv-automation-server-core/commit/3788672)) +- make the context menu available in the entire header ([0590f9d](https://github.com/nrkno/tv-automation-server-core/commit/0590f9d)) +- make the FullScreen detection more lenient ([215d73c](https://github.com/nrkno/tv-automation-server-core/commit/215d73c)) +- make the FullScreen detection more lenient ([28b689a](https://github.com/nrkno/tv-automation-server-core/commit/28b689a)) +- Make the head to kam wipe not use the mosartVariant field. Correct the head order checking ([6030755](https://github.com/nrkno/tv-automation-server-core/commit/6030755)) +- media-manager: rename keyStep => criticalStep ([77f4d6a](https://github.com/nrkno/tv-automation-server-core/commit/77f4d6a)) +- mediainfo typings & timebase ([67f16be](https://github.com/nrkno/tv-automation-server-core/commit/67f16be)) +- mediaobjects to use computed field ([39d13b5](https://github.com/nrkno/tv-automation-server-core/commit/39d13b5)) +- mediaobjects to use computed field ([dba858f](https://github.com/nrkno/tv-automation-server-core/commit/dba858f)) +- message came twice, wrong index for signature ([64aeafb](https://github.com/nrkno/tv-automation-server-core/commit/64aeafb)) +- Meteor mock ([dec64db](https://github.com/nrkno/tv-automation-server-core/commit/dec64db)) +- meteor mock error ([f005291](https://github.com/nrkno/tv-automation-server-core/commit/f005291)) +- Migration for stk&full audio remapping ([2491f52](https://github.com/nrkno/tv-automation-server-core/commit/2491f52)) +- migration helpers ([40228e8](https://github.com/nrkno/tv-automation-server-core/commit/40228e8)) +- Migration UI fixes ([b141243](https://github.com/nrkno/tv-automation-server-core/commit/b141243)) +- Migrations internal server error ([45d0238](https://github.com/nrkno/tv-automation-server-core/commit/45d0238)) +- minor ui fix on status page ([97fc3c2](https://github.com/nrkno/tv-automation-server-core/commit/97fc3c2)) +- miss in merge ([93106b1](https://github.com/nrkno/tv-automation-server-core/commit/93106b1)) +- missed line ([4f635b9](https://github.com/nrkno/tv-automation-server-core/commit/4f635b9)) +- missing argument for mediaStatusCheck ([658e82a](https://github.com/nrkno/tv-automation-server-core/commit/658e82a)) +- missing key property ([79fb3e6](https://github.com/nrkno/tv-automation-server-core/commit/79fb3e6)) +- missing sass import ([f1f10ff](https://github.com/nrkno/tv-automation-server-core/commit/f1f10ff)) +- Missing typings on ShowStyle ([a0a4e14](https://github.com/nrkno/tv-automation-server-core/commit/a0a4e14)) +- Mix transitions ([0ebf3e1](https://github.com/nrkno/tv-automation-server-core/commit/0ebf3e1)) +- Mix transitions ([5cf2314](https://github.com/nrkno/tv-automation-server-core/commit/5cf2314)) +- Mock Collection object ([a6976fa](https://github.com/nrkno/tv-automation-server-core/commit/a6976fa)) +- mode logging method, to avoid circular dependency ([4d55286](https://github.com/nrkno/tv-automation-server-core/commit/4d55286)) +- modified timestamp on imported blueprints was not being set, causing the cache to not be cleared properly ([2f3fd17](https://github.com/nrkno/tv-automation-server-core/commit/2f3fd17)) +- monaco typing error fix ([e73467e](https://github.com/nrkno/tv-automation-server-core/commit/e73467e)) +- more CSS fixes due to switching to buttons ([f3a939f](https://github.com/nrkno/tv-automation-server-core/commit/f3a939f)) +- more fixes for MOS status indicator in header ([97311b1](https://github.com/nrkno/tv-automation-server-core/commit/97311b1)) +- more optimizations ([df8c397](https://github.com/nrkno/tv-automation-server-core/commit/df8c397)) +- more performance subscription based on studioId and rundownId ([e1b8d77](https://github.com/nrkno/tv-automation-server-core/commit/e1b8d77)) +- more refactoring of the styles ([f5af269](https://github.com/nrkno/tv-automation-server-core/commit/f5af269)) +- MOS ingest fixes and tests ([233c523](https://github.com/nrkno/tv-automation-server-core/commit/233c523)) +- mos-gateway external functions names ([a3497df](https://github.com/nrkno/tv-automation-server-core/commit/a3497df)) +- move all segment notes away from header, show only summary, clickable summary ([aee3d01](https://github.com/nrkno/tv-automation-server-core/commit/aee3d01)) +- move all segment notes away from header, show only summary, clickable summary ([d0a4801](https://github.com/nrkno/tv-automation-server-core/commit/d0a4801)) +- move back executeFunction to peripheralDeviceAPI ([226289f](https://github.com/nrkno/tv-automation-server-core/commit/226289f)) +- move notifications pop-ups when NC is open ([d6ce260](https://github.com/nrkno/tv-automation-server-core/commit/d6ce260)) +- move notifications pop-ups when NC is open ([6f7759f](https://github.com/nrkno/tv-automation-server-core/commit/6f7759f)) +- Move remaining mos types into ingest/mosDevice ([904b3cb](https://github.com/nrkno/tv-automation-server-core/commit/904b3cb)) +- move wrapMethods, to avoid circular import ([df41959](https://github.com/nrkno/tv-automation-server-core/commit/df41959)) +- multiply inPoint/duration by timeBase before sending back to MOS ([b576f26](https://github.com/nrkno/tv-automation-server-core/commit/b576f26)) +- multiply inPoint/duration by timebase before storing to MOS ([d01b8d9](https://github.com/nrkno/tv-automation-server-core/commit/d01b8d9)) +- new implementation of runtime caching ([92e09be](https://github.com/nrkno/tv-automation-server-core/commit/92e09be)) +- new implementation of runtime caching ([767fbb7](https://github.com/nrkno/tv-automation-server-core/commit/767fbb7)) +- new lawo source mappings ([20f7d5a](https://github.com/nrkno/tv-automation-server-core/commit/20f7d5a)) +- next part not updating properly from ingest data changes ([1486e65](https://github.com/nrkno/tv-automation-server-core/commit/1486e65)) +- non-persistent pop-ups should be prioritized over persistent ones ([99f147a](https://github.com/nrkno/tv-automation-server-core/commit/99f147a)) +- normalize naming scheme to 'runtimeArguments', normalize hotkey labels ([528679d](https://github.com/nrkno/tv-automation-server-core/commit/528679d)) +- not able to run migration on empty database (to bump system version) ([f65fcfe](https://github.com/nrkno/tv-automation-server-core/commit/f65fcfe)) +- note type got lost ([863e49d](https://github.com/nrkno/tv-automation-server-core/commit/863e49d)) +- notification center panel shadow ([1010dda](https://github.com/nrkno/tv-automation-server-core/commit/1010dda)) +- Notification Center width calculations ([fa31d65](https://github.com/nrkno/tv-automation-server-core/commit/fa31d65)) +- notification equality check, resolves 'republished' RO notifications ([27b6102](https://github.com/nrkno/tv-automation-server-core/commit/27b6102)) +- NotificationCenter visual fix for other pages ([10b1afa](https://github.com/nrkno/tv-automation-server-core/commit/10b1afa)) +- NotificationCenter visual fix for other pages ([2c5da97](https://github.com/nrkno/tv-automation-server-core/commit/2c5da97)) +- Notifications panel styling fix ([7f7f5cb](https://github.com/nrkno/tv-automation-server-core/commit/7f7f5cb)) +- NymansPlayground caused issues in Timeline ([83e772d](https://github.com/nrkno/tv-automation-server-core/commit/83e772d)) +- on air label position ([00d4e20](https://github.com/nrkno/tv-automation-server-core/commit/00d4e20)) +- on startup, clear old connection statuses ([e9d7cba](https://github.com/nrkno/tv-automation-server-core/commit/e9d7cba)) +- onAir line jumping around on takes ([8330112](https://github.com/nrkno/tv-automation-server-core/commit/8330112)) +- optimizations during adlibs (thanks to [@baltedewit](https://github.com/baltedewit)) ([daa135b](https://github.com/nrkno/tv-automation-server-core/commit/daa135b)) +- optimizations during adlibs (thanks to [@baltedewit](https://github.com/baltedewit)) ([f50b60e](https://github.com/nrkno/tv-automation-server-core/commit/f50b60e)) +- optimizations in roTake ([3457e73](https://github.com/nrkno/tv-automation-server-core/commit/3457e73)) +- optimize saveIntoDB ([65c189e](https://github.com/nrkno/tv-automation-server-core/commit/65c189e)) +- Out of space build failures. Run circleci for tags ([53a5626](https://github.com/nrkno/tv-automation-server-core/commit/53a5626)) +- output version differ error ([8816ed3](https://github.com/nrkno/tv-automation-server-core/commit/8816ed3)) +- Pass SofieHostURL to blueprints config ([8c18821](https://github.com/nrkno/tv-automation-server-core/commit/8c18821)) +- peripheralDevices subscription for RO data ([90b4e13](https://github.com/nrkno/tv-automation-server-core/commit/90b4e13)) +- Persist SegmentLine.updateStoryStatus ([427b24c](https://github.com/nrkno/tv-automation-server-core/commit/427b24c)) +- playout ([969e316](https://github.com/nrkno/tv-automation-server-core/commit/969e316)) +- playout, lookahead: use the originalLayer instear of isAbstract ([30fe842](https://github.com/nrkno/tv-automation-server-core/commit/30fe842)) +- PR changes ([c877aad](https://github.com/nrkno/tv-automation-server-core/commit/c877aad)) +- prevent default action for f1 & f3 ([53b2f22](https://github.com/nrkno/tv-automation-server-core/commit/53b2f22)) +- prevent resetting rundown when on-air ([d842922](https://github.com/nrkno/tv-automation-server-core/commit/d842922)) +- prevent take + autotake bug ([b3d9a4d](https://github.com/nrkno/tv-automation-server-core/commit/b3d9a4d)) +- problem with viewing test recordings ([2e817ac](https://github.com/nrkno/tv-automation-server-core/commit/2e817ac)) +- Prompter: keyboard device interface ([540f47a](https://github.com/nrkno/tv-automation-server-core/commit/540f47a)) +- proper calls of IngestActions ([69121dc](https://github.com/nrkno/tv-automation-server-core/commit/69121dc)) +- proper dispose of executeFunction checkReply after execution is done ([523ec99](https://github.com/nrkno/tv-automation-server-core/commit/523ec99)) +- queued adlib should have infinite sli's ([75452dc](https://github.com/nrkno/tv-automation-server-core/commit/75452dc)) +- R3 ONLY: bugfix: reload data from ENPS ([cc6ed44](https://github.com/nrkno/tv-automation-server-core/commit/cc6ed44)) +- rabbitMQ sending messages ([df72c4c](https://github.com/nrkno/tv-automation-server-core/commit/df72c4c)) +- re-add blueprint & mosdatacache restore (to be deprecated later) ([886c756](https://github.com/nrkno/tv-automation-server-core/commit/886c756)) +- re-add jest-meteor-stubs ([86ede36](https://github.com/nrkno/tv-automation-server-core/commit/86ede36)) +- re-added monaco typings and disabled import, so it works client-side ([1226763](https://github.com/nrkno/tv-automation-server-core/commit/1226763)) +- re-timing vignett ([17fbced](https://github.com/nrkno/tv-automation-server-core/commit/17fbced)) +- react errors while rendering nymansPlayground ([0c245d3](https://github.com/nrkno/tv-automation-server-core/commit/0c245d3)) +- React unique keys ([4f728d9](https://github.com/nrkno/tv-automation-server-core/commit/4f728d9)) +- RecordedFiles index ([f1aae5e](https://github.com/nrkno/tv-automation-server-core/commit/f1aae5e)) +- refactor ([9e9d60a](https://github.com/nrkno/tv-automation-server-core/commit/9e9d60a)) +- refactor infinite generation logic into separate file ([84ef579](https://github.com/nrkno/tv-automation-server-core/commit/84ef579)) +- refactor storeSnapshot methods ([6e66394](https://github.com/nrkno/tv-automation-server-core/commit/6e66394)) +- refactor updateExternalMessageQueueStatus to avoid fatal startup bug ([b54b09d](https://github.com/nrkno/tv-automation-server-core/commit/b54b09d)) +- refactored execMethod, so it doesn't use promises and causes unhandled promise rejections ([24da71b](https://github.com/nrkno/tv-automation-server-core/commit/24da71b)) +- refactored reset-segmentLine further ([0523eb6](https://github.com/nrkno/tv-automation-server-core/commit/0523eb6)) +- refactored/DRYd adminMode & studioMode, disabled trashbin-button for externalMessages when not in adminMode ([b29dae1](https://github.com/nrkno/tv-automation-server-core/commit/b29dae1)) +- refactoring of mos-ingest functions ([ad26959](https://github.com/nrkno/tv-automation-server-core/commit/ad26959)) +- refator ingest API ([a9fa737](https://github.com/nrkno/tv-automation-server-core/commit/a9fa737)) +- rehaul of versions, WIP ([93dea2f](https://github.com/nrkno/tv-automation-server-core/commit/93dea2f)) +- Reimplement mosRoCreate via new ingest api ([34c3247](https://github.com/nrkno/tv-automation-server-core/commit/34c3247)) +- relative durations causing type warnings for ui code ([5249435](https://github.com/nrkno/tv-automation-server-core/commit/5249435)) +- Release 3 only: disable config missing warning ([921cc82](https://github.com/nrkno/tv-automation-server-core/commit/921cc82)) +- remount monaco ([4ce1566](https://github.com/nrkno/tv-automation-server-core/commit/4ce1566)) +- remove 'computation stopped' notifications ([bf4d8d8](https://github.com/nrkno/tv-automation-server-core/commit/bf4d8d8)) +- Remove all notifications from prompter (incl. connection) ([b13d561](https://github.com/nrkno/tv-automation-server-core/commit/b13d561)) +- remove check that didn't work ([fdc917f](https://github.com/nrkno/tv-automation-server-core/commit/fdc917f)) +- remove config didn't work ([893717e](https://github.com/nrkno/tv-automation-server-core/commit/893717e)) +- remove debug line in nightly cronjob ([dda3017](https://github.com/nrkno/tv-automation-server-core/commit/dda3017)) +- remove deprecated options ([ab7275b](https://github.com/nrkno/tv-automation-server-core/commit/ab7275b)) +- remove duplicate attributes ([31e4414](https://github.com/nrkno/tv-automation-server-core/commit/31e4414)) +- Remove empty translations ([d2f1bd0](https://github.com/nrkno/tv-automation-server-core/commit/d2f1bd0)) +- remove expectedMediaItems when ro is removed ([5230695](https://github.com/nrkno/tv-automation-server-core/commit/5230695)) +- remove full-screen button, add label ([5c9a3e5](https://github.com/nrkno/tv-automation-server-core/commit/5c9a3e5)) +- remove full-screen button, add label ([5e9826e](https://github.com/nrkno/tv-automation-server-core/commit/5e9826e)) +- remove internal methods from API ([1752bb1](https://github.com/nrkno/tv-automation-server-core/commit/1752bb1)) +- remove leftover debug info ([d475b76](https://github.com/nrkno/tv-automation-server-core/commit/d475b76)) +- remove memoization of RVars ([ca22155](https://github.com/nrkno/tv-automation-server-core/commit/ca22155)) +- remove minified timeline-visualizer ([1cd5552](https://github.com/nrkno/tv-automation-server-core/commit/1cd5552)) +- remove minified timeline-visualizer ([da85c89](https://github.com/nrkno/tv-automation-server-core/commit/da85c89)) +- remove queued adlibs when original part is reset ([812e19c](https://github.com/nrkno/tv-automation-server-core/commit/812e19c)) +- Remove some calls to rundownSyncFunction from inside another ([83eb955](https://github.com/nrkno/tv-automation-server-core/commit/83eb955)) +- remove some console.logs ([a9f3f53](https://github.com/nrkno/tv-automation-server-core/commit/a9f3f53)) +- remove systemStatus when removing blueprint ([1aa9b44](https://github.com/nrkno/tv-automation-server-core/commit/1aa9b44)) +- Remove timestamps from blueprint backups ([74fa1b3](https://github.com/nrkno/tv-automation-server-core/commit/74fa1b3)) +- remove trigger from the AdLibPieceUi setup in AdLibPanel ([847edb5](https://github.com/nrkno/tv-automation-server-core/commit/847edb5)) +- remove unneccessary margin in some headers ([b47ea11](https://github.com/nrkno/tv-automation-server-core/commit/b47ea11)) +- remove unneccessary margin in some headers ([32874a1](https://github.com/nrkno/tv-automation-server-core/commit/32874a1)) +- remove unused imports ([5fe6ac3](https://github.com/nrkno/tv-automation-server-core/commit/5fe6ac3)) +- remove unused imports ([59041fc](https://github.com/nrkno/tv-automation-server-core/commit/59041fc)) +- remove unused translation helper ([e545a9e](https://github.com/nrkno/tv-automation-server-core/commit/e545a9e)) +- removed autopublish and insecure packages, we'll implement publications and allow/deny rules from now on ([213998d](https://github.com/nrkno/tv-automation-server-core/commit/213998d)) +- removed ntp server debug code ([b9857e7](https://github.com/nrkno/tv-automation-server-core/commit/b9857e7)) +- removed old, deprecated attr ([bf0cdfd](https://github.com/nrkno/tv-automation-server-core/commit/bf0cdfd)) +- Removed the hard-coded link in the header that set the translation to Norwegian Bokmål. ([4515066](https://github.com/nrkno/tv-automation-server-core/commit/4515066)) +- removed uploadFileToAtem function, this should be done in devicesMakeReady ([4e96bb3](https://github.com/nrkno/tv-automation-server-core/commit/4e96bb3)) +- removed wrongful error throw ([852c495](https://github.com/nrkno/tv-automation-server-core/commit/852c495)) +- removed wrongful error throw ([b3deed1](https://github.com/nrkno/tv-automation-server-core/commit/b3deed1)) +- Removing trailing slashes in url defaults ([f6fa32c](https://github.com/nrkno/tv-automation-server-core/commit/f6fa32c)) +- rename "Edit" to "Trim" for clipTrimDialog ([3879a34](https://github.com/nrkno/tv-automation-server-core/commit/3879a34)) +- rename collection RundownBaselineItems => RundownBaselineObjs ([e471321](https://github.com/nrkno/tv-automation-server-core/commit/e471321)) +- rename InspectorDrawer to Shelf ([db6e778](https://github.com/nrkno/tv-automation-server-core/commit/db6e778)) +- rename method getShowStyleRef => getShowStyleConfigRef ([c8bbe95](https://github.com/nrkno/tv-automation-server-core/commit/c8bbe95)) +- rename restoreBackups page to Snapshots ([0c5103f](https://github.com/nrkno/tv-automation-server-core/commit/0c5103f)) +- rename rundownAPI => runningOrderAPI ([89d48d0](https://github.com/nrkno/tv-automation-server-core/commit/89d48d0)) +- rename rundownBaselineAdLibItem => rundownBaselineAdLibPiece ([82f8327](https://github.com/nrkno/tv-automation-server-core/commit/82f8327)) +- rename runningOrder => rundown ([4eab6de](https://github.com/nrkno/tv-automation-server-core/commit/4eab6de)) +- rename segmentLine => part ([b56b55b](https://github.com/nrkno/tv-automation-server-core/commit/b56b55b)) +- rename SegmentLineAdLibItem => AdLibPiece ([04c50a9](https://github.com/nrkno/tv-automation-server-core/commit/04c50a9)) +- rename segmentLineItem => piece ([bf61c48](https://github.com/nrkno/tv-automation-server-core/commit/bf61c48)) +- Rename shelf, more fixes ([898247e](https://github.com/nrkno/tv-automation-server-core/commit/898247e)) +- rename siId to studioId in Timeline ([88f6039](https://github.com/nrkno/tv-automation-server-core/commit/88f6039)) +- rename some methods in RundownNotifier ([1a5b6ea](https://github.com/nrkno/tv-automation-server-core/commit/1a5b6ea)) +- rename some segmentLine props to parts ([344f796](https://github.com/nrkno/tv-automation-server-core/commit/344f796)) +- rename StudioInstallation => Studio ([22d0786](https://github.com/nrkno/tv-automation-server-core/commit/22d0786)) +- rename version 0.20.0 => 0.21.0 (release 6) ([7b1ee3a](https://github.com/nrkno/tv-automation-server-core/commit/7b1ee3a)) +- renames ([b606907](https://github.com/nrkno/tv-automation-server-core/commit/b606907)) +- Rerunning blueprints losing part timings ([e6c35b4](https://github.com/nrkno/tv-automation-server-core/commit/e6c35b4)) +- resetRunningOrder functionality in GUI ([4eb096a](https://github.com/nrkno/tv-automation-server-core/commit/4eb096a)) +- resetRunningorder should update timeline ([0d01e6a](https://github.com/nrkno/tv-automation-server-core/commit/0d01e6a)) +- resetRunningorder should update timeline ([35451b1](https://github.com/nrkno/tv-automation-server-core/commit/35451b1)) +- resetting running order rewind ([a122f2c](https://github.com/nrkno/tv-automation-server-core/commit/a122f2c)) +- resolve a typo in rabbitMQ.ts ([3b36ae3](https://github.com/nrkno/tv-automation-server-core/commit/3b36ae3)) +- resolve an issue with dropdown EditAttribute not selecting the undefined option ([2658ed3](https://github.com/nrkno/tv-automation-server-core/commit/2658ed3)) +- resolve an issue with dropdown EditAttribute not selecting the undefined option ([9f85845](https://github.com/nrkno/tv-automation-server-core/commit/9f85845)) +- resolve an issue with missing media notification after floating a line ([00fedce](https://github.com/nrkno/tv-automation-server-core/commit/00fedce)) +- resolve issue with ContextMenus in RO view ([8d9ba96](https://github.com/nrkno/tv-automation-server-core/commit/8d9ba96)) +- resolve issue with hit-area of Notification Center ([1618619](https://github.com/nrkno/tv-automation-server-core/commit/1618619)) +- resolve issue with lowPriority cron jobs ([f7c3c83](https://github.com/nrkno/tv-automation-server-core/commit/f7c3c83)) +- resolve issue with segmentLineDisplayDuration & segment duration ([a73ed09](https://github.com/nrkno/tv-automation-server-core/commit/a73ed09)) +- resolve issues with how play-from-here is displayed in GUI ([ebdb549](https://github.com/nrkno/tv-automation-server-core/commit/ebdb549)) +- resolve Media Object Status notifications bug ([367dcce](https://github.com/nrkno/tv-automation-server-core/commit/367dcce)) +- resolve merge issue ([0cbc75a](https://github.com/nrkno/tv-automation-server-core/commit/0cbc75a)) +- resolve some sizing issues in the RD view ([f0c1826](https://github.com/nrkno/tv-automation-server-core/commit/f0c1826)) +- Respect disableOutTransition on SegmentLine during manual takes (not just autonext) ([f19788d](https://github.com/nrkno/tv-automation-server-core/commit/f19788d)) +- restore blueprint settings page ([faa7fdd](https://github.com/nrkno/tv-automation-server-core/commit/faa7fdd)) +- restore running order 'backup' fails if doesnt already exist ([87b3300](https://github.com/nrkno/tv-automation-server-core/commit/87b3300)) +- retry strategy for restart casparcg cronjob ([b54f0f6](https://github.com/nrkno/tv-automation-server-core/commit/b54f0f6)) +- reversed logic during refactoring by mistake ([694191e](https://github.com/nrkno/tv-automation-server-core/commit/694191e)) +- Revert 594a1e7 ([edeb166](https://github.com/nrkno/tv-automation-server-core/commit/edeb166)) +- rewind all segments when re-enabling follow on air ([a23b84c](https://github.com/nrkno/tv-automation-server-core/commit/a23b84c)) +- rewind icon was not responsive in ROFullscreenControls ([2e7c1d2](https://github.com/nrkno/tv-automation-server-core/commit/2e7c1d2)) +- rewind icon was not responsive in ROFullscreenControls ([0e494df](https://github.com/nrkno/tv-automation-server-core/commit/0e494df)) +- rewind UI even if reset returns error ([08c5d6b](https://github.com/nrkno/tv-automation-server-core/commit/08c5d6b)) +- rewind UI even if reset returns error ([3bd5417](https://github.com/nrkno/tv-automation-server-core/commit/3bd5417)) +- reworked systemStatus to use components instead ([cccfe3c](https://github.com/nrkno/tv-automation-server-core/commit/cccfe3c)) +- Rewrite piece durations to allow for specifying end instead of duration ([9dee8a6](https://github.com/nrkno/tv-automation-server-core/commit/9dee8a6)) +- RO buttons z-order ([3c53254](https://github.com/nrkno/tv-automation-server-core/commit/3c53254)) +- RO buttons z-order ([15e9da8](https://github.com/nrkno/tv-automation-server-core/commit/15e9da8)) +- RO config changed notification not updating when RO is updated ([f5c2540](https://github.com/nrkno/tv-automation-server-core/commit/f5c2540)) +- RO notification action ([36cf900](https://github.com/nrkno/tv-automation-server-core/commit/36cf900)) +- RO Notifications fixes attempt no. 3 ([f0eee1f](https://github.com/nrkno/tv-automation-server-core/commit/f0eee1f)) +- RO overview crashed during rebuild of RO ([d2c62a1](https://github.com/nrkno/tv-automation-server-core/commit/d2c62a1)) +- ro-reset does not reset properly ([6367658](https://github.com/nrkno/tv-automation-server-core/commit/6367658)) +- roReset should reset holdItems and infinites ([bdf8385](https://github.com/nrkno/tv-automation-server-core/commit/bdf8385)) +- run afterUpdateTimeline after timelineTriggerTime ([98ece60](https://github.com/nrkno/tv-automation-server-core/commit/98ece60)) +- Rundown name dissappearing from view ([91dcc21](https://github.com/nrkno/tv-automation-server-core/commit/91dcc21)) +- running blueprint migrations ([fe1e7fd](https://github.com/nrkno/tv-automation-server-core/commit/fe1e7fd)) +- Running blueprints and migrations ([3b29df3](https://github.com/nrkno/tv-automation-server-core/commit/3b29df3)) +- running order closing prompt ([3024543](https://github.com/nrkno/tv-automation-server-core/commit/3024543)) +- running order closing prompt ([7074cc3](https://github.com/nrkno/tv-automation-server-core/commit/7074cc3)) +- Running Order Notifications in activeRo view ([63658b1](https://github.com/nrkno/tv-automation-server-core/commit/63658b1)) +- Running order status notifying wrong dep ([e6b84e5](https://github.com/nrkno/tv-automation-server-core/commit/e6b84e5)) +- running order view notifications in production build ([b593323](https://github.com/nrkno/tv-automation-server-core/commit/b593323)) +- seek support in VT, STK, hoverscrub ([43e413b](https://github.com/nrkno/tv-automation-server-core/commit/43e413b)) +- semver.clean cannot handle undefined input parameter ([333588a](https://github.com/nrkno/tv-automation-server-core/commit/333588a)) +- send utf-8 filenames properly in Content-Disposition ([60eb521](https://github.com/nrkno/tv-automation-server-core/commit/60eb521)) +- separate warnings for black frames & freeze frames ([e2acad5](https://github.com/nrkno/tv-automation-server-core/commit/e2acad5)) +- Set KAM source layer, and a probably incorrect duration (but its now non-zero) ([6e152f0](https://github.com/nrkno/tv-automation-server-core/commit/6e152f0)) +- set tsr multithreading from UI instead of CLI ([c8be25b](https://github.com/nrkno/tv-automation-server-core/commit/c8be25b)) +- setAsNext on previous ([6ced09b](https://github.com/nrkno/tv-automation-server-core/commit/6ced09b)) +- setAsNext on previous ([4ffe665](https://github.com/nrkno/tv-automation-server-core/commit/4ffe665)) +- setAsNext on previous line no longer shows default state, but now instead stalls when attempting to take ([e441aaf](https://github.com/nrkno/tv-automation-server-core/commit/e441aaf)) +- settings styling improvements, code fixes ([d9484cd](https://github.com/nrkno/tv-automation-server-core/commit/d9484cd)) +- shelf height would not change ([123b407](https://github.com/nrkno/tv-automation-server-core/commit/123b407)) +- show connected devices in RO view ([e804d1e](https://github.com/nrkno/tv-automation-server-core/commit/e804d1e)) +- show full timecode for set with of offset ([0954ce6](https://github.com/nrkno/tv-automation-server-core/commit/0954ce6)) +- show media errors in segment header ([3775d2e](https://github.com/nrkno/tv-automation-server-core/commit/3775d2e)) +- show ShowStyleBase name as a part of the ShowStyleVariant name in Studios ([ba67011](https://github.com/nrkno/tv-automation-server-core/commit/ba67011)) +- ShowStyleVariant settings not saving changes ([e90137b](https://github.com/nrkno/tv-automation-server-core/commit/e90137b)) +- simplify getRSourceLayer - unnecessary null check ([0405f35](https://github.com/nrkno/tv-automation-server-core/commit/0405f35)) +- since afterUpdateTimeline is called in from a syncFunctionIgnore-function, we can remove the timeout ([e7f8f25](https://github.com/nrkno/tv-automation-server-core/commit/e7f8f25)) +- skip an allocation in RundownTiming ([db83682](https://github.com/nrkno/tv-automation-server-core/commit/db83682)) +- skip untranslated strings from po files, update i18next-conv to latest version ([1de4ccb](https://github.com/nrkno/tv-automation-server-core/commit/1de4ccb)) +- sl prod init ([2ff4a46](https://github.com/nrkno/tv-automation-server-core/commit/2ff4a46)) +- smoother handling when reloading ENPS data ([83be7cb](https://github.com/nrkno/tv-automation-server-core/commit/83be7cb)) +- snapshots ([182c221](https://github.com/nrkno/tv-automation-server-core/commit/182c221)) +- SOAP message encoding ([63d8634](https://github.com/nrkno/tv-automation-server-core/commit/63d8634)) +- SOAP message encoding ([b19ea77](https://github.com/nrkno/tv-automation-server-core/commit/b19ea77)) +- solve a problem with viewing recordings ([09aa112](https://github.com/nrkno/tv-automation-server-core/commit/09aa112)) +- solve a problem with viewing recordings ([01c165b](https://github.com/nrkno/tv-automation-server-core/commit/01c165b)) +- solve an issue with content trimmed icon ([461617f](https://github.com/nrkno/tv-automation-server-core/commit/461617f)) +- Some durations using removed self references ([b3b7776](https://github.com/nrkno/tv-automation-server-core/commit/b3b7776)) +- Some fatal bugs in a clean installation ([b311ae1](https://github.com/nrkno/tv-automation-server-core/commit/b311ae1)) +- some minor react errors in the settings ([d7bb849](https://github.com/nrkno/tv-automation-server-core/commit/d7bb849)) +- some more linting and refactoring due to deprecation of certain lifecycle methods ([a6d1cc6](https://github.com/nrkno/tv-automation-server-core/commit/a6d1cc6)) +- some more margin touch-ups ([71a291a](https://github.com/nrkno/tv-automation-server-core/commit/71a291a)) +- some more margin touch-ups ([c8b6f1e](https://github.com/nrkno/tv-automation-server-core/commit/c8b6f1e)) +- Some mos typing errors, and references to old runningorderdatacache ([3722a86](https://github.com/nrkno/tv-automation-server-core/commit/3722a86)) +- some playout and rundown issues ([c235fda](https://github.com/nrkno/tv-automation-server-core/commit/c235fda)) +- some playout bugs ([065de84](https://github.com/nrkno/tv-automation-server-core/commit/065de84)) +- Some playout bugs ([08ec090](https://github.com/nrkno/tv-automation-server-core/commit/08ec090)) +- Some playout timeline bugs ([f4ad363](https://github.com/nrkno/tv-automation-server-core/commit/f4ad363)) +- split abbreviation spacing ([43ea9d5](https://github.com/nrkno/tv-automation-server-core/commit/43ea9d5)) +- Start on template for KAM ÅPNING ([4cd682f](https://github.com/nrkno/tv-automation-server-core/commit/4cd682f)) +- status colors ([46fdaf1](https://github.com/nrkno/tv-automation-server-core/commit/46fdaf1)) +- strip blueprint manifest versions of '^' ([54a5ecf](https://github.com/nrkno/tv-automation-server-core/commit/54a5ecf)) +- StudioInstallation key-value config tidying ([4b0bc1a](https://github.com/nrkno/tv-automation-server-core/commit/4b0bc1a)) +- styling fix for z-order with menu and RO buttons ([1b0717e](https://github.com/nrkno/tv-automation-server-core/commit/1b0717e)) +- subscription handling ([8aaa3ec](https://github.com/nrkno/tv-automation-server-core/commit/8aaa3ec)) +- super.componentWillUnmount is required ([2342e48](https://github.com/nrkno/tv-automation-server-core/commit/2342e48)) +- suppress console.errors, display notifications whenever possible ([5918886](https://github.com/nrkno/tv-automation-server-core/commit/5918886)) +- syncFunction only timing out when any other syncFunction gets queued ([2d45122](https://github.com/nrkno/tv-automation-server-core/commit/2d45122)) +- syntax errors in test file ([a8f5d1e](https://github.com/nrkno/tv-automation-server-core/commit/a8f5d1e)) +- systemStatus \_internal messages ([d150f54](https://github.com/nrkno/tv-automation-server-core/commit/d150f54)) +- systemStatus \_internal messages ([05fd6c8](https://github.com/nrkno/tv-automation-server-core/commit/05fd6c8)) +- systemStatus messages ([e595e5b](https://github.com/nrkno/tv-automation-server-core/commit/e595e5b)) +- systemStatus messages ([17420cc](https://github.com/nrkno/tv-automation-server-core/commit/17420cc)) +- systemStatus versions ([62bfa9a](https://github.com/nrkno/tv-automation-server-core/commit/62bfa9a)) +- take action should not throw as nasty errors when called by user. ([6791d50](https://github.com/nrkno/tv-automation-server-core/commit/6791d50)) +- take playOffset into account for timing ([422783a](https://github.com/nrkno/tv-automation-server-core/commit/422783a)) +- templates with wipe. Readd seperate audio file ([5be2802](https://github.com/nrkno/tv-automation-server-core/commit/5be2802)) +- temporary fix for the "UnhandledPromiseRejectionWarning" bug, supressing the error when used ([7aa7cf8](https://github.com/nrkno/tv-automation-server-core/commit/7aa7cf8)) +- temporary fix of typing error ([73bf56d](https://github.com/nrkno/tv-automation-server-core/commit/73bf56d)) +- test-tools decklink input format dropdown has no options ([b02f447](https://github.com/nrkno/tv-automation-server-core/commit/b02f447)) +- text shadow in SegmentLineLabels ([3a310b1](https://github.com/nrkno/tv-automation-server-core/commit/3a310b1)) +- tie snapshot to evaluation ([ec18370](https://github.com/nrkno/tv-automation-server-core/commit/ec18370)) +- Timeline always being built without previous segmentline ([a077805](https://github.com/nrkno/tv-automation-server-core/commit/a077805)) +- timeline dep ([b26eecb](https://github.com/nrkno/tv-automation-server-core/commit/b26eecb)) +- timeline resolution bug for non-infinite items ([35fc40a](https://github.com/nrkno/tv-automation-server-core/commit/35fc40a)) +- timeline statobj didn't update on inactivate (empty timeline) ([839b906](https://github.com/nrkno/tv-automation-server-core/commit/839b906)) +- timeline statObject: updated hashing function ([e00a01c](https://github.com/nrkno/tv-automation-server-core/commit/e00a01c)) +- Timeline viewer infinite loop ([74856df](https://github.com/nrkno/tv-automation-server-core/commit/74856df)) +- timelineObj \_id missing ([1dcedbf](https://github.com/nrkno/tv-automation-server-core/commit/1dcedbf)) +- timelineObj \_id missing ([0f8e0da](https://github.com/nrkno/tv-automation-server-core/commit/0f8e0da)) +- timesync: better retry strategy on startup sync ([eda632a](https://github.com/nrkno/tv-automation-server-core/commit/eda632a)) +- toc trace message ([c53124f](https://github.com/nrkno/tv-automation-server-core/commit/c53124f)) +- Toggle hotkeys legend in support panel ([e6f4769](https://github.com/nrkno/tv-automation-server-core/commit/e6f4769)) +- too long script out-words could overlap with previous items ([8f8a9a2](https://github.com/nrkno/tv-automation-server-core/commit/8f8a9a2)) +- Tooltip import ([cd2b65a](https://github.com/nrkno/tv-automation-server-core/commit/cd2b65a)) +- tooltips after import change ([a82140f](https://github.com/nrkno/tv-automation-server-core/commit/a82140f)) +- top RO overview labels clipped in wrong places ([5e5c228](https://github.com/nrkno/tv-automation-server-core/commit/5e5c228)) +- Tweaked styling of evaluation form, warning messages, color of the next lines, translations, capialized warning icon file name, and optimized png and svg icons. ([50d2753](https://github.com/nrkno/tv-automation-server-core/commit/50d2753)) +- tweaks on externalMessage send function, limiting the number of messages sent in one go ([046ae38](https://github.com/nrkno/tv-automation-server-core/commit/046ae38)) +- type bug ([de43835](https://github.com/nrkno/tv-automation-server-core/commit/de43835)) +- type error in SegmentTimelineContainer ([c4d6b4d](https://github.com/nrkno/tv-automation-server-core/commit/c4d6b4d)) +- type error, ensure string ([76da25d](https://github.com/nrkno/tv-automation-server-core/commit/76da25d)) +- typing ([7c21efe](https://github.com/nrkno/tv-automation-server-core/commit/7c21efe)) +- typing fix: cannot find name 'monaco' ([3ad88ce](https://github.com/nrkno/tv-automation-server-core/commit/3ad88ce)) +- typing fixes, to work with updated packages ([b4362f7](https://github.com/nrkno/tv-automation-server-core/commit/b4362f7)) +- typings error, ensuring string ([1e25345](https://github.com/nrkno/tv-automation-server-core/commit/1e25345)) +- typo ([2efc829](https://github.com/nrkno/tv-automation-server-core/commit/2efc829)) +- typo bug in performanceMonitor ([6a5eeb4](https://github.com/nrkno/tv-automation-server-core/commit/6a5eeb4)) +- typo bug in performanceMonitor ([797c393](https://github.com/nrkno/tv-automation-server-core/commit/797c393)) +- typo MediaResolutions vs mediaResolutions ([6a72e09](https://github.com/nrkno/tv-automation-server-core/commit/6a72e09)) +- Typographic tweaks for prompter. ([068d535](https://github.com/nrkno/tv-automation-server-core/commit/068d535)) +- UI bug: key in

missing ([b957660](https://github.com/nrkno/tv-automation-server-core/commit/b957660)) +- UI crash when outputLayer is undefined ([e6dd558](https://github.com/nrkno/tv-automation-server-core/commit/e6dd558)) +- UI fixes for some margins in the migrations view ([4dc6fef](https://github.com/nrkno/tv-automation-server-core/commit/4dc6fef)) +- ui manualPlayback key ([ca1a943](https://github.com/nrkno/tv-automation-server-core/commit/ca1a943)) +- ui manualPlayback key ([5d4e49f](https://github.com/nrkno/tv-automation-server-core/commit/5d4e49f)) +- UI tweaks for messages status view. so it doesn't break when having long error messages ([ca1e3ae](https://github.com/nrkno/tv-automation-server-core/commit/ca1e3ae)) +- UI: improve shapshot comment edit field ([093e6cb](https://github.com/nrkno/tv-automation-server-core/commit/093e6cb)) +- upd meteor typings ([53f17d2](https://github.com/nrkno/tv-automation-server-core/commit/53f17d2)) +- upd query-string dependency & fixed typings issue ([e0d3f12](https://github.com/nrkno/tv-automation-server-core/commit/e0d3f12)) +- update all data in roReplaceMetadata ([8a5a671](https://github.com/nrkno/tv-automation-server-core/commit/8a5a671)) +- update asRunLog typings ([5d18c66](https://github.com/nrkno/tv-automation-server-core/commit/5d18c66)) +- update blueprints-integration ([28d17c2](https://github.com/nrkno/tv-automation-server-core/commit/28d17c2)) +- update blueprints-integration ([59c29f6](https://github.com/nrkno/tv-automation-server-core/commit/59c29f6)) +- Update blueprints-integration ([9870256](https://github.com/nrkno/tv-automation-server-core/commit/9870256)) +- update blueprints-integration depencendy & update getHashId to match ([e1c12d2](https://github.com/nrkno/tv-automation-server-core/commit/e1c12d2)) +- update design of presenter screen ([4f41195](https://github.com/nrkno/tv-automation-server-core/commit/4f41195)) +- update device last data timestamp ([ac82ebd](https://github.com/nrkno/tv-automation-server-core/commit/ac82ebd)) +- Update names passed to SegmentLineItems ([ed0fc0d](https://github.com/nrkno/tv-automation-server-core/commit/ed0fc0d)) +- update Next-line when inserting story just before it, also added property to track if the next point was set manually ([d82dbc6](https://github.com/nrkno/tv-automation-server-core/commit/d82dbc6)) +- update package versions to fix audit issues ([be3cae5](https://github.com/nrkno/tv-automation-server-core/commit/be3cae5)) +- update Part & Rundown classes from inherited interface ([956f4c6](https://github.com/nrkno/tv-automation-server-core/commit/956f4c6)) +- Update RO change notification on an interval, to ensure it catches changes to other document types ([79d8c05](https://github.com/nrkno/tv-automation-server-core/commit/79d8c05)) +- update ro data cache when getting new metadata ([d700783](https://github.com/nrkno/tv-automation-server-core/commit/d700783)) +- Update some playout timelineobj types ([fe883a8](https://github.com/nrkno/tv-automation-server-core/commit/fe883a8)) +- update supertimeline ([28bccfe](https://github.com/nrkno/tv-automation-server-core/commit/28bccfe)) +- update timeline dependency ([b83f6be](https://github.com/nrkno/tv-automation-server-core/commit/b83f6be)) +- Update timeline on new ingest data ([80ac1ed](https://github.com/nrkno/tv-automation-server-core/commit/80ac1ed)) +- Update timeline on removing a mos story ([fd3d443](https://github.com/nrkno/tv-automation-server-core/commit/fd3d443)) +- update timeline-visualizer ([8e46981](https://github.com/nrkno/tv-automation-server-core/commit/8e46981)) +- Update TimelineObjCCGRoute. ([203ef91](https://github.com/nrkno/tv-automation-server-core/commit/203ef91)) +- update ts-jest dependency ([69c3c64](https://github.com/nrkno/tv-automation-server-core/commit/69c3c64)) +- Update tsr version ([92359bd](https://github.com/nrkno/tv-automation-server-core/commit/92359bd)) +- update typings ([d536ad1](https://github.com/nrkno/tv-automation-server-core/commit/d536ad1)) +- update typings to match blueprints-integration ([f97f177](https://github.com/nrkno/tv-automation-server-core/commit/f97f177)) +- updated health endpoint according to spec ([900728b](https://github.com/nrkno/tv-automation-server-core/commit/900728b)) +- updated health endpoint according to spec ([c196382](https://github.com/nrkno/tv-automation-server-core/commit/c196382)) +- updated mock data ([3e140c6](https://github.com/nrkno/tv-automation-server-core/commit/3e140c6)) +- updated mock data ([a7a4ae5](https://github.com/nrkno/tv-automation-server-core/commit/a7a4ae5)) +- updated nightly cronjob: restart casparcg devices, to work with new restartCasparCG function implementation ([edbc186](https://github.com/nrkno/tv-automation-server-core/commit/edbc186)) +- updated nightly cronjob: restart casparcg devices, to work with new restartCasparCG function implementation ([3f9344d](https://github.com/nrkno/tv-automation-server-core/commit/3f9344d)) +- updated package-lock.json ([bf0cfde](https://github.com/nrkno/tv-automation-server-core/commit/bf0cfde)) +- updated systemTime endpoint ([503d2c8](https://github.com/nrkno/tv-automation-server-core/commit/503d2c8)) +- updated timeline dep (bugfixes) ([ff29ce6](https://github.com/nrkno/tv-automation-server-core/commit/ff29ce6)) +- updated versions file ([f6c9869](https://github.com/nrkno/tv-automation-server-core/commit/f6c9869)) +- updateExpectedMediaItems failing was causing the post-process blueprint to not be run. Errors from this are still logged, but no longer block blueprint execution ([2fe22bb](https://github.com/nrkno/tv-automation-server-core/commit/2fe22bb)) +- usage of logging.warning didn't work (use logging.warn() ) ([fbf7528](https://github.com/nrkno/tv-automation-server-core/commit/fbf7528)) +- use a single setState in updateVersions in MigrationsView ([afd730a](https://github.com/nrkno/tv-automation-server-core/commit/afd730a)) +- **adlib:** Allow for overlap of adlib sli to give preload time ([d2f0dcd](https://github.com/nrkno/tv-automation-server-core/commit/d2f0dcd)) +- **adlib:** An adlib replacing the main sli of a sl would not adjust the length of the original. F5/F6 sometimes failed to insert a sli correctly, causing black ([fca6f05](https://github.com/nrkno/tv-automation-server-core/commit/fca6f05)) +- **adlib:** Set as next on SL after using F5/F6 would not restore correctly ([3829293](https://github.com/nrkno/tv-automation-server-core/commit/3829293)) +- **asRunLog:** wrong id, typo ([636fc41](https://github.com/nrkno/tv-automation-server-core/commit/636fc41)) +- **backup:** make restore running order less strict ([e78313f](https://github.com/nrkno/tv-automation-server-core/commit/e78313f)) +- **blueprint:** Fill in missing TimelineObj fields ([0ed7663](https://github.com/nrkno/tv-automation-server-core/commit/0ed7663)) +- **blueprint:** fix manifest config add item showing an 'undefined' option ([fa6182a](https://github.com/nrkno/tv-automation-server-core/commit/fa6182a)) +- **blueprint:** Remove invalid backup restore code ([2e00eca](https://github.com/nrkno/tv-automation-server-core/commit/2e00eca)) +- **blueprints:** Ensure ids are not duplicated ([fbd0a04](https://github.com/nrkno/tv-automation-server-core/commit/fbd0a04)) +- **blueprints:** Ensure the object ids generated by the post-process blueprint are unique ([bdee540](https://github.com/nrkno/tv-automation-server-core/commit/bdee540)) +- **cam/dir:** clear hotkeys ([2545de8](https://github.com/nrkno/tv-automation-server-core/commit/2545de8)) +- **clip metadata:** timebase info ([5c39ea8](https://github.com/nrkno/tv-automation-server-core/commit/5c39ea8)) +- **countdowns:** ignore sourceLayers that we don't have an icon for ([27b2ac0](https://github.com/nrkno/tv-automation-server-core/commit/27b2ac0)) +- **countdowns:** split text parsing ([9a174ae](https://github.com/nrkno/tv-automation-server-core/commit/9a174ae)) +- **Devices:** Better strings and device list layouts (less details) ([be26a18](https://github.com/nrkno/tv-automation-server-core/commit/be26a18)) +- **displayDurationGroup:** fix GUI clocks for displayDurationGroups ([10ac255](https://github.com/nrkno/tv-automation-server-core/commit/10ac255)) +- **displayDurationGroup:** fix GUI clocks for displayDurationGroups ([76e217e](https://github.com/nrkno/tv-automation-server-core/commit/76e217e)) +- **displayDurationGroup:** use displayDurationGroup timing in presenter's screen ([9138845](https://github.com/nrkno/tv-automation-server-core/commit/9138845)) +- **displayDurationGroup:** use displayDurationGroup timing in presenter's screen ([61e04f9](https://github.com/nrkno/tv-automation-server-core/commit/61e04f9)) +- **emberplus:** changes intiDB mapping to new .-delimited string format ([b6d8bc7](https://github.com/nrkno/tv-automation-server-core/commit/b6d8bc7)) +- **expected media items:** use a function instead of fat arrow ([fa23c05](https://github.com/nrkno/tv-automation-server-core/commit/fa23c05)) +- **externalMessage:** encode proper html-entities in strings ([243995c](https://github.com/nrkno/tv-automation-server-core/commit/243995c)) +- **FirstObjects:** Reverts regression introduced by removing isAbstract from firstObject items ([8f1608b](https://github.com/nrkno/tv-automation-server-core/commit/8f1608b)) +- **GUI:** bug in EditAttribute dropdown, causing NaN to be written if optionsAreNumbers is not set ([4b17853](https://github.com/nrkno/tv-automation-server-core/commit/4b17853)) +- **hold:** Disable transition when in HOLD ([cfcb141](https://github.com/nrkno/tv-automation-server-core/commit/cfcb141)) +- **hold:** Disable transition when leaving HOLD ([809dd34](https://github.com/nrkno/tv-automation-server-core/commit/809dd34)) +- **hold:** Disable transition when leaving HOLD ([6b7184c](https://github.com/nrkno/tv-automation-server-core/commit/6b7184c)) +- **hold:** Disable transition when leaving or leaving HOLD ([ef5cbcb](https://github.com/nrkno/tv-automation-server-core/commit/ef5cbcb)) +- **hold:** Ensure the original stk does not get picked up as a dynamic object when setting the sl as next ([225304d](https://github.com/nrkno/tv-automation-server-core/commit/225304d)) +- **hold:** Ensure the original stk does not get picked up as a dynamic object when setting the sl as next ([b10f48d](https://github.com/nrkno/tv-automation-server-core/commit/b10f48d)) +- **hold:** Ensure the original stk does not get picked up as a dynamic object when setting the sl as next ([22da4d8](https://github.com/nrkno/tv-automation-server-core/commit/22da4d8)) +- **hold:** keep showing any infinite items that existed on the previous sl ([21a9973](https://github.com/nrkno/tv-automation-server-core/commit/21a9973)) +- **hold:** Too many sli being extended for hold mode ([f644e32](https://github.com/nrkno/tv-automation-server-core/commit/f644e32)) +- **hold:** When extending a sli during hold, use the original id to make any triggers on the sli work ([669a4b2](https://github.com/nrkno/tv-automation-server-core/commit/669a4b2)) +- **hold:** When extending a sli during hold, use the original id to make any triggers on the sli work ([a3fd1a6](https://github.com/nrkno/tv-automation-server-core/commit/a3fd1a6)) +- **infinite:** Persist overrideDuration when updating infinites ([72670d5](https://github.com/nrkno/tv-automation-server-core/commit/72670d5)) +- **infinite:** Persist overrideDuration when updating infinites ([b15bfa3](https://github.com/nrkno/tv-automation-server-core/commit/b15bfa3)) +- **infinite items:** removes infinite icon from outOnNextSegment ([4a75d7d](https://github.com/nrkno/tv-automation-server-core/commit/4a75d7d)) +- **ingest:** Error when removeSegment doesnt remove anything. Call updateDynamicPartRanks after importing ingest data ([5bf0c95](https://github.com/nrkno/tv-automation-server-core/commit/5bf0c95)) +- **ingest:** Rewrite portions of the removeX and afterRemoveX functions to allow batching changes and make more durable ([2457a29](https://github.com/nrkno/tv-automation-server-core/commit/2457a29)) +- **ingest:** Save notes generated by blueprints ([06fac36](https://github.com/nrkno/tv-automation-server-core/commit/06fac36)) +- **ingest:** Some syncFunction timeouts. Finish a bit more of the mos ingest ([38e7576](https://github.com/nrkno/tv-automation-server-core/commit/38e7576)) +- **ingest:** Tidy up the peripheraldevice api ingest method parameters and expect valid Ingest types to be sent by the gateway ([a49fb7c](https://github.com/nrkno/tv-automation-server-core/commit/a49fb7c)) +- **ingest:** Use Ingest types for the peripheraldevice ingest api methods (Some mangling is still done internally to fix up spreadsheet gateway data) ([4a5421b](https://github.com/nrkno/tv-automation-server-core/commit/4a5421b)) +- **init:** Adds default lawo device settings ([28759df](https://github.com/nrkno/tv-automation-server-core/commit/28759df)) +- **init:** adds qwerty to bakskjerm ([a45de4d](https://github.com/nrkno/tv-automation-server-core/commit/a45de4d)) +- **init:** adds qwerty to bakskjerm ([7329976](https://github.com/nrkno/tv-automation-server-core/commit/7329976)) +- **init:** adds qwerty to bakskjerm ([78198c9](https://github.com/nrkno/tv-automation-server-core/commit/78198c9)) +- userAction: increased timeout value for "waiting for..." notification ([f00e273](https://github.com/nrkno/tv-automation-server-core/commit/f00e273)) +- **init:** hides klokke and logo layers by default ([1847ca4](https://github.com/nrkno/tv-automation-server-core/commit/1847ca4)) +- **init:** Layer names ([221b374](https://github.com/nrkno/tv-automation-server-core/commit/221b374)) +- **init:** Layer names ([16a504c](https://github.com/nrkno/tv-automation-server-core/commit/16a504c)) +- **init:** Splits init_layers and init_config. ([e056e5a](https://github.com/nrkno/tv-automation-server-core/commit/e056e5a)) +- **init:** swaps MP2 and MP1NXT layers ([b8a370c](https://github.com/nrkno/tv-automation-server-core/commit/b8a370c)) +- **init:** updated channel orders after 2-caspar setup ([3404b9b](https://github.com/nrkno/tv-automation-server-core/commit/3404b9b)) +- **Init:** Creat empty settings for Nora ([f8d0669](https://github.com/nrkno/tv-automation-server-core/commit/f8d0669)) +- **Init:** fixes wrong mapping of Lawo RMs ([ee68432](https://github.com/nrkno/tv-automation-server-core/commit/ee68432)) +- **Init:** Sets init defaults to xpro ([fd9c182](https://github.com/nrkno/tv-automation-server-core/commit/fd9c182)) +- **Initdb:** Preload vignett ([156a454](https://github.com/nrkno/tv-automation-server-core/commit/156a454)) +- **Initdb:** Preload vignett ([9470318](https://github.com/nrkno/tv-automation-server-core/commit/9470318)) +- **iterateDeeply:** typos ([c9198f1](https://github.com/nrkno/tv-automation-server-core/commit/c9198f1)) +- **L3rd pop-up:** filter out properties starting with @ ([c85ebeb](https://github.com/nrkno/tv-automation-server-core/commit/c85ebeb)) +- **L3rd pop-up:** filter out properties starting with @ ([19977e7](https://github.com/nrkno/tv-automation-server-core/commit/19977e7)) +- **lawo:** changes tempaltes to new structure ([29bf666](https://github.com/nrkno/tv-automation-server-core/commit/29bf666)) +- **lawo:** more generic timeline object ([b0418ab](https://github.com/nrkno/tv-automation-server-core/commit/b0418ab)) +- **lookahead:** clear inGroup in a better fashion ([60541cc](https://github.com/nrkno/tv-automation-server-core/commit/60541cc)) +- **lookahead:** consider transitions properly in lookahead ([c78c6fa](https://github.com/nrkno/tv-automation-server-core/commit/c78c6fa)) +- **lookahead:** Dont run lookahead on abs0 sli if there is an active transition. ([bb4123a](https://github.com/nrkno/tv-automation-server-core/commit/bb4123a)) +- **lookahead:** Dont run lookahead on abs0 sli if there is an active transition. ([191df09](https://github.com/nrkno/tv-automation-server-core/commit/191df09)) +- **lookahead:** Fix lookahead when transition does not define clip. Fix duplicate key exception when using hold multiple times at the same point ([a1bb026](https://github.com/nrkno/tv-automation-server-core/commit/a1bb026)) +- **lookahead:** Fix lookahead when transition object starts at abs0 ([c88c830](https://github.com/nrkno/tv-automation-server-core/commit/c88c830)) +- **lookahead:** Fix lookahead when transition object starts at abs0 ([bd3edbd](https://github.com/nrkno/tv-automation-server-core/commit/bd3edbd)) +- **lookahead:** Give lookahead the correct limit when in the next SegmentLine during autonext ([a3a299a](https://github.com/nrkno/tv-automation-server-core/commit/a3a299a)) +- **lookahead:** Give lookahead the correct limit when in the next SegmentLine during autonext ([0b20b9e](https://github.com/nrkno/tv-automation-server-core/commit/0b20b9e)) +- **lookahead:** Ignore transition if this is the first sl and so no transition will be used ([3df2e1e](https://github.com/nrkno/tv-automation-server-core/commit/3df2e1e)) +- **lookahead:** Not using transition info when in a segmentline with no previous segmentline ([917b34e](https://github.com/nrkno/tv-automation-server-core/commit/917b34e)) +- **lookahead:** Produced objects not resolving properly ([7660bf5](https://github.com/nrkno/tv-automation-server-core/commit/7660bf5)) +- **lookahead:** Produced objects not resolving properly ([322a94f](https://github.com/nrkno/tv-automation-server-core/commit/322a94f)) +- **lookahead:** Resolving an object for both transition clip and main clip causing an extra loadbg ([875bd1a](https://github.com/nrkno/tv-automation-server-core/commit/875bd1a)) +- **lookahead:** Resolving an object for both transition clip and main clip causing an extra loadbg ([739b5e4](https://github.com/nrkno/tv-automation-server-core/commit/739b5e4)) +- **lookahead:** RETAIN mode now follows the WHEN_CLEAR behaviour instead of PRELOAD ([f0df41c](https://github.com/nrkno/tv-automation-server-core/commit/f0df41c)) +- **media formats:** do not 2x interlaced frame rates ([1639c32](https://github.com/nrkno/tv-automation-server-core/commit/1639c32)) +- **media manager:** label on MM workFlow ([fc2e8d5](https://github.com/nrkno/tv-automation-server-core/commit/fc2e8d5)) +- **media manager ui:** display work step labels correctly ([05cce78](https://github.com/nrkno/tv-automation-server-core/commit/05cce78)) +- **media manager ui:** fix task list layout issue ([9902dc1](https://github.com/nrkno/tv-automation-server-core/commit/9902dc1)) +- **media manager ui:** media manager flow order ([1eb1c48](https://github.com/nrkno/tv-automation-server-core/commit/1eb1c48)) +- **migration:** Missing studio0_audio_bed ([1c6edcc](https://github.com/nrkno/tv-automation-server-core/commit/1c6edcc)) +- **migration:** overrideSteps should be applied before .validate() is run, so overrideSteps works independent of the validation result. ([c9c1f25](https://github.com/nrkno/tv-automation-server-core/commit/c9c1f25)) +- **migrations:** Broken StudioContext.updateDevice method ([d882e8b](https://github.com/nrkno/tv-automation-server-core/commit/d882e8b)) +- **migrations:** Broken StudioContext.updateDevice method ([7311d10](https://github.com/nrkno/tv-automation-server-core/commit/7311d10)) +- **migrations:** Check migrate function exists before trying to run it ([cf076f5](https://github.com/nrkno/tv-automation-server-core/commit/cf076f5)) +- **migrations:** Create ShowStyleVariant with ShowStyleBase in the migrations and setup studio to use it as its default ([75073d4](https://github.com/nrkno/tv-automation-server-core/commit/75073d4)) +- **migrations:** DependOnResultFrom id was not being prefixed causing it to never work ([5830754](https://github.com/nrkno/tv-automation-server-core/commit/5830754)) +- **migrations:** DependOnResultFrom id was not being prefixed causing it to never work ([602740c](https://github.com/nrkno/tv-automation-server-core/commit/602740c)) +- **migrations:** Ensure there are migrations to run before running another batch ([c3d77b5](https://github.com/nrkno/tv-automation-server-core/commit/c3d77b5)) +- **migrations:** Ensure there are migrations to run before running another batch ([3b703e5](https://github.com/nrkno/tv-automation-server-core/commit/3b703e5)) +- **migrations:** Uncomment mos check migration ([c262fff](https://github.com/nrkno/tv-automation-server-core/commit/c262fff)) +- **migrations:** Various problems when running from empty ([11d1d0b](https://github.com/nrkno/tv-automation-server-core/commit/11d1d0b)) +- **mos:** Mos ingest typing errors ([8f08f6e](https://github.com/nrkno/tv-automation-server-core/commit/8f08f6e)) +- **mos:** move stories. Refactor updating next-part to be seperately testable ([19b2d05](https://github.com/nrkno/tv-automation-server-core/commit/19b2d05)) +- **mos:** Segment externalId is now based on externalId of first part, instead of rank ([0916113](https://github.com/nrkno/tv-automation-server-core/commit/0916113)) +- **mos:** Set next part logic after story updates ([2b8cf47](https://github.com/nrkno/tv-automation-server-core/commit/2b8cf47)) +- **notification center:** fix notification center toggle button in RO view ([894c1e2](https://github.com/nrkno/tv-automation-server-core/commit/894c1e2)) +- **notification center:** fix running order overview to line up with the Segments column ([0906cab](https://github.com/nrkno/tv-automation-server-core/commit/0906cab)) +- **notification center:** notification count position ([1d8d2cb](https://github.com/nrkno/tv-automation-server-core/commit/1d8d2cb)) +- **notification center:** reintroduce RunningOrderNotifier into RunningOrderView ([e70e5c9](https://github.com/nrkno/tv-automation-server-core/commit/e70e5c9)) +- **notifications:** change unknown to any ([7ac8008](https://github.com/nrkno/tv-automation-server-core/commit/7ac8008)) +- **Notifications refresh:** limit amount of reactive vars ([2c01e66](https://github.com/nrkno/tv-automation-server-core/commit/2c01e66)) +- **NRK Template:** Use LLayers Enum ([84ed5df](https://github.com/nrkno/tv-automation-server-core/commit/84ed5df)) +- **pharos:** add missing settingsType and migration step ([9f73a8e](https://github.com/nrkno/tv-automation-server-core/commit/9f73a8e)) +- **pharos:** add missing settingsType and migration step ([be618d2](https://github.com/nrkno/tv-automation-server-core/commit/be618d2)) +- **playout:** bad timing during autonext ([5524e3b](https://github.com/nrkno/tv-automation-server-core/commit/5524e3b)) +- **playout:** Better account for duration and overlaps with transitions etc. ([dc249a3](https://github.com/nrkno/tv-automation-server-core/commit/dc249a3)) +- **playout:** Double head2 headline out animation ([7ec91ff](https://github.com/nrkno/tv-automation-server-core/commit/7ec91ff)) +- **playout:** Double head2 headline out animation ([165e2c0](https://github.com/nrkno/tv-automation-server-core/commit/165e2c0)) +- **playout:** Ensure that infinite segmentLineItems are reset correctly after being removed by some hotkeys ([e4f8a83](https://github.com/nrkno/tv-automation-server-core/commit/e4f8a83)) +- **playout:** Ensure that infinite segmentLineItems are reset correctly after being removed by some hotkeys ([045c9b1](https://github.com/nrkno/tv-automation-server-core/commit/045c9b1)) +- **playout:** Fix overlap tests ([15628a2](https://github.com/nrkno/tv-automation-server-core/commit/15628a2)) +- **playout:** ID prefixing did not handle logical object id references ([44f2883](https://github.com/nrkno/tv-automation-server-core/commit/44f2883)) +- **playout:** Infinite item continuations were not always updated correctly ([7a7aed6](https://github.com/nrkno/tv-automation-server-core/commit/7a7aed6)) +- **playout:** Objects being written out without an id ([b05a851](https://github.com/nrkno/tv-automation-server-core/commit/b05a851)) +- **playout:** Optimise layers of promises in infinite generation logic, and reorder function parameters ([e400c7c](https://github.com/nrkno/tv-automation-server-core/commit/e400c7c)) +- **playout:** R4 only partial merge of dc249a31b342e8bdbeb7faac064dd97cec15c3e8. Fix sl duration with autonext and no transitions ([17175c3](https://github.com/nrkno/tv-automation-server-core/commit/17175c3)) +- **playout:** Refactor setting object siId ([48de044](https://github.com/nrkno/tv-automation-server-core/commit/48de044)) +- **playout:** sl with autoNextOverlap not getting applied properly ([eb22967](https://github.com/nrkno/tv-automation-server-core/commit/eb22967)) +- **playout:** StatObj not being generated ([581d99d](https://github.com/nrkno/tv-automation-server-core/commit/581d99d)) +- **playout:** Typo in ID prefixing ([249b35d](https://github.com/nrkno/tv-automation-server-core/commit/249b35d)) +- **playout:** Use original sli id when adding infinite to the timeline, to ensure that any triggers on other objects resolve ([e7eb871](https://github.com/nrkno/tv-automation-server-core/commit/e7eb871)) +- **playout:** Use original sli id when adding infinite to the timeline, to ensure that any triggers on other objects resolve ([c0382ec](https://github.com/nrkno/tv-automation-server-core/commit/c0382ec)) +- **presenter screen:** display hours correctly ([e242a9e](https://github.com/nrkno/tv-automation-server-core/commit/e242a9e)) +- **presenter screen:** split background + text spacing ([9aad750](https://github.com/nrkno/tv-automation-server-core/commit/9aad750)) +- **rabbitmq:** send persistant messages ([ff8d375](https://github.com/nrkno/tv-automation-server-core/commit/ff8d375)) +- **record:** CR changes ([b3adbec](https://github.com/nrkno/tv-automation-server-core/commit/b3adbec)) +- **record:** Hide internal layer mappings ([24dfef1](https://github.com/nrkno/tv-automation-server-core/commit/24dfef1)) +- **refactor:** existing runningOrders were not migrated to the new data structure ([b20bc2d](https://github.com/nrkno/tv-automation-server-core/commit/b20bc2d)) +- **refactor:** remove stray debugger calls ([3be5c22](https://github.com/nrkno/tv-automation-server-core/commit/3be5c22)) +- use Range check instead of Version for minimumCoreVersion ([392c646](https://github.com/nrkno/tv-automation-server-core/commit/392c646)) +- **ro list:** translatify & hide 'Unsynced from MOS' label when no unsynced items ([fa56ecd](https://github.com/nrkno/tv-automation-server-core/commit/fa56ecd)) +- **ro list:** translatify & hide 'Unsynced from MOS' label when no unsynced items ([11b0f29](https://github.com/nrkno/tv-automation-server-core/commit/11b0f29)) +- **RO view:** Always persist original event in user-action methods ([6ba7df8](https://github.com/nrkno/tv-automation-server-core/commit/6ba7df8)) +- use admin as parameter instead of all ([20751b4](https://github.com/nrkno/tv-automation-server-core/commit/20751b4)) +- use DisplayName field for graphic elements ([e2e9014](https://github.com/nrkno/tv-automation-server-core/commit/e2e9014)) +- use floor for all positioning and sizing of segment lines ([8a84a7e](https://github.com/nrkno/tv-automation-server-core/commit/8a84a7e)) +- Use more consistent inputs in Blueprints page ([d223d11](https://github.com/nrkno/tv-automation-server-core/commit/d223d11)) +- wait for response from MOS device until resolving segmentLineItemSetInOutPoints ([2572a11](https://github.com/nrkno/tv-automation-server-core/commit/2572a11)) +- **vignett:** do not preload vignett, as it is risky business preloading sluttvignett. Could be done better by separating vignett and sluttvignett ([b0da067](https://github.com/nrkno/tv-automation-server-core/commit/b0da067)) +- Use new mediaPreviewsUrl setting ([1bd0ba4](https://github.com/nrkno/tv-automation-server-core/commit/1bd0ba4)) +- use parseRange for expected versions ([1604bea](https://github.com/nrkno/tv-automation-server-core/commit/1604bea)) +- use studioInstallationId of parent peripheralDevice ([7dedf9b](https://github.com/nrkno/tv-automation-server-core/commit/7dedf9b)) +- Use thin styling for a solo 'AUTO' label ([74b5f15](https://github.com/nrkno/tv-automation-server-core/commit/74b5f15)) +- Use thin styling for a solo 'AUTO' label ([0c26d38](https://github.com/nrkno/tv-automation-server-core/commit/0c26d38)) +- use unique id for baseline items cache entries ([cf89409](https://github.com/nrkno/tv-automation-server-core/commit/cf89409)) +- useractions: proper handling of the this keyword ([49a44a7](https://github.com/nrkno/tv-automation-server-core/commit/49a44a7)) +- useractions: proper handling of the this keyword ([a2686db](https://github.com/nrkno/tv-automation-server-core/commit/a2686db)) +- userActivity executionTime logging ([a3e763e](https://github.com/nrkno/tv-automation-server-core/commit/a3e763e)) +- Using object as notification message ([f06aee6](https://github.com/nrkno/tv-automation-server-core/commit/f06aee6)) +- various fixes after refactoring ([1a17414](https://github.com/nrkno/tv-automation-server-core/commit/1a17414)) +- various fixes for mocks ([aebcfc7](https://github.com/nrkno/tv-automation-server-core/commit/aebcfc7)) +- version handling ([4b9863a](https://github.com/nrkno/tv-automation-server-core/commit/4b9863a)) +- when (for some reason) the currently playing part is missing in db, it was impossible to continue. ([e3ba048](https://github.com/nrkno/tv-automation-server-core/commit/e3ba048)) +- when activating, set Next if not set ([c9f71a1](https://github.com/nrkno/tv-automation-server-core/commit/c9f71a1)) +- when overriding componentWillUnmount, we need to call this.\_cleanup() ([0f39cd4](https://github.com/nrkno/tv-automation-server-core/commit/0f39cd4)) +- when restoring a runningOrder, use the .active property of the database (or false) ([b5e5b05](https://github.com/nrkno/tv-automation-server-core/commit/b5e5b05)) +- wrap all MeteorReactComponent.autoruns in nonreactive. ([9020c96](https://github.com/nrkno/tv-automation-server-core/commit/9020c96)) +- wrap ntpClient.getNetworkTime() in try/catch, as an attempt to fix fatal error thrown ([cd44862](https://github.com/nrkno/tv-automation-server-core/commit/cd44862)) +- write back TimeBase when changing EditorialStart/Duration ([8012cea](https://github.com/nrkno/tv-automation-server-core/commit/8012cea)) +- **templates:** Fix incorrect camera number used with head transition. Hook in sluttvignett. Fix segments not respecting overlapduration if no transition is used ([00b7cdd](https://github.com/nrkno/tv-automation-server-core/commit/00b7cdd)) +- write back TimeBase with EditorialStart/Duration ([96f8e21](https://github.com/nrkno/tv-automation-server-core/commit/96f8e21)) +- **rundown layout:** don't display segment headers when currentSegemnt filter is on ([9b09858](https://github.com/nrkno/tv-automation-server-core/commit/9b09858)) +- **rundown layouts:** issue with layer type filtering ([c41bd5a](https://github.com/nrkno/tv-automation-server-core/commit/c41bd5a)) +- **RundownView:** don't wrap on system status header ([0daaa6a](https://github.com/nrkno/tv-automation-server-core/commit/0daaa6a)) +- **runtimeArgs:** Removing infinite items from changed sl and anything following ([28ffd5d](https://github.com/nrkno/tv-automation-server-core/commit/28ffd5d)) +- **snapshot:** SegmentLines were not being included in the snapshot ([d9a427e](https://github.com/nrkno/tv-automation-server-core/commit/d9a427e)) +- **snapshot:** SegmentLines were not being included in the snapshot ([224f806](https://github.com/nrkno/tv-automation-server-core/commit/224f806)) +- **sticky:** Fix sticky items with objects using relative triggers or durations ([0c47cff](https://github.com/nrkno/tv-automation-server-core/commit/0c47cff)) +- **template:** Caspar portion of in-transition for segmentline rerun whenever timeline was recalculated ([3373457](https://github.com/nrkno/tv-automation-server-core/commit/3373457)) +- **template:** graphic supers group using wrong trigger. ([e28d1ef](https://github.com/nrkno/tv-automation-server-core/commit/e28d1ef)) +- **template:** Reduce volume of head wipes ([b2092cc](https://github.com/nrkno/tv-automation-server-core/commit/b2092cc)) +- **template:** setup dsk properly ([2e8309c](https://github.com/nrkno/tv-automation-server-core/commit/2e8309c)) +- **templates:** use enum for nora channels ([55c0cfc](https://github.com/nrkno/tv-automation-server-core/commit/55c0cfc)) +- **templates:** Various tweaks ([eb93c6a](https://github.com/nrkno/tv-automation-server-core/commit/eb93c6a)) +- **Test:** Verifying build and deploy script ([0b13e18](https://github.com/nrkno/tv-automation-server-core/commit/0b13e18)) +- **timeline:** don't round items in relative mode ([2938819](https://github.com/nrkno/tv-automation-server-core/commit/2938819)) +- **timeline:** Infinite sli do not update properly on new mos data. Fix detection of the end of the chain, and ensure the last is set to not infinite ([16d9715](https://github.com/nrkno/tv-automation-server-core/commit/16d9715)) +- **timeline:** Infinite sli do not update properly on new mos data. Fix detection of the end of the chain, and ensure the last is set to not infinite ([61b2930](https://github.com/nrkno/tv-automation-server-core/commit/61b2930)) +- **Timeline:** Corrects the angle of the gradient indication mix-in-transition on a segmentLineItem ([151ecf9](https://github.com/nrkno/tv-automation-server-core/commit/151ecf9)) +- **transition:** Delay sli not contents, to ensure relative triggers against the sli are correct (fixes sluttvignett with transition) ([856da4b](https://github.com/nrkno/tv-automation-server-core/commit/856da4b)) +- **transition:** reverses direction of wipe transitions ([9961a3f](https://github.com/nrkno/tv-automation-server-core/commit/9961a3f)) +- **transition:** Using wrong overlap when combined with autonext ([4c56102](https://github.com/nrkno/tv-automation-server-core/commit/4c56102)) +- **transitions:** Ensure they are run with the correct overlap on autonext ([bbc6ca2](https://github.com/nrkno/tv-automation-server-core/commit/bbc6ca2)) +- **transitions:** Timed graphics being run wrong ([8b39960](https://github.com/nrkno/tv-automation-server-core/commit/8b39960)) +- **UI:** Improves device settings and status page by removing information ([267c10c](https://github.com/nrkno/tv-automation-server-core/commit/267c10c)) +- **unsync:** refactor, add method to unsync runningOrder ([d54c147](https://github.com/nrkno/tv-automation-server-core/commit/d54c147)) +- Wrong icon for split in presenter view ([1ec1c56](https://github.com/nrkno/tv-automation-server-core/commit/1ec1c56)) +- Wrong icon for split in presenter view ([08c8df8](https://github.com/nrkno/tv-automation-server-core/commit/08c8df8)) +- **vignett:** do not preload vignett, as it is risky business preloading sluttvignett. Could be done better by separating vignett and sluttvignett ([8bf7ff8](https://github.com/nrkno/tv-automation-server-core/commit/8bf7ff8)) +- **zoom:** moved zoom modifier for scroll action to ctrl ([863d81e](https://github.com/nrkno/tv-automation-server-core/commit/863d81e)) +- **zoom:** moved zoom modifier for scroll action to ctrl ([80829f2](https://github.com/nrkno/tv-automation-server-core/commit/80829f2)) ### Features -* add & remove studios ([81749b4](https://github.com/nrkno/tv-automation-server-core/commit/81749b4)) -* add a label of the source Piece on the ExpectedMediaItems ([bad1576](https://github.com/nrkno/tv-automation-server-core/commit/bad1576)) -* add a subtle line underneath segment title when has-remote-items and has-guest-items ([a02b50d](https://github.com/nrkno/tv-automation-server-core/commit/a02b50d)) -* add a subtle line underneath segment title when has-remote-items and has-guest-items ([4b1d582](https://github.com/nrkno/tv-automation-server-core/commit/4b1d582)) -* add a user-definable CoreSystem.name that is displayed in the header and title bar ([717ee45](https://github.com/nrkno/tv-automation-server-core/commit/717ee45)) -* add a user-definable CoreSystem.name that is displayed in the header and title bar ([493568e](https://github.com/nrkno/tv-automation-server-core/commit/493568e)) -* Add backup link to backup only active template data ([cdfffdf](https://github.com/nrkno/tv-automation-server-core/commit/cdfffdf)) -* Add backup restore method to import mock rundowns similar to the embedded mocks ([d71d9c7](https://github.com/nrkno/tv-automation-server-core/commit/d71d9c7)) -* Add backup restore method to import mock rundowns similar to the embedded mocks ([251555b](https://github.com/nrkno/tv-automation-server-core/commit/251555b)) -* add category, type & subType to peripheralDevice ([34469f5](https://github.com/nrkno/tv-automation-server-core/commit/34469f5)) -* add checkbox for debugLogging in media manager ([64b80e9](https://github.com/nrkno/tv-automation-server-core/commit/64b80e9)) -* add default mocks ([2985af8](https://github.com/nrkno/tv-automation-server-core/commit/2985af8)) -* add editorconfig ([296f71d](https://github.com/nrkno/tv-automation-server-core/commit/296f71d)) -* add expected media items collection ([931536e](https://github.com/nrkno/tv-automation-server-core/commit/931536e)) -* Add expected media items collection ([04c15a9](https://github.com/nrkno/tv-automation-server-core/commit/04c15a9)) -* add fetchFrom() as a wrapper for fetch(), to handle non-200 responses as errors ([4e3734c](https://github.com/nrkno/tv-automation-server-core/commit/4e3734c)) -* add fonts ([e617d60](https://github.com/nrkno/tv-automation-server-core/commit/e617d60)) -* Add http put request timeline object ([14f391c](https://github.com/nrkno/tv-automation-server-core/commit/14f391c)) -* add httpWatcher settings ([fbb91d9](https://github.com/nrkno/tv-automation-server-core/commit/fbb91d9)) -* add IngestActions.regenerateRundown, for debugging & resetting of rundown ([ebefd42](https://github.com/nrkno/tv-automation-server-core/commit/ebefd42)) -* add jest ([3fab0ed](https://github.com/nrkno/tv-automation-server-core/commit/3fab0ed)) -* add link to compatible studios from ShowStyle page ([4be495c](https://github.com/nrkno/tv-automation-server-core/commit/4be495c)) -* Add LOG_FILE env var to specify the file to log to ([d2ad941](https://github.com/nrkno/tv-automation-server-core/commit/d2ad941)) -* Add LOG_FILE env var to specify the file to log to ([8a192bc](https://github.com/nrkno/tv-automation-server-core/commit/8a192bc)) -* Add Media_Manager DeviceType ([2b612c7](https://github.com/nrkno/tv-automation-server-core/commit/2b612c7)) -* add methods for insert/remove blueprints ([8acb72b](https://github.com/nrkno/tv-automation-server-core/commit/8acb72b)) -* add migration steps, logging ([96aae63](https://github.com/nrkno/tv-automation-server-core/commit/96aae63)) -* add migrations for 0.25.0 ([9165255](https://github.com/nrkno/tv-automation-server-core/commit/9165255)) -* add nn translation and update nb translation ([922b93b](https://github.com/nrkno/tv-automation-server-core/commit/922b93b)) -* add nn-nynorsk and update nb-bokmal translation ([6db7a99](https://github.com/nrkno/tv-automation-server-core/commit/6db7a99)) -* add notes to RunningOrder ([6100b0c](https://github.com/nrkno/tv-automation-server-core/commit/6100b0c)) -* add option to input data into a ModalDialogue ([ef54b74](https://github.com/nrkno/tv-automation-server-core/commit/ef54b74)) -* Add OSC Playout device type ([bf426b5](https://github.com/nrkno/tv-automation-server-core/commit/bf426b5)) -* add performance monitor and track all server-side methods ([385f703](https://github.com/nrkno/tv-automation-server-core/commit/385f703)) -* add performance monitor and track all server-side methods ([2733d74](https://github.com/nrkno/tv-automation-server-core/commit/2733d74)) -* add peripheralDevice expectedVersions, to throw error if device version is too low. Refactor /health endpoint. ([51ed4c3](https://github.com/nrkno/tv-automation-server-core/commit/51ed4c3)) -* add property .deviceId to MediaWorkFlow & MedieWorkFlowStep, to indicate ownership. (preliminary implementation) ([62ac066](https://github.com/nrkno/tv-automation-server-core/commit/62ac066)) -* add restart button ([9b43d6f](https://github.com/nrkno/tv-automation-server-core/commit/9b43d6f)) -* add restart button ([6083145](https://github.com/nrkno/tv-automation-server-core/commit/6083145)) -* add retryDuration for external messages. ([c19d84b](https://github.com/nrkno/tv-automation-server-core/commit/c19d84b)) -* add rewind button ([9fd61b5](https://github.com/nrkno/tv-automation-server-core/commit/9fd61b5)) -* add rewind button ([f235a25](https://github.com/nrkno/tv-automation-server-core/commit/f235a25)) -* Add runHelper method to template context ([ebc477a](https://github.com/nrkno/tv-automation-server-core/commit/ebc477a)) -* Add running order name to top of run page ([674c392](https://github.com/nrkno/tv-automation-server-core/commit/674c392)) -* Add SegmentLineItem.infiniteMode value for items which are infinite within the SegmentLine ([e99c661](https://github.com/nrkno/tv-automation-server-core/commit/e99c661)) -* add setting for playout device: multiThreadedResolver ([37f2aa7](https://github.com/nrkno/tv-automation-server-core/commit/37f2aa7)) -* add snapshot restore statistics to logging ([45115f3](https://github.com/nrkno/tv-automation-server-core/commit/45115f3)) -* Add some new template config data for sources information ([3e48508](https://github.com/nrkno/tv-automation-server-core/commit/3e48508)) -* add some responsive styling to the RD view ([a133947](https://github.com/nrkno/tv-automation-server-core/commit/a133947)) -* add sourceLayerType.LIGHTS ([0554251](https://github.com/nrkno/tv-automation-server-core/commit/0554251)) -* add stoppedPlayback tracking ([ddbdd66](https://github.com/nrkno/tv-automation-server-core/commit/ddbdd66)) -* add stoppedPlayback tracking ([7345856](https://github.com/nrkno/tv-automation-server-core/commit/7345856)) -* add studioInstallation.settings, mediaPreviewsUrl and sofieUrl, to replace configs ([adc6cb5](https://github.com/nrkno/tv-automation-server-core/commit/adc6cb5)) -* add support for Config References (to be used for referencing usernames & passwords) ([6df8c6e](https://github.com/nrkno/tv-automation-server-core/commit/6df8c6e)) -* add support for refs in rabbitMQ-messages (for username & password) ([e34ee34](https://github.com/nrkno/tv-automation-server-core/commit/e34ee34)) -* add support for refs in rabbitMQ-messages (for username & password) ([5b3ea33](https://github.com/nrkno/tv-automation-server-core/commit/5b3ea33)) -* Add support for RuntimeArguments in blueprint migrations ([82e5286](https://github.com/nrkno/tv-automation-server-core/commit/82e5286)) -* Add support panel in Running Order View ([e3cee77](https://github.com/nrkno/tv-automation-server-core/commit/e3cee77)) -* Add typeSubVariant field to SegmentLine. ([#46](https://github.com/nrkno/tv-automation-server-core/issues/46)) ([82bd4bd](https://github.com/nrkno/tv-automation-server-core/commit/82bd4bd)) -* Add typeSubVariant field to SegmentLine. ([#46](https://github.com/nrkno/tv-automation-server-core/issues/46)) ([4af88d3](https://github.com/nrkno/tv-automation-server-core/commit/4af88d3)) -* add utility CSS classes for support message ([95e1424](https://github.com/nrkno/tv-automation-server-core/commit/95e1424)) -* Add version string field to blueprint collection ([869dd02](https://github.com/nrkno/tv-automation-server-core/commit/869dd02)) -* add versions to /health endpoint ([a324213](https://github.com/nrkno/tv-automation-server-core/commit/a324213)) -* add warning of unsent messages to rundown notifications ([f65309f](https://github.com/nrkno/tv-automation-server-core/commit/f65309f)) -* Add warning to rundown when config changed ([#69](https://github.com/nrkno/tv-automation-server-core/issues/69)) ([4f5e6a9](https://github.com/nrkno/tv-automation-server-core/commit/4f5e6a9)) -* add warnings for wrong field order ([c4d23d8](https://github.com/nrkno/tv-automation-server-core/commit/c4d23d8)) -* added .timings object to SegmentLine, to track take/playout times during playout ([5d860b3](https://github.com/nrkno/tv-automation-server-core/commit/5d860b3)) -* added "develop=1" to url, which re-enables right-click, for dev ([b73522c](https://github.com/nrkno/tv-automation-server-core/commit/b73522c)) -* added afterBroadcast form ([e98b59e](https://github.com/nrkno/tv-automation-server-core/commit/e98b59e)) -* added async database functions ([a754a24](https://github.com/nrkno/tv-automation-server-core/commit/a754a24)) -* added client-side logging wrapper ([06597be](https://github.com/nrkno/tv-automation-server-core/commit/06597be)) -* added connection status of peripheralDevices ([c0e0a94](https://github.com/nrkno/tv-automation-server-core/commit/c0e0a94)) -* added context.runningOrder, for blueprints to use ([855f6d4](https://github.com/nrkno/tv-automation-server-core/commit/855f6d4)) -* added device version to status page ([ed0acda](https://github.com/nrkno/tv-automation-server-core/commit/ed0acda)) -* Added dynamic template context ([0ea4849](https://github.com/nrkno/tv-automation-server-core/commit/0ea4849)) -* added executionTime to userAction ([1ca92c1](https://github.com/nrkno/tv-automation-server-core/commit/1ca92c1)) -* added getAllSegments, to use in metadata-template ([f8a5514](https://github.com/nrkno/tv-automation-server-core/commit/f8a5514)) -* added indexes for all collections ([6ef324c](https://github.com/nrkno/tv-automation-server-core/commit/6ef324c)) -* added kill process buttons to device status UI ([6fdab68](https://github.com/nrkno/tv-automation-server-core/commit/6fdab68)) -* added killProcess method, to be used by integration tests of gateways in closed environments ([7f2b42c](https://github.com/nrkno/tv-automation-server-core/commit/7f2b42c)) -* added MeteorReactComponent, which exposes subscribe & autorun, which will stop automatically on component unmount ([cf11808](https://github.com/nrkno/tv-automation-server-core/commit/cf11808)) -* added name and type to peripheralDevice ([915c518](https://github.com/nrkno/tv-automation-server-core/commit/915c518)) -* added packages: mocha and typescript ([8b19269](https://github.com/nrkno/tv-automation-server-core/commit/8b19269)) -* added peripheralDevice.lastConnected, to be used for sorting so they wont jump around in the UI ([08e97f7](https://github.com/nrkno/tv-automation-server-core/commit/08e97f7)) -* added pingWithCommand method, used by watchdog ([6f6427b](https://github.com/nrkno/tv-automation-server-core/commit/6f6427b)) -* Added publications for all running order data, and changed some interfaces ([2365fd2](https://github.com/nrkno/tv-automation-server-core/commit/2365fd2)) -* added SegmentLine.timings.stoppedPlayback property ([2121245](https://github.com/nrkno/tv-automation-server-core/commit/2121245)) -* added SegmentLine.timings.takeDone property ([d18d539](https://github.com/nrkno/tv-automation-server-core/commit/d18d539)) -* added some shadow to the status dots ([04df33c](https://github.com/nrkno/tv-automation-server-core/commit/04df33c)) -* added support for typescript ([d3471b3](https://github.com/nrkno/tv-automation-server-core/commit/d3471b3)) -* added temporary deploy script ([244fb5b](https://github.com/nrkno/tv-automation-server-core/commit/244fb5b)) -* added test-data for testing and mocking ([b277c3c](https://github.com/nrkno/tv-automation-server-core/commit/b277c3c)) -* added tests stub ([edd4b6e](https://github.com/nrkno/tv-automation-server-core/commit/edd4b6e)) -* added tictac for troubleshooting timings ([df91cea](https://github.com/nrkno/tv-automation-server-core/commit/df91cea)) -* added Timeline data structure ([35ce6db](https://github.com/nrkno/tv-automation-server-core/commit/35ce6db)) -* added Timeline.objectType and implemented the typing changes all around ([a69e626](https://github.com/nrkno/tv-automation-server-core/commit/a69e626)) -* added timestamp to externalMessage error ([e13d1d8](https://github.com/nrkno/tv-automation-server-core/commit/e13d1d8)) -* added timings property to adlig segmentLineItems ([b333bf1](https://github.com/nrkno/tv-automation-server-core/commit/b333bf1)) -* added unsyncedTime ([8fcffb5](https://github.com/nrkno/tv-automation-server-core/commit/8fcffb5)) -* added updateStoryStatus. The yellow line will only be driven when this is set to true ([c7ec8da](https://github.com/nrkno/tv-automation-server-core/commit/c7ec8da)) -* Adjust split box values ([680eb11](https://github.com/nrkno/tv-automation-server-core/commit/680eb11)) -* allow ? as 'any' field/frame type ([c950fba](https://github.com/nrkno/tv-automation-server-core/commit/c950fba)) -* allow a place to store MediaWorkFlow comments ([a2c54fb](https://github.com/nrkno/tv-automation-server-core/commit/a2c54fb)) -* allow a string array as mediaFlowIds in SLI content ([7ac6fb5](https://github.com/nrkno/tv-automation-server-core/commit/7ac6fb5)) -* allow admins to delete non-unsynced running orders ([190ca36](https://github.com/nrkno/tv-automation-server-core/commit/190ca36)) -* allow reconnection action on click ([3575f4f](https://github.com/nrkno/tv-automation-server-core/commit/3575f4f)) -* Allow StudioInstallation to define entries in the hotkey legend ([74c1c1c](https://github.com/nrkno/tv-automation-server-core/commit/74c1c1c)) -* Allow to specify blueprint name in request query string ([e8c2dc9](https://github.com/nrkno/tv-automation-server-core/commit/e8c2dc9)) -* ask before closing an active RO (if allowed by browser) ([16ee66b](https://github.com/nrkno/tv-automation-server-core/commit/16ee66b)) -* Atem SuperSource properties support ([2688142](https://github.com/nrkno/tv-automation-server-core/commit/2688142)) -* autonext property is defined on the current SegmentLine rather than the next ([09441db](https://github.com/nrkno/tv-automation-server-core/commit/09441db)) -* backend implementation of migration (wip) ([8762ca3](https://github.com/nrkno/tv-automation-server-core/commit/8762ca3)) -* backup and restore show styles (including templates) through ui ([9758b2c](https://github.com/nrkno/tv-automation-server-core/commit/9758b2c)) -* basic setup of jest ([6dd0fcd](https://github.com/nrkno/tv-automation-server-core/commit/6dd0fcd)) -* Batch uploading of blueprints in one http request ([5a707e1](https://github.com/nrkno/tv-automation-server-core/commit/5a707e1)) -* be able to remove stored snapshots ([849f906](https://github.com/nrkno/tv-automation-server-core/commit/849f906)) -* beautify "Upload blueprints" button ([2dce2c8](https://github.com/nrkno/tv-automation-server-core/commit/2dce2c8)) -* begin implementation of new blueprint interface (wip) ([d7aa2e4](https://github.com/nrkno/tv-automation-server-core/commit/d7aa2e4)) -* better return type from post-process ([a971b43](https://github.com/nrkno/tv-automation-server-core/commit/a971b43)) -* BIG refactoring of Core ([9d6ae9e](https://github.com/nrkno/tv-automation-server-core/commit/9d6ae9e)) -* black / freeze frame detection warnings ([7166177](https://github.com/nrkno/tv-automation-server-core/commit/7166177)) -* block take if duration since startedPlayback/take less than X ([99d41b9](https://github.com/nrkno/tv-automation-server-core/commit/99d41b9)) -* blueprint migration implementation (it works now) ([15250b2](https://github.com/nrkno/tv-automation-server-core/commit/15250b2)) -* blueprint migration, continued implementation ([ff507ab](https://github.com/nrkno/tv-automation-server-core/commit/ff507ab)) -* blueprintMigrations ([9527cae](https://github.com/nrkno/tv-automation-server-core/commit/9527cae)) -* blueprints context: handle notes externally (to ro notes) or internally (to logger) ([63640f2](https://github.com/nrkno/tv-automation-server-core/commit/63640f2)) -* Break nrk templates into seperate files. Parse KAM templates better ([2ec0433](https://github.com/nrkno/tv-automation-server-core/commit/2ec0433)) -* bump blueprints-integration version ([6f2c46d](https://github.com/nrkno/tv-automation-server-core/commit/6f2c46d)) -* Button to assign/unassign system blueprint ([edef22a](https://github.com/nrkno/tv-automation-server-core/commit/edef22a)) -* change heavy-light display style ([91a1931](https://github.com/nrkno/tv-automation-server-core/commit/91a1931)) -* change heavy-light display style ([329e2c6](https://github.com/nrkno/tv-automation-server-core/commit/329e2c6)) -* change labeled buttons to icons with tooltips in Media Transfer Status ([c5e582b](https://github.com/nrkno/tv-automation-server-core/commit/c5e582b)) -* Change styling for video monitors ([a01de7d](https://github.com/nrkno/tv-automation-server-core/commit/a01de7d)) -* Change styling for video monitors ([5de76fc](https://github.com/nrkno/tv-automation-server-core/commit/5de76fc)) -* change VideoEditMonitors behavior from hoverScrub to click-and-drag ([77327fe](https://github.com/nrkno/tv-automation-server-core/commit/77327fe)) -* change VideoEditMonitors behavior from hoverScrub to click-and-drag ([bc1ed2c](https://github.com/nrkno/tv-automation-server-core/commit/bc1ed2c)) -* changed keyboard shortcuts ([ef02f7c](https://github.com/nrkno/tv-automation-server-core/commit/ef02f7c)) -* changed restart CasparCG functionality ([dd567c2](https://github.com/nrkno/tv-automation-server-core/commit/dd567c2)) -* changed to retryUntil, added button ([1b31374](https://github.com/nrkno/tv-automation-server-core/commit/1b31374)) -* Changes for blueprints-integration typings ([8d1f37d](https://github.com/nrkno/tv-automation-server-core/commit/8d1f37d)) -* check AdLib media object status and display in Shelf ([3bacb40](https://github.com/nrkno/tv-automation-server-core/commit/3bacb40)) -* cherry-pick changes from the UI feature branch ([dfbb3b4](https://github.com/nrkno/tv-automation-server-core/commit/dfbb3b4)) -* clean up: show style, blueprint, blueprint logic names in UI ([e1ae6a7](https://github.com/nrkno/tv-automation-server-core/commit/e1ae6a7)) -* ClientAPI test suite ([69cad3f](https://github.com/nrkno/tv-automation-server-core/commit/69cad3f)) -* clip trim panel WIP ([9d01c2b](https://github.com/nrkno/tv-automation-server-core/commit/9d01c2b)) -* clip trim panel WIP ([36e79dc](https://github.com/nrkno/tv-automation-server-core/commit/36e79dc)) -* clip trim panel working, hide video monitor under a flag ([72ee490](https://github.com/nrkno/tv-automation-server-core/commit/72ee490)) -* codeControl: create syncFunctions which finer grained execution control based on arguments ([f53607f](https://github.com/nrkno/tv-automation-server-core/commit/f53607f)) -* componentize WorkFlow item ([f920e4b](https://github.com/nrkno/tv-automation-server-core/commit/f920e4b)) -* configuration UI for media manager ([b1883ec](https://github.com/nrkno/tv-automation-server-core/commit/b1883ec)) -* Consider transitions applied to objects via keyframes ([eb65a3c](https://github.com/nrkno/tv-automation-server-core/commit/eb65a3c)) -* Consider transitions applied to objects via keyframes ([e911760](https://github.com/nrkno/tv-automation-server-core/commit/e911760)) -* continue implementation of new blueprint interface ([b7d013d](https://github.com/nrkno/tv-automation-server-core/commit/b7d013d)) -* continue refactor of mos ingest logic ([c5b775a](https://github.com/nrkno/tv-automation-server-core/commit/c5b775a)) -* continue refactor of mos ingest logic ([ad6cbb1](https://github.com/nrkno/tv-automation-server-core/commit/ad6cbb1)) -* continued implementation of Migration (wip) ([72fbcb5](https://github.com/nrkno/tv-automation-server-core/commit/72fbcb5)) -* continued refactoring of ingest / mos data flow ([4ffe93a](https://github.com/nrkno/tv-automation-server-core/commit/4ffe93a)) -* converted app.js to typescript and added an example subscription-implementation ([da439af](https://github.com/nrkno/tv-automation-server-core/commit/da439af)) -* converted more subscriptions (WIP) ([e047fef](https://github.com/nrkno/tv-automation-server-core/commit/e047fef)) -* converted StudioInstallation into a class, adding getConfigValue as member method, a step towards DRY ([4af278e](https://github.com/nrkno/tv-automation-server-core/commit/4af278e)) -* CoreSystem initial implementation ([06369b2](https://github.com/nrkno/tv-automation-server-core/commit/06369b2)) -* countdown to running order expectedStart ([7b505c5](https://github.com/nrkno/tv-automation-server-core/commit/7b505c5)) -* create action buttons in the Support PopUp for reset PG, take snapshot, show hotkeys ([be89893](https://github.com/nrkno/tv-automation-server-core/commit/be89893)) -* cron job for restarting casparcg ([19898d1](https://github.com/nrkno/tv-automation-server-core/commit/19898d1)) -* Crude UI to rerun studio baseline ([25b2395](https://github.com/nrkno/tv-automation-server-core/commit/25b2395)) -* Crude ui to visualise generated timeline ([6e55382](https://github.com/nrkno/tv-automation-server-core/commit/6e55382)) -* css: import and use fonts in prompter ([97a8037](https://github.com/nrkno/tv-automation-server-core/commit/97a8037)) -* Define all special blueprints as options in the showstyle ([7e1da16](https://github.com/nrkno/tv-automation-server-core/commit/7e1da16)) -* disable in next segmentLine & refactoring ([669166c](https://github.com/nrkno/tv-automation-server-core/commit/669166c)) -* disable shortcut-keys when modalDialog is open ([24bab3f](https://github.com/nrkno/tv-automation-server-core/commit/24bab3f)) -* dismiss all notifcations ([896dbb5](https://github.com/nrkno/tv-automation-server-core/commit/896dbb5)) -* display ms in user activity log ([5172f2e](https://github.com/nrkno/tv-automation-server-core/commit/5172f2e)) -* display ms in user activity log ([7fc2744](https://github.com/nrkno/tv-automation-server-core/commit/7fc2744)) -* do not block click-to-take when trigger is absolute 0 ([cec86ca](https://github.com/nrkno/tv-automation-server-core/commit/cec86ca)) -* don't restore from old snapshots ([bab8bbb](https://github.com/nrkno/tv-automation-server-core/commit/bab8bbb)) -* ensure each sli has a mosId set ([57c977d](https://github.com/nrkno/tv-automation-server-core/commit/57c977d)) -* expected audioTracks property ([250dc79](https://github.com/nrkno/tv-automation-server-core/commit/250dc79)) -* expose moment to templates ([c2a1cc5](https://github.com/nrkno/tv-automation-server-core/commit/c2a1cc5)) -* externalMessage: allow for multiple messages to be generated at the same time ([284efbe](https://github.com/nrkno/tv-automation-server-core/commit/284efbe)) -* externalMessages implementation (it works now) ([3b8e88a](https://github.com/nrkno/tv-automation-server-core/commit/3b8e88a)) -* f9, f10 buttons step next forward & down (shift reverses direction) ([a3be0cf](https://github.com/nrkno/tv-automation-server-core/commit/a3be0cf)) -* First draft at uploading a blueprints blob into a new db collection, and running it instead of the existing baseline ([31c56d8](https://github.com/nrkno/tv-automation-server-core/commit/31c56d8)) -* force some function to run synchronously. experimental, WIP! ([54d83dd](https://github.com/nrkno/tv-automation-server-core/commit/54d83dd)) -* force some function to run synchronously. experimental, WIP! ([55a064c](https://github.com/nrkno/tv-automation-server-core/commit/55a064c)) -* full implementation of mos-functions, profile 0 & 2 ([4bafeeb](https://github.com/nrkno/tv-automation-server-core/commit/4bafeeb)) -* Generate full sl & sli data on create/update of both ro and segment ([7969c2e](https://github.com/nrkno/tv-automation-server-core/commit/7969c2e)) -* Grafikk lookahead/preload ([30a6b03](https://github.com/nrkno/tv-automation-server-core/commit/30a6b03)) -* Grafikk lookahead/preload ([78828fe](https://github.com/nrkno/tv-automation-server-core/commit/78828fe)) -* handle mos updates with dynamicallyInserted segmentLines ([1d292c0](https://github.com/nrkno/tv-automation-server-core/commit/1d292c0)) -* handle roList reply on reload RunningOrder data, also more refactoring & cleanup ([cee70c5](https://github.com/nrkno/tv-automation-server-core/commit/cee70c5)) -* Handle SegmentLine data operations, with the help of an improved data cache ([9c84271](https://github.com/nrkno/tv-automation-server-core/commit/9c84271)) -* HOLD mode ([e41c5a4](https://github.com/nrkno/tv-automation-server-core/commit/e41c5a4)) -* HOLD mode ([ae1dacf](https://github.com/nrkno/tv-automation-server-core/commit/ae1dacf)) -* Hold state UI ([d835efc](https://github.com/nrkno/tv-automation-server-core/commit/d835efc)) -* Hold state UI ([c7a17c7](https://github.com/nrkno/tv-automation-server-core/commit/c7a17c7)) -* hyperdeck device ([#49](https://github.com/nrkno/tv-automation-server-core/issues/49)) ([c706628](https://github.com/nrkno/tv-automation-server-core/commit/c706628)) -* if template 'getId' returns null, don't throw an error. Also when templateId is not found, send warning instead of an error ([d98f09d](https://github.com/nrkno/tv-automation-server-core/commit/d98f09d)) -* implement (upcoming) blueprint API ([d86faa5](https://github.com/nrkno/tv-automation-server-core/commit/d86faa5)) -* implement AdLib filters in RundownView ([b88ef64](https://github.com/nrkno/tv-automation-server-core/commit/b88ef64)) -* implement camera number-device mapping for PTZ ([374568d](https://github.com/nrkno/tv-automation-server-core/commit/374568d)) -* implement click-to-adlib completely ([577dcac](https://github.com/nrkno/tv-automation-server-core/commit/577dcac)) -* implement client-side error reporting to Core ([f747057](https://github.com/nrkno/tv-automation-server-core/commit/f747057)) -* implement fibers support when testing in Jest ([bb99e97](https://github.com/nrkno/tv-automation-server-core/commit/bb99e97)) -* implement mosRoStoryMove ([ab76cfb](https://github.com/nrkno/tv-automation-server-core/commit/ab76cfb)) -* implement Panasonic PTZ device ([42d8534](https://github.com/nrkno/tv-automation-server-core/commit/42d8534)) -* implement Panasonic PTZ settings ([f7840da](https://github.com/nrkno/tv-automation-server-core/commit/f7840da)) -* implement spliting long scripts into beginning and end in popup ([9fa8006](https://github.com/nrkno/tv-automation-server-core/commit/9fa8006)) -* implement support for Spreadsheet gateway ([44dab01](https://github.com/nrkno/tv-automation-server-core/commit/44dab01)) -* implement timeline-visualizer view ([e725618](https://github.com/nrkno/tv-automation-server-core/commit/e725618)) -* implementation of blueprint migrations ([5fec7a2](https://github.com/nrkno/tv-automation-server-core/commit/5fec7a2)) -* implementation of disable-next-segmentLineItem ([a06d196](https://github.com/nrkno/tv-automation-server-core/commit/a06d196)) -* implementation of invalid segmentLine & invalid segmentLineItem (adLib) ([7ddcede](https://github.com/nrkno/tv-automation-server-core/commit/7ddcede)) -* implementation of new blueprint API ([34f905f](https://github.com/nrkno/tv-automation-server-core/commit/34f905f)) -* implemented mos profiles 0-2 ([d803da1](https://github.com/nrkno/tv-automation-server-core/commit/d803da1)) -* Implemented Notes into data structure & GUI ([735b8c5](https://github.com/nrkno/tv-automation-server-core/commit/735b8c5)) -* implemented partial timeline fix ([c8b56e4](https://github.com/nrkno/tv-automation-server-core/commit/c8b56e4)) -* implemented stricter typing & changed classes to ReactMeteorComponent where applicable ([9d2166e](https://github.com/nrkno/tv-automation-server-core/commit/9d2166e)) -* implemented userActions ([2b343e6](https://github.com/nrkno/tv-automation-server-core/commit/2b343e6)) -* import MOS snapshot ([ad11dd6](https://github.com/nrkno/tv-automation-server-core/commit/ad11dd6)) -* improve code quality (switch div's to buttons where they should be) ([70d9348](https://github.com/nrkno/tv-automation-server-core/commit/70d9348)) -* improved layout for presenter countdowns ([2bd61cc](https://github.com/nrkno/tv-automation-server-core/commit/2bd61cc)) -* include expectedMediaItems in RunningOrder snapshots ([9fcbba0](https://github.com/nrkno/tv-automation-server-core/commit/9fcbba0)) -* Infinite segmentlineitem ([c02a641](https://github.com/nrkno/tv-automation-server-core/commit/c02a641)) -* initial implementation of externalMessages, (not working yet) ([ace91f1](https://github.com/nrkno/tv-automation-server-core/commit/ace91f1)) -* Initial implementation of importing a running order from spreadsheet gateway (wip) ([870a500](https://github.com/nrkno/tv-automation-server-core/commit/870a500)) -* initial implementation of new general data ingest API ([a2b4987](https://github.com/nrkno/tv-automation-server-core/commit/a2b4987)) -* initial implementation of Take with Offset functionality ([9c860ca](https://github.com/nrkno/tv-automation-server-core/commit/9c860ca)) -* Initial timings for opening templates ([a9bfb66](https://github.com/nrkno/tv-automation-server-core/commit/a9bfb66)) -* Interfaces for describing the timeline, segments (titles), layers ([ea96dfb](https://github.com/nrkno/tv-automation-server-core/commit/ea96dfb)) -* jest config & example implementation of module mocks ([43ac8fa](https://github.com/nrkno/tv-automation-server-core/commit/43ac8fa)) -* jest mocks ([9fdadf3](https://github.com/nrkno/tv-automation-server-core/commit/9fdadf3)) -* KAM SLUTT variant ([e819269](https://github.com/nrkno/tv-automation-server-core/commit/e819269)) -* List, start and stop test recordings ([df552ab](https://github.com/nrkno/tv-automation-server-core/commit/df552ab)) -* load atem ssrc background when activating RO ([0eda9b4](https://github.com/nrkno/tv-automation-server-core/commit/0eda9b4)) -* log ClientResonseErrors as errors in userActionLog ([4bc10b5](https://github.com/nrkno/tv-automation-server-core/commit/4bc10b5)) -* log message on startup ([c715266](https://github.com/nrkno/tv-automation-server-core/commit/c715266)) -* log warning message when trying to access a studio.config value that hasn't been set. ([7e706c6](https://github.com/nrkno/tv-automation-server-core/commit/7e706c6)) -* log WorkFlow success or failure ([8e7d9d7](https://github.com/nrkno/tv-automation-server-core/commit/8e7d9d7)) -* lookahead ([5ed0f13](https://github.com/nrkno/tv-automation-server-core/commit/5ed0f13)) -* manipulator methods for inserting & removing showStyleBase & showStyleVariant ([6bb4e00](https://github.com/nrkno/tv-automation-server-core/commit/6bb4e00)) -* mark segmentline as invalid ([bd1f20c](https://github.com/nrkno/tv-automation-server-core/commit/bd1f20c)) -* Media Manager actions to restart & abort workflows ([6c94ad6](https://github.com/nrkno/tv-automation-server-core/commit/6c94ad6)) -* Media manager UI ([c83e1ff](https://github.com/nrkno/tv-automation-server-core/commit/c83e1ff)) -* media scanner & casparcg launcher hostnames ([02ec8be](https://github.com/nrkno/tv-automation-server-core/commit/02ec8be)) -* mediamanager: GUI support for SKIPPED step status ([1c39867](https://github.com/nrkno/tv-automation-server-core/commit/1c39867)) -* message queue retry button working with with retryUntil ([2fa05bb](https://github.com/nrkno/tv-automation-server-core/commit/2fa05bb)) -* MeteorReactComponent: return subscription & computation handle ([e20e6de](https://github.com/nrkno/tv-automation-server-core/commit/e20e6de)) -* method "ping" to be called by devices every now and then, to update lastSeen ([41a996c](https://github.com/nrkno/tv-automation-server-core/commit/41a996c)) -* Migration UI & started adding migration steps ([2a117ad](https://github.com/nrkno/tv-automation-server-core/commit/2a117ad)) -* Migration: added more migration steps for 0.16.0 ([2ac06ea](https://github.com/nrkno/tv-automation-server-core/commit/2ac06ea)) -* Migration: continued impl. ([8982701](https://github.com/nrkno/tv-automation-server-core/commit/8982701)) -* monitor externalMessageQueue for system status ([e92f5be](https://github.com/nrkno/tv-automation-server-core/commit/e92f5be)) -* more WIP for support panel ([b23c855](https://github.com/nrkno/tv-automation-server-core/commit/b23c855)) -* more work on notification center ([a34ccd0](https://github.com/nrkno/tv-automation-server-core/commit/a34ccd0)) -* more work on notification center ([92196ca](https://github.com/nrkno/tv-automation-server-core/commit/92196ca)) -* more work on peripheralDevices notifications ([692b1b2](https://github.com/nrkno/tv-automation-server-core/commit/692b1b2)) -* more work on peripheralDevices notifications ([36a0a4b](https://github.com/nrkno/tv-automation-server-core/commit/36a0a4b)) -* mos-actions ([248db8a](https://github.com/nrkno/tv-automation-server-core/commit/248db8a)) -* Move all device specific TimelineObj types to tsr-types ([55766a5](https://github.com/nrkno/tv-automation-server-core/commit/55766a5)) -* move delete button to peripheralDevice page ([46647c1](https://github.com/nrkno/tv-automation-server-core/commit/46647c1)) -* move delete button to peripheralDevice page ([286d12f](https://github.com/nrkno/tv-automation-server-core/commit/286d12f)) -* Move Mapping types to tsr-types package ([67bd838](https://github.com/nrkno/tv-automation-server-core/commit/67bd838)) -* move new timeline visualizer to replace the old broken one ([174dd7e](https://github.com/nrkno/tv-automation-server-core/commit/174dd7e)) -* Move SegmentLine duration calculation into templates ([315eb42](https://github.com/nrkno/tv-automation-server-core/commit/315eb42)) -* Move sofie and metadata urls from templates to config ([af8e388](https://github.com/nrkno/tv-automation-server-core/commit/af8e388)) -* Move some lawo and nora specific processing to blueprints ([a7a6aad](https://github.com/nrkno/tv-automation-server-core/commit/a7a6aad)) -* Move types to blueprint-integration ([c305061](https://github.com/nrkno/tv-automation-server-core/commit/c305061)) -* moved nightly cronjob to run after 4am ([8eb4e12](https://github.com/nrkno/tv-automation-server-core/commit/8eb4e12)) -* multiSelect component for selecting compatible Show Styles ([e1a5c35](https://github.com/nrkno/tv-automation-server-core/commit/e1a5c35)) -* only log logger.debug() when in developer mode ([8ed8e71](https://github.com/nrkno/tv-automation-server-core/commit/8ed8e71)) -* optimization: add cache of blueprints, to avoid having to parse text-functions all the time ([1e469d9](https://github.com/nrkno/tv-automation-server-core/commit/1e469d9)) -* output evaluation to log ([f95cfbf](https://github.com/nrkno/tv-automation-server-core/commit/f95cfbf)) -* output evaluation to log ([7deca0f](https://github.com/nrkno/tv-automation-server-core/commit/7deca0f)) -* place all collections in Collections object, for debugging purposes ([9682a89](https://github.com/nrkno/tv-automation-server-core/commit/9682a89)) -* playout device debugLogging (wip) ([7ab4ec6](https://github.com/nrkno/tv-automation-server-core/commit/7ab4ec6)) -* preliminary mongo mock implementation ([498b88f](https://github.com/nrkno/tv-automation-server-core/commit/498b88f)) -* prevent next:ing of currently playing segmentLine ([b9c9ea1](https://github.com/nrkno/tv-automation-server-core/commit/b9c9ea1)) -* prompter-view ([f45a923](https://github.com/nrkno/tv-automation-server-core/commit/f45a923)) -* prompter: add ^ and v indicators to where current take & next point is ([5c545e5](https://github.com/nrkno/tv-automation-server-core/commit/5c545e5)) -* prompter: continued implementation, url parameters etc ([785d0c0](https://github.com/nrkno/tv-automation-server-core/commit/785d0c0)) -* Prompter: New scroll mode: Smooth scrolling, which allows the user to use scroll wheel naturally ([e25ae40](https://github.com/nrkno/tv-automation-server-core/commit/e25ae40)) -* rabbitMQ: add support for headers ([e3e3d48](https://github.com/nrkno/tv-automation-server-core/commit/e3e3d48)) -* rabbitMQ: headers ([087bb2e](https://github.com/nrkno/tv-automation-server-core/commit/087bb2e)) -* Read all templates from database ([3287f63](https://github.com/nrkno/tv-automation-server-core/commit/3287f63)) -* Refactor blueprint contexts so be different per type to limit exposed api ([f0d1c7c](https://github.com/nrkno/tv-automation-server-core/commit/f0d1c7c)) -* Refactor external message template code ([21ac50e](https://github.com/nrkno/tv-automation-server-core/commit/21ac50e)) -* refactor of subscriptions (WIP) ([2b6f994](https://github.com/nrkno/tv-automation-server-core/commit/2b6f994)) -* refactor prompter view, prepare for modular controllers ([eb1ac27](https://github.com/nrkno/tv-automation-server-core/commit/eb1ac27)) -* Refactor story template code to use new blueprint structure ([104982b](https://github.com/nrkno/tv-automation-server-core/commit/104982b)) -* refactor systemStatus & add status messages on front page ([14da61a](https://github.com/nrkno/tv-automation-server-core/commit/14da61a)) -* refactor to use relative durations. affects infinite segmentlineitems, autonext, segmentline overlapduration property ([67c5444](https://github.com/nrkno/tv-automation-server-core/commit/67c5444)) -* refactored initDB into 2 separate methods, so we can easilly update just the layers and not the infrastructure ([d4fcc3f](https://github.com/nrkno/tv-automation-server-core/commit/d4fcc3f)) -* Reference blueprints-integration api file ([dc1cdb8](https://github.com/nrkno/tv-automation-server-core/commit/dc1cdb8)) -* Reference blueprints-integration utils file ([d94c97b](https://github.com/nrkno/tv-automation-server-core/commit/d94c97b)) -* Reference device options in tsr-types ([049b9bc](https://github.com/nrkno/tv-automation-server-core/commit/049b9bc)) -* reimplement fullscreen/on air button ([4b8658d](https://github.com/nrkno/tv-automation-server-core/commit/4b8658d)) -* Reimplement mock ro importing for new ingest data flow ([4b5ce20](https://github.com/nrkno/tv-automation-server-core/commit/4b5ce20)) -* reimplement remaining mos methods ([43b7ba1](https://github.com/nrkno/tv-automation-server-core/commit/43b7ba1)) -* Remove monaco ([e417548](https://github.com/nrkno/tv-automation-server-core/commit/e417548)) -* rename /clock into /countdowns/presenter ([96c3136](https://github.com/nrkno/tv-automation-server-core/commit/96c3136)) -* rename files according to new naming convention ([406fad2](https://github.com/nrkno/tv-automation-server-core/commit/406fad2)) -* reset 'dirty' segment lines by re-running blueprints on them ([064a84d](https://github.com/nrkno/tv-automation-server-core/commit/064a84d)) -* restart CasparCG from UI ([64509c3](https://github.com/nrkno/tv-automation-server-core/commit/64509c3)) -* reworked externalMessages page ([3b87242](https://github.com/nrkno/tv-automation-server-core/commit/3b87242)) -* reworked the whole activate/deacticate/reset/reload logic ([1fea56e](https://github.com/nrkno/tv-automation-server-core/commit/1fea56e)) -* Rewrite debug rerun blueprints helper to use new ingest data cache ([29692e4](https://github.com/nrkno/tv-automation-server-core/commit/29692e4)) -* Rewrite templateContext.getConfigValue to get default values from defaultConfig 'blueprint' and to cache values ([6ce0f97](https://github.com/nrkno/tv-automation-server-core/commit/6ce0f97)) -* run automatic migration when starting up a fresh system, if possible. ([4fb4759](https://github.com/nrkno/tv-automation-server-core/commit/4fb4759)) -* rundown layout editor in Settings ([df206e5](https://github.com/nrkno/tv-automation-server-core/commit/df206e5)) -* running order full-screen marker ([03010ec](https://github.com/nrkno/tv-automation-server-core/commit/03010ec)) -* RunningOrder unsynced notification ([9effce5](https://github.com/nrkno/tv-automation-server-core/commit/9effce5)) -* RunningOrderDataImport tidying and unsync guards ([d0a12d8](https://github.com/nrkno/tv-automation-server-core/commit/d0a12d8)) -* second upload to atem ([6697a80](https://github.com/nrkno/tv-automation-server-core/commit/6697a80)) -* segment line arguments ([3c5313a](https://github.com/nrkno/tv-automation-server-core/commit/3c5313a)) -* send evaluation message to slack. WIP ([3dcbe3a](https://github.com/nrkno/tv-automation-server-core/commit/3dcbe3a)) -* send evaluation message to slack. WIP ([96e8b81](https://github.com/nrkno/tv-automation-server-core/commit/96e8b81)) -* send the window url in the client error report ([807ccc9](https://github.com/nrkno/tv-automation-server-core/commit/807ccc9)) -* separate RO list into synced and unsynced lists ([6b92f40](https://github.com/nrkno/tv-automation-server-core/commit/6b92f40)) -* server side implementation of queueabilified adlibs ([0527b3b](https://github.com/nrkno/tv-automation-server-core/commit/0527b3b)) -* set in/out points through itemReplace ([4d31d70](https://github.com/nrkno/tv-automation-server-core/commit/4d31d70)) -* set triggerValue to lawo-TimelineObjs, so it triggers upon Nexting ([e3df655](https://github.com/nrkno/tv-automation-server-core/commit/e3df655)) -* settings: add workflow linger time ([9beefda](https://github.com/nrkno/tv-automation-server-core/commit/9beefda)) -* SH-121-Double-clicking zoom-scrubber should mean "zoom to show everything in this segment" ([aeadc46](https://github.com/nrkno/tv-automation-server-core/commit/aeadc46)) -* show 99+ instead of actual number for notifications ([1f84e67](https://github.com/nrkno/tv-automation-server-core/commit/1f84e67)) -* show a restart button in the notification if a parentDevice is connected and there is an issue with subdevice ([bde803b](https://github.com/nrkno/tv-automation-server-core/commit/bde803b)) -* show a restart button in the notification if a parentDevice is connected and there is an issue with subdevice ([67e75b0](https://github.com/nrkno/tv-automation-server-core/commit/67e75b0)) -* Show assignment in blueprint settings ([2816d45](https://github.com/nrkno/tv-automation-server-core/commit/2816d45)) -* show blueprint id in select options in Show Styles, hyphenated show-styles doesn't seem right ([e19802f](https://github.com/nrkno/tv-automation-server-core/commit/e19802f)) -* show changed timestamp on script items ([f2955e1](https://github.com/nrkno/tv-automation-server-core/commit/f2955e1)) -* show RO notes as notifications ([0ebc3fe](https://github.com/nrkno/tv-automation-server-core/commit/0ebc3fe)) -* show timecodes in SegmentLineContextMenus ([5df6e15](https://github.com/nrkno/tv-automation-server-core/commit/5df6e15)) -* show user activity log for timeslot of recording ([5c75305](https://github.com/nrkno/tv-automation-server-core/commit/5c75305)) -* show user name in evaluations ([c59d7ee](https://github.com/nrkno/tv-automation-server-core/commit/c59d7ee)) -* ShowStyle templates can be marked as helpers and accessed from other templates ([a20ffa7](https://github.com/nrkno/tv-automation-server-core/commit/a20ffa7)) -* Simplify RunningOrderBaseItem type ([2b8257b](https://github.com/nrkno/tv-automation-server-core/commit/2b8257b)) -* sketch interfaces for RundownLayouts ([69b37d9](https://github.com/nrkno/tv-automation-server-core/commit/69b37d9)) -* some work on notification center ([58ad599](https://github.com/nrkno/tv-automation-server-core/commit/58ad599)) -* some work on notification center ([8e2c269](https://github.com/nrkno/tv-automation-server-core/commit/8e2c269)) -* some work on updating the next part on data changes ([5551707](https://github.com/nrkno/tv-automation-server-core/commit/5551707)) -* SOURCE_NOT_SET for SLI Status ([cff64e1](https://github.com/nrkno/tv-automation-server-core/commit/cff64e1)) -* specific implementation: append Note on RunningOrder if segmentLine is not found ([a2ff6a2](https://github.com/nrkno/tv-automation-server-core/commit/a2ff6a2)) -* speech synthesis ([eb9643a](https://github.com/nrkno/tv-automation-server-core/commit/eb9643a)) -* Split (DVE 2LIKE) template ([8ccf23e](https://github.com/nrkno/tv-automation-server-core/commit/8ccf23e)) -* Start moving some migrations to blueprints ([9d4949e](https://github.com/nrkno/tv-automation-server-core/commit/9d4949e)) -* Start of stk and grafikk templates ([0458e3e](https://github.com/nrkno/tv-automation-server-core/commit/0458e3e)) -* start on migration for 0.25.0 ([104a867](https://github.com/nrkno/tv-automation-server-core/commit/104a867)) -* Start using types from sofie-blueprints-integration ([6106d99](https://github.com/nrkno/tv-automation-server-core/commit/6106d99)) -* started on mos device data implementation ([1d3b19a](https://github.com/nrkno/tv-automation-server-core/commit/1d3b19a)) -* started working on integration tests, added a client-side stub ([c4cbadc](https://github.com/nrkno/tv-automation-server-core/commit/c4cbadc)) -* status endpoint /health updated to use device statuses ([2c4b7fa](https://github.com/nrkno/tv-automation-server-core/commit/2c4b7fa)) -* store last shelf tab, rework UIStateStorage ([7ab0f3f](https://github.com/nrkno/tv-automation-server-core/commit/7ab0f3f)) -* Strip out old runtime functions ([880a885](https://github.com/nrkno/tv-automation-server-core/commit/880a885)) -* stub of setting in & out points ([0852b42](https://github.com/nrkno/tv-automation-server-core/commit/0852b42)) -* studio and system blueprints ([5ed64cf](https://github.com/nrkno/tv-automation-server-core/commit/5ed64cf)) -* Studio blueprint now selects variant to use for ROs ([6131057](https://github.com/nrkno/tv-automation-server-core/commit/6131057)) -* StudioInstallation key-value config store for template settings ([812c313](https://github.com/nrkno/tv-automation-server-core/commit/812c313)) -* StudioInstallation key-value config store for template settings ([b37ea17](https://github.com/nrkno/tv-automation-server-core/commit/b37ea17)) -* support displayDurationGroups in RO view ([460df8d](https://github.com/nrkno/tv-automation-server-core/commit/460df8d)) -* support for multiple notification actions ([09be9c1](https://github.com/nrkno/tv-automation-server-core/commit/09be9c1)) -* support for Pharos device ([4a99fb3](https://github.com/nrkno/tv-automation-server-core/commit/4a99fb3)) -* support media manager integration ([dcbf282](https://github.com/nrkno/tv-automation-server-core/commit/dcbf282)) -* Support panel WIP ([6955fdc](https://github.com/nrkno/tv-automation-server-core/commit/6955fdc)) -* support preload lookahead mode for nora, which swaps out take commands for cue ([4cfd4fe](https://github.com/nrkno/tv-automation-server-core/commit/4cfd4fe)) -* support timeline v2 by Johan & Julian ([fd039d8](https://github.com/nrkno/tv-automation-server-core/commit/fd039d8)) -* support workFlow comments ([6181006](https://github.com/nrkno/tv-automation-server-core/commit/6181006)) -* Switch to single-device design ([a268c40](https://github.com/nrkno/tv-automation-server-core/commit/a268c40)) -* syncFunction priorities ([4c99c11](https://github.com/nrkno/tv-automation-server-core/commit/4c99c11)) -* System snapshot ([006027b](https://github.com/nrkno/tv-automation-server-core/commit/006027b)) -* system version status monitoring ([1c96263](https://github.com/nrkno/tv-automation-server-core/commit/1c96263)) -* system-wide message ([d7305df](https://github.com/nrkno/tv-automation-server-core/commit/d7305df)) -* take from here UI item ([ca26660](https://github.com/nrkno/tv-automation-server-core/commit/ca26660)) -* **asRunLog:** collection implementation ([0e63c36](https://github.com/nrkno/tv-automation-server-core/commit/0e63c36)) -* **asRunLog:** implementation of asRunLog ([62f5b8c](https://github.com/nrkno/tv-automation-server-core/commit/62f5b8c)) -* **aux:** Adds tecnical error aux 2 ([34ce710](https://github.com/nrkno/tv-automation-server-core/commit/34ce710)) -* **AUX:** adds clock aux ([45479da](https://github.com/nrkno/tv-automation-server-core/commit/45479da)) -* **AUXes:** New AUX-mapping introducing more previews and moves the cleanfeed ([548bd8c](https://github.com/nrkno/tv-automation-server-core/commit/548bd8c)) -* **blueprint:** refactor getConfigValue into the blueprints, with context exposing the raw array as getConfig instead ([5b0ac39](https://github.com/nrkno/tv-automation-server-core/commit/5b0ac39)) -* **blueprints:** Add minimum core version to blueprints. Move blueprint restore code to api/blueprints ([2453a16](https://github.com/nrkno/tv-automation-server-core/commit/2453a16)) -* **blueprints:** Add section of studio settings based off a manifest from the blueprints ([4866a79](https://github.com/nrkno/tv-automation-server-core/commit/4866a79)) -* **blueprints:** Allow the post-process blueprint to modify a select few properties on the segmentLines ([ee02813](https://github.com/nrkno/tv-automation-server-core/commit/ee02813)) -* **blueprints:** Expose version string and uploading in the ui ([00875a4](https://github.com/nrkno/tv-automation-server-core/commit/00875a4)) -* **Capabilities:** Added basic Lawo and ATEM capabilities ([90d6edd](https://github.com/nrkno/tv-automation-server-core/commit/90d6edd)) -* **click-to-take:** initial WIP ([8e63808](https://github.com/nrkno/tv-automation-server-core/commit/8e63808)) -* **click-to-take:** more work in progress ([e3549e0](https://github.com/nrkno/tv-automation-server-core/commit/e3549e0)) -* **clip trim:** WIP on styling Clip trimmer components ([1af8ff4](https://github.com/nrkno/tv-automation-server-core/commit/1af8ff4)) -* **clip trim dialog:** add an icon to mark a trimmed clip ([371ddb8](https://github.com/nrkno/tv-automation-server-core/commit/371ddb8)) -* **clip trim dialog:** implement timecode encoder ([32e8f89](https://github.com/nrkno/tv-automation-server-core/commit/32e8f89)) -* **clip trim panel:** more WIP on components ([05daa8f](https://github.com/nrkno/tv-automation-server-core/commit/05daa8f)) -* **config:** Add support for enum config entries ([b4ae4b5](https://github.com/nrkno/tv-automation-server-core/commit/b4ae4b5)) -* **countdowns:** display autonext ([1405a89](https://github.com/nrkno/tv-automation-server-core/commit/1405a89)) -* **device:** Custom make-ready commands for httpsend device ([410a2ef](https://github.com/nrkno/tv-automation-server-core/commit/410a2ef)) -* **ENV:** adds ENV vars for default devices - casparcg, atem and lawo ([9bf8eee](https://github.com/nrkno/tv-automation-server-core/commit/9bf8eee)) -* **evaluation:** adds logging of evaluation level to keep statistics ([5da33a0](https://github.com/nrkno/tv-automation-server-core/commit/5da33a0)) -* **evaluation:** sends positive evaluations too ([d6c0bff](https://github.com/nrkno/tv-automation-server-core/commit/d6c0bff)) -* **expected media items:** updateExpectedMediaItems function ([e1ad692](https://github.com/nrkno/tv-automation-server-core/commit/e1ad692)) -* **expected media items:** use segmentLineId as key ([3803e87](https://github.com/nrkno/tv-automation-server-core/commit/3803e87)) -* **externalMessages:** add hold property, to be able to pause sending of messages ([adc69d8](https://github.com/nrkno/tv-automation-server-core/commit/adc69d8)) -* **Guest input:** use isGuestInput like isRemoteInput ([2d40e87](https://github.com/nrkno/tv-automation-server-core/commit/2d40e87)) -* **health check:** statusMessage implementation ([b01ac48](https://github.com/nrkno/tv-automation-server-core/commit/b01ac48)) -* **health check:** statusMessage implementation ([9bcf95a](https://github.com/nrkno/tv-automation-server-core/commit/9bcf95a)) -* **hotkeys:** optional cool down ([c9c2743](https://github.com/nrkno/tv-automation-server-core/commit/c9c2743)) -* **ingest:** First pass at ensuring all playout and ingest functions share a global rundown lock to avoid concurrent updates ([4b0cb56](https://github.com/nrkno/tv-automation-server-core/commit/4b0cb56)) -* **init:** adds clear shortcuts + skippabloe ([f824ae5](https://github.com/nrkno/tv-automation-server-core/commit/f824ae5)) -* **init:** adds multiple bak source layers ([c812510](https://github.com/nrkno/tv-automation-server-core/commit/c812510)) -* **init:** Adds RM 4,5,6 ([0021d7b](https://github.com/nrkno/tv-automation-server-core/commit/0021d7b)) -* **init:** Adds RM 4,5,6 ([dd59d47](https://github.com/nrkno/tv-automation-server-core/commit/dd59d47)) -* **init:** adds studio monitor html player to casparcg ([6533b0f](https://github.com/nrkno/tv-automation-server-core/commit/6533b0f)) -* **init:** bakskjerm type ([8ffe776](https://github.com/nrkno/tv-automation-server-core/commit/8ffe776)) -* **init:** moves countdown to casparcg machine 2, channel 1 ([6c93464](https://github.com/nrkno/tv-automation-server-core/commit/6c93464)) -* **init:** moves countdown to casparcg machine 2, channel 1 ([18c354b](https://github.com/nrkno/tv-automation-server-core/commit/18c354b)) -* **iterateDeeply:** exports iterateDeeply to template context ([42cc886](https://github.com/nrkno/tv-automation-server-core/commit/42cc886)) -* **lawo:** New structure to lawo devices and mappings ([35d812b](https://github.com/nrkno/tv-automation-server-core/commit/35d812b)) -* **loggin:** uses logger for better kibana logs ([8d31691](https://github.com/nrkno/tv-automation-server-core/commit/8d31691)) -* **lookahead:** Delay lookahead after an object by 1s if it is labelled by a class ([2c595fb](https://github.com/nrkno/tv-automation-server-core/commit/2c595fb)) -* **Media manager settings:** add 'mediaPath' property to storages ([50185b2](https://github.com/nrkno/tv-automation-server-core/commit/50185b2)) -* **media manager ui:** fix animations ([10a38de](https://github.com/nrkno/tv-automation-server-core/commit/10a38de)) -* **media manager ui:** nearly finishing the styling ([1bb3116](https://github.com/nrkno/tv-automation-server-core/commit/1bb3116)) -* **media manager ui:** show workflow creation time ([84a4b71](https://github.com/nrkno/tv-automation-server-core/commit/84a4b71)) -* **media manager UI:** WIP ([ccb54f0](https://github.com/nrkno/tv-automation-server-core/commit/ccb54f0)) -* timeline-visualizer: add details-on-click ([c81243c](https://github.com/nrkno/tv-automation-server-core/commit/c81243c)) -* **migration:** add previousVersion and buttons in GUI to revert database version ([61525a5](https://github.com/nrkno/tv-automation-server-core/commit/61525a5)) -* **migration:** display returned error message in GUI ([6169048](https://github.com/nrkno/tv-automation-server-core/commit/6169048)) -* **migration:** reafactor migrations and add new migration steps ([0966ef6](https://github.com/nrkno/tv-automation-server-core/commit/0966ef6)) -* **migrations:** automatically continue partialMigrations when possible ([f75e907](https://github.com/nrkno/tv-automation-server-core/commit/f75e907)) -* **migrations:** Move playout-device migrations to blueprints ([04029d4](https://github.com/nrkno/tv-automation-server-core/commit/04029d4)) -* take snapshot before running migration ([3ae4e92](https://github.com/nrkno/tv-automation-server-core/commit/3ae4e92)) -* take snapshot when saving evaluation form ([b98d68f](https://github.com/nrkno/tv-automation-server-core/commit/b98d68f)) -* take snapshot when saving evaluation form ([df318bb](https://github.com/nrkno/tv-automation-server-core/commit/df318bb)) -* templates: added format functions for timecode ([ea38081](https://github.com/nrkno/tv-automation-server-core/commit/ea38081)) -* this did not look right button ([1e01a10](https://github.com/nrkno/tv-automation-server-core/commit/1e01a10)) -* timings page ([6bc325a](https://github.com/nrkno/tv-automation-server-core/commit/6bc325a)) -* toggle running order argument on an SL with a hotkey ([258c3b3](https://github.com/nrkno/tv-automation-server-core/commit/258c3b3)) -* Transition as a seperate SegmentLineItem, which is not run if the first SegmentLine in the show, or the previous SegmentLine instructs it to not ([e676a43](https://github.com/nrkno/tv-automation-server-core/commit/e676a43)) -* translation improvements ([d3a535d](https://github.com/nrkno/tv-automation-server-core/commit/d3a535d)) -* Treat sli marked as virtual solely as markers for the timeline. They are hidden from the ui and are not allowed to place any contents on the timeline ([25e0f42](https://github.com/nrkno/tv-automation-server-core/commit/25e0f42)) -* trim config values (strings) ([d41e07e](https://github.com/nrkno/tv-automation-server-core/commit/d41e07e)) -* UI: Add Getting Started message on fresh system startup ([febe8ff](https://github.com/nrkno/tv-automation-server-core/commit/febe8ff)) -* unsynced mode ([#51](https://github.com/nrkno/tv-automation-server-core/issues/51)) ([7e0a263](https://github.com/nrkno/tv-automation-server-core/commit/7e0a263)) -* Update baseline generation for new blueprint api ([79767bf](https://github.com/nrkno/tv-automation-server-core/commit/79767bf)) -* update blueprint contexts to match new API ([ab6fc5a](https://github.com/nrkno/tv-automation-server-core/commit/ab6fc5a)) -* update dependencies ([6766d18](https://github.com/nrkno/tv-automation-server-core/commit/6766d18)) -* update meteor typings ([49b6969](https://github.com/nrkno/tv-automation-server-core/commit/49b6969)) -* Update template to use correct media files and durations. Adjust transitions from head to kam ([18f6c44](https://github.com/nrkno/tv-automation-server-core/commit/18f6c44)) -* Update timeline and infinite items on enps update ([db0c041](https://github.com/nrkno/tv-automation-server-core/commit/db0c041)) -* update type dependencies and type references. Removed dependency of mos-connection and replaced it with references to the blueprints-integration. ([85bd795](https://github.com/nrkno/tv-automation-server-core/commit/85bd795)) -* update types deps & API methods ([7d1a49b](https://github.com/nrkno/tv-automation-server-core/commit/7d1a49b)) -* Update typings for blueprints to be more specific ([53f7281](https://github.com/nrkno/tv-automation-server-core/commit/53f7281)) -* Update typings for message blueprint ([cf13fc9](https://github.com/nrkno/tv-automation-server-core/commit/cf13fc9)) -* updated timeline dependency ([6ef9eb7](https://github.com/nrkno/tv-automation-server-core/commit/6ef9eb7)) -* updated to match blueprints-integration /develop, started on new message-flow, WIP ([6b84b75](https://github.com/nrkno/tv-automation-server-core/commit/6b84b75)) -* url parameter "all" configures ui modes ([586d5f4](https://github.com/nrkno/tv-automation-server-core/commit/586d5f4)) -* use date-picker for user-activity-log ([5e2c218](https://github.com/nrkno/tv-automation-server-core/commit/5e2c218)) -* use default renderer for MIC sourceLayerType ([6ab97b7](https://github.com/nrkno/tv-automation-server-core/commit/6ab97b7)) -* use default renderer for MIC sourceLayerType ([ce845d4](https://github.com/nrkno/tv-automation-server-core/commit/ce845d4)) -* use generated svg as icons in countdown ([843ad10](https://github.com/nrkno/tv-automation-server-core/commit/843ad10)) -* Use studio baseline when no ro is active ([8353615](https://github.com/nrkno/tv-automation-server-core/commit/8353615)) -* validatedMethod mock ([2f3a641](https://github.com/nrkno/tv-automation-server-core/commit/2f3a641)) -* warn media status for interlacing and fps ([fc3ac4b](https://github.com/nrkno/tv-automation-server-core/commit/fc3ac4b)) -* warnings for media in wrong resolution ([55135c1](https://github.com/nrkno/tv-automation-server-core/commit/55135c1)) -* WIP: VERY preliminary implementation of quick and dirty manual playback ([a9ec948](https://github.com/nrkno/tv-automation-server-core/commit/a9ec948)) -* **multi-step success:** introduce keyStep property ([fc8aebd](https://github.com/nrkno/tv-automation-server-core/commit/fc8aebd)) -* **Next:** Adds warning/fallback of not loaded clips ([e20bc2f](https://github.com/nrkno/tv-automation-server-core/commit/e20bc2f)) -* **notification center:** hot-links to RO note notifications ([f3e9f59](https://github.com/nrkno/tv-automation-server-core/commit/f3e9f59)) -* zoom control buttons ([41c1c92](https://github.com/nrkno/tv-automation-server-core/commit/41c1c92)) -* **notification center:** notification count ([b8fbcac](https://github.com/nrkno/tv-automation-server-core/commit/b8fbcac)) -* **notification center:** squish segments in RO view when NC is open ([36b514f](https://github.com/nrkno/tv-automation-server-core/commit/36b514f)) -* **notification-center:** connection status notifier et al. ([e529e94](https://github.com/nrkno/tv-automation-server-core/commit/e529e94)) -* **notification-center:** connection status notifier et al. ([5aefd52](https://github.com/nrkno/tv-automation-server-core/commit/5aefd52)) -* **notification-center:** move expand notification center to right-hand status bar ([2750fab](https://github.com/nrkno/tv-automation-server-core/commit/2750fab)) -* **notification-center:** move expand notification center to right-hand status bar ([635c09d](https://github.com/nrkno/tv-automation-server-core/commit/635c09d)) -* **notification-center:** NotificationCenterPanel et al. ([c4794c8](https://github.com/nrkno/tv-automation-server-core/commit/c4794c8)) -* **notification-center:** NotificationCenterPanel et al. ([9283909](https://github.com/nrkno/tv-automation-server-core/commit/9283909)) -* **notification-center:** segment warning tweak ([e956488](https://github.com/nrkno/tv-automation-server-core/commit/e956488)) -* **notification-center:** segment warning tweak ([d4fc5e7](https://github.com/nrkno/tv-automation-server-core/commit/d4fc5e7)) -* **notifications-center:** notification center in other pages than ROV ([0620115](https://github.com/nrkno/tv-automation-server-core/commit/0620115)) -* **notifications-center:** notification center in other pages than ROV ([5250aab](https://github.com/nrkno/tv-automation-server-core/commit/5250aab)) -* **onlySelectedFiles:** support only selected files flag on shared storage options ([dee11d2](https://github.com/nrkno/tv-automation-server-core/commit/dee11d2)) -* **peripheralDevices:** added collection, publication, api, access control and tests ([794b5be](https://github.com/nrkno/tv-automation-server-core/commit/794b5be)) -* **playout:** Add class to sli first_object to indicate if sli is from the current or previous sl ([8de6004](https://github.com/nrkno/tv-automation-server-core/commit/8de6004)) -* **playout:** Add class to sli first_object when the sli is a continuation of another ([d53f06b](https://github.com/nrkno/tv-automation-server-core/commit/d53f06b)) -* **playout:** Add classes to sl-firstobject from the current and prev sl. This will allow for some logical triggers which can be influenced by the prev sl ([632326f](https://github.com/nrkno/tv-automation-server-core/commit/632326f)) -* **playout:** Add object to timeline to indicate whether ro is active or in rehersal ([d0e850d](https://github.com/nrkno/tv-automation-server-core/commit/d0e850d)) -* **playout:** Block take during transitions ([d0628a2](https://github.com/nrkno/tv-automation-server-core/commit/d0628a2)) -* **prompter:** add anchor points & movement tweaks ([c4ababe](https://github.com/nrkno/tv-automation-server-core/commit/c4ababe)) -* **prompter:** Add keyboard-controller, for control by keyboard-like devices ([c6e307d](https://github.com/nrkno/tv-automation-server-core/commit/c6e307d)) -* **prompter:** add mouse-ish controller, for control by mouse-like devices ([00a924f](https://github.com/nrkno/tv-automation-server-core/commit/00a924f)) -* **Prompter:** implement a simple mirror mode ([8d0be4e](https://github.com/nrkno/tv-automation-server-core/commit/8d0be4e)) -* **rabbit:** initial commit (wip) ([7ed3223](https://github.com/nrkno/tv-automation-server-core/commit/7ed3223)) -* **rabbitmq:** Implementation of RabbitMQ external message queue ([b31e15f](https://github.com/nrkno/tv-automation-server-core/commit/b31e15f)) -* **rabbitmq:** message id ([7ce9e5a](https://github.com/nrkno/tv-automation-server-core/commit/7ce9e5a)) -* **record:** basic video player page ([138b8b9](https://github.com/nrkno/tv-automation-server-core/commit/138b8b9)) -* **record:** Controls to delete files ([4236db2](https://github.com/nrkno/tv-automation-server-core/commit/4236db2)) -* **record:** Create timelineobjects to control recording to the timeline. Add config to the db, and ui to edit it ([b5e4ebf](https://github.com/nrkno/tv-automation-server-core/commit/b5e4ebf)) -* **record:** Input field for user to give recording a name ([116ea9f](https://github.com/nrkno/tv-automation-server-core/commit/116ea9f)) -* **refactor:** move Runtime Arguments for Blueprints from StudioInstallation to ShowStyleBase ([9b2c2d8](https://github.com/nrkno/tv-automation-server-core/commit/9b2c2d8)) -* **RO view:** Introduce a 'duration settling' state to delay the UI update until the actual playout duration is received from playout ([28823c3](https://github.com/nrkno/tv-automation-server-core/commit/28823c3)) -* **RundownLayouts:** allow for default tabs ([bdd7403](https://github.com/nrkno/tv-automation-server-core/commit/bdd7403)) -* **Setting:** adds lawo setting to studio and devices ([5ab1717](https://github.com/nrkno/tv-automation-server-core/commit/5ab1717)) -* **settings:** playout devices have threadUsage ([b74410c](https://github.com/nrkno/tv-automation-server-core/commit/b74410c)) -* **shortcuts:** adds shortcuts to remove various graphic layers ([0d1a83d](https://github.com/nrkno/tv-automation-server-core/commit/0d1a83d)) -* **shortcuts:** standarize shortcut label display, support numpad ([4c5ba74](https://github.com/nrkno/tv-automation-server-core/commit/4c5ba74)) -* **snapshot:** continued implementation ([009e9e5](https://github.com/nrkno/tv-automation-server-core/commit/009e9e5)) -* **snapshot:** edit snapshot comments ([264638a](https://github.com/nrkno/tv-automation-server-core/commit/264638a)) -* **snapshot:** Implement snapshots, API endpoints & restore ([72e1a83](https://github.com/nrkno/tv-automation-server-core/commit/72e1a83)) -* **snapshot:** implement support for taking snapshot of settings related to a single studio ([d177113](https://github.com/nrkno/tv-automation-server-core/commit/d177113)) -* **snapshot:** snapshot restore/backup GUI ([c414f70](https://github.com/nrkno/tv-automation-server-core/commit/c414f70)) -* **snapshot:** take snapshot of runningOrder & restore ([fc34f73](https://github.com/nrkno/tv-automation-server-core/commit/fc34f73)) -* **template:** setup atem wipe transition ([f0c576c](https://github.com/nrkno/tv-automation-server-core/commit/f0c576c)) -* **template:** temporary env variable for nora group (MESOS_NORA_GROUP) ([8b00bc4](https://github.com/nrkno/tv-automation-server-core/commit/8b00bc4)) -* **template:** use upstream keyer for vignett playback. Adds some more layers for atem defaults, and overrides to stack changes better ([76b1e10](https://github.com/nrkno/tv-automation-server-core/commit/76b1e10)) -* wrap blueprint functions, to emit better errors ([14873f1](https://github.com/nrkno/tv-automation-server-core/commit/14873f1)) -* **Template doc:** Added CasparCG resources ([80f98d5](https://github.com/nrkno/tv-automation-server-core/commit/80f98d5)) -* **templates:** Use ShowStyle to define default/fallback state. Play and stop head supers ([8375363](https://github.com/nrkno/tv-automation-server-core/commit/8375363)) -* **Templates:** Start parsing some new mos data. Process mesos based graphics. Set some lawo audio states ([df4b670](https://github.com/nrkno/tv-automation-server-core/commit/df4b670)) -* **timeline:** Remove deviceId field from timeline objects ([85c4b89](https://github.com/nrkno/tv-automation-server-core/commit/85c4b89)) -* **timeline:** some initial work on labels taking account of liveline ([3086eec](https://github.com/nrkno/tv-automation-server-core/commit/3086eec)) -* **Timeline:** more work on new marker style ([570e408](https://github.com/nrkno/tv-automation-server-core/commit/570e408)) - - +- add & remove studios ([81749b4](https://github.com/nrkno/tv-automation-server-core/commit/81749b4)) +- add a label of the source Piece on the ExpectedMediaItems ([bad1576](https://github.com/nrkno/tv-automation-server-core/commit/bad1576)) +- add a subtle line underneath segment title when has-remote-items and has-guest-items ([a02b50d](https://github.com/nrkno/tv-automation-server-core/commit/a02b50d)) +- add a subtle line underneath segment title when has-remote-items and has-guest-items ([4b1d582](https://github.com/nrkno/tv-automation-server-core/commit/4b1d582)) +- add a user-definable CoreSystem.name that is displayed in the header and title bar ([717ee45](https://github.com/nrkno/tv-automation-server-core/commit/717ee45)) +- add a user-definable CoreSystem.name that is displayed in the header and title bar ([493568e](https://github.com/nrkno/tv-automation-server-core/commit/493568e)) +- Add backup link to backup only active template data ([cdfffdf](https://github.com/nrkno/tv-automation-server-core/commit/cdfffdf)) +- Add backup restore method to import mock rundowns similar to the embedded mocks ([d71d9c7](https://github.com/nrkno/tv-automation-server-core/commit/d71d9c7)) +- Add backup restore method to import mock rundowns similar to the embedded mocks ([251555b](https://github.com/nrkno/tv-automation-server-core/commit/251555b)) +- add category, type & subType to peripheralDevice ([34469f5](https://github.com/nrkno/tv-automation-server-core/commit/34469f5)) +- add checkbox for debugLogging in media manager ([64b80e9](https://github.com/nrkno/tv-automation-server-core/commit/64b80e9)) +- add default mocks ([2985af8](https://github.com/nrkno/tv-automation-server-core/commit/2985af8)) +- add editorconfig ([296f71d](https://github.com/nrkno/tv-automation-server-core/commit/296f71d)) +- add expected media items collection ([931536e](https://github.com/nrkno/tv-automation-server-core/commit/931536e)) +- Add expected media items collection ([04c15a9](https://github.com/nrkno/tv-automation-server-core/commit/04c15a9)) +- add fetchFrom() as a wrapper for fetch(), to handle non-200 responses as errors ([4e3734c](https://github.com/nrkno/tv-automation-server-core/commit/4e3734c)) +- add fonts ([e617d60](https://github.com/nrkno/tv-automation-server-core/commit/e617d60)) +- Add http put request timeline object ([14f391c](https://github.com/nrkno/tv-automation-server-core/commit/14f391c)) +- add httpWatcher settings ([fbb91d9](https://github.com/nrkno/tv-automation-server-core/commit/fbb91d9)) +- add IngestActions.regenerateRundown, for debugging & resetting of rundown ([ebefd42](https://github.com/nrkno/tv-automation-server-core/commit/ebefd42)) +- add jest ([3fab0ed](https://github.com/nrkno/tv-automation-server-core/commit/3fab0ed)) +- add link to compatible studios from ShowStyle page ([4be495c](https://github.com/nrkno/tv-automation-server-core/commit/4be495c)) +- Add LOG_FILE env var to specify the file to log to ([d2ad941](https://github.com/nrkno/tv-automation-server-core/commit/d2ad941)) +- Add LOG_FILE env var to specify the file to log to ([8a192bc](https://github.com/nrkno/tv-automation-server-core/commit/8a192bc)) +- Add Media_Manager DeviceType ([2b612c7](https://github.com/nrkno/tv-automation-server-core/commit/2b612c7)) +- add methods for insert/remove blueprints ([8acb72b](https://github.com/nrkno/tv-automation-server-core/commit/8acb72b)) +- add migration steps, logging ([96aae63](https://github.com/nrkno/tv-automation-server-core/commit/96aae63)) +- add migrations for 0.25.0 ([9165255](https://github.com/nrkno/tv-automation-server-core/commit/9165255)) +- add nn translation and update nb translation ([922b93b](https://github.com/nrkno/tv-automation-server-core/commit/922b93b)) +- add nn-nynorsk and update nb-bokmal translation ([6db7a99](https://github.com/nrkno/tv-automation-server-core/commit/6db7a99)) +- add notes to RunningOrder ([6100b0c](https://github.com/nrkno/tv-automation-server-core/commit/6100b0c)) +- add option to input data into a ModalDialogue ([ef54b74](https://github.com/nrkno/tv-automation-server-core/commit/ef54b74)) +- Add OSC Playout device type ([bf426b5](https://github.com/nrkno/tv-automation-server-core/commit/bf426b5)) +- add performance monitor and track all server-side methods ([385f703](https://github.com/nrkno/tv-automation-server-core/commit/385f703)) +- add performance monitor and track all server-side methods ([2733d74](https://github.com/nrkno/tv-automation-server-core/commit/2733d74)) +- add peripheralDevice expectedVersions, to throw error if device version is too low. Refactor /health endpoint. ([51ed4c3](https://github.com/nrkno/tv-automation-server-core/commit/51ed4c3)) +- add property .deviceId to MediaWorkFlow & MedieWorkFlowStep, to indicate ownership. (preliminary implementation) ([62ac066](https://github.com/nrkno/tv-automation-server-core/commit/62ac066)) +- add restart button ([9b43d6f](https://github.com/nrkno/tv-automation-server-core/commit/9b43d6f)) +- add restart button ([6083145](https://github.com/nrkno/tv-automation-server-core/commit/6083145)) +- add retryDuration for external messages. ([c19d84b](https://github.com/nrkno/tv-automation-server-core/commit/c19d84b)) +- add rewind button ([9fd61b5](https://github.com/nrkno/tv-automation-server-core/commit/9fd61b5)) +- add rewind button ([f235a25](https://github.com/nrkno/tv-automation-server-core/commit/f235a25)) +- Add runHelper method to template context ([ebc477a](https://github.com/nrkno/tv-automation-server-core/commit/ebc477a)) +- Add running order name to top of run page ([674c392](https://github.com/nrkno/tv-automation-server-core/commit/674c392)) +- Add SegmentLineItem.infiniteMode value for items which are infinite within the SegmentLine ([e99c661](https://github.com/nrkno/tv-automation-server-core/commit/e99c661)) +- add setting for playout device: multiThreadedResolver ([37f2aa7](https://github.com/nrkno/tv-automation-server-core/commit/37f2aa7)) +- add snapshot restore statistics to logging ([45115f3](https://github.com/nrkno/tv-automation-server-core/commit/45115f3)) +- Add some new template config data for sources information ([3e48508](https://github.com/nrkno/tv-automation-server-core/commit/3e48508)) +- add some responsive styling to the RD view ([a133947](https://github.com/nrkno/tv-automation-server-core/commit/a133947)) +- add sourceLayerType.LIGHTS ([0554251](https://github.com/nrkno/tv-automation-server-core/commit/0554251)) +- add stoppedPlayback tracking ([ddbdd66](https://github.com/nrkno/tv-automation-server-core/commit/ddbdd66)) +- add stoppedPlayback tracking ([7345856](https://github.com/nrkno/tv-automation-server-core/commit/7345856)) +- add studioInstallation.settings, mediaPreviewsUrl and sofieUrl, to replace configs ([adc6cb5](https://github.com/nrkno/tv-automation-server-core/commit/adc6cb5)) +- add support for Config References (to be used for referencing usernames & passwords) ([6df8c6e](https://github.com/nrkno/tv-automation-server-core/commit/6df8c6e)) +- add support for refs in rabbitMQ-messages (for username & password) ([e34ee34](https://github.com/nrkno/tv-automation-server-core/commit/e34ee34)) +- add support for refs in rabbitMQ-messages (for username & password) ([5b3ea33](https://github.com/nrkno/tv-automation-server-core/commit/5b3ea33)) +- Add support for RuntimeArguments in blueprint migrations ([82e5286](https://github.com/nrkno/tv-automation-server-core/commit/82e5286)) +- Add support panel in Running Order View ([e3cee77](https://github.com/nrkno/tv-automation-server-core/commit/e3cee77)) +- Add typeSubVariant field to SegmentLine. ([#46](https://github.com/nrkno/tv-automation-server-core/issues/46)) ([82bd4bd](https://github.com/nrkno/tv-automation-server-core/commit/82bd4bd)) +- Add typeSubVariant field to SegmentLine. ([#46](https://github.com/nrkno/tv-automation-server-core/issues/46)) ([4af88d3](https://github.com/nrkno/tv-automation-server-core/commit/4af88d3)) +- add utility CSS classes for support message ([95e1424](https://github.com/nrkno/tv-automation-server-core/commit/95e1424)) +- Add version string field to blueprint collection ([869dd02](https://github.com/nrkno/tv-automation-server-core/commit/869dd02)) +- add versions to /health endpoint ([a324213](https://github.com/nrkno/tv-automation-server-core/commit/a324213)) +- add warning of unsent messages to rundown notifications ([f65309f](https://github.com/nrkno/tv-automation-server-core/commit/f65309f)) +- Add warning to rundown when config changed ([#69](https://github.com/nrkno/tv-automation-server-core/issues/69)) ([4f5e6a9](https://github.com/nrkno/tv-automation-server-core/commit/4f5e6a9)) +- add warnings for wrong field order ([c4d23d8](https://github.com/nrkno/tv-automation-server-core/commit/c4d23d8)) +- added .timings object to SegmentLine, to track take/playout times during playout ([5d860b3](https://github.com/nrkno/tv-automation-server-core/commit/5d860b3)) +- added "develop=1" to url, which re-enables right-click, for dev ([b73522c](https://github.com/nrkno/tv-automation-server-core/commit/b73522c)) +- added afterBroadcast form ([e98b59e](https://github.com/nrkno/tv-automation-server-core/commit/e98b59e)) +- added async database functions ([a754a24](https://github.com/nrkno/tv-automation-server-core/commit/a754a24)) +- added client-side logging wrapper ([06597be](https://github.com/nrkno/tv-automation-server-core/commit/06597be)) +- added connection status of peripheralDevices ([c0e0a94](https://github.com/nrkno/tv-automation-server-core/commit/c0e0a94)) +- added context.runningOrder, for blueprints to use ([855f6d4](https://github.com/nrkno/tv-automation-server-core/commit/855f6d4)) +- added device version to status page ([ed0acda](https://github.com/nrkno/tv-automation-server-core/commit/ed0acda)) +- Added dynamic template context ([0ea4849](https://github.com/nrkno/tv-automation-server-core/commit/0ea4849)) +- added executionTime to userAction ([1ca92c1](https://github.com/nrkno/tv-automation-server-core/commit/1ca92c1)) +- added getAllSegments, to use in metadata-template ([f8a5514](https://github.com/nrkno/tv-automation-server-core/commit/f8a5514)) +- added indexes for all collections ([6ef324c](https://github.com/nrkno/tv-automation-server-core/commit/6ef324c)) +- added kill process buttons to device status UI ([6fdab68](https://github.com/nrkno/tv-automation-server-core/commit/6fdab68)) +- added killProcess method, to be used by integration tests of gateways in closed environments ([7f2b42c](https://github.com/nrkno/tv-automation-server-core/commit/7f2b42c)) +- added MeteorReactComponent, which exposes subscribe & autorun, which will stop automatically on component unmount ([cf11808](https://github.com/nrkno/tv-automation-server-core/commit/cf11808)) +- added name and type to peripheralDevice ([915c518](https://github.com/nrkno/tv-automation-server-core/commit/915c518)) +- added packages: mocha and typescript ([8b19269](https://github.com/nrkno/tv-automation-server-core/commit/8b19269)) +- added peripheralDevice.lastConnected, to be used for sorting so they wont jump around in the UI ([08e97f7](https://github.com/nrkno/tv-automation-server-core/commit/08e97f7)) +- added pingWithCommand method, used by watchdog ([6f6427b](https://github.com/nrkno/tv-automation-server-core/commit/6f6427b)) +- Added publications for all running order data, and changed some interfaces ([2365fd2](https://github.com/nrkno/tv-automation-server-core/commit/2365fd2)) +- added SegmentLine.timings.stoppedPlayback property ([2121245](https://github.com/nrkno/tv-automation-server-core/commit/2121245)) +- added SegmentLine.timings.takeDone property ([d18d539](https://github.com/nrkno/tv-automation-server-core/commit/d18d539)) +- added some shadow to the status dots ([04df33c](https://github.com/nrkno/tv-automation-server-core/commit/04df33c)) +- added support for typescript ([d3471b3](https://github.com/nrkno/tv-automation-server-core/commit/d3471b3)) +- added temporary deploy script ([244fb5b](https://github.com/nrkno/tv-automation-server-core/commit/244fb5b)) +- added test-data for testing and mocking ([b277c3c](https://github.com/nrkno/tv-automation-server-core/commit/b277c3c)) +- added tests stub ([edd4b6e](https://github.com/nrkno/tv-automation-server-core/commit/edd4b6e)) +- added tictac for troubleshooting timings ([df91cea](https://github.com/nrkno/tv-automation-server-core/commit/df91cea)) +- added Timeline data structure ([35ce6db](https://github.com/nrkno/tv-automation-server-core/commit/35ce6db)) +- added Timeline.objectType and implemented the typing changes all around ([a69e626](https://github.com/nrkno/tv-automation-server-core/commit/a69e626)) +- added timestamp to externalMessage error ([e13d1d8](https://github.com/nrkno/tv-automation-server-core/commit/e13d1d8)) +- added timings property to adlig segmentLineItems ([b333bf1](https://github.com/nrkno/tv-automation-server-core/commit/b333bf1)) +- added unsyncedTime ([8fcffb5](https://github.com/nrkno/tv-automation-server-core/commit/8fcffb5)) +- added updateStoryStatus. The yellow line will only be driven when this is set to true ([c7ec8da](https://github.com/nrkno/tv-automation-server-core/commit/c7ec8da)) +- Adjust split box values ([680eb11](https://github.com/nrkno/tv-automation-server-core/commit/680eb11)) +- allow ? as 'any' field/frame type ([c950fba](https://github.com/nrkno/tv-automation-server-core/commit/c950fba)) +- allow a place to store MediaWorkFlow comments ([a2c54fb](https://github.com/nrkno/tv-automation-server-core/commit/a2c54fb)) +- allow a string array as mediaFlowIds in SLI content ([7ac6fb5](https://github.com/nrkno/tv-automation-server-core/commit/7ac6fb5)) +- allow admins to delete non-unsynced running orders ([190ca36](https://github.com/nrkno/tv-automation-server-core/commit/190ca36)) +- allow reconnection action on click ([3575f4f](https://github.com/nrkno/tv-automation-server-core/commit/3575f4f)) +- Allow StudioInstallation to define entries in the hotkey legend ([74c1c1c](https://github.com/nrkno/tv-automation-server-core/commit/74c1c1c)) +- Allow to specify blueprint name in request query string ([e8c2dc9](https://github.com/nrkno/tv-automation-server-core/commit/e8c2dc9)) +- ask before closing an active RO (if allowed by browser) ([16ee66b](https://github.com/nrkno/tv-automation-server-core/commit/16ee66b)) +- Atem SuperSource properties support ([2688142](https://github.com/nrkno/tv-automation-server-core/commit/2688142)) +- autonext property is defined on the current SegmentLine rather than the next ([09441db](https://github.com/nrkno/tv-automation-server-core/commit/09441db)) +- backend implementation of migration (wip) ([8762ca3](https://github.com/nrkno/tv-automation-server-core/commit/8762ca3)) +- backup and restore show styles (including templates) through ui ([9758b2c](https://github.com/nrkno/tv-automation-server-core/commit/9758b2c)) +- basic setup of jest ([6dd0fcd](https://github.com/nrkno/tv-automation-server-core/commit/6dd0fcd)) +- Batch uploading of blueprints in one http request ([5a707e1](https://github.com/nrkno/tv-automation-server-core/commit/5a707e1)) +- be able to remove stored snapshots ([849f906](https://github.com/nrkno/tv-automation-server-core/commit/849f906)) +- beautify "Upload blueprints" button ([2dce2c8](https://github.com/nrkno/tv-automation-server-core/commit/2dce2c8)) +- begin implementation of new blueprint interface (wip) ([d7aa2e4](https://github.com/nrkno/tv-automation-server-core/commit/d7aa2e4)) +- better return type from post-process ([a971b43](https://github.com/nrkno/tv-automation-server-core/commit/a971b43)) +- BIG refactoring of Core ([9d6ae9e](https://github.com/nrkno/tv-automation-server-core/commit/9d6ae9e)) +- black / freeze frame detection warnings ([7166177](https://github.com/nrkno/tv-automation-server-core/commit/7166177)) +- block take if duration since startedPlayback/take less than X ([99d41b9](https://github.com/nrkno/tv-automation-server-core/commit/99d41b9)) +- blueprint migration implementation (it works now) ([15250b2](https://github.com/nrkno/tv-automation-server-core/commit/15250b2)) +- blueprint migration, continued implementation ([ff507ab](https://github.com/nrkno/tv-automation-server-core/commit/ff507ab)) +- blueprintMigrations ([9527cae](https://github.com/nrkno/tv-automation-server-core/commit/9527cae)) +- blueprints context: handle notes externally (to ro notes) or internally (to logger) ([63640f2](https://github.com/nrkno/tv-automation-server-core/commit/63640f2)) +- Break nrk templates into seperate files. Parse KAM templates better ([2ec0433](https://github.com/nrkno/tv-automation-server-core/commit/2ec0433)) +- bump blueprints-integration version ([6f2c46d](https://github.com/nrkno/tv-automation-server-core/commit/6f2c46d)) +- Button to assign/unassign system blueprint ([edef22a](https://github.com/nrkno/tv-automation-server-core/commit/edef22a)) +- change heavy-light display style ([91a1931](https://github.com/nrkno/tv-automation-server-core/commit/91a1931)) +- change heavy-light display style ([329e2c6](https://github.com/nrkno/tv-automation-server-core/commit/329e2c6)) +- change labeled buttons to icons with tooltips in Media Transfer Status ([c5e582b](https://github.com/nrkno/tv-automation-server-core/commit/c5e582b)) +- Change styling for video monitors ([a01de7d](https://github.com/nrkno/tv-automation-server-core/commit/a01de7d)) +- Change styling for video monitors ([5de76fc](https://github.com/nrkno/tv-automation-server-core/commit/5de76fc)) +- change VideoEditMonitors behavior from hoverScrub to click-and-drag ([77327fe](https://github.com/nrkno/tv-automation-server-core/commit/77327fe)) +- change VideoEditMonitors behavior from hoverScrub to click-and-drag ([bc1ed2c](https://github.com/nrkno/tv-automation-server-core/commit/bc1ed2c)) +- changed keyboard shortcuts ([ef02f7c](https://github.com/nrkno/tv-automation-server-core/commit/ef02f7c)) +- changed restart CasparCG functionality ([dd567c2](https://github.com/nrkno/tv-automation-server-core/commit/dd567c2)) +- changed to retryUntil, added button ([1b31374](https://github.com/nrkno/tv-automation-server-core/commit/1b31374)) +- Changes for blueprints-integration typings ([8d1f37d](https://github.com/nrkno/tv-automation-server-core/commit/8d1f37d)) +- check AdLib media object status and display in Shelf ([3bacb40](https://github.com/nrkno/tv-automation-server-core/commit/3bacb40)) +- cherry-pick changes from the UI feature branch ([dfbb3b4](https://github.com/nrkno/tv-automation-server-core/commit/dfbb3b4)) +- clean up: show style, blueprint, blueprint logic names in UI ([e1ae6a7](https://github.com/nrkno/tv-automation-server-core/commit/e1ae6a7)) +- ClientAPI test suite ([69cad3f](https://github.com/nrkno/tv-automation-server-core/commit/69cad3f)) +- clip trim panel WIP ([9d01c2b](https://github.com/nrkno/tv-automation-server-core/commit/9d01c2b)) +- clip trim panel WIP ([36e79dc](https://github.com/nrkno/tv-automation-server-core/commit/36e79dc)) +- clip trim panel working, hide video monitor under a flag ([72ee490](https://github.com/nrkno/tv-automation-server-core/commit/72ee490)) +- codeControl: create syncFunctions which finer grained execution control based on arguments ([f53607f](https://github.com/nrkno/tv-automation-server-core/commit/f53607f)) +- componentize WorkFlow item ([f920e4b](https://github.com/nrkno/tv-automation-server-core/commit/f920e4b)) +- configuration UI for media manager ([b1883ec](https://github.com/nrkno/tv-automation-server-core/commit/b1883ec)) +- Consider transitions applied to objects via keyframes ([eb65a3c](https://github.com/nrkno/tv-automation-server-core/commit/eb65a3c)) +- Consider transitions applied to objects via keyframes ([e911760](https://github.com/nrkno/tv-automation-server-core/commit/e911760)) +- continue implementation of new blueprint interface ([b7d013d](https://github.com/nrkno/tv-automation-server-core/commit/b7d013d)) +- continue refactor of mos ingest logic ([c5b775a](https://github.com/nrkno/tv-automation-server-core/commit/c5b775a)) +- continue refactor of mos ingest logic ([ad6cbb1](https://github.com/nrkno/tv-automation-server-core/commit/ad6cbb1)) +- continued implementation of Migration (wip) ([72fbcb5](https://github.com/nrkno/tv-automation-server-core/commit/72fbcb5)) +- continued refactoring of ingest / mos data flow ([4ffe93a](https://github.com/nrkno/tv-automation-server-core/commit/4ffe93a)) +- converted app.js to typescript and added an example subscription-implementation ([da439af](https://github.com/nrkno/tv-automation-server-core/commit/da439af)) +- converted more subscriptions (WIP) ([e047fef](https://github.com/nrkno/tv-automation-server-core/commit/e047fef)) +- converted StudioInstallation into a class, adding getConfigValue as member method, a step towards DRY ([4af278e](https://github.com/nrkno/tv-automation-server-core/commit/4af278e)) +- CoreSystem initial implementation ([06369b2](https://github.com/nrkno/tv-automation-server-core/commit/06369b2)) +- countdown to running order expectedStart ([7b505c5](https://github.com/nrkno/tv-automation-server-core/commit/7b505c5)) +- create action buttons in the Support PopUp for reset PG, take snapshot, show hotkeys ([be89893](https://github.com/nrkno/tv-automation-server-core/commit/be89893)) +- cron job for restarting casparcg ([19898d1](https://github.com/nrkno/tv-automation-server-core/commit/19898d1)) +- Crude UI to rerun studio baseline ([25b2395](https://github.com/nrkno/tv-automation-server-core/commit/25b2395)) +- Crude ui to visualise generated timeline ([6e55382](https://github.com/nrkno/tv-automation-server-core/commit/6e55382)) +- css: import and use fonts in prompter ([97a8037](https://github.com/nrkno/tv-automation-server-core/commit/97a8037)) +- Define all special blueprints as options in the showstyle ([7e1da16](https://github.com/nrkno/tv-automation-server-core/commit/7e1da16)) +- disable in next segmentLine & refactoring ([669166c](https://github.com/nrkno/tv-automation-server-core/commit/669166c)) +- disable shortcut-keys when modalDialog is open ([24bab3f](https://github.com/nrkno/tv-automation-server-core/commit/24bab3f)) +- dismiss all notifcations ([896dbb5](https://github.com/nrkno/tv-automation-server-core/commit/896dbb5)) +- display ms in user activity log ([5172f2e](https://github.com/nrkno/tv-automation-server-core/commit/5172f2e)) +- display ms in user activity log ([7fc2744](https://github.com/nrkno/tv-automation-server-core/commit/7fc2744)) +- do not block click-to-take when trigger is absolute 0 ([cec86ca](https://github.com/nrkno/tv-automation-server-core/commit/cec86ca)) +- don't restore from old snapshots ([bab8bbb](https://github.com/nrkno/tv-automation-server-core/commit/bab8bbb)) +- ensure each sli has a mosId set ([57c977d](https://github.com/nrkno/tv-automation-server-core/commit/57c977d)) +- expected audioTracks property ([250dc79](https://github.com/nrkno/tv-automation-server-core/commit/250dc79)) +- expose moment to templates ([c2a1cc5](https://github.com/nrkno/tv-automation-server-core/commit/c2a1cc5)) +- externalMessage: allow for multiple messages to be generated at the same time ([284efbe](https://github.com/nrkno/tv-automation-server-core/commit/284efbe)) +- externalMessages implementation (it works now) ([3b8e88a](https://github.com/nrkno/tv-automation-server-core/commit/3b8e88a)) +- f9, f10 buttons step next forward & down (shift reverses direction) ([a3be0cf](https://github.com/nrkno/tv-automation-server-core/commit/a3be0cf)) +- First draft at uploading a blueprints blob into a new db collection, and running it instead of the existing baseline ([31c56d8](https://github.com/nrkno/tv-automation-server-core/commit/31c56d8)) +- force some function to run synchronously. experimental, WIP! ([54d83dd](https://github.com/nrkno/tv-automation-server-core/commit/54d83dd)) +- force some function to run synchronously. experimental, WIP! ([55a064c](https://github.com/nrkno/tv-automation-server-core/commit/55a064c)) +- full implementation of mos-functions, profile 0 & 2 ([4bafeeb](https://github.com/nrkno/tv-automation-server-core/commit/4bafeeb)) +- Generate full sl & sli data on create/update of both ro and segment ([7969c2e](https://github.com/nrkno/tv-automation-server-core/commit/7969c2e)) +- Grafikk lookahead/preload ([30a6b03](https://github.com/nrkno/tv-automation-server-core/commit/30a6b03)) +- Grafikk lookahead/preload ([78828fe](https://github.com/nrkno/tv-automation-server-core/commit/78828fe)) +- handle mos updates with dynamicallyInserted segmentLines ([1d292c0](https://github.com/nrkno/tv-automation-server-core/commit/1d292c0)) +- handle roList reply on reload RunningOrder data, also more refactoring & cleanup ([cee70c5](https://github.com/nrkno/tv-automation-server-core/commit/cee70c5)) +- Handle SegmentLine data operations, with the help of an improved data cache ([9c84271](https://github.com/nrkno/tv-automation-server-core/commit/9c84271)) +- HOLD mode ([e41c5a4](https://github.com/nrkno/tv-automation-server-core/commit/e41c5a4)) +- HOLD mode ([ae1dacf](https://github.com/nrkno/tv-automation-server-core/commit/ae1dacf)) +- Hold state UI ([d835efc](https://github.com/nrkno/tv-automation-server-core/commit/d835efc)) +- Hold state UI ([c7a17c7](https://github.com/nrkno/tv-automation-server-core/commit/c7a17c7)) +- hyperdeck device ([#49](https://github.com/nrkno/tv-automation-server-core/issues/49)) ([c706628](https://github.com/nrkno/tv-automation-server-core/commit/c706628)) +- if template 'getId' returns null, don't throw an error. Also when templateId is not found, send warning instead of an error ([d98f09d](https://github.com/nrkno/tv-automation-server-core/commit/d98f09d)) +- implement (upcoming) blueprint API ([d86faa5](https://github.com/nrkno/tv-automation-server-core/commit/d86faa5)) +- implement AdLib filters in RundownView ([b88ef64](https://github.com/nrkno/tv-automation-server-core/commit/b88ef64)) +- implement camera number-device mapping for PTZ ([374568d](https://github.com/nrkno/tv-automation-server-core/commit/374568d)) +- implement click-to-adlib completely ([577dcac](https://github.com/nrkno/tv-automation-server-core/commit/577dcac)) +- implement client-side error reporting to Core ([f747057](https://github.com/nrkno/tv-automation-server-core/commit/f747057)) +- implement fibers support when testing in Jest ([bb99e97](https://github.com/nrkno/tv-automation-server-core/commit/bb99e97)) +- implement mosRoStoryMove ([ab76cfb](https://github.com/nrkno/tv-automation-server-core/commit/ab76cfb)) +- implement Panasonic PTZ device ([42d8534](https://github.com/nrkno/tv-automation-server-core/commit/42d8534)) +- implement Panasonic PTZ settings ([f7840da](https://github.com/nrkno/tv-automation-server-core/commit/f7840da)) +- implement spliting long scripts into beginning and end in popup ([9fa8006](https://github.com/nrkno/tv-automation-server-core/commit/9fa8006)) +- implement support for Spreadsheet gateway ([44dab01](https://github.com/nrkno/tv-automation-server-core/commit/44dab01)) +- implement timeline-visualizer view ([e725618](https://github.com/nrkno/tv-automation-server-core/commit/e725618)) +- implementation of blueprint migrations ([5fec7a2](https://github.com/nrkno/tv-automation-server-core/commit/5fec7a2)) +- implementation of disable-next-segmentLineItem ([a06d196](https://github.com/nrkno/tv-automation-server-core/commit/a06d196)) +- implementation of invalid segmentLine & invalid segmentLineItem (adLib) ([7ddcede](https://github.com/nrkno/tv-automation-server-core/commit/7ddcede)) +- implementation of new blueprint API ([34f905f](https://github.com/nrkno/tv-automation-server-core/commit/34f905f)) +- implemented mos profiles 0-2 ([d803da1](https://github.com/nrkno/tv-automation-server-core/commit/d803da1)) +- Implemented Notes into data structure & GUI ([735b8c5](https://github.com/nrkno/tv-automation-server-core/commit/735b8c5)) +- implemented partial timeline fix ([c8b56e4](https://github.com/nrkno/tv-automation-server-core/commit/c8b56e4)) +- implemented stricter typing & changed classes to ReactMeteorComponent where applicable ([9d2166e](https://github.com/nrkno/tv-automation-server-core/commit/9d2166e)) +- implemented userActions ([2b343e6](https://github.com/nrkno/tv-automation-server-core/commit/2b343e6)) +- import MOS snapshot ([ad11dd6](https://github.com/nrkno/tv-automation-server-core/commit/ad11dd6)) +- improve code quality (switch div's to buttons where they should be) ([70d9348](https://github.com/nrkno/tv-automation-server-core/commit/70d9348)) +- improved layout for presenter countdowns ([2bd61cc](https://github.com/nrkno/tv-automation-server-core/commit/2bd61cc)) +- include expectedMediaItems in RunningOrder snapshots ([9fcbba0](https://github.com/nrkno/tv-automation-server-core/commit/9fcbba0)) +- Infinite segmentlineitem ([c02a641](https://github.com/nrkno/tv-automation-server-core/commit/c02a641)) +- initial implementation of externalMessages, (not working yet) ([ace91f1](https://github.com/nrkno/tv-automation-server-core/commit/ace91f1)) +- Initial implementation of importing a running order from spreadsheet gateway (wip) ([870a500](https://github.com/nrkno/tv-automation-server-core/commit/870a500)) +- initial implementation of new general data ingest API ([a2b4987](https://github.com/nrkno/tv-automation-server-core/commit/a2b4987)) +- initial implementation of Take with Offset functionality ([9c860ca](https://github.com/nrkno/tv-automation-server-core/commit/9c860ca)) +- Initial timings for opening templates ([a9bfb66](https://github.com/nrkno/tv-automation-server-core/commit/a9bfb66)) +- Interfaces for describing the timeline, segments (titles), layers ([ea96dfb](https://github.com/nrkno/tv-automation-server-core/commit/ea96dfb)) +- jest config & example implementation of module mocks ([43ac8fa](https://github.com/nrkno/tv-automation-server-core/commit/43ac8fa)) +- jest mocks ([9fdadf3](https://github.com/nrkno/tv-automation-server-core/commit/9fdadf3)) +- KAM SLUTT variant ([e819269](https://github.com/nrkno/tv-automation-server-core/commit/e819269)) +- List, start and stop test recordings ([df552ab](https://github.com/nrkno/tv-automation-server-core/commit/df552ab)) +- load atem ssrc background when activating RO ([0eda9b4](https://github.com/nrkno/tv-automation-server-core/commit/0eda9b4)) +- log ClientResonseErrors as errors in userActionLog ([4bc10b5](https://github.com/nrkno/tv-automation-server-core/commit/4bc10b5)) +- log message on startup ([c715266](https://github.com/nrkno/tv-automation-server-core/commit/c715266)) +- log warning message when trying to access a studio.config value that hasn't been set. ([7e706c6](https://github.com/nrkno/tv-automation-server-core/commit/7e706c6)) +- log WorkFlow success or failure ([8e7d9d7](https://github.com/nrkno/tv-automation-server-core/commit/8e7d9d7)) +- lookahead ([5ed0f13](https://github.com/nrkno/tv-automation-server-core/commit/5ed0f13)) +- manipulator methods for inserting & removing showStyleBase & showStyleVariant ([6bb4e00](https://github.com/nrkno/tv-automation-server-core/commit/6bb4e00)) +- mark segmentline as invalid ([bd1f20c](https://github.com/nrkno/tv-automation-server-core/commit/bd1f20c)) +- Media Manager actions to restart & abort workflows ([6c94ad6](https://github.com/nrkno/tv-automation-server-core/commit/6c94ad6)) +- Media manager UI ([c83e1ff](https://github.com/nrkno/tv-automation-server-core/commit/c83e1ff)) +- media scanner & casparcg launcher hostnames ([02ec8be](https://github.com/nrkno/tv-automation-server-core/commit/02ec8be)) +- mediamanager: GUI support for SKIPPED step status ([1c39867](https://github.com/nrkno/tv-automation-server-core/commit/1c39867)) +- message queue retry button working with with retryUntil ([2fa05bb](https://github.com/nrkno/tv-automation-server-core/commit/2fa05bb)) +- MeteorReactComponent: return subscription & computation handle ([e20e6de](https://github.com/nrkno/tv-automation-server-core/commit/e20e6de)) +- method "ping" to be called by devices every now and then, to update lastSeen ([41a996c](https://github.com/nrkno/tv-automation-server-core/commit/41a996c)) +- Migration UI & started adding migration steps ([2a117ad](https://github.com/nrkno/tv-automation-server-core/commit/2a117ad)) +- Migration: added more migration steps for 0.16.0 ([2ac06ea](https://github.com/nrkno/tv-automation-server-core/commit/2ac06ea)) +- Migration: continued impl. ([8982701](https://github.com/nrkno/tv-automation-server-core/commit/8982701)) +- monitor externalMessageQueue for system status ([e92f5be](https://github.com/nrkno/tv-automation-server-core/commit/e92f5be)) +- more WIP for support panel ([b23c855](https://github.com/nrkno/tv-automation-server-core/commit/b23c855)) +- more work on notification center ([a34ccd0](https://github.com/nrkno/tv-automation-server-core/commit/a34ccd0)) +- more work on notification center ([92196ca](https://github.com/nrkno/tv-automation-server-core/commit/92196ca)) +- more work on peripheralDevices notifications ([692b1b2](https://github.com/nrkno/tv-automation-server-core/commit/692b1b2)) +- more work on peripheralDevices notifications ([36a0a4b](https://github.com/nrkno/tv-automation-server-core/commit/36a0a4b)) +- mos-actions ([248db8a](https://github.com/nrkno/tv-automation-server-core/commit/248db8a)) +- Move all device specific TimelineObj types to tsr-types ([55766a5](https://github.com/nrkno/tv-automation-server-core/commit/55766a5)) +- move delete button to peripheralDevice page ([46647c1](https://github.com/nrkno/tv-automation-server-core/commit/46647c1)) +- move delete button to peripheralDevice page ([286d12f](https://github.com/nrkno/tv-automation-server-core/commit/286d12f)) +- Move Mapping types to tsr-types package ([67bd838](https://github.com/nrkno/tv-automation-server-core/commit/67bd838)) +- move new timeline visualizer to replace the old broken one ([174dd7e](https://github.com/nrkno/tv-automation-server-core/commit/174dd7e)) +- Move SegmentLine duration calculation into templates ([315eb42](https://github.com/nrkno/tv-automation-server-core/commit/315eb42)) +- Move sofie and metadata urls from templates to config ([af8e388](https://github.com/nrkno/tv-automation-server-core/commit/af8e388)) +- Move some lawo and nora specific processing to blueprints ([a7a6aad](https://github.com/nrkno/tv-automation-server-core/commit/a7a6aad)) +- Move types to blueprint-integration ([c305061](https://github.com/nrkno/tv-automation-server-core/commit/c305061)) +- moved nightly cronjob to run after 4am ([8eb4e12](https://github.com/nrkno/tv-automation-server-core/commit/8eb4e12)) +- multiSelect component for selecting compatible Show Styles ([e1a5c35](https://github.com/nrkno/tv-automation-server-core/commit/e1a5c35)) +- only log logger.debug() when in developer mode ([8ed8e71](https://github.com/nrkno/tv-automation-server-core/commit/8ed8e71)) +- optimization: add cache of blueprints, to avoid having to parse text-functions all the time ([1e469d9](https://github.com/nrkno/tv-automation-server-core/commit/1e469d9)) +- output evaluation to log ([f95cfbf](https://github.com/nrkno/tv-automation-server-core/commit/f95cfbf)) +- output evaluation to log ([7deca0f](https://github.com/nrkno/tv-automation-server-core/commit/7deca0f)) +- place all collections in Collections object, for debugging purposes ([9682a89](https://github.com/nrkno/tv-automation-server-core/commit/9682a89)) +- playout device debugLogging (wip) ([7ab4ec6](https://github.com/nrkno/tv-automation-server-core/commit/7ab4ec6)) +- preliminary mongo mock implementation ([498b88f](https://github.com/nrkno/tv-automation-server-core/commit/498b88f)) +- prevent next:ing of currently playing segmentLine ([b9c9ea1](https://github.com/nrkno/tv-automation-server-core/commit/b9c9ea1)) +- prompter-view ([f45a923](https://github.com/nrkno/tv-automation-server-core/commit/f45a923)) +- prompter: add ^ and v indicators to where current take & next point is ([5c545e5](https://github.com/nrkno/tv-automation-server-core/commit/5c545e5)) +- prompter: continued implementation, url parameters etc ([785d0c0](https://github.com/nrkno/tv-automation-server-core/commit/785d0c0)) +- Prompter: New scroll mode: Smooth scrolling, which allows the user to use scroll wheel naturally ([e25ae40](https://github.com/nrkno/tv-automation-server-core/commit/e25ae40)) +- rabbitMQ: add support for headers ([e3e3d48](https://github.com/nrkno/tv-automation-server-core/commit/e3e3d48)) +- rabbitMQ: headers ([087bb2e](https://github.com/nrkno/tv-automation-server-core/commit/087bb2e)) +- Read all templates from database ([3287f63](https://github.com/nrkno/tv-automation-server-core/commit/3287f63)) +- Refactor blueprint contexts so be different per type to limit exposed api ([f0d1c7c](https://github.com/nrkno/tv-automation-server-core/commit/f0d1c7c)) +- Refactor external message template code ([21ac50e](https://github.com/nrkno/tv-automation-server-core/commit/21ac50e)) +- refactor of subscriptions (WIP) ([2b6f994](https://github.com/nrkno/tv-automation-server-core/commit/2b6f994)) +- refactor prompter view, prepare for modular controllers ([eb1ac27](https://github.com/nrkno/tv-automation-server-core/commit/eb1ac27)) +- Refactor story template code to use new blueprint structure ([104982b](https://github.com/nrkno/tv-automation-server-core/commit/104982b)) +- refactor systemStatus & add status messages on front page ([14da61a](https://github.com/nrkno/tv-automation-server-core/commit/14da61a)) +- refactor to use relative durations. affects infinite segmentlineitems, autonext, segmentline overlapduration property ([67c5444](https://github.com/nrkno/tv-automation-server-core/commit/67c5444)) +- refactored initDB into 2 separate methods, so we can easilly update just the layers and not the infrastructure ([d4fcc3f](https://github.com/nrkno/tv-automation-server-core/commit/d4fcc3f)) +- Reference blueprints-integration api file ([dc1cdb8](https://github.com/nrkno/tv-automation-server-core/commit/dc1cdb8)) +- Reference blueprints-integration utils file ([d94c97b](https://github.com/nrkno/tv-automation-server-core/commit/d94c97b)) +- Reference device options in tsr-types ([049b9bc](https://github.com/nrkno/tv-automation-server-core/commit/049b9bc)) +- reimplement fullscreen/on air button ([4b8658d](https://github.com/nrkno/tv-automation-server-core/commit/4b8658d)) +- Reimplement mock ro importing for new ingest data flow ([4b5ce20](https://github.com/nrkno/tv-automation-server-core/commit/4b5ce20)) +- reimplement remaining mos methods ([43b7ba1](https://github.com/nrkno/tv-automation-server-core/commit/43b7ba1)) +- Remove monaco ([e417548](https://github.com/nrkno/tv-automation-server-core/commit/e417548)) +- rename /clock into /countdowns/presenter ([96c3136](https://github.com/nrkno/tv-automation-server-core/commit/96c3136)) +- rename files according to new naming convention ([406fad2](https://github.com/nrkno/tv-automation-server-core/commit/406fad2)) +- reset 'dirty' segment lines by re-running blueprints on them ([064a84d](https://github.com/nrkno/tv-automation-server-core/commit/064a84d)) +- restart CasparCG from UI ([64509c3](https://github.com/nrkno/tv-automation-server-core/commit/64509c3)) +- reworked externalMessages page ([3b87242](https://github.com/nrkno/tv-automation-server-core/commit/3b87242)) +- reworked the whole activate/deacticate/reset/reload logic ([1fea56e](https://github.com/nrkno/tv-automation-server-core/commit/1fea56e)) +- Rewrite debug rerun blueprints helper to use new ingest data cache ([29692e4](https://github.com/nrkno/tv-automation-server-core/commit/29692e4)) +- Rewrite templateContext.getConfigValue to get default values from defaultConfig 'blueprint' and to cache values ([6ce0f97](https://github.com/nrkno/tv-automation-server-core/commit/6ce0f97)) +- run automatic migration when starting up a fresh system, if possible. ([4fb4759](https://github.com/nrkno/tv-automation-server-core/commit/4fb4759)) +- rundown layout editor in Settings ([df206e5](https://github.com/nrkno/tv-automation-server-core/commit/df206e5)) +- running order full-screen marker ([03010ec](https://github.com/nrkno/tv-automation-server-core/commit/03010ec)) +- RunningOrder unsynced notification ([9effce5](https://github.com/nrkno/tv-automation-server-core/commit/9effce5)) +- RunningOrderDataImport tidying and unsync guards ([d0a12d8](https://github.com/nrkno/tv-automation-server-core/commit/d0a12d8)) +- second upload to atem ([6697a80](https://github.com/nrkno/tv-automation-server-core/commit/6697a80)) +- segment line arguments ([3c5313a](https://github.com/nrkno/tv-automation-server-core/commit/3c5313a)) +- send evaluation message to slack. WIP ([3dcbe3a](https://github.com/nrkno/tv-automation-server-core/commit/3dcbe3a)) +- send evaluation message to slack. WIP ([96e8b81](https://github.com/nrkno/tv-automation-server-core/commit/96e8b81)) +- send the window url in the client error report ([807ccc9](https://github.com/nrkno/tv-automation-server-core/commit/807ccc9)) +- separate RO list into synced and unsynced lists ([6b92f40](https://github.com/nrkno/tv-automation-server-core/commit/6b92f40)) +- server side implementation of queueabilified adlibs ([0527b3b](https://github.com/nrkno/tv-automation-server-core/commit/0527b3b)) +- set in/out points through itemReplace ([4d31d70](https://github.com/nrkno/tv-automation-server-core/commit/4d31d70)) +- set triggerValue to lawo-TimelineObjs, so it triggers upon Nexting ([e3df655](https://github.com/nrkno/tv-automation-server-core/commit/e3df655)) +- settings: add workflow linger time ([9beefda](https://github.com/nrkno/tv-automation-server-core/commit/9beefda)) +- SH-121-Double-clicking zoom-scrubber should mean "zoom to show everything in this segment" ([aeadc46](https://github.com/nrkno/tv-automation-server-core/commit/aeadc46)) +- show 99+ instead of actual number for notifications ([1f84e67](https://github.com/nrkno/tv-automation-server-core/commit/1f84e67)) +- show a restart button in the notification if a parentDevice is connected and there is an issue with subdevice ([bde803b](https://github.com/nrkno/tv-automation-server-core/commit/bde803b)) +- show a restart button in the notification if a parentDevice is connected and there is an issue with subdevice ([67e75b0](https://github.com/nrkno/tv-automation-server-core/commit/67e75b0)) +- Show assignment in blueprint settings ([2816d45](https://github.com/nrkno/tv-automation-server-core/commit/2816d45)) +- show blueprint id in select options in Show Styles, hyphenated show-styles doesn't seem right ([e19802f](https://github.com/nrkno/tv-automation-server-core/commit/e19802f)) +- show changed timestamp on script items ([f2955e1](https://github.com/nrkno/tv-automation-server-core/commit/f2955e1)) +- show RO notes as notifications ([0ebc3fe](https://github.com/nrkno/tv-automation-server-core/commit/0ebc3fe)) +- show timecodes in SegmentLineContextMenus ([5df6e15](https://github.com/nrkno/tv-automation-server-core/commit/5df6e15)) +- show user activity log for timeslot of recording ([5c75305](https://github.com/nrkno/tv-automation-server-core/commit/5c75305)) +- show user name in evaluations ([c59d7ee](https://github.com/nrkno/tv-automation-server-core/commit/c59d7ee)) +- ShowStyle templates can be marked as helpers and accessed from other templates ([a20ffa7](https://github.com/nrkno/tv-automation-server-core/commit/a20ffa7)) +- Simplify RunningOrderBaseItem type ([2b8257b](https://github.com/nrkno/tv-automation-server-core/commit/2b8257b)) +- sketch interfaces for RundownLayouts ([69b37d9](https://github.com/nrkno/tv-automation-server-core/commit/69b37d9)) +- some work on notification center ([58ad599](https://github.com/nrkno/tv-automation-server-core/commit/58ad599)) +- some work on notification center ([8e2c269](https://github.com/nrkno/tv-automation-server-core/commit/8e2c269)) +- some work on updating the next part on data changes ([5551707](https://github.com/nrkno/tv-automation-server-core/commit/5551707)) +- SOURCE_NOT_SET for SLI Status ([cff64e1](https://github.com/nrkno/tv-automation-server-core/commit/cff64e1)) +- specific implementation: append Note on RunningOrder if segmentLine is not found ([a2ff6a2](https://github.com/nrkno/tv-automation-server-core/commit/a2ff6a2)) +- speech synthesis ([eb9643a](https://github.com/nrkno/tv-automation-server-core/commit/eb9643a)) +- Split (DVE 2LIKE) template ([8ccf23e](https://github.com/nrkno/tv-automation-server-core/commit/8ccf23e)) +- Start moving some migrations to blueprints ([9d4949e](https://github.com/nrkno/tv-automation-server-core/commit/9d4949e)) +- Start of stk and grafikk templates ([0458e3e](https://github.com/nrkno/tv-automation-server-core/commit/0458e3e)) +- start on migration for 0.25.0 ([104a867](https://github.com/nrkno/tv-automation-server-core/commit/104a867)) +- Start using types from sofie-blueprints-integration ([6106d99](https://github.com/nrkno/tv-automation-server-core/commit/6106d99)) +- started on mos device data implementation ([1d3b19a](https://github.com/nrkno/tv-automation-server-core/commit/1d3b19a)) +- started working on integration tests, added a client-side stub ([c4cbadc](https://github.com/nrkno/tv-automation-server-core/commit/c4cbadc)) +- status endpoint /health updated to use device statuses ([2c4b7fa](https://github.com/nrkno/tv-automation-server-core/commit/2c4b7fa)) +- store last shelf tab, rework UIStateStorage ([7ab0f3f](https://github.com/nrkno/tv-automation-server-core/commit/7ab0f3f)) +- Strip out old runtime functions ([880a885](https://github.com/nrkno/tv-automation-server-core/commit/880a885)) +- stub of setting in & out points ([0852b42](https://github.com/nrkno/tv-automation-server-core/commit/0852b42)) +- studio and system blueprints ([5ed64cf](https://github.com/nrkno/tv-automation-server-core/commit/5ed64cf)) +- Studio blueprint now selects variant to use for ROs ([6131057](https://github.com/nrkno/tv-automation-server-core/commit/6131057)) +- StudioInstallation key-value config store for template settings ([812c313](https://github.com/nrkno/tv-automation-server-core/commit/812c313)) +- StudioInstallation key-value config store for template settings ([b37ea17](https://github.com/nrkno/tv-automation-server-core/commit/b37ea17)) +- support displayDurationGroups in RO view ([460df8d](https://github.com/nrkno/tv-automation-server-core/commit/460df8d)) +- support for multiple notification actions ([09be9c1](https://github.com/nrkno/tv-automation-server-core/commit/09be9c1)) +- support for Pharos device ([4a99fb3](https://github.com/nrkno/tv-automation-server-core/commit/4a99fb3)) +- support media manager integration ([dcbf282](https://github.com/nrkno/tv-automation-server-core/commit/dcbf282)) +- Support panel WIP ([6955fdc](https://github.com/nrkno/tv-automation-server-core/commit/6955fdc)) +- support preload lookahead mode for nora, which swaps out take commands for cue ([4cfd4fe](https://github.com/nrkno/tv-automation-server-core/commit/4cfd4fe)) +- support timeline v2 by Johan & Julian ([fd039d8](https://github.com/nrkno/tv-automation-server-core/commit/fd039d8)) +- support workFlow comments ([6181006](https://github.com/nrkno/tv-automation-server-core/commit/6181006)) +- Switch to single-device design ([a268c40](https://github.com/nrkno/tv-automation-server-core/commit/a268c40)) +- syncFunction priorities ([4c99c11](https://github.com/nrkno/tv-automation-server-core/commit/4c99c11)) +- System snapshot ([006027b](https://github.com/nrkno/tv-automation-server-core/commit/006027b)) +- system version status monitoring ([1c96263](https://github.com/nrkno/tv-automation-server-core/commit/1c96263)) +- system-wide message ([d7305df](https://github.com/nrkno/tv-automation-server-core/commit/d7305df)) +- take from here UI item ([ca26660](https://github.com/nrkno/tv-automation-server-core/commit/ca26660)) +- **asRunLog:** collection implementation ([0e63c36](https://github.com/nrkno/tv-automation-server-core/commit/0e63c36)) +- **asRunLog:** implementation of asRunLog ([62f5b8c](https://github.com/nrkno/tv-automation-server-core/commit/62f5b8c)) +- **aux:** Adds tecnical error aux 2 ([34ce710](https://github.com/nrkno/tv-automation-server-core/commit/34ce710)) +- **AUX:** adds clock aux ([45479da](https://github.com/nrkno/tv-automation-server-core/commit/45479da)) +- **AUXes:** New AUX-mapping introducing more previews and moves the cleanfeed ([548bd8c](https://github.com/nrkno/tv-automation-server-core/commit/548bd8c)) +- **blueprint:** refactor getConfigValue into the blueprints, with context exposing the raw array as getConfig instead ([5b0ac39](https://github.com/nrkno/tv-automation-server-core/commit/5b0ac39)) +- **blueprints:** Add minimum core version to blueprints. Move blueprint restore code to api/blueprints ([2453a16](https://github.com/nrkno/tv-automation-server-core/commit/2453a16)) +- **blueprints:** Add section of studio settings based off a manifest from the blueprints ([4866a79](https://github.com/nrkno/tv-automation-server-core/commit/4866a79)) +- **blueprints:** Allow the post-process blueprint to modify a select few properties on the segmentLines ([ee02813](https://github.com/nrkno/tv-automation-server-core/commit/ee02813)) +- **blueprints:** Expose version string and uploading in the ui ([00875a4](https://github.com/nrkno/tv-automation-server-core/commit/00875a4)) +- **Capabilities:** Added basic Lawo and ATEM capabilities ([90d6edd](https://github.com/nrkno/tv-automation-server-core/commit/90d6edd)) +- **click-to-take:** initial WIP ([8e63808](https://github.com/nrkno/tv-automation-server-core/commit/8e63808)) +- **click-to-take:** more work in progress ([e3549e0](https://github.com/nrkno/tv-automation-server-core/commit/e3549e0)) +- **clip trim:** WIP on styling Clip trimmer components ([1af8ff4](https://github.com/nrkno/tv-automation-server-core/commit/1af8ff4)) +- **clip trim dialog:** add an icon to mark a trimmed clip ([371ddb8](https://github.com/nrkno/tv-automation-server-core/commit/371ddb8)) +- **clip trim dialog:** implement timecode encoder ([32e8f89](https://github.com/nrkno/tv-automation-server-core/commit/32e8f89)) +- **clip trim panel:** more WIP on components ([05daa8f](https://github.com/nrkno/tv-automation-server-core/commit/05daa8f)) +- **config:** Add support for enum config entries ([b4ae4b5](https://github.com/nrkno/tv-automation-server-core/commit/b4ae4b5)) +- **countdowns:** display autonext ([1405a89](https://github.com/nrkno/tv-automation-server-core/commit/1405a89)) +- **device:** Custom make-ready commands for httpsend device ([410a2ef](https://github.com/nrkno/tv-automation-server-core/commit/410a2ef)) +- **ENV:** adds ENV vars for default devices - casparcg, atem and lawo ([9bf8eee](https://github.com/nrkno/tv-automation-server-core/commit/9bf8eee)) +- **evaluation:** adds logging of evaluation level to keep statistics ([5da33a0](https://github.com/nrkno/tv-automation-server-core/commit/5da33a0)) +- **evaluation:** sends positive evaluations too ([d6c0bff](https://github.com/nrkno/tv-automation-server-core/commit/d6c0bff)) +- **expected media items:** updateExpectedMediaItems function ([e1ad692](https://github.com/nrkno/tv-automation-server-core/commit/e1ad692)) +- **expected media items:** use segmentLineId as key ([3803e87](https://github.com/nrkno/tv-automation-server-core/commit/3803e87)) +- **externalMessages:** add hold property, to be able to pause sending of messages ([adc69d8](https://github.com/nrkno/tv-automation-server-core/commit/adc69d8)) +- **Guest input:** use isGuestInput like isRemoteInput ([2d40e87](https://github.com/nrkno/tv-automation-server-core/commit/2d40e87)) +- **health check:** statusMessage implementation ([b01ac48](https://github.com/nrkno/tv-automation-server-core/commit/b01ac48)) +- **health check:** statusMessage implementation ([9bcf95a](https://github.com/nrkno/tv-automation-server-core/commit/9bcf95a)) +- **hotkeys:** optional cool down ([c9c2743](https://github.com/nrkno/tv-automation-server-core/commit/c9c2743)) +- **ingest:** First pass at ensuring all playout and ingest functions share a global rundown lock to avoid concurrent updates ([4b0cb56](https://github.com/nrkno/tv-automation-server-core/commit/4b0cb56)) +- **init:** adds clear shortcuts + skippabloe ([f824ae5](https://github.com/nrkno/tv-automation-server-core/commit/f824ae5)) +- **init:** adds multiple bak source layers ([c812510](https://github.com/nrkno/tv-automation-server-core/commit/c812510)) +- **init:** Adds RM 4,5,6 ([0021d7b](https://github.com/nrkno/tv-automation-server-core/commit/0021d7b)) +- **init:** Adds RM 4,5,6 ([dd59d47](https://github.com/nrkno/tv-automation-server-core/commit/dd59d47)) +- **init:** adds studio monitor html player to casparcg ([6533b0f](https://github.com/nrkno/tv-automation-server-core/commit/6533b0f)) +- **init:** bakskjerm type ([8ffe776](https://github.com/nrkno/tv-automation-server-core/commit/8ffe776)) +- **init:** moves countdown to casparcg machine 2, channel 1 ([6c93464](https://github.com/nrkno/tv-automation-server-core/commit/6c93464)) +- **init:** moves countdown to casparcg machine 2, channel 1 ([18c354b](https://github.com/nrkno/tv-automation-server-core/commit/18c354b)) +- **iterateDeeply:** exports iterateDeeply to template context ([42cc886](https://github.com/nrkno/tv-automation-server-core/commit/42cc886)) +- **lawo:** New structure to lawo devices and mappings ([35d812b](https://github.com/nrkno/tv-automation-server-core/commit/35d812b)) +- **loggin:** uses logger for better kibana logs ([8d31691](https://github.com/nrkno/tv-automation-server-core/commit/8d31691)) +- **lookahead:** Delay lookahead after an object by 1s if it is labelled by a class ([2c595fb](https://github.com/nrkno/tv-automation-server-core/commit/2c595fb)) +- **Media manager settings:** add 'mediaPath' property to storages ([50185b2](https://github.com/nrkno/tv-automation-server-core/commit/50185b2)) +- **media manager ui:** fix animations ([10a38de](https://github.com/nrkno/tv-automation-server-core/commit/10a38de)) +- **media manager ui:** nearly finishing the styling ([1bb3116](https://github.com/nrkno/tv-automation-server-core/commit/1bb3116)) +- **media manager ui:** show workflow creation time ([84a4b71](https://github.com/nrkno/tv-automation-server-core/commit/84a4b71)) +- **media manager UI:** WIP ([ccb54f0](https://github.com/nrkno/tv-automation-server-core/commit/ccb54f0)) +- timeline-visualizer: add details-on-click ([c81243c](https://github.com/nrkno/tv-automation-server-core/commit/c81243c)) +- **migration:** add previousVersion and buttons in GUI to revert database version ([61525a5](https://github.com/nrkno/tv-automation-server-core/commit/61525a5)) +- **migration:** display returned error message in GUI ([6169048](https://github.com/nrkno/tv-automation-server-core/commit/6169048)) +- **migration:** reafactor migrations and add new migration steps ([0966ef6](https://github.com/nrkno/tv-automation-server-core/commit/0966ef6)) +- **migrations:** automatically continue partialMigrations when possible ([f75e907](https://github.com/nrkno/tv-automation-server-core/commit/f75e907)) +- **migrations:** Move playout-device migrations to blueprints ([04029d4](https://github.com/nrkno/tv-automation-server-core/commit/04029d4)) +- take snapshot before running migration ([3ae4e92](https://github.com/nrkno/tv-automation-server-core/commit/3ae4e92)) +- take snapshot when saving evaluation form ([b98d68f](https://github.com/nrkno/tv-automation-server-core/commit/b98d68f)) +- take snapshot when saving evaluation form ([df318bb](https://github.com/nrkno/tv-automation-server-core/commit/df318bb)) +- templates: added format functions for timecode ([ea38081](https://github.com/nrkno/tv-automation-server-core/commit/ea38081)) +- this did not look right button ([1e01a10](https://github.com/nrkno/tv-automation-server-core/commit/1e01a10)) +- timings page ([6bc325a](https://github.com/nrkno/tv-automation-server-core/commit/6bc325a)) +- toggle running order argument on an SL with a hotkey ([258c3b3](https://github.com/nrkno/tv-automation-server-core/commit/258c3b3)) +- Transition as a seperate SegmentLineItem, which is not run if the first SegmentLine in the show, or the previous SegmentLine instructs it to not ([e676a43](https://github.com/nrkno/tv-automation-server-core/commit/e676a43)) +- translation improvements ([d3a535d](https://github.com/nrkno/tv-automation-server-core/commit/d3a535d)) +- Treat sli marked as virtual solely as markers for the timeline. They are hidden from the ui and are not allowed to place any contents on the timeline ([25e0f42](https://github.com/nrkno/tv-automation-server-core/commit/25e0f42)) +- trim config values (strings) ([d41e07e](https://github.com/nrkno/tv-automation-server-core/commit/d41e07e)) +- UI: Add Getting Started message on fresh system startup ([febe8ff](https://github.com/nrkno/tv-automation-server-core/commit/febe8ff)) +- unsynced mode ([#51](https://github.com/nrkno/tv-automation-server-core/issues/51)) ([7e0a263](https://github.com/nrkno/tv-automation-server-core/commit/7e0a263)) +- Update baseline generation for new blueprint api ([79767bf](https://github.com/nrkno/tv-automation-server-core/commit/79767bf)) +- update blueprint contexts to match new API ([ab6fc5a](https://github.com/nrkno/tv-automation-server-core/commit/ab6fc5a)) +- update dependencies ([6766d18](https://github.com/nrkno/tv-automation-server-core/commit/6766d18)) +- update meteor typings ([49b6969](https://github.com/nrkno/tv-automation-server-core/commit/49b6969)) +- Update template to use correct media files and durations. Adjust transitions from head to kam ([18f6c44](https://github.com/nrkno/tv-automation-server-core/commit/18f6c44)) +- Update timeline and infinite items on enps update ([db0c041](https://github.com/nrkno/tv-automation-server-core/commit/db0c041)) +- update type dependencies and type references. Removed dependency of mos-connection and replaced it with references to the blueprints-integration. ([85bd795](https://github.com/nrkno/tv-automation-server-core/commit/85bd795)) +- update types deps & API methods ([7d1a49b](https://github.com/nrkno/tv-automation-server-core/commit/7d1a49b)) +- Update typings for blueprints to be more specific ([53f7281](https://github.com/nrkno/tv-automation-server-core/commit/53f7281)) +- Update typings for message blueprint ([cf13fc9](https://github.com/nrkno/tv-automation-server-core/commit/cf13fc9)) +- updated timeline dependency ([6ef9eb7](https://github.com/nrkno/tv-automation-server-core/commit/6ef9eb7)) +- updated to match blueprints-integration /develop, started on new message-flow, WIP ([6b84b75](https://github.com/nrkno/tv-automation-server-core/commit/6b84b75)) +- url parameter "all" configures ui modes ([586d5f4](https://github.com/nrkno/tv-automation-server-core/commit/586d5f4)) +- use date-picker for user-activity-log ([5e2c218](https://github.com/nrkno/tv-automation-server-core/commit/5e2c218)) +- use default renderer for MIC sourceLayerType ([6ab97b7](https://github.com/nrkno/tv-automation-server-core/commit/6ab97b7)) +- use default renderer for MIC sourceLayerType ([ce845d4](https://github.com/nrkno/tv-automation-server-core/commit/ce845d4)) +- use generated svg as icons in countdown ([843ad10](https://github.com/nrkno/tv-automation-server-core/commit/843ad10)) +- Use studio baseline when no ro is active ([8353615](https://github.com/nrkno/tv-automation-server-core/commit/8353615)) +- validatedMethod mock ([2f3a641](https://github.com/nrkno/tv-automation-server-core/commit/2f3a641)) +- warn media status for interlacing and fps ([fc3ac4b](https://github.com/nrkno/tv-automation-server-core/commit/fc3ac4b)) +- warnings for media in wrong resolution ([55135c1](https://github.com/nrkno/tv-automation-server-core/commit/55135c1)) +- WIP: VERY preliminary implementation of quick and dirty manual playback ([a9ec948](https://github.com/nrkno/tv-automation-server-core/commit/a9ec948)) +- **multi-step success:** introduce keyStep property ([fc8aebd](https://github.com/nrkno/tv-automation-server-core/commit/fc8aebd)) +- **Next:** Adds warning/fallback of not loaded clips ([e20bc2f](https://github.com/nrkno/tv-automation-server-core/commit/e20bc2f)) +- **notification center:** hot-links to RO note notifications ([f3e9f59](https://github.com/nrkno/tv-automation-server-core/commit/f3e9f59)) +- zoom control buttons ([41c1c92](https://github.com/nrkno/tv-automation-server-core/commit/41c1c92)) +- **notification center:** notification count ([b8fbcac](https://github.com/nrkno/tv-automation-server-core/commit/b8fbcac)) +- **notification center:** squish segments in RO view when NC is open ([36b514f](https://github.com/nrkno/tv-automation-server-core/commit/36b514f)) +- **notification-center:** connection status notifier et al. ([e529e94](https://github.com/nrkno/tv-automation-server-core/commit/e529e94)) +- **notification-center:** connection status notifier et al. ([5aefd52](https://github.com/nrkno/tv-automation-server-core/commit/5aefd52)) +- **notification-center:** move expand notification center to right-hand status bar ([2750fab](https://github.com/nrkno/tv-automation-server-core/commit/2750fab)) +- **notification-center:** move expand notification center to right-hand status bar ([635c09d](https://github.com/nrkno/tv-automation-server-core/commit/635c09d)) +- **notification-center:** NotificationCenterPanel et al. ([c4794c8](https://github.com/nrkno/tv-automation-server-core/commit/c4794c8)) +- **notification-center:** NotificationCenterPanel et al. ([9283909](https://github.com/nrkno/tv-automation-server-core/commit/9283909)) +- **notification-center:** segment warning tweak ([e956488](https://github.com/nrkno/tv-automation-server-core/commit/e956488)) +- **notification-center:** segment warning tweak ([d4fc5e7](https://github.com/nrkno/tv-automation-server-core/commit/d4fc5e7)) +- **notifications-center:** notification center in other pages than ROV ([0620115](https://github.com/nrkno/tv-automation-server-core/commit/0620115)) +- **notifications-center:** notification center in other pages than ROV ([5250aab](https://github.com/nrkno/tv-automation-server-core/commit/5250aab)) +- **onlySelectedFiles:** support only selected files flag on shared storage options ([dee11d2](https://github.com/nrkno/tv-automation-server-core/commit/dee11d2)) +- **peripheralDevices:** added collection, publication, api, access control and tests ([794b5be](https://github.com/nrkno/tv-automation-server-core/commit/794b5be)) +- **playout:** Add class to sli first_object to indicate if sli is from the current or previous sl ([8de6004](https://github.com/nrkno/tv-automation-server-core/commit/8de6004)) +- **playout:** Add class to sli first_object when the sli is a continuation of another ([d53f06b](https://github.com/nrkno/tv-automation-server-core/commit/d53f06b)) +- **playout:** Add classes to sl-firstobject from the current and prev sl. This will allow for some logical triggers which can be influenced by the prev sl ([632326f](https://github.com/nrkno/tv-automation-server-core/commit/632326f)) +- **playout:** Add object to timeline to indicate whether ro is active or in rehersal ([d0e850d](https://github.com/nrkno/tv-automation-server-core/commit/d0e850d)) +- **playout:** Block take during transitions ([d0628a2](https://github.com/nrkno/tv-automation-server-core/commit/d0628a2)) +- **prompter:** add anchor points & movement tweaks ([c4ababe](https://github.com/nrkno/tv-automation-server-core/commit/c4ababe)) +- **prompter:** Add keyboard-controller, for control by keyboard-like devices ([c6e307d](https://github.com/nrkno/tv-automation-server-core/commit/c6e307d)) +- **prompter:** add mouse-ish controller, for control by mouse-like devices ([00a924f](https://github.com/nrkno/tv-automation-server-core/commit/00a924f)) +- **Prompter:** implement a simple mirror mode ([8d0be4e](https://github.com/nrkno/tv-automation-server-core/commit/8d0be4e)) +- **rabbit:** initial commit (wip) ([7ed3223](https://github.com/nrkno/tv-automation-server-core/commit/7ed3223)) +- **rabbitmq:** Implementation of RabbitMQ external message queue ([b31e15f](https://github.com/nrkno/tv-automation-server-core/commit/b31e15f)) +- **rabbitmq:** message id ([7ce9e5a](https://github.com/nrkno/tv-automation-server-core/commit/7ce9e5a)) +- **record:** basic video player page ([138b8b9](https://github.com/nrkno/tv-automation-server-core/commit/138b8b9)) +- **record:** Controls to delete files ([4236db2](https://github.com/nrkno/tv-automation-server-core/commit/4236db2)) +- **record:** Create timelineobjects to control recording to the timeline. Add config to the db, and ui to edit it ([b5e4ebf](https://github.com/nrkno/tv-automation-server-core/commit/b5e4ebf)) +- **record:** Input field for user to give recording a name ([116ea9f](https://github.com/nrkno/tv-automation-server-core/commit/116ea9f)) +- **refactor:** move Runtime Arguments for Blueprints from StudioInstallation to ShowStyleBase ([9b2c2d8](https://github.com/nrkno/tv-automation-server-core/commit/9b2c2d8)) +- **RO view:** Introduce a 'duration settling' state to delay the UI update until the actual playout duration is received from playout ([28823c3](https://github.com/nrkno/tv-automation-server-core/commit/28823c3)) +- **RundownLayouts:** allow for default tabs ([bdd7403](https://github.com/nrkno/tv-automation-server-core/commit/bdd7403)) +- **Setting:** adds lawo setting to studio and devices ([5ab1717](https://github.com/nrkno/tv-automation-server-core/commit/5ab1717)) +- **settings:** playout devices have threadUsage ([b74410c](https://github.com/nrkno/tv-automation-server-core/commit/b74410c)) +- **shortcuts:** adds shortcuts to remove various graphic layers ([0d1a83d](https://github.com/nrkno/tv-automation-server-core/commit/0d1a83d)) +- **shortcuts:** standarize shortcut label display, support numpad ([4c5ba74](https://github.com/nrkno/tv-automation-server-core/commit/4c5ba74)) +- **snapshot:** continued implementation ([009e9e5](https://github.com/nrkno/tv-automation-server-core/commit/009e9e5)) +- **snapshot:** edit snapshot comments ([264638a](https://github.com/nrkno/tv-automation-server-core/commit/264638a)) +- **snapshot:** Implement snapshots, API endpoints & restore ([72e1a83](https://github.com/nrkno/tv-automation-server-core/commit/72e1a83)) +- **snapshot:** implement support for taking snapshot of settings related to a single studio ([d177113](https://github.com/nrkno/tv-automation-server-core/commit/d177113)) +- **snapshot:** snapshot restore/backup GUI ([c414f70](https://github.com/nrkno/tv-automation-server-core/commit/c414f70)) +- **snapshot:** take snapshot of runningOrder & restore ([fc34f73](https://github.com/nrkno/tv-automation-server-core/commit/fc34f73)) +- **template:** setup atem wipe transition ([f0c576c](https://github.com/nrkno/tv-automation-server-core/commit/f0c576c)) +- **template:** temporary env variable for nora group (MESOS_NORA_GROUP) ([8b00bc4](https://github.com/nrkno/tv-automation-server-core/commit/8b00bc4)) +- **template:** use upstream keyer for vignett playback. Adds some more layers for atem defaults, and overrides to stack changes better ([76b1e10](https://github.com/nrkno/tv-automation-server-core/commit/76b1e10)) +- wrap blueprint functions, to emit better errors ([14873f1](https://github.com/nrkno/tv-automation-server-core/commit/14873f1)) +- **Template doc:** Added CasparCG resources ([80f98d5](https://github.com/nrkno/tv-automation-server-core/commit/80f98d5)) +- **templates:** Use ShowStyle to define default/fallback state. Play and stop head supers ([8375363](https://github.com/nrkno/tv-automation-server-core/commit/8375363)) +- **Templates:** Start parsing some new mos data. Process mesos based graphics. Set some lawo audio states ([df4b670](https://github.com/nrkno/tv-automation-server-core/commit/df4b670)) +- **timeline:** Remove deviceId field from timeline objects ([85c4b89](https://github.com/nrkno/tv-automation-server-core/commit/85c4b89)) +- **timeline:** some initial work on labels taking account of liveline ([3086eec](https://github.com/nrkno/tv-automation-server-core/commit/3086eec)) +- **Timeline:** more work on new marker style ([570e408](https://github.com/nrkno/tv-automation-server-core/commit/570e408)) -## [0.24.1](https://github.com/nrkno/tv-automation-server-core/compare/v0.24.0...v0.24.1) (2019-05-22) +## [0.24.1](https://github.com/nrkno/tv-automation-server-core/compare/v0.24.0...v0.24.1) (2019-05-22) ### Bug Fixes -* Update tsr version ([92359bd](https://github.com/nrkno/tv-automation-server-core/commit/92359bd)) -* Using object as notification message ([f06aee6](https://github.com/nrkno/tv-automation-server-core/commit/f06aee6)) - - +- Update tsr version ([92359bd](https://github.com/nrkno/tv-automation-server-core/commit/92359bd)) +- Using object as notification message ([f06aee6](https://github.com/nrkno/tv-automation-server-core/commit/f06aee6)) + # 0.24.0 (2019-05-16) ### Features #### Take from anywhere -*It is now prossible to start playing from anywhere in a segmentLine, not just from the beginning of it* -* Merge branch 'feature/takeFromOffset' into develop ([e50c0cf](https://github.com/nrkno/tv-automation-server-core/commit/e50c0cf)) -* feat: initial implementation of Take with Offset functionality ([9c860ca](https://github.com/nrkno/tv-automation-server-core/commit/9c860ca)) -* fix: fix set offset working from UI ([91bc80d](https://github.com/nrkno/tv-automation-server-core/commit/91bc80d)) -* fix: show full timecode for set with of offset ([0954ce6](https://github.com/nrkno/tv-automation-server-core/commit/0954ce6)) + +_It is now prossible to start playing from anywhere in a segmentLine, not just from the beginning of it_ + +- Merge branch 'feature/takeFromOffset' into develop ([e50c0cf](https://github.com/nrkno/tv-automation-server-core/commit/e50c0cf)) +- feat: initial implementation of Take with Offset functionality ([9c860ca](https://github.com/nrkno/tv-automation-server-core/commit/9c860ca)) +- fix: fix set offset working from UI ([91bc80d](https://github.com/nrkno/tv-automation-server-core/commit/91bc80d)) +- fix: show full timecode for set with of offset ([0954ce6](https://github.com/nrkno/tv-automation-server-core/commit/0954ce6)) #### Set In / Out points -*UI for editing in & out-points of video clips* -* feat: clip trim panel WIP ([36e79dc](https://github.com/nrkno/tv-automation-server-core/commit/36e79dc)) -* feat: clip trim panel WIP ([9d01c2b](https://github.com/nrkno/tv-automation-server-core/commit/9d01c2b)) -* feat: clip trim panel working, hide video monitor under a flag ([72ee490](https://github.com/nrkno/tv-automation-server-core/commit/72ee490)) -* feat(clip trim dialog): add an icon to mark a trimmed clip ([371ddb8](https://github.com/nrkno/tv-automation-server-core/commit/371ddb8)) -* feat(clip trim dialog): implement timecode encoder ([32e8f89](https://github.com/nrkno/tv-automation-server-core/commit/32e8f89)) -* feat(clip trim panel): more WIP on components ([05daa8f](https://github.com/nrkno/tv-automation-server-core/commit/05daa8f)) -* feat(clip trim): WIP on styling Clip trimmer components ([1af8ff4](https://github.com/nrkno/tv-automation-server-core/commit/1af8ff4)) + +_UI for editing in & out-points of video clips_ + +- feat: clip trim panel WIP ([36e79dc](https://github.com/nrkno/tv-automation-server-core/commit/36e79dc)) +- feat: clip trim panel WIP ([9d01c2b](https://github.com/nrkno/tv-automation-server-core/commit/9d01c2b)) +- feat: clip trim panel working, hide video monitor under a flag ([72ee490](https://github.com/nrkno/tv-automation-server-core/commit/72ee490)) +- feat(clip trim dialog): add an icon to mark a trimmed clip ([371ddb8](https://github.com/nrkno/tv-automation-server-core/commit/371ddb8)) +- feat(clip trim dialog): implement timecode encoder ([32e8f89](https://github.com/nrkno/tv-automation-server-core/commit/32e8f89)) +- feat(clip trim panel): more WIP on components ([05daa8f](https://github.com/nrkno/tv-automation-server-core/commit/05daa8f)) +- feat(clip trim): WIP on styling Clip trimmer components ([1af8ff4](https://github.com/nrkno/tv-automation-server-core/commit/1af8ff4)) #### Prompter -*Teleprompter on a separate page (se documentation in README)* -* Merge branch 'feature/prompter2' into develop ([fc7c038](https://github.com/nrkno/tv-automation-server-core/commit/fc7c038)) -* feat: prompter: add ^ and v indicators to where current take & next point is ([5c545e5](https://github.com/nrkno/tv-automation-server-core/commit/5c545e5)) -* feat: prompter: continued implementation, url parameters etc ([785d0c0](https://github.com/nrkno/tv-automation-server-core/commit/785d0c0)) -* feat: Prompter: New scroll mode: Smooth scrolling, which allows the user to use scroll wheel natural ([e25ae40](https://github.com/nrkno/tv-automation-server-core/commit/e25ae40)) -* feat: refactor prompter view, prepare for modular controllers ([eb1ac27](https://github.com/nrkno/tv-automation-server-core/commit/eb1ac27)) -* feat(prompter): add anchor points & movement tweaks ([c4ababe](https://github.com/nrkno/tv-automation-server-core/commit/c4ababe)) -* feat(prompter): Add keyboard-controller, for control by keyboard-like devices ([c6e307d](https://github.com/nrkno/tv-automation-server-core/commit/c6e307d)) -* feat(prompter): add mouse-ish controller, for control by mouse-like devices ([00a924f](https://github.com/nrkno/tv-automation-server-core/commit/00a924f)) + +_Teleprompter on a separate page (se documentation in README)_ + +- Merge branch 'feature/prompter2' into develop ([fc7c038](https://github.com/nrkno/tv-automation-server-core/commit/fc7c038)) +- feat: prompter: add ^ and v indicators to where current take & next point is ([5c545e5](https://github.com/nrkno/tv-automation-server-core/commit/5c545e5)) +- feat: prompter: continued implementation, url parameters etc ([785d0c0](https://github.com/nrkno/tv-automation-server-core/commit/785d0c0)) +- feat: Prompter: New scroll mode: Smooth scrolling, which allows the user to use scroll wheel natural ([e25ae40](https://github.com/nrkno/tv-automation-server-core/commit/e25ae40)) +- feat: refactor prompter view, prepare for modular controllers ([eb1ac27](https://github.com/nrkno/tv-automation-server-core/commit/eb1ac27)) +- feat(prompter): add anchor points & movement tweaks ([c4ababe](https://github.com/nrkno/tv-automation-server-core/commit/c4ababe)) +- feat(prompter): Add keyboard-controller, for control by keyboard-like devices ([c6e307d](https://github.com/nrkno/tv-automation-server-core/commit/c6e307d)) +- feat(prompter): add mouse-ish controller, for control by mouse-like devices ([00a924f](https://github.com/nrkno/tv-automation-server-core/commit/00a924f)) #### Invalid SegmentLines -*If a segmentLine cannot be created proberly by the blueprint, it can no be set as "invalid", which prevents it from being played out* -* Merge branch 'feature/invalid' into develop ([fc10b8c](https://github.com/nrkno/tv-automation-server-core/commit/fc10b8c)) -* Merge remote-tracking branch 'origin/feature/invalidSegmentLine' into develop ([6ce8c04](https://github.com/nrkno/tv-automation-server-core/commit/6ce8c04)) -* feat: implementation of invalid segmentLine & invalid segmentLineItem (adLib) ([7ddcede](https://github.com/nrkno/tv-automation-server-core/commit/7ddcede)) -* feat: mark segmentline as invalid ([bd1f20c](https://github.com/nrkno/tv-automation-server-core/commit/bd1f20c)) + +_If a segmentLine cannot be created proberly by the blueprint, it can no be set as "invalid", which prevents it from being played out_ + +- Merge branch 'feature/invalid' into develop ([fc10b8c](https://github.com/nrkno/tv-automation-server-core/commit/fc10b8c)) +- Merge remote-tracking branch 'origin/feature/invalidSegmentLine' into develop ([6ce8c04](https://github.com/nrkno/tv-automation-server-core/commit/6ce8c04)) +- feat: implementation of invalid segmentLine & invalid segmentLineItem (adLib) ([7ddcede](https://github.com/nrkno/tv-automation-server-core/commit/7ddcede)) +- feat: mark segmentline as invalid ([bd1f20c](https://github.com/nrkno/tv-automation-server-core/commit/bd1f20c)) #### System & studio blueprints -*The blueprints have now been split into system-, studio- & showStyle- bluepprints* -* Merge pull request #79 from nrkno/feature/system-studio-blueprints ([f3a67e2](https://github.com/nrkno/tv-automation-server-core/commit/f3a67e2)), closes [#79](https://github.com/nrkno/tv-automation-server-core/issues/79) -* feat: Batch uploading of blueprints in one http request ([5a707e1](https://github.com/nrkno/tv-automation-server-core/commit/5a707e1)) -* feat: studio and system blueprints ([5ed64cf](https://github.com/nrkno/tv-automation-server-core/commit/5ed64cf)) -* feat: Show assignment in blueprint settings ([2816d45](https://github.com/nrkno/tv-automation-server-core/commit/2816d45)) -* feat: Studio blueprint now selects variant to use for ROs ([6131057](https://github.com/nrkno/tv-automation-server-core/commit/6131057)) -* fix: Add migration to set type on existing blueprints ([f1b4f3c](https://github.com/nrkno/tv-automation-server-core/commit/f1b4f3c)) -* fix: Creating blueprints in UI ([8419ecf](https://github.com/nrkno/tv-automation-server-core/commit/8419ecf)) -* feat: Use studio baseline when no ro is active ([8353615](https://github.com/nrkno/tv-automation-server-core/commit/8353615)) -#### Other -* Merge branch 'feature/rehaulVersions' into develop ([0e655f5](https://github.com/nrkno/tv-automation-server-core/commit/0e655f5)) -* feat: add a user-definable CoreSystem.name that is displayed in the header and title bar ([493568e](https://github.com/nrkno/tv-automation-server-core/commit/493568e)) -* feat: add notes to RunningOrder ([6100b0c](https://github.com/nrkno/tv-automation-server-core/commit/6100b0c)) -* feat: Button to assign/unassign system blueprint ([edef22a](https://github.com/nrkno/tv-automation-server-core/commit/edef22a)) -* feat: Crude UI to rerun studio baseline ([25b2395](https://github.com/nrkno/tv-automation-server-core/commit/25b2395)) -* feat: log ClientResonseErrors as errors in userActionLog ([4bc10b5](https://github.com/nrkno/tv-automation-server-core/commit/4bc10b5)) -* feat: bump blueprints-integration version ([6f2c46d](https://github.com/nrkno/tv-automation-server-core/commit/6f2c46d)) -* feat: show RO notes as notifications ([0ebc3fe](https://github.com/nrkno/tv-automation-server-core/commit/0ebc3fe)) -* feat: show timecodes in SegmentLineContextMenus ([5df6e15](https://github.com/nrkno/tv-automation-server-core/commit/5df6e15)) -* feat: specific implementation: append Note on RunningOrder if segmentLine is not found ([a2ff6a2](https://github.com/nrkno/tv-automation-server-core/commit/a2ff6a2)) -* feat: take from here UI item ([ca26660](https://github.com/nrkno/tv-automation-server-core/commit/ca26660)) -* feat: change VideoEditMonitors behavior from hoverScrub to click-and-drag ([77327fe](https://github.com/nrkno/tv-automation-server-core/commit/77327fe)) -* feat: Change styling for video monitors ([a01de7d](https://github.com/nrkno/tv-automation-server-core/commit/a01de7d)) +_The blueprints have now been split into system-, studio- & showStyle- bluepprints_ +- Merge pull request #79 from nrkno/feature/system-studio-blueprints ([f3a67e2](https://github.com/nrkno/tv-automation-server-core/commit/f3a67e2)), closes [#79](https://github.com/nrkno/tv-automation-server-core/issues/79) +- feat: Batch uploading of blueprints in one http request ([5a707e1](https://github.com/nrkno/tv-automation-server-core/commit/5a707e1)) +- feat: studio and system blueprints ([5ed64cf](https://github.com/nrkno/tv-automation-server-core/commit/5ed64cf)) +- feat: Show assignment in blueprint settings ([2816d45](https://github.com/nrkno/tv-automation-server-core/commit/2816d45)) +- feat: Studio blueprint now selects variant to use for ROs ([6131057](https://github.com/nrkno/tv-automation-server-core/commit/6131057)) +- fix: Add migration to set type on existing blueprints ([f1b4f3c](https://github.com/nrkno/tv-automation-server-core/commit/f1b4f3c)) +- fix: Creating blueprints in UI ([8419ecf](https://github.com/nrkno/tv-automation-server-core/commit/8419ecf)) +- feat: Use studio baseline when no ro is active ([8353615](https://github.com/nrkno/tv-automation-server-core/commit/8353615)) -### Bug fixes -* fix: a bug where DEFAULT_DISPLAY_DURATION would be added to a 0-duration member of a displayDuration ([13f784d](https://github.com/nrkno/tv-automation-server-core/commit/13f784d)) -* fix: add missing $ne (not equal) in mongoWhere ([53c76a8](https://github.com/nrkno/tv-automation-server-core/commit/53c76a8)) -* fix: Blueprint selection input in studio settings ([fc80da1](https://github.com/nrkno/tv-automation-server-core/commit/fc80da1)) -* fix: catch scroll events properly in later Chrome versions. ([7396973](https://github.com/nrkno/tv-automation-server-core/commit/7396973)) -* fix: clip floating inspector values ([d4c7430](https://github.com/nrkno/tv-automation-server-core/commit/d4c7430)) -* fix: fix an issue where some of the snapshot restores would not be recognized as JSON ([57d31bc](https://github.com/nrkno/tv-automation-server-core/commit/57d31bc)) -* fix: fix an issue where the message for clip ingested would be "null, Clip is being ingested" ([7ac5672](https://github.com/nrkno/tv-automation-server-core/commit/7ac5672)) -* fix: fix MOS status indicators in RO header ([c0724cc](https://github.com/nrkno/tv-automation-server-core/commit/c0724cc)) -* fix: handle take situation better when having invalid segmentLines ([dacd3b0](https://github.com/nrkno/tv-automation-server-core/commit/dacd3b0)) -* fix: issue with segment context menu ([7a44deb](https://github.com/nrkno/tv-automation-server-core/commit/7a44deb)) -* fix: Made sure that the typography update for the prompter has a font fallback. ([6f2b20a](https://github.com/nrkno/tv-automation-server-core/commit/6f2b20a)) -* fix: make segmentLine.invalid optional ([c179e3c](https://github.com/nrkno/tv-automation-server-core/commit/c179e3c)) -* fix: missing key property ([79fb3e6](https://github.com/nrkno/tv-automation-server-core/commit/79fb3e6)) -* fix: missing sass import ([f1f10ff](https://github.com/nrkno/tv-automation-server-core/commit/f1f10ff)) -* fix: more fixes for MOS status indicator in header ([97311b1](https://github.com/nrkno/tv-automation-server-core/commit/97311b1)) -* fix: on air label position ([00d4e20](https://github.com/nrkno/tv-automation-server-core/commit/00d4e20)) -* fix: Prompter: keyboard device interface ([540f47a](https://github.com/nrkno/tv-automation-server-core/commit/540f47a)) -* fix: rehaul of versions, WIP ([93dea2f](https://github.com/nrkno/tv-automation-server-core/commit/93dea2f)) -* fix: rename "Edit" to "Trim" for clipTrimDialog ([3879a34](https://github.com/nrkno/tv-automation-server-core/commit/3879a34)) -* fix: rewind all segments when re-enabling follow on air ([a23b84c](https://github.com/nrkno/tv-automation-server-core/commit/a23b84c)) -* fix: systemStatus versions ([62bfa9a](https://github.com/nrkno/tv-automation-server-core/commit/62bfa9a)) -* fix: upd query-string dependency & fixed typings issue ([e0d3f12](https://github.com/nrkno/tv-automation-server-core/commit/e0d3f12)) -* fix: update timeline-visualizer ([8e46981](https://github.com/nrkno/tv-automation-server-core/commit/8e46981)) -* fix: update typings ([d536ad1](https://github.com/nrkno/tv-automation-server-core/commit/d536ad1)) -* fix: version handling ([4b9863a](https://github.com/nrkno/tv-automation-server-core/commit/4b9863a)) -* fix: Update blueprints-integration ([9870256](https://github.com/nrkno/tv-automation-server-core/commit/9870256)) -* fix: update blueprints-integration depencendy & update getHashId to match ([e1c12d2](https://github.com/nrkno/tv-automation-server-core/commit/e1c12d2)) -* fix: make sure that expectedMediaItems are purged along with the RO ([0d9dda1](https://github.com/nrkno/tv-automation-server-core/commit/0d9dda1)) -* fix: solve a problem with viewing recordings ([01c165b](https://github.com/nrkno/tv-automation-server-core/commit/01c165b)) -* fix: handle when error is thrown in function in makePromise ([b7094dd](https://github.com/nrkno/tv-automation-server-core/commit/b7094dd)) -* fix: multiply inPoint/duration by timeBase before sending back to MOS ([b576f26](https://github.com/nrkno/tv-automation-server-core/commit/b576f26)) -* fix: write back TimeBase when changing EditorialStart/Duration ([8012cea](https://github.com/nrkno/tv-automation-server-core/commit/8012cea)) -* fix: strip blueprint manifest versions of '^' ([54a5ecf](https://github.com/nrkno/tv-automation-server-core/commit/54a5ecf)) -* fix: solve an issue with content trimmed icon ([461617f](https://github.com/nrkno/tv-automation-server-core/commit/461617f)) -* fix: wait for response from MOS device until resolving segmentLineItemSetInOutPoints ([2572a11](https://github.com/nrkno/tv-automation-server-core/commit/2572a11)) -* fix: resolve an issue with dropdown EditAttribute not selecting the undefined option ([9f85845](https://github.com/nrkno/tv-automation-server-core/commit/9f85845)) -* fix: ensure that VideoEditMonitor is comfortably scrubbable at any window width ([a5e882a](https://github.com/nrkno/tv-automation-server-core/commit/a5e882a)) -* fix: implement Play from here ([bd79569](https://github.com/nrkno/tv-automation-server-core/commit/bd79569)) -* fix: backport timing changes for play-from-anywhere from R10 ([5d96b1e](https://github.com/nrkno/tv-automation-server-core/commit/5d96b1e)) -* fix: hide "Restart playout" from support panel when not in studio mode ([5820b00](https://github.com/nrkno/tv-automation-server-core/commit/5820b00)) -* fix(displayDurationGroup): fix GUI clocks for displayDurationGroups ([76e217e](https://github.com/nrkno/tv-automation-server-core/commit/76e217e)) -* fix(displayDurationGroup): use displayDurationGroup timing in presenter's screen ([9138845](https://github.com/nrkno/tv-automation-server-core/commit/9138845)) -* fix(lookahead): Give lookahead the correct limit when in the next SegmentLine during autonext ([0b20b9e](https://github.com/nrkno/tv-automation-server-core/commit/0b20b9e)) -* fix(lookahead): Produced objects not resolving properly ([7660bf5](https://github.com/nrkno/tv-automation-server-core/commit/7660bf5)) -* fix(migrations): Ensure there are migrations to run before running another batch ([c3d77b5](https://github.com/nrkno/tv-automation-server-core/commit/c3d77b5)) +#### Other +- Merge branch 'feature/rehaulVersions' into develop ([0e655f5](https://github.com/nrkno/tv-automation-server-core/commit/0e655f5)) +- feat: add a user-definable CoreSystem.name that is displayed in the header and title bar ([493568e](https://github.com/nrkno/tv-automation-server-core/commit/493568e)) +- feat: add notes to RunningOrder ([6100b0c](https://github.com/nrkno/tv-automation-server-core/commit/6100b0c)) +- feat: Button to assign/unassign system blueprint ([edef22a](https://github.com/nrkno/tv-automation-server-core/commit/edef22a)) +- feat: Crude UI to rerun studio baseline ([25b2395](https://github.com/nrkno/tv-automation-server-core/commit/25b2395)) +- feat: log ClientResonseErrors as errors in userActionLog ([4bc10b5](https://github.com/nrkno/tv-automation-server-core/commit/4bc10b5)) +- feat: bump blueprints-integration version ([6f2c46d](https://github.com/nrkno/tv-automation-server-core/commit/6f2c46d)) +- feat: show RO notes as notifications ([0ebc3fe](https://github.com/nrkno/tv-automation-server-core/commit/0ebc3fe)) +- feat: show timecodes in SegmentLineContextMenus ([5df6e15](https://github.com/nrkno/tv-automation-server-core/commit/5df6e15)) +- feat: specific implementation: append Note on RunningOrder if segmentLine is not found ([a2ff6a2](https://github.com/nrkno/tv-automation-server-core/commit/a2ff6a2)) +- feat: take from here UI item ([ca26660](https://github.com/nrkno/tv-automation-server-core/commit/ca26660)) +- feat: change VideoEditMonitors behavior from hoverScrub to click-and-drag ([77327fe](https://github.com/nrkno/tv-automation-server-core/commit/77327fe)) +- feat: Change styling for video monitors ([a01de7d](https://github.com/nrkno/tv-automation-server-core/commit/a01de7d)) +### Bug fixes +- fix: a bug where DEFAULT_DISPLAY_DURATION would be added to a 0-duration member of a displayDuration ([13f784d](https://github.com/nrkno/tv-automation-server-core/commit/13f784d)) +- fix: add missing $ne (not equal) in mongoWhere ([53c76a8](https://github.com/nrkno/tv-automation-server-core/commit/53c76a8)) +- fix: Blueprint selection input in studio settings ([fc80da1](https://github.com/nrkno/tv-automation-server-core/commit/fc80da1)) +- fix: catch scroll events properly in later Chrome versions. ([7396973](https://github.com/nrkno/tv-automation-server-core/commit/7396973)) +- fix: clip floating inspector values ([d4c7430](https://github.com/nrkno/tv-automation-server-core/commit/d4c7430)) +- fix: fix an issue where some of the snapshot restores would not be recognized as JSON ([57d31bc](https://github.com/nrkno/tv-automation-server-core/commit/57d31bc)) +- fix: fix an issue where the message for clip ingested would be "null, Clip is being ingested" ([7ac5672](https://github.com/nrkno/tv-automation-server-core/commit/7ac5672)) +- fix: fix MOS status indicators in RO header ([c0724cc](https://github.com/nrkno/tv-automation-server-core/commit/c0724cc)) +- fix: handle take situation better when having invalid segmentLines ([dacd3b0](https://github.com/nrkno/tv-automation-server-core/commit/dacd3b0)) +- fix: issue with segment context menu ([7a44deb](https://github.com/nrkno/tv-automation-server-core/commit/7a44deb)) +- fix: Made sure that the typography update for the prompter has a font fallback. ([6f2b20a](https://github.com/nrkno/tv-automation-server-core/commit/6f2b20a)) +- fix: make segmentLine.invalid optional ([c179e3c](https://github.com/nrkno/tv-automation-server-core/commit/c179e3c)) +- fix: missing key property ([79fb3e6](https://github.com/nrkno/tv-automation-server-core/commit/79fb3e6)) +- fix: missing sass import ([f1f10ff](https://github.com/nrkno/tv-automation-server-core/commit/f1f10ff)) +- fix: more fixes for MOS status indicator in header ([97311b1](https://github.com/nrkno/tv-automation-server-core/commit/97311b1)) +- fix: on air label position ([00d4e20](https://github.com/nrkno/tv-automation-server-core/commit/00d4e20)) +- fix: Prompter: keyboard device interface ([540f47a](https://github.com/nrkno/tv-automation-server-core/commit/540f47a)) +- fix: rehaul of versions, WIP ([93dea2f](https://github.com/nrkno/tv-automation-server-core/commit/93dea2f)) +- fix: rename "Edit" to "Trim" for clipTrimDialog ([3879a34](https://github.com/nrkno/tv-automation-server-core/commit/3879a34)) +- fix: rewind all segments when re-enabling follow on air ([a23b84c](https://github.com/nrkno/tv-automation-server-core/commit/a23b84c)) +- fix: systemStatus versions ([62bfa9a](https://github.com/nrkno/tv-automation-server-core/commit/62bfa9a)) +- fix: upd query-string dependency & fixed typings issue ([e0d3f12](https://github.com/nrkno/tv-automation-server-core/commit/e0d3f12)) +- fix: update timeline-visualizer ([8e46981](https://github.com/nrkno/tv-automation-server-core/commit/8e46981)) +- fix: update typings ([d536ad1](https://github.com/nrkno/tv-automation-server-core/commit/d536ad1)) +- fix: version handling ([4b9863a](https://github.com/nrkno/tv-automation-server-core/commit/4b9863a)) +- fix: Update blueprints-integration ([9870256](https://github.com/nrkno/tv-automation-server-core/commit/9870256)) +- fix: update blueprints-integration depencendy & update getHashId to match ([e1c12d2](https://github.com/nrkno/tv-automation-server-core/commit/e1c12d2)) +- fix: make sure that expectedMediaItems are purged along with the RO ([0d9dda1](https://github.com/nrkno/tv-automation-server-core/commit/0d9dda1)) +- fix: solve a problem with viewing recordings ([01c165b](https://github.com/nrkno/tv-automation-server-core/commit/01c165b)) +- fix: handle when error is thrown in function in makePromise ([b7094dd](https://github.com/nrkno/tv-automation-server-core/commit/b7094dd)) +- fix: multiply inPoint/duration by timeBase before sending back to MOS ([b576f26](https://github.com/nrkno/tv-automation-server-core/commit/b576f26)) +- fix: write back TimeBase when changing EditorialStart/Duration ([8012cea](https://github.com/nrkno/tv-automation-server-core/commit/8012cea)) +- fix: strip blueprint manifest versions of '^' ([54a5ecf](https://github.com/nrkno/tv-automation-server-core/commit/54a5ecf)) +- fix: solve an issue with content trimmed icon ([461617f](https://github.com/nrkno/tv-automation-server-core/commit/461617f)) +- fix: wait for response from MOS device until resolving segmentLineItemSetInOutPoints ([2572a11](https://github.com/nrkno/tv-automation-server-core/commit/2572a11)) +- fix: resolve an issue with dropdown EditAttribute not selecting the undefined option ([9f85845](https://github.com/nrkno/tv-automation-server-core/commit/9f85845)) +- fix: ensure that VideoEditMonitor is comfortably scrubbable at any window width ([a5e882a](https://github.com/nrkno/tv-automation-server-core/commit/a5e882a)) +- fix: implement Play from here ([bd79569](https://github.com/nrkno/tv-automation-server-core/commit/bd79569)) +- fix: backport timing changes for play-from-anywhere from R10 ([5d96b1e](https://github.com/nrkno/tv-automation-server-core/commit/5d96b1e)) +- fix: hide "Restart playout" from support panel when not in studio mode ([5820b00](https://github.com/nrkno/tv-automation-server-core/commit/5820b00)) +- fix(displayDurationGroup): fix GUI clocks for displayDurationGroups ([76e217e](https://github.com/nrkno/tv-automation-server-core/commit/76e217e)) +- fix(displayDurationGroup): use displayDurationGroup timing in presenter's screen ([9138845](https://github.com/nrkno/tv-automation-server-core/commit/9138845)) +- fix(lookahead): Give lookahead the correct limit when in the next SegmentLine during autonext ([0b20b9e](https://github.com/nrkno/tv-automation-server-core/commit/0b20b9e)) +- fix(lookahead): Produced objects not resolving properly ([7660bf5](https://github.com/nrkno/tv-automation-server-core/commit/7660bf5)) +- fix(migrations): Ensure there are migrations to run before running another batch ([c3d77b5](https://github.com/nrkno/tv-automation-server-core/commit/c3d77b5)) ### Other -* Merge branch 'develop' into feature/prompter2 ([a072747](https://github.com/nrkno/tv-automation-server-core/commit/a072747)) -* Merge branch 'develop' into feature/prompter2 ([6f17ba8](https://github.com/nrkno/tv-automation-server-core/commit/6f17ba8)) -* Merge branch 'develop' into feature/takeFromOffset ([39afebf](https://github.com/nrkno/tv-automation-server-core/commit/39afebf)) -* Merge branch 'master' into release9 ([5cbbf5d](https://github.com/nrkno/tv-automation-server-core/commit/5cbbf5d)) -* Merge branch 'release8' into develop ([8df5fbb](https://github.com/nrkno/tv-automation-server-core/commit/8df5fbb)) -* Merge branch 'release8' into develop ([924837f](https://github.com/nrkno/tv-automation-server-core/commit/924837f)) -* chore: added debug message in case of strange too-quick takes ([5863035](https://github.com/nrkno/tv-automation-server-core/commit/5863035)) -* chore: bump blueprints integration ([00fc68c](https://github.com/nrkno/tv-automation-server-core/commit/00fc68c)) -* chore: copy changelog from master ([4570223](https://github.com/nrkno/tv-automation-server-core/commit/4570223)) -* chore: doc ([ab53256](https://github.com/nrkno/tv-automation-server-core/commit/ab53256)) -* chore: fix changelog: remove duplicates & categorize commits [skip-ci] ([cd53594](https://github.com/nrkno/tv-automation-server-core/commit/cd53594)) -* chore: improve confirmation dialogs ([dc123ba](https://github.com/nrkno/tv-automation-server-core/commit/dc123ba)) -* chore: lint & merge runningOrderNotes ([0183d67](https://github.com/nrkno/tv-automation-server-core/commit/0183d67)) -* chore: linting ([290bb4c](https://github.com/nrkno/tv-automation-server-core/commit/290bb4c)) -* chore: merge changes from develop ([46b5775](https://github.com/nrkno/tv-automation-server-core/commit/46b5775)) -* chore: merge changes from develop ([6ecaa62](https://github.com/nrkno/tv-automation-server-core/commit/6ecaa62)) -* chore: merge latest changes from develop ([fa44fc8](https://github.com/nrkno/tv-automation-server-core/commit/fa44fc8)) -* chore: merge latest changes from develop ([203ef70](https://github.com/nrkno/tv-automation-server-core/commit/203ef70)) -* chore: move updateSpeech from render() ([50c6142](https://github.com/nrkno/tv-automation-server-core/commit/50c6142)) -* chore: refactor SegmentLineNotes; move & rename ([96d0947](https://github.com/nrkno/tv-automation-server-core/commit/96d0947)) -* chore: Remove all references to the now unused defaultShowStyleVariant ([d49c633](https://github.com/nrkno/tv-automation-server-core/commit/d49c633)) -* chore: upd TSR types dep ([9c4f339](https://github.com/nrkno/tv-automation-server-core/commit/9c4f339)) -* chore: update package-lock.json ([eac327c](https://github.com/nrkno/tv-automation-server-core/commit/eac327c)) -* chore: update to the latest develop changes ([bd2c3ec](https://github.com/nrkno/tv-automation-server-core/commit/bd2c3ec)) -* chore: Updated prompter with the more legible font "Source Sans Pro" (uses Open SIL license) which w ([6a8e459](https://github.com/nrkno/tv-automation-server-core/commit/6a8e459)) -* chore: use playOffset in RunningOrderTiming ([05756cc](https://github.com/nrkno/tv-automation-server-core/commit/05756cc)) +- Merge branch 'develop' into feature/prompter2 ([a072747](https://github.com/nrkno/tv-automation-server-core/commit/a072747)) +- Merge branch 'develop' into feature/prompter2 ([6f17ba8](https://github.com/nrkno/tv-automation-server-core/commit/6f17ba8)) +- Merge branch 'develop' into feature/takeFromOffset ([39afebf](https://github.com/nrkno/tv-automation-server-core/commit/39afebf)) +- Merge branch 'master' into release9 ([5cbbf5d](https://github.com/nrkno/tv-automation-server-core/commit/5cbbf5d)) +- Merge branch 'release8' into develop ([8df5fbb](https://github.com/nrkno/tv-automation-server-core/commit/8df5fbb)) +- Merge branch 'release8' into develop ([924837f](https://github.com/nrkno/tv-automation-server-core/commit/924837f)) +- chore: added debug message in case of strange too-quick takes ([5863035](https://github.com/nrkno/tv-automation-server-core/commit/5863035)) +- chore: bump blueprints integration ([00fc68c](https://github.com/nrkno/tv-automation-server-core/commit/00fc68c)) +- chore: copy changelog from master ([4570223](https://github.com/nrkno/tv-automation-server-core/commit/4570223)) +- chore: doc ([ab53256](https://github.com/nrkno/tv-automation-server-core/commit/ab53256)) +- chore: fix changelog: remove duplicates & categorize commits [skip-ci] ([cd53594](https://github.com/nrkno/tv-automation-server-core/commit/cd53594)) +- chore: improve confirmation dialogs ([dc123ba](https://github.com/nrkno/tv-automation-server-core/commit/dc123ba)) +- chore: lint & merge runningOrderNotes ([0183d67](https://github.com/nrkno/tv-automation-server-core/commit/0183d67)) +- chore: linting ([290bb4c](https://github.com/nrkno/tv-automation-server-core/commit/290bb4c)) +- chore: merge changes from develop ([46b5775](https://github.com/nrkno/tv-automation-server-core/commit/46b5775)) +- chore: merge changes from develop ([6ecaa62](https://github.com/nrkno/tv-automation-server-core/commit/6ecaa62)) +- chore: merge latest changes from develop ([fa44fc8](https://github.com/nrkno/tv-automation-server-core/commit/fa44fc8)) +- chore: merge latest changes from develop ([203ef70](https://github.com/nrkno/tv-automation-server-core/commit/203ef70)) +- chore: move updateSpeech from render() ([50c6142](https://github.com/nrkno/tv-automation-server-core/commit/50c6142)) +- chore: refactor SegmentLineNotes; move & rename ([96d0947](https://github.com/nrkno/tv-automation-server-core/commit/96d0947)) +- chore: Remove all references to the now unused defaultShowStyleVariant ([d49c633](https://github.com/nrkno/tv-automation-server-core/commit/d49c633)) +- chore: upd TSR types dep ([9c4f339](https://github.com/nrkno/tv-automation-server-core/commit/9c4f339)) +- chore: update package-lock.json ([eac327c](https://github.com/nrkno/tv-automation-server-core/commit/eac327c)) +- chore: update to the latest develop changes ([bd2c3ec](https://github.com/nrkno/tv-automation-server-core/commit/bd2c3ec)) +- chore: Updated prompter with the more legible font "Source Sans Pro" (uses Open SIL license) which w ([6a8e459](https://github.com/nrkno/tv-automation-server-core/commit/6a8e459)) +- chore: use playOffset in RunningOrderTiming ([05756cc](https://github.com/nrkno/tv-automation-server-core/commit/05756cc)) + # [0.23.0](https://github.com/nrkno/tv-automation-server-core/compare/v0.22.0...v0.23.0) (2019-04-08) ### Features #### Set In / Out points (preliminary implementation) -* stub of setting in & out points ([0852b42](https://github.com/nrkno/tv-automation-server-core/commit/0852b42)) -* set in/out points through itemReplace ([4d31d70](https://github.com/nrkno/tv-automation-server-core/commit/4d31d70)) + +- stub of setting in & out points ([0852b42](https://github.com/nrkno/tv-automation-server-core/commit/0852b42)) +- set in/out points through itemReplace ([4d31d70](https://github.com/nrkno/tv-automation-server-core/commit/4d31d70)) #### GUI -* SH-121-Double-clicking zoom-scrubber should mean "zoom to show everything in this segment" ([aeadc46](https://github.com/nrkno/tv-automation-server-core/commit/aeadc46)) -* Add warning to rundown when config changed (#69) ([4f5e6a9](https://github.com/nrkno/tv-automation-server-core/commit/4f5e6a9)), closes [#69](https://github.com/nrkno/tv-automation-server-core/issues/69) -* add httpWatcher settings ([fbb91d9](https://github.com/nrkno/tv-automation-server-core/commit/fbb91d9)) -* add checkbox for debugLogging in media manager ([64b80e9](https://github.com/nrkno/tv-automation-server-core/commit/64b80e9)) -* add option to input data into a ModalDialogue ([ef54b74](https://github.com/nrkno/tv-automation-server-core/commit/ef54b74)) -* change labeled buttons to icons with tooltips in Media Transfer Status ([c5e582b](https://github.com/nrkno/tv-automation-server-core/commit/c5e582b)) -* show user activity log for timeslot of recording ([5c75305](https://github.com/nrkno/tv-automation-server-core/commit/5c75305)) -* speech synthesis ([eb9643a](https://github.com/nrkno/tv-automation-server-core/commit/eb9643a)) -* support displayDurationGroups in RO view ([460df8d](https://github.com/nrkno/tv-automation-server-core/commit/460df8d)) -* feat(countdowns): display autonext ([1405a89](https://github.com/nrkno/tv-automation-server-core/commit/1405a89)) -* add a user-definable CoreSystem.name that is displayed in the header and title bar ([717ee45](https://github.com/nrkno/tv-automation-server-core/commit/717ee45)) + +- SH-121-Double-clicking zoom-scrubber should mean "zoom to show everything in this segment" ([aeadc46](https://github.com/nrkno/tv-automation-server-core/commit/aeadc46)) +- Add warning to rundown when config changed (#69) ([4f5e6a9](https://github.com/nrkno/tv-automation-server-core/commit/4f5e6a9)), closes [#69](https://github.com/nrkno/tv-automation-server-core/issues/69) +- add httpWatcher settings ([fbb91d9](https://github.com/nrkno/tv-automation-server-core/commit/fbb91d9)) +- add checkbox for debugLogging in media manager ([64b80e9](https://github.com/nrkno/tv-automation-server-core/commit/64b80e9)) +- add option to input data into a ModalDialogue ([ef54b74](https://github.com/nrkno/tv-automation-server-core/commit/ef54b74)) +- change labeled buttons to icons with tooltips in Media Transfer Status ([c5e582b](https://github.com/nrkno/tv-automation-server-core/commit/c5e582b)) +- show user activity log for timeslot of recording ([5c75305](https://github.com/nrkno/tv-automation-server-core/commit/5c75305)) +- speech synthesis ([eb9643a](https://github.com/nrkno/tv-automation-server-core/commit/eb9643a)) +- support displayDurationGroups in RO view ([460df8d](https://github.com/nrkno/tv-automation-server-core/commit/460df8d)) +- feat(countdowns): display autonext ([1405a89](https://github.com/nrkno/tv-automation-server-core/commit/1405a89)) +- add a user-definable CoreSystem.name that is displayed in the header and title bar ([717ee45](https://github.com/nrkno/tv-automation-server-core/commit/717ee45)) #### Timeline vizualiser -* implement timeline-visualizer view ([e725618](https://github.com/nrkno/tv-automation-server-core/commit/e725618)) -* timeline-visualizer: add details-on-click ([c81243c](https://github.com/nrkno/tv-automation-server-core/commit/c81243c)) -* move new timeline visualizer to replace the old broken one ([174dd7e](https://github.com/nrkno/tv-automation-server-core/commit/174dd7e)) + +- implement timeline-visualizer view ([e725618](https://github.com/nrkno/tv-automation-server-core/commit/e725618)) +- timeline-visualizer: add details-on-click ([c81243c](https://github.com/nrkno/tv-automation-server-core/commit/c81243c)) +- move new timeline visualizer to replace the old broken one ([174dd7e](https://github.com/nrkno/tv-automation-server-core/commit/174dd7e)) #### Evaluations -* adds logging of evaluation level to keep statistics ([5da33a0](https://github.com/nrkno/tv-automation-server-core/commit/5da33a0)) -* sends positive evaluations too ([d6c0bff](https://github.com/nrkno/tv-automation-server-core/commit/d6c0bff)) + +- adds logging of evaluation level to keep statistics ([5da33a0](https://github.com/nrkno/tv-automation-server-core/commit/5da33a0)) +- sends positive evaluations too ([d6c0bff](https://github.com/nrkno/tv-automation-server-core/commit/d6c0bff)) #### Other -* **playout:** Block take during transitions ([d0628a2](https://github.com/nrkno/tv-automation-server-core/commit/d0628a2)) -* **blueprints:** Allow the post-process blueprint to modify a select few properties on the segmentL ([ee02813](https://github.com/nrkno/tv-automation-server-core/commit/ee02813)) -* **config:** Add support for enum config entries ([b4ae4b5](https://github.com/nrkno/tv-automation-server-core/commit/b4ae4b5)) -* **lookahead:** Delay lookahead after an object by 1s if it is labelled by a class ([2c595fb](https://github.com/nrkno/tv-automation-server-core/commit/2c595fb)) -* log WorkFlow success or failure ([8e7d9d7](https://github.com/nrkno/tv-automation-server-core/commit/8e7d9d7)) -* allow admins to delete non-unsynced running orders ([190ca36](https://github.com/nrkno/tv-automation-server-core/commit/190ca36)) + +- **playout:** Block take during transitions ([d0628a2](https://github.com/nrkno/tv-automation-server-core/commit/d0628a2)) +- **blueprints:** Allow the post-process blueprint to modify a select few properties on the segmentL ([ee02813](https://github.com/nrkno/tv-automation-server-core/commit/ee02813)) +- **config:** Add support for enum config entries ([b4ae4b5](https://github.com/nrkno/tv-automation-server-core/commit/b4ae4b5)) +- **lookahead:** Delay lookahead after an object by 1s if it is labelled by a class ([2c595fb](https://github.com/nrkno/tv-automation-server-core/commit/2c595fb)) +- log WorkFlow success or failure ([8e7d9d7](https://github.com/nrkno/tv-automation-server-core/commit/8e7d9d7)) +- allow admins to delete non-unsynced running orders ([190ca36](https://github.com/nrkno/tv-automation-server-core/commit/190ca36)) ### Bug Fixes -* add shortcut ctrl+shift+enter-on-numpad to reload ([b9820ff](https://github.com/nrkno/tv-automation-server-core/commit/b9820ff)) -* Allow translations of media warnings, show clip as broken until scan finished ([b693de7](https://github.com/nrkno/tv-automation-server-core/commit/b693de7)) -* apply some fixes when restoring a RO ([b04bf53](https://github.com/nrkno/tv-automation-server-core/commit/b04bf53)) -* change logging to info on device state change ([1cc9429](https://github.com/nrkno/tv-automation-server-core/commit/1cc9429)) -* Changed the color of the top bar during Rehearsal mode to something a little less hideous. ([1e887e3](https://github.com/nrkno/tv-automation-server-core/commit/1e887e3)) -* do not refresh RO notifications if RO/showStyleBase/studioInstallation changes ([5702939](https://github.com/nrkno/tv-automation-server-core/commit/5702939)) -* externalMessage: update status on removed document ([75a1053](https://github.com/nrkno/tv-automation-server-core/commit/75a1053)) -* getHash undefined exception in asRunLog ([8faab78](https://github.com/nrkno/tv-automation-server-core/commit/8faab78)) -* make sure that the OnAir line connects to the label ([3788672](https://github.com/nrkno/tv-automation-server-core/commit/3788672)) -* more optimizations ([df8c397](https://github.com/nrkno/tv-automation-server-core/commit/df8c397)) -* optimizations in roTake ([3457e73](https://github.com/nrkno/tv-automation-server-core/commit/3457e73)) -* output version differ error ([8816ed3](https://github.com/nrkno/tv-automation-server-core/commit/8816ed3)) -* refactor ([9e9d60a](https://github.com/nrkno/tv-automation-server-core/commit/9e9d60a)) -* remove memoization of RVars ([ca22155](https://github.com/nrkno/tv-automation-server-core/commit/ca22155)) -* resolve issue with segmentLineDisplayDuration & segment duration ([a73ed09](https://github.com/nrkno/tv-automation-server-core/commit/a73ed09)) -* RO config changed notification not updating when RO is updated ([f5c2540](https://github.com/nrkno/tv-automation-server-core/commit/f5c2540)) -* Running order status notifying wrong dep ([e6b84e5](https://github.com/nrkno/tv-automation-server-core/commit/e6b84e5)) -* seek support in VT, STK, hoverscrub ([43e413b](https://github.com/nrkno/tv-automation-server-core/commit/43e413b)) -* settings styling improvements, code fixes ([d9484cd](https://github.com/nrkno/tv-automation-server-core/commit/d9484cd)) -* ShowStyleVariant settings not saving changes ([e90137b](https://github.com/nrkno/tv-automation-server-core/commit/e90137b)) -* skip untranslated strings from po files, update i18next-conv to latest version ([1de4ccb](https://github.com/nrkno/tv-automation-server-core/commit/1de4ccb)) -* Toggle hotkeys legend in support panel ([e6f4769](https://github.com/nrkno/tv-automation-server-core/commit/e6f4769)) -* typo ([2efc829](https://github.com/nrkno/tv-automation-server-core/commit/2efc829)) -* update package versions to fix audit issues ([be3cae5](https://github.com/nrkno/tv-automation-server-core/commit/be3cae5)) -* Update RO change notification on an interval, to ensure it catches changes to other document ty ([79d8c05](https://github.com/nrkno/tv-automation-server-core/commit/79d8c05)) -* use a single setState in updateVersions in MigrationsView ([afd730a](https://github.com/nrkno/tv-automation-server-core/commit/afd730a)) -* use floor for all positioning and sizing of segment lines ([8a84a7e](https://github.com/nrkno/tv-automation-server-core/commit/8a84a7e)) -* when restoring a runningOrder, use the .active property of the database (or false) ([b5e5b05](https://github.com/nrkno/tv-automation-server-core/commit/b5e5b05)) -* wrap all MeteorReactComponent.autoruns in nonreactive. ([9020c96](https://github.com/nrkno/tv-automation-server-core/commit/9020c96)) -* backup: make restore running order less strict ([e78313f](https://github.com/nrkno/tv-automation-server-core/commit/e78313f)) -* countdowns: split text parsing ([9a174ae](https://github.com/nrkno/tv-automation-server-core/commit/9a174ae)) -* infinite: Persist overrideDuration when updating infinites ([b15bfa3](https://github.com/nrkno/tv-automation-server-core/commit/b15bfa3)) -* Notifications refresh: limit amount of reactive vars ([2c01e66](https://github.com/nrkno/tv-automation-server-core/commit/2c01e66)) -* playout: StatObj not being generated ([581d99d](https://github.com/nrkno/tv-automation-server-core/commit/581d99d)) -* presenter screen: split background + text spacing ([9aad750](https://github.com/nrkno/tv-automation-server-core/commit/9aad750)) -* a bug where DEFAULT_DISPLAY_DURATION would be added to a 0-duration member of a displayDurationGroup ([5f2ed62](https://github.com/nrkno/tv-automation-server-core/commit/5f2ed62)) -* broken logging + message ([ffe4fb4](https://github.com/nrkno/tv-automation-server-core/commit/ffe4fb4)) -* delete & sync buttons in RO-list ([9fbc875](https://github.com/nrkno/tv-automation-server-core/commit/9fbc875)) -* message came twice, wrong index for signature ([64aeafb](https://github.com/nrkno/tv-automation-server-core/commit/64aeafb)) -* displayDurationGroup: fix GUI clocks for displayDurationGroups ([10ac255](https://github.com/nrkno/tv-automation-server-core/commit/10ac255)) -* displayDurationGroup: use displayDurationGroup timing in presenter's screen ([61e04f9](https://github.com/nrkno/tv-automation-server-core/commit/61e04f9)) -* lookahead: Give lookahead the correct limit when in the next SegmentLine during autonext ([a3a299a](https://github.com/nrkno/tv-automation-server-core/commit/a3a299a)) -* lookahead: Produced objects not resolving properly ([322a94f](https://github.com/nrkno/tv-automation-server-core/commit/322a94f)) -* migrations: Ensure there are migrations to run before running another batch ([3b703e5](https://github.com/nrkno/tv-automation-server-core/commit/3b703e5)) -- +- add shortcut ctrl+shift+enter-on-numpad to reload ([b9820ff](https://github.com/nrkno/tv-automation-server-core/commit/b9820ff)) +- Allow translations of media warnings, show clip as broken until scan finished ([b693de7](https://github.com/nrkno/tv-automation-server-core/commit/b693de7)) +- apply some fixes when restoring a RO ([b04bf53](https://github.com/nrkno/tv-automation-server-core/commit/b04bf53)) +- change logging to info on device state change ([1cc9429](https://github.com/nrkno/tv-automation-server-core/commit/1cc9429)) +- Changed the color of the top bar during Rehearsal mode to something a little less hideous. ([1e887e3](https://github.com/nrkno/tv-automation-server-core/commit/1e887e3)) +- do not refresh RO notifications if RO/showStyleBase/studioInstallation changes ([5702939](https://github.com/nrkno/tv-automation-server-core/commit/5702939)) +- externalMessage: update status on removed document ([75a1053](https://github.com/nrkno/tv-automation-server-core/commit/75a1053)) +- getHash undefined exception in asRunLog ([8faab78](https://github.com/nrkno/tv-automation-server-core/commit/8faab78)) +- make sure that the OnAir line connects to the label ([3788672](https://github.com/nrkno/tv-automation-server-core/commit/3788672)) +- more optimizations ([df8c397](https://github.com/nrkno/tv-automation-server-core/commit/df8c397)) +- optimizations in roTake ([3457e73](https://github.com/nrkno/tv-automation-server-core/commit/3457e73)) +- output version differ error ([8816ed3](https://github.com/nrkno/tv-automation-server-core/commit/8816ed3)) +- refactor ([9e9d60a](https://github.com/nrkno/tv-automation-server-core/commit/9e9d60a)) +- remove memoization of RVars ([ca22155](https://github.com/nrkno/tv-automation-server-core/commit/ca22155)) +- resolve issue with segmentLineDisplayDuration & segment duration ([a73ed09](https://github.com/nrkno/tv-automation-server-core/commit/a73ed09)) +- RO config changed notification not updating when RO is updated ([f5c2540](https://github.com/nrkno/tv-automation-server-core/commit/f5c2540)) +- Running order status notifying wrong dep ([e6b84e5](https://github.com/nrkno/tv-automation-server-core/commit/e6b84e5)) +- seek support in VT, STK, hoverscrub ([43e413b](https://github.com/nrkno/tv-automation-server-core/commit/43e413b)) +- settings styling improvements, code fixes ([d9484cd](https://github.com/nrkno/tv-automation-server-core/commit/d9484cd)) +- ShowStyleVariant settings not saving changes ([e90137b](https://github.com/nrkno/tv-automation-server-core/commit/e90137b)) +- skip untranslated strings from po files, update i18next-conv to latest version ([1de4ccb](https://github.com/nrkno/tv-automation-server-core/commit/1de4ccb)) +- Toggle hotkeys legend in support panel ([e6f4769](https://github.com/nrkno/tv-automation-server-core/commit/e6f4769)) +- typo ([2efc829](https://github.com/nrkno/tv-automation-server-core/commit/2efc829)) +- update package versions to fix audit issues ([be3cae5](https://github.com/nrkno/tv-automation-server-core/commit/be3cae5)) +- Update RO change notification on an interval, to ensure it catches changes to other document ty ([79d8c05](https://github.com/nrkno/tv-automation-server-core/commit/79d8c05)) +- use a single setState in updateVersions in MigrationsView ([afd730a](https://github.com/nrkno/tv-automation-server-core/commit/afd730a)) +- use floor for all positioning and sizing of segment lines ([8a84a7e](https://github.com/nrkno/tv-automation-server-core/commit/8a84a7e)) +- when restoring a runningOrder, use the .active property of the database (or false) ([b5e5b05](https://github.com/nrkno/tv-automation-server-core/commit/b5e5b05)) +- wrap all MeteorReactComponent.autoruns in nonreactive. ([9020c96](https://github.com/nrkno/tv-automation-server-core/commit/9020c96)) +- backup: make restore running order less strict ([e78313f](https://github.com/nrkno/tv-automation-server-core/commit/e78313f)) +- countdowns: split text parsing ([9a174ae](https://github.com/nrkno/tv-automation-server-core/commit/9a174ae)) +- infinite: Persist overrideDuration when updating infinites ([b15bfa3](https://github.com/nrkno/tv-automation-server-core/commit/b15bfa3)) +- Notifications refresh: limit amount of reactive vars ([2c01e66](https://github.com/nrkno/tv-automation-server-core/commit/2c01e66)) +- playout: StatObj not being generated ([581d99d](https://github.com/nrkno/tv-automation-server-core/commit/581d99d)) +- presenter screen: split background + text spacing ([9aad750](https://github.com/nrkno/tv-automation-server-core/commit/9aad750)) +- a bug where DEFAULT_DISPLAY_DURATION would be added to a 0-duration member of a displayDurationGroup ([5f2ed62](https://github.com/nrkno/tv-automation-server-core/commit/5f2ed62)) +- broken logging + message ([ffe4fb4](https://github.com/nrkno/tv-automation-server-core/commit/ffe4fb4)) +- delete & sync buttons in RO-list ([9fbc875](https://github.com/nrkno/tv-automation-server-core/commit/9fbc875)) +- message came twice, wrong index for signature ([64aeafb](https://github.com/nrkno/tv-automation-server-core/commit/64aeafb)) +- displayDurationGroup: fix GUI clocks for displayDurationGroups ([10ac255](https://github.com/nrkno/tv-automation-server-core/commit/10ac255)) +- displayDurationGroup: use displayDurationGroup timing in presenter's screen ([61e04f9](https://github.com/nrkno/tv-automation-server-core/commit/61e04f9)) +- lookahead: Give lookahead the correct limit when in the next SegmentLine during autonext ([a3a299a](https://github.com/nrkno/tv-automation-server-core/commit/a3a299a)) +- lookahead: Produced objects not resolving properly ([322a94f](https://github.com/nrkno/tv-automation-server-core/commit/322a94f)) +- migrations: Ensure there are migrations to run before running another batch ([3b703e5](https://github.com/nrkno/tv-automation-server-core/commit/3b703e5)) + +* ### Other -* Merge branch 'feature/timeline-visualizer' into develop ([9a1ca6c](https://github.com/nrkno/tv-automation-server-core/commit/9a1ca6c)) -* Merge branch 'master' into release8 ([4ebd9fa](https://github.com/nrkno/tv-automation-server-core/commit/4ebd9fa)) -* Merge branch 'release7' into develop ([ff8d209](https://github.com/nrkno/tv-automation-server-core/commit/ff8d209)) -* Merge pull request #72 from nrkno/fix/audit ([ad599c8](https://github.com/nrkno/tv-automation-server-core/commit/ad599c8)), closes [#72](https://github.com/nrkno/tv-automation-server-core/issues/72) -* Merge pull request #73 from nrkno/feature/ctrlShiftEnterReload ([59e6bf6](https://github.com/nrkno/tv-automation-server-core/commit/59e6bf6)), closes [#73](https://github.com/nrkno/tv-automation-server-core/issues/73) -* Merge pull request #74 from nrkno/feat/debugLogButtonOnMediaManagement ([15d814c](https://github.com/nrkno/tv-automation-server-core/commit/15d814c)), closes [#74](https://github.com/nrkno/tv-automation-server-core/issues/74) -* Merge pull request #75 from nrkno/feature/httpWatcher ([f9146f4](https://github.com/nrkno/tv-automation-server-core/commit/f9146f4)), closes [#75](https://github.com/nrkno/tv-automation-server-core/issues/75) -* Merge remote-tracking branch 'origin/develop' into develop ([30956d4](https://github.com/nrkno/tv-automation-server-core/commit/30956d4)) -* chore: Add expandable list of migrations to be run in migrations ui ([4b95878](https://github.com/nrkno/tv-automation-server-core/commit/4b95878)) -* chore: Added background to Live Line label to make it more visible. ([c0d3cdc](https://github.com/nrkno/tv-automation-server-core/commit/c0d3cdc)) -* chore: Clarified the "System Messages" headlines and labels to better explain the functionality. Als ([8de55b2](https://github.com/nrkno/tv-automation-server-core/commit/8de55b2)) -* chore: Don't log when runningOrderNeedsUpdating is called ([450c9e6](https://github.com/nrkno/tv-automation-server-core/commit/450c9e6)) -* chore: linting ([6bf03e0](https://github.com/nrkno/tv-automation-server-core/commit/6bf03e0)) -* chore: refactor to use doModalDialog ([f02abdd](https://github.com/nrkno/tv-automation-server-core/commit/f02abdd)) -* chore: refactor view when RO not loaded properly ([0a5c509](https://github.com/nrkno/tv-automation-server-core/commit/0a5c509)) -* chore: remove some debug attributes ([7e60012](https://github.com/nrkno/tv-automation-server-core/commit/7e60012)) -* chore: resolve a simple typo causing enormous havoc ([50abaa6](https://github.com/nrkno/tv-automation-server-core/commit/50abaa6)) -* chore: Reverted the top bar Rehearsal mode color. ([23e2656](https://github.com/nrkno/tv-automation-server-core/commit/23e2656)) -* chore: scan ts files for translatable strings ([8f82627](https://github.com/nrkno/tv-automation-server-core/commit/8f82627)) -* chore: upd package.lock ([08c64d8](https://github.com/nrkno/tv-automation-server-core/commit/08c64d8)) -* chore: update ([19fead5](https://github.com/nrkno/tv-automation-server-core/commit/19fead5)) -* chore: update tsr-types ([01f3260](https://github.com/nrkno/tv-automation-server-core/commit/01f3260)) -* chore: Updated NB and NN translations. Fixed case on several labels and headlines. ([ff0e855](https://github.com/nrkno/tv-automation-server-core/commit/ff0e855)) -* chore: Updated the case on many English strings. Generated new translations for NN and NB. ([d7e517d](https://github.com/nrkno/tv-automation-server-core/commit/d7e517d)) +- Merge branch 'feature/timeline-visualizer' into develop ([9a1ca6c](https://github.com/nrkno/tv-automation-server-core/commit/9a1ca6c)) +- Merge branch 'master' into release8 ([4ebd9fa](https://github.com/nrkno/tv-automation-server-core/commit/4ebd9fa)) +- Merge branch 'release7' into develop ([ff8d209](https://github.com/nrkno/tv-automation-server-core/commit/ff8d209)) +- Merge pull request #72 from nrkno/fix/audit ([ad599c8](https://github.com/nrkno/tv-automation-server-core/commit/ad599c8)), closes [#72](https://github.com/nrkno/tv-automation-server-core/issues/72) +- Merge pull request #73 from nrkno/feature/ctrlShiftEnterReload ([59e6bf6](https://github.com/nrkno/tv-automation-server-core/commit/59e6bf6)), closes [#73](https://github.com/nrkno/tv-automation-server-core/issues/73) +- Merge pull request #74 from nrkno/feat/debugLogButtonOnMediaManagement ([15d814c](https://github.com/nrkno/tv-automation-server-core/commit/15d814c)), closes [#74](https://github.com/nrkno/tv-automation-server-core/issues/74) +- Merge pull request #75 from nrkno/feature/httpWatcher ([f9146f4](https://github.com/nrkno/tv-automation-server-core/commit/f9146f4)), closes [#75](https://github.com/nrkno/tv-automation-server-core/issues/75) +- Merge remote-tracking branch 'origin/develop' into develop ([30956d4](https://github.com/nrkno/tv-automation-server-core/commit/30956d4)) +- chore: Add expandable list of migrations to be run in migrations ui ([4b95878](https://github.com/nrkno/tv-automation-server-core/commit/4b95878)) +- chore: Added background to Live Line label to make it more visible. ([c0d3cdc](https://github.com/nrkno/tv-automation-server-core/commit/c0d3cdc)) +- chore: Clarified the "System Messages" headlines and labels to better explain the functionality. Als ([8de55b2](https://github.com/nrkno/tv-automation-server-core/commit/8de55b2)) +- chore: Don't log when runningOrderNeedsUpdating is called ([450c9e6](https://github.com/nrkno/tv-automation-server-core/commit/450c9e6)) +- chore: linting ([6bf03e0](https://github.com/nrkno/tv-automation-server-core/commit/6bf03e0)) +- chore: refactor to use doModalDialog ([f02abdd](https://github.com/nrkno/tv-automation-server-core/commit/f02abdd)) +- chore: refactor view when RO not loaded properly ([0a5c509](https://github.com/nrkno/tv-automation-server-core/commit/0a5c509)) +- chore: remove some debug attributes ([7e60012](https://github.com/nrkno/tv-automation-server-core/commit/7e60012)) +- chore: resolve a simple typo causing enormous havoc ([50abaa6](https://github.com/nrkno/tv-automation-server-core/commit/50abaa6)) +- chore: Reverted the top bar Rehearsal mode color. ([23e2656](https://github.com/nrkno/tv-automation-server-core/commit/23e2656)) +- chore: scan ts files for translatable strings ([8f82627](https://github.com/nrkno/tv-automation-server-core/commit/8f82627)) +- chore: upd package.lock ([08c64d8](https://github.com/nrkno/tv-automation-server-core/commit/08c64d8)) +- chore: update ([19fead5](https://github.com/nrkno/tv-automation-server-core/commit/19fead5)) +- chore: update tsr-types ([01f3260](https://github.com/nrkno/tv-automation-server-core/commit/01f3260)) +- chore: Updated NB and NN translations. Fixed case on several labels and headlines. ([ff0e855](https://github.com/nrkno/tv-automation-server-core/commit/ff0e855)) +- chore: Updated the case on many English strings. Generated new translations for NN and NB. ([d7e517d](https://github.com/nrkno/tv-automation-server-core/commit/d7e517d)) -# 0.22.0 (2019-03-15) +# 0.22.0 (2019-03-15) ### Bug Fixes -* &nbps; in a string instead of A0 ([299ba28](https://github.com/nrkno/tv-automation-server-core/commit/299ba28)) -* accepted resolutions should not be separated by space. ([1b80a2c](https://github.com/nrkno/tv-automation-server-core/commit/1b80a2c)) -* activate past ROs ([c20af5d](https://github.com/nrkno/tv-automation-server-core/commit/c20af5d)) -* activate past ROs ([4b128a5](https://github.com/nrkno/tv-automation-server-core/commit/4b128a5)) -* add (preliminary) security rules for all collections ([6fd60e2](https://github.com/nrkno/tv-automation-server-core/commit/6fd60e2)) -* Add default exclusivity groups to InitDB ([dfd1782](https://github.com/nrkno/tv-automation-server-core/commit/dfd1782)) -* add dependency: timeline-state-resolver-types ([cd2db55](https://github.com/nrkno/tv-automation-server-core/commit/cd2db55)) -* add missing translation json-file ([6059965](https://github.com/nrkno/tv-automation-server-core/commit/6059965)) -* add missing _id ([970fbf8](https://github.com/nrkno/tv-automation-server-core/commit/970fbf8)) -* add missing _id ([c948d09](https://github.com/nrkno/tv-automation-server-core/commit/c948d09)) -* Add missing _rank field to SegmentLineAdLibItem ([9cd15fa](https://github.com/nrkno/tv-automation-server-core/commit/9cd15fa)) -* add missing asRunEvent in AsRunEventContext ([b8def27](https://github.com/nrkno/tv-automation-server-core/commit/b8def27)) -* add missing core version ([8ad3a9e](https://github.com/nrkno/tv-automation-server-core/commit/8ad3a9e)) -* add missing function ([de2b81f](https://github.com/nrkno/tv-automation-server-core/commit/de2b81f)) -* Add missing layers to initdb. Use readtime as possible duration of segmentline when calculating story length ([e388d63](https://github.com/nrkno/tv-automation-server-core/commit/e388d63)) -* add nn translation to whitelist ([4663e3b](https://github.com/nrkno/tv-automation-server-core/commit/4663e3b)) -* add parseDateTime code hints to template editor ([c38b2f7](https://github.com/nrkno/tv-automation-server-core/commit/c38b2f7)) -* added _valid: true to mock-data ([6c2775b](https://github.com/nrkno/tv-automation-server-core/commit/6c2775b)) -* added a place to run updateExpectedMediaItems ([c70704d](https://github.com/nrkno/tv-automation-server-core/commit/c70704d)) -* added missing "force" parameter ([7b50a97](https://github.com/nrkno/tv-automation-server-core/commit/7b50a97)) -* added missing debug-logging setting ([8f616ca](https://github.com/nrkno/tv-automation-server-core/commit/8f616ca)) -* added missing getRank import ([9d37eb8](https://github.com/nrkno/tv-automation-server-core/commit/9d37eb8)) -* added MomentFromNow, to use instead of ([aefea31](https://github.com/nrkno/tv-automation-server-core/commit/aefea31)) -* added peripheralDevices subscription, used by status display ([ccb309d](https://github.com/nrkno/tv-automation-server-core/commit/ccb309d)) -* added sorting of runtimeFunctions when generating backup, so diffing works ([b3ba3f6](https://github.com/nrkno/tv-automation-server-core/commit/b3ba3f6)) -* added sorting of runtimeFunctions when generating backup, so diffing works ([17639a0](https://github.com/nrkno/tv-automation-server-core/commit/17639a0)) -* added virtual lines to the generated function, so that line numbers add up in error messages ([df2366a](https://github.com/nrkno/tv-automation-server-core/commit/df2366a)) -* adlib items conflict with programmed content ([a304238](https://github.com/nrkno/tv-automation-server-core/commit/a304238)) -* after broadcast form failed to saveEvaluation ([f55546b](https://github.com/nrkno/tv-automation-server-core/commit/f55546b)) -* allow duration 0 of segmentLines ([11a18ae](https://github.com/nrkno/tv-automation-server-core/commit/11a18ae)) -* allow esc & enter in modalDialog ([cd511b6](https://github.com/nrkno/tv-automation-server-core/commit/cd511b6)) -* allow re-sync of unsynced RO while it is active ([b824d72](https://github.com/nrkno/tv-automation-server-core/commit/b824d72)) -* allow removing peripheralDevices from Settings page ([948675f](https://github.com/nrkno/tv-automation-server-core/commit/948675f)) -* allow removing peripheralDevices from Settings page ([b14e56a](https://github.com/nrkno/tv-automation-server-core/commit/b14e56a)) -* allow timelineobjs to be declared as abstract, and always route those with the core_abstract layer ([9bfa6c4](https://github.com/nrkno/tv-automation-server-core/commit/9bfa6c4)) -* also defer sendStoryStatus, as that's not critical for playback ([9417862](https://github.com/nrkno/tv-automation-server-core/commit/9417862)) -* always rewind GUI on roReset, roResetAndActivate ([4502d90](https://github.com/nrkno/tv-automation-server-core/commit/4502d90)) -* always rewind GUI on roReset, roResetAndActivate ([11744c9](https://github.com/nrkno/tv-automation-server-core/commit/11744c9)) -* anomaly timings as numbers ([d0c0d36](https://github.com/nrkno/tv-automation-server-core/commit/d0c0d36)) -* another bugfix ([c7ed208](https://github.com/nrkno/tv-automation-server-core/commit/c7ed208)) -* apning with no heads ([dfb1976](https://github.com/nrkno/tv-automation-server-core/commit/dfb1976)) -* apparently componentwillmount is running in a reactive context and causes issues ([a8e53b6](https://github.com/nrkno/tv-automation-server-core/commit/a8e53b6)) -* asRunLog: defer handleEvent, to make sure all events have been reported before running. ([6c56ec7](https://github.com/nrkno/tv-automation-server-core/commit/6c56ec7)) -* atem mappings ([8d4ea2d](https://github.com/nrkno/tv-automation-server-core/commit/8d4ea2d)) -* autoNext should update yellow line (it didn't) ([ff42a81](https://github.com/nrkno/tv-automation-server-core/commit/ff42a81)) -* baselineTemplates not being calculated correctly for showstyle ([e4799b4](https://github.com/nrkno/tv-automation-server-core/commit/e4799b4)) -* Basic rundown playback ([3b88d2a](https://github.com/nrkno/tv-automation-server-core/commit/3b88d2a)) -* be able to reset & activate inactivated RO ([18e01f4](https://github.com/nrkno/tv-automation-server-core/commit/18e01f4)) -* be able to reset & activate inactivated RO ([e7d52da](https://github.com/nrkno/tv-automation-server-core/commit/e7d52da)) -* better debug message ([17e1b4e](https://github.com/nrkno/tv-automation-server-core/commit/17e1b4e)) -* better handling of template-errors ([9f98100](https://github.com/nrkno/tv-automation-server-core/commit/9f98100)) -* better implementation of push update to local objects ([d692c96](https://github.com/nrkno/tv-automation-server-core/commit/d692c96)) -* BIG optimization in roTake and affected functions, made database fetches async & parallel where possible. This should not affect the functionality, though testing is needed. ([aa6f4bd](https://github.com/nrkno/tv-automation-server-core/commit/aa6f4bd)) -* bind keydown for any keyup events to prevent their default behaviour ([83e42e4](https://github.com/nrkno/tv-automation-server-core/commit/83e42e4)) -* blueprint config from manifest is reenabled and used for show style base and variant ([59b2f2f](https://github.com/nrkno/tv-automation-server-core/commit/59b2f2f)) -* blueprint settings page ([5697afe](https://github.com/nrkno/tv-automation-server-core/commit/5697afe)) -* break long script better in hoverscrub ([5697493](https://github.com/nrkno/tv-automation-server-core/commit/5697493)) -* break long script better in hoverscrub ([2d2f26d](https://github.com/nrkno/tv-automation-server-core/commit/2d2f26d)) -* broken GUI SegmentLineItems resolution, when simulating timeline output ([60fb843](https://github.com/nrkno/tv-automation-server-core/commit/60fb843)) -* broken settings page ([1e99ff7](https://github.com/nrkno/tv-automation-server-core/commit/1e99ff7)) -* bug in popup: nora payload can be deep objects, causing ui crash ([30bfca9](https://github.com/nrkno/tv-automation-server-core/commit/30bfca9)) -* bug in storePath migration step ([b623973](https://github.com/nrkno/tv-automation-server-core/commit/b623973)) -* bug that caused unhandledPromiseRejection. Also added logging of result of user action ([e799277](https://github.com/nrkno/tv-automation-server-core/commit/e799277)) -* bug when moving story to last ([83cef62](https://github.com/nrkno/tv-automation-server-core/commit/83cef62)) -* bug when moving story to last ([2b86f1a](https://github.com/nrkno/tv-automation-server-core/commit/2b86f1a)) -* bugfix ([943ff72](https://github.com/nrkno/tv-automation-server-core/commit/943ff72)) -* bugfix, some keys didn't work in text inputs ([36e99cb](https://github.com/nrkno/tv-automation-server-core/commit/36e99cb)) -* bugfix: didn't correctly find the right segmentLineItem in next segmentLine ([0f9313f](https://github.com/nrkno/tv-automation-server-core/commit/0f9313f)) -* bugfix: executeFunction didn't really time out ([acba08c](https://github.com/nrkno/tv-automation-server-core/commit/acba08c)) -* bugfix: timeline wasn't updated when going rehersal => roResetAndActivate ([ca76732](https://github.com/nrkno/tv-automation-server-core/commit/ca76732)) -* bugfix: undefined storePath ([cbfdde5](https://github.com/nrkno/tv-automation-server-core/commit/cbfdde5)) -* bugfix: update local object when updating database ([9d3b05b](https://github.com/nrkno/tv-automation-server-core/commit/9d3b05b)) -* bugfix: updateExpectedMediaItems used all segmentLineItems in RO, not just in segmmentLine ([406829b](https://github.com/nrkno/tv-automation-server-core/commit/406829b)) -* bugfix: When updating collection, documents with removed properties didn't get their properties removed. ([237b8ff](https://github.com/nrkno/tv-automation-server-core/commit/237b8ff)) -* bugfix: When updating collection, documents with removed properties didn't get their properties removed. ([93dd81e](https://github.com/nrkno/tv-automation-server-core/commit/93dd81e)) -* build errors ([81382f7](https://github.com/nrkno/tv-automation-server-core/commit/81382f7)) -* build errors ([34889b9](https://github.com/nrkno/tv-automation-server-core/commit/34889b9)) -* bumps expected version ([bd06edc](https://github.com/nrkno/tv-automation-server-core/commit/bd06edc)) -* change lawo enum & interface ([3959761](https://github.com/nrkno/tv-automation-server-core/commit/3959761)) -* changed backup sorting to use templateId instead of _id ([d7047a5](https://github.com/nrkno/tv-automation-server-core/commit/d7047a5)) -* changed default chortcuts ([ba33bb7](https://github.com/nrkno/tv-automation-server-core/commit/ba33bb7)) -* changed header colors ([b9efc61](https://github.com/nrkno/tv-automation-server-core/commit/b9efc61)) -* changed how i18n is initialized & exported ([cc674aa](https://github.com/nrkno/tv-automation-server-core/commit/cc674aa)) -* changes attr. paths in lawo source objs ([55f8c7b](https://github.com/nrkno/tv-automation-server-core/commit/55f8c7b)) -* changes lawo mapping with the effects change ([dbe58fe](https://github.com/nrkno/tv-automation-server-core/commit/dbe58fe)) -* check content.path before creating an ExpectedMediaItem ([0914e98](https://github.com/nrkno/tv-automation-server-core/commit/0914e98)) -* clean up imports in ROV ([58067a6](https://github.com/nrkno/tv-automation-server-core/commit/58067a6)) -* clean up more collections when removing RO ([b84ed59](https://github.com/nrkno/tv-automation-server-core/commit/b84ed59)) -* clean up onBeforeUnload handler ([51adbba](https://github.com/nrkno/tv-automation-server-core/commit/51adbba)) -* clear queued adlibs when resetting running order ([83ed11a](https://github.com/nrkno/tv-automation-server-core/commit/83ed11a)) -* clear runtimeArguments on resetRunningOrder ([350dd45](https://github.com/nrkno/tv-automation-server-core/commit/350dd45)) -* collection name ([e014558](https://github.com/nrkno/tv-automation-server-core/commit/e014558)) -* ConfigRef fix ([f557052](https://github.com/nrkno/tv-automation-server-core/commit/f557052)) -* Correct some TimelineObj typings ([eb36ef9](https://github.com/nrkno/tv-automation-server-core/commit/eb36ef9)) -* corrects the default baseline template ([bf4eb03](https://github.com/nrkno/tv-automation-server-core/commit/bf4eb03)) -* Ctrl-S in template editor triggers a save ([bacbc3e](https://github.com/nrkno/tv-automation-server-core/commit/bacbc3e)) -* defer triggerExternalMessage so as not to block timelineUpdate's ([ba7383f](https://github.com/nrkno/tv-automation-server-core/commit/ba7383f)) -* detect and discard double as-run events ([98f65a2](https://github.com/nrkno/tv-automation-server-core/commit/98f65a2)) -* dev Collections bug, due to collections being filled in later ([43e8856](https://github.com/nrkno/tv-automation-server-core/commit/43e8856)) -* dev debug data function ([e4570e2](https://github.com/nrkno/tv-automation-server-core/commit/e4570e2)) -* device is first created as Abstract ([98dca79](https://github.com/nrkno/tv-automation-server-core/commit/98dca79)) -* device status notifications ([7ab4a4c](https://github.com/nrkno/tv-automation-server-core/commit/7ab4a4c)) -* disable client-side RO updates ([72ba831](https://github.com/nrkno/tv-automation-server-core/commit/72ba831)) -* disable fullscreen overlay in developer mode ([7cc2e43](https://github.com/nrkno/tv-automation-server-core/commit/7cc2e43)) -* disable runtimeFunction caching during code-test & save ([e21f8dd](https://github.com/nrkno/tv-automation-server-core/commit/e21f8dd)) -* disable runtimeFunction caching during code-test & save ([74d6d34](https://github.com/nrkno/tv-automation-server-core/commit/74d6d34)) -* Do not allow queue ad lib during hold mode ([c378fc8](https://github.com/nrkno/tv-automation-server-core/commit/c378fc8)) -* do not allow toggling sl arguments during hold mode ([3311f0a](https://github.com/nrkno/tv-automation-server-core/commit/3311f0a)) -* do not display notification count if = 0 ([1fe9a39](https://github.com/nrkno/tv-automation-server-core/commit/1fe9a39)) -* do not error CountdownItemLabel when sourceLayer is not found ([9451d1c](https://github.com/nrkno/tv-automation-server-core/commit/9451d1c)) -* do not show empty string values in L3rd popup ([b0c6c8e](https://github.com/nrkno/tv-automation-server-core/commit/b0c6c8e)) -* don't send devicesMakeReady until verified no other runningOrders are active ([953a1a7](https://github.com/nrkno/tv-automation-server-core/commit/953a1a7)) -* don't update device name if already got one ([833196a](https://github.com/nrkno/tv-automation-server-core/commit/833196a)) -* don't wait for subscriptions before rendering ([2bbfa20](https://github.com/nrkno/tv-automation-server-core/commit/2bbfa20)) -* Dont generate ui outputlayers for sli which are virtual ([c0ad368](https://github.com/nrkno/tv-automation-server-core/commit/c0ad368)) -* dont set nora_* config values in initDB ([1330008](https://github.com/nrkno/tv-automation-server-core/commit/1330008)) -* Dont show unset optional config in the config list ([5689865](https://github.com/nrkno/tv-automation-server-core/commit/5689865)) -* duration settling ([0648f57](https://github.com/nrkno/tv-automation-server-core/commit/0648f57)) -* Editattribute type typing ([1206d0c](https://github.com/nrkno/tv-automation-server-core/commit/1206d0c)) -* Editattribute type typing ([392f4aa](https://github.com/nrkno/tv-automation-server-core/commit/392f4aa)) -* EditAttribute: dropdown options was always strings ([814cdf7](https://github.com/nrkno/tv-automation-server-core/commit/814cdf7)) -* End of Show marker line doesn't end where it should ([e188c97](https://github.com/nrkno/tv-automation-server-core/commit/e188c97)) -* enforce workflow data structure ([d01245f](https://github.com/nrkno/tv-automation-server-core/commit/d01245f)) -* Ensure lookahead ids are always unique ([26f6637](https://github.com/nrkno/tv-automation-server-core/commit/26f6637)) -* ensure that the connection notification is always on top ([662cd7a](https://github.com/nrkno/tv-automation-server-core/commit/662cd7a)) -* ensure the same overlap is used for autonext and the previous sl ([efb39e6](https://github.com/nrkno/tv-automation-server-core/commit/efb39e6)) -* Ensure the sl overlapDuration is respected on autonext. ([8c3bf3e](https://github.com/nrkno/tv-automation-server-core/commit/8c3bf3e)) -* Ensure typeVariant on SegmentLine is preserved when a roList is received ([98b224c](https://github.com/nrkno/tv-automation-server-core/commit/98b224c)) -* error when content.boxSourceConfiguration is undefined ([81c896b](https://github.com/nrkno/tv-automation-server-core/commit/81c896b)) -* error when content.boxSourceConfiguration is undefined ([fc7ec40](https://github.com/nrkno/tv-automation-server-core/commit/fc7ec40)) -* expectedMediaItems: make ids uniquer ([e16594a](https://github.com/nrkno/tv-automation-server-core/commit/e16594a)) -* externalMessage: priority of messages to send ([cffcd97](https://github.com/nrkno/tv-automation-server-core/commit/cffcd97)) -* externalMessageQueue id ([5c8c39d](https://github.com/nrkno/tv-automation-server-core/commit/5c8c39d)) -* externalMessages upd ([a803882](https://github.com/nrkno/tv-automation-server-core/commit/a803882)) -* failing on startup if dp property missing ([041fc3e](https://github.com/nrkno/tv-automation-server-core/commit/041fc3e)) -* filter on json files on restore backup file selector ([1a0b867](https://github.com/nrkno/tv-automation-server-core/commit/1a0b867)) -* Fix context.runHelper not working in templates. ([36ca5f3](https://github.com/nrkno/tv-automation-server-core/commit/36ca5f3)) -* Fix device status notifications ([b9f274e](https://github.com/nrkno/tv-automation-server-core/commit/b9f274e)) -* fix for strange (temporary?) error about method missing ([0db30ae](https://github.com/nrkno/tv-automation-server-core/commit/0db30ae)) -* fix more typings and add some null checks in unusual places ([d0c53c3](https://github.com/nrkno/tv-automation-server-core/commit/d0c53c3)) -* fix notifications toggle button cursor ([b0d8dcb](https://github.com/nrkno/tv-automation-server-core/commit/b0d8dcb)) -* fix notifications toggle button cursor ([402486b](https://github.com/nrkno/tv-automation-server-core/commit/402486b)) -* fix PTZ Testing harness ([97bccc7](https://github.com/nrkno/tv-automation-server-core/commit/97bccc7)) -* fix Segment Line notifications ([3753250](https://github.com/nrkno/tv-automation-server-core/commit/3753250)) -* fix typings to match with the stronger typings ([ae1bd4f](https://github.com/nrkno/tv-automation-server-core/commit/ae1bd4f)) -* fix zoom area height ([24d2e38](https://github.com/nrkno/tv-automation-server-core/commit/24d2e38)) -* force lookahead inGroup field to be emptied. Fixes mismatched statobj ([c76209c](https://github.com/nrkno/tv-automation-server-core/commit/c76209c)) -* freeze/black in begin/end of mediafile gets special warning ([ea950e2](https://github.com/nrkno/tv-automation-server-core/commit/ea950e2)) -* generate statObject per device ([82a0736](https://github.com/nrkno/tv-automation-server-core/commit/82a0736)) -* getSnapshot: don't ask devices of type OTHER ([ea874d4](https://github.com/nrkno/tv-automation-server-core/commit/ea874d4)) -* getting monaco to work runtime while still having typings ([5db8218](https://github.com/nrkno/tv-automation-server-core/commit/5db8218)) -* global ad-lib order was wrong, basline blueprint did not set _rank ([ffbacc8](https://github.com/nrkno/tv-automation-server-core/commit/ffbacc8)) -* Guard against there being no next segmentline ([849d97f](https://github.com/nrkno/tv-automation-server-core/commit/849d97f)) -* GUI externalMessages json formatting ([0b7cd2c](https://github.com/nrkno/tv-automation-server-core/commit/0b7cd2c)) -* GUI: new try on rewinding the viewport on RO reset ([b0edaf4](https://github.com/nrkno/tv-automation-server-core/commit/b0edaf4)) -* GUI: round number of frames ([c90021f](https://github.com/nrkno/tv-automation-server-core/commit/c90021f)) -* GUI: settings: only show parent-devices in left menu (only they have settings on them) ([ecb164e](https://github.com/nrkno/tv-automation-server-core/commit/ecb164e)) -* GUI: unexpected behaviour in blueprint configuration ([f5bed4e](https://github.com/nrkno/tv-automation-server-core/commit/f5bed4e)) -* handle both update & insert of runningOrder ([3701bb3](https://github.com/nrkno/tv-automation-server-core/commit/3701bb3)) -* handle both update & insert of runningOrder ([84a6c53](https://github.com/nrkno/tv-automation-server-core/commit/84a6c53)) -* handle promises correctly.. ([b952e1d](https://github.com/nrkno/tv-automation-server-core/commit/b952e1d)) -* handle promises correctly.. ([2e57296](https://github.com/nrkno/tv-automation-server-core/commit/2e57296)) -* handle when nexting before start or after end ([506bb8a](https://github.com/nrkno/tv-automation-server-core/commit/506bb8a)) -* has played styling shouldn't be applied to Guest and Remote segments ([18bdc82](https://github.com/nrkno/tv-automation-server-core/commit/18bdc82)) -* head mute audio and hold on last frame ([ceec7f6](https://github.com/nrkno/tv-automation-server-core/commit/ceec7f6)) -* header context menu z-order fix ([c68244b](https://github.com/nrkno/tv-automation-server-core/commit/c68244b)) -* Hide child devices from being added to the studio ([852ec9b](https://github.com/nrkno/tv-automation-server-core/commit/852ec9b)) -* Hide Keyboard focus marker when not in studio mode ([70dc6b0](https://github.com/nrkno/tv-automation-server-core/commit/70dc6b0)) -* HOLD add new llayer to initDB ([650b6e6](https://github.com/nrkno/tv-automation-server-core/commit/650b6e6)) -* hold-copy of the SLI should provide seek information to offset markers on the SLI ([3967d03](https://github.com/nrkno/tv-automation-server-core/commit/3967d03)) -* holdState = 0 displayed a status ([49c7ead](https://github.com/nrkno/tv-automation-server-core/commit/49c7ead)) -* holdState = 0 displayed a status ([aacd140](https://github.com/nrkno/tv-automation-server-core/commit/aacd140)) -* hot fix for rehearsal activation when an RO is already active ([648c02d](https://github.com/nrkno/tv-automation-server-core/commit/648c02d)) -* houskeeping: remove uneccessary logs ([0c054f9](https://github.com/nrkno/tv-automation-server-core/commit/0c054f9)) -* if the next:ed segment is removed, instead next the one in its place ([22597b3](https://github.com/nrkno/tv-automation-server-core/commit/22597b3)) -* Importing of some mock running orders ([eadf225](https://github.com/nrkno/tv-automation-server-core/commit/eadf225)) -* improve evaluation form visuals ([30af081](https://github.com/nrkno/tv-automation-server-core/commit/30af081)) -* Improve group label visuals ([39b43e1](https://github.com/nrkno/tv-automation-server-core/commit/39b43e1)) -* Improve missing mosId error message ([89695fb](https://github.com/nrkno/tv-automation-server-core/commit/89695fb)) -* improve notification center button ([0b4d082](https://github.com/nrkno/tv-automation-server-core/commit/0b4d082)) -* improve notifications highlighting animation ([abda2c3](https://github.com/nrkno/tv-automation-server-core/commit/abda2c3)) -* improve notifications highlighting animation ([afeb568](https://github.com/nrkno/tv-automation-server-core/commit/afeb568)) -* improve some error logging ([60af59b](https://github.com/nrkno/tv-automation-server-core/commit/60af59b)) -* improved queries & added index ([159f6d5](https://github.com/nrkno/tv-automation-server-core/commit/159f6d5)) -* incorrect typings for template editor ([9d021df](https://github.com/nrkno/tv-automation-server-core/commit/9d021df)) -* Increase size of template editor to make it better fill the screen ([3212d7b](https://github.com/nrkno/tv-automation-server-core/commit/3212d7b)) -* increase upload limit for backup files ([5effaa9](https://github.com/nrkno/tv-automation-server-core/commit/5effaa9)) -* increase upload limit for backup files ([e658f12](https://github.com/nrkno/tv-automation-server-core/commit/e658f12)) -* Infinite items dont stop against a absolute 0 item properly. ([78c1499](https://github.com/nrkno/tv-automation-server-core/commit/78c1499)) -* infinite segment line tidying and fixes ([8469ffb](https://github.com/nrkno/tv-automation-server-core/commit/8469ffb)) -* Infinite segmentline bad guard when calculating the current infinites that caused the process to stop early ([2f9abeb](https://github.com/nrkno/tv-automation-server-core/commit/2f9abeb)) -* infinite segmentlines crossing an autonext throwing a duplicate key exception ([93b2a30](https://github.com/nrkno/tv-automation-server-core/commit/93b2a30)) -* init state properly ([2572cdc](https://github.com/nrkno/tv-automation-server-core/commit/2572cdc)) -* initDB for pharos lights ([57fbc73](https://github.com/nrkno/tv-automation-server-core/commit/57fbc73)) -* initial optimization of updateSourceLayerInfinitesAfterLine ([5cd8235](https://github.com/nrkno/tv-automation-server-core/commit/5cd8235)) -* initial optimization of updateSourceLayerInfinitesAfterLine ([871bdd2](https://github.com/nrkno/tv-automation-server-core/commit/871bdd2)) -* initiateDB update for PTZ ([e529782](https://github.com/nrkno/tv-automation-server-core/commit/e529782)) -* issue with rehearsal double-activation warning ([17b4e95](https://github.com/nrkno/tv-automation-server-core/commit/17b4e95)) -* issue with roPrepareForBroadcast ([c3ad30c](https://github.com/nrkno/tv-automation-server-core/commit/c3ad30c)) -* issue with source layers marked as used even though they were used in the following segmentLine ([71acfb3](https://github.com/nrkno/tv-automation-server-core/commit/71acfb3)) -* JSX props typings fix in Header ([7596557](https://github.com/nrkno/tv-automation-server-core/commit/7596557)) -* keep device header in Mos parent properties settings ([4ff9b91](https://github.com/nrkno/tv-automation-server-core/commit/4ff9b91)) -* keep device header in Mos parent properties settings ([2f2529d](https://github.com/nrkno/tv-automation-server-core/commit/2f2529d)) -* Keep the devices header visible when editing device ([cb2d7d9](https://github.com/nrkno/tv-automation-server-core/commit/cb2d7d9)) -* Keep the devices header visible when editing device ([90dbe05](https://github.com/nrkno/tv-automation-server-core/commit/90dbe05)) -* keys should be handled at up, not down ([957f583](https://github.com/nrkno/tv-automation-server-core/commit/957f583)) -* labels in modal dialogs ([3af18fc](https://github.com/nrkno/tv-automation-server-core/commit/3af18fc)) -* limit db fetches to active running order ([f3aca8f](https://github.com/nrkno/tv-automation-server-core/commit/f3aca8f)) -* lock down package.json & update package-lock, to get release2 to build ([472f8ab](https://github.com/nrkno/tv-automation-server-core/commit/472f8ab)) -* locked [@babel](https://github.com/babel)/runtime version & updated package-lock ([8e62d2f](https://github.com/nrkno/tv-automation-server-core/commit/8e62d2f)) -* logics bugfix after optimization ([fe85cd3](https://github.com/nrkno/tv-automation-server-core/commit/fe85cd3)) -* logics bugfix after optimization ([2b8fa3c](https://github.com/nrkno/tv-automation-server-core/commit/2b8fa3c)) -* lookahead object id not being set correctly ([594a1e7](https://github.com/nrkno/tv-automation-server-core/commit/594a1e7)) -* made editor height dynamic ([7f5f40e](https://github.com/nrkno/tv-automation-server-core/commit/7f5f40e)) -* made editor height dynamic ([c68ac4f](https://github.com/nrkno/tv-automation-server-core/commit/c68ac4f)) -* Major refactoring, splitting code into separate files depending on their areas: "rundown": General rundown manipulation, "media-scanner": Media-scanner, "mos": mos-specific functions ([db82375](https://github.com/nrkno/tv-automation-server-core/commit/db82375)) -* make 'Lights' source layer type translatable in the Settings ([65d5b76](https://github.com/nrkno/tv-automation-server-core/commit/65d5b76)) -* make sure that the adlib shelf isn't obstructed by the right-hand bar ([8783819](https://github.com/nrkno/tv-automation-server-core/commit/8783819)) -* make the context menu available in the entire header ([0590f9d](https://github.com/nrkno/tv-automation-server-core/commit/0590f9d)) -* make the FullScreen detection more lenient ([215d73c](https://github.com/nrkno/tv-automation-server-core/commit/215d73c)) -* make the FullScreen detection more lenient ([28b689a](https://github.com/nrkno/tv-automation-server-core/commit/28b689a)) -* Make the head to kam wipe not use the mosartVariant field. Correct the head order checking ([6030755](https://github.com/nrkno/tv-automation-server-core/commit/6030755)) -* media-manager: rename keyStep => criticalStep ([77f4d6a](https://github.com/nrkno/tv-automation-server-core/commit/77f4d6a)) -* mediainfo typings & timebase ([67f16be](https://github.com/nrkno/tv-automation-server-core/commit/67f16be)) -* mediaobjects to use computed field ([dba858f](https://github.com/nrkno/tv-automation-server-core/commit/dba858f)) -* mediaobjects to use computed field ([39d13b5](https://github.com/nrkno/tv-automation-server-core/commit/39d13b5)) -* Migration for stk&full audio remapping ([2491f52](https://github.com/nrkno/tv-automation-server-core/commit/2491f52)) -* migration helpers ([40228e8](https://github.com/nrkno/tv-automation-server-core/commit/40228e8)) -* Migration UI fixes ([b141243](https://github.com/nrkno/tv-automation-server-core/commit/b141243)) -* Migrations internal server error ([45d0238](https://github.com/nrkno/tv-automation-server-core/commit/45d0238)) -* minor ui fix on status page ([97fc3c2](https://github.com/nrkno/tv-automation-server-core/commit/97fc3c2)) -* miss in merge ([93106b1](https://github.com/nrkno/tv-automation-server-core/commit/93106b1)) -* missing argument for mediaStatusCheck ([658e82a](https://github.com/nrkno/tv-automation-server-core/commit/658e82a)) -* Missing typings on ShowStyle ([a0a4e14](https://github.com/nrkno/tv-automation-server-core/commit/a0a4e14)) -* Mix transitions ([5cf2314](https://github.com/nrkno/tv-automation-server-core/commit/5cf2314)) -* Mix transitions ([0ebf3e1](https://github.com/nrkno/tv-automation-server-core/commit/0ebf3e1)) -* modified timestamp on imported blueprints was not being set, causing the cache to not be cleared properly ([2f3fd17](https://github.com/nrkno/tv-automation-server-core/commit/2f3fd17)) -* monaco typing error fix ([e73467e](https://github.com/nrkno/tv-automation-server-core/commit/e73467e)) -* move all segment notes away from header, show only summary, clickable summary ([d0a4801](https://github.com/nrkno/tv-automation-server-core/commit/d0a4801)) -* move all segment notes away from header, show only summary, clickable summary ([aee3d01](https://github.com/nrkno/tv-automation-server-core/commit/aee3d01)) -* move back executeFunction to peripheralDeviceAPI ([226289f](https://github.com/nrkno/tv-automation-server-core/commit/226289f)) -* move notifications pop-ups when NC is open ([d6ce260](https://github.com/nrkno/tv-automation-server-core/commit/d6ce260)) -* move notifications pop-ups when NC is open ([6f7759f](https://github.com/nrkno/tv-automation-server-core/commit/6f7759f)) -* new implementation of runtime caching ([92e09be](https://github.com/nrkno/tv-automation-server-core/commit/92e09be)) -* new implementation of runtime caching ([767fbb7](https://github.com/nrkno/tv-automation-server-core/commit/767fbb7)) -* new lawo source mappings ([20f7d5a](https://github.com/nrkno/tv-automation-server-core/commit/20f7d5a)) -* non-persistent pop-ups should be prioritized over persistent ones ([99f147a](https://github.com/nrkno/tv-automation-server-core/commit/99f147a)) -* normalize naming scheme to 'runtimeArguments', normalize hotkey labels ([528679d](https://github.com/nrkno/tv-automation-server-core/commit/528679d)) -* note type got lost ([863e49d](https://github.com/nrkno/tv-automation-server-core/commit/863e49d)) -* notification center panel shadow ([1010dda](https://github.com/nrkno/tv-automation-server-core/commit/1010dda)) -* Notification Center width calculations ([fa31d65](https://github.com/nrkno/tv-automation-server-core/commit/fa31d65)) -* notification equality check, resolves 'republished' RO notifications ([27b6102](https://github.com/nrkno/tv-automation-server-core/commit/27b6102)) -* NotificationCenter visual fix for other pages ([10b1afa](https://github.com/nrkno/tv-automation-server-core/commit/10b1afa)) -* NotificationCenter visual fix for other pages ([2c5da97](https://github.com/nrkno/tv-automation-server-core/commit/2c5da97)) -* Notifications panel styling fix ([7f7f5cb](https://github.com/nrkno/tv-automation-server-core/commit/7f7f5cb)) -* NymansPlayground caused issues in Timeline ([83e772d](https://github.com/nrkno/tv-automation-server-core/commit/83e772d)) -* on startup, clear old connection statuses ([e9d7cba](https://github.com/nrkno/tv-automation-server-core/commit/e9d7cba)) -* onAir line jumping around on takes ([8330112](https://github.com/nrkno/tv-automation-server-core/commit/8330112)) -* optimizations during adlibs (thanks to [@baltedewit](https://github.com/baltedewit)) ([f50b60e](https://github.com/nrkno/tv-automation-server-core/commit/f50b60e)) -* optimizations during adlibs (thanks to [@baltedewit](https://github.com/baltedewit)) ([daa135b](https://github.com/nrkno/tv-automation-server-core/commit/daa135b)) -* optimize saveIntoDB ([65c189e](https://github.com/nrkno/tv-automation-server-core/commit/65c189e)) -* Pass SofieHostURL to blueprints config ([8c18821](https://github.com/nrkno/tv-automation-server-core/commit/8c18821)) -* peripheralDevices subscription for RO data ([90b4e13](https://github.com/nrkno/tv-automation-server-core/commit/90b4e13)) -* Persist SegmentLine.updateStoryStatus ([427b24c](https://github.com/nrkno/tv-automation-server-core/commit/427b24c)) -* playout ([969e316](https://github.com/nrkno/tv-automation-server-core/commit/969e316)) -* playout, lookahead: use the originalLayer instear of isAbstract ([30fe842](https://github.com/nrkno/tv-automation-server-core/commit/30fe842)) -* PR changes ([c877aad](https://github.com/nrkno/tv-automation-server-core/commit/c877aad)) -* prevent default action for f1 & f3 ([53b2f22](https://github.com/nrkno/tv-automation-server-core/commit/53b2f22)) -* prevent resetting rundown when on-air ([d842922](https://github.com/nrkno/tv-automation-server-core/commit/d842922)) -* prevent take + autotake bug ([b3d9a4d](https://github.com/nrkno/tv-automation-server-core/commit/b3d9a4d)) -* proper dispose of executeFunction checkReply after execution is done ([523ec99](https://github.com/nrkno/tv-automation-server-core/commit/523ec99)) -* queued adlib should have infinite sli's ([75452dc](https://github.com/nrkno/tv-automation-server-core/commit/75452dc)) -* R3 ONLY: bugfix: reload data from ENPS ([cc6ed44](https://github.com/nrkno/tv-automation-server-core/commit/cc6ed44)) -* rabbitMQ sending messages ([df72c4c](https://github.com/nrkno/tv-automation-server-core/commit/df72c4c)) -* re-add blueprint & mosdatacache restore (to be deprecated later) ([886c756](https://github.com/nrkno/tv-automation-server-core/commit/886c756)) -* re-added monaco typings and disabled import, so it works client-side ([1226763](https://github.com/nrkno/tv-automation-server-core/commit/1226763)) -* re-timing vignett ([17fbced](https://github.com/nrkno/tv-automation-server-core/commit/17fbced)) -* react errors while rendering nymansPlayground ([0c245d3](https://github.com/nrkno/tv-automation-server-core/commit/0c245d3)) -* React unique keys ([4f728d9](https://github.com/nrkno/tv-automation-server-core/commit/4f728d9)) -* RecordedFiles index ([f1aae5e](https://github.com/nrkno/tv-automation-server-core/commit/f1aae5e)) -* refactor storeSnapshot methods ([6e66394](https://github.com/nrkno/tv-automation-server-core/commit/6e66394)) -* refactor updateExternalMessageQueueStatus to avoid fatal startup bug ([b54b09d](https://github.com/nrkno/tv-automation-server-core/commit/b54b09d)) -* refactored execMethod, so it doesn't use promises and causes unhandled promise rejections ([24da71b](https://github.com/nrkno/tv-automation-server-core/commit/24da71b)) -* refactored reset-segmentLine further ([0523eb6](https://github.com/nrkno/tv-automation-server-core/commit/0523eb6)) -* refactored/DRYd adminMode & studioMode, disabled trashbin-button for externalMessages when not in adminMode ([b29dae1](https://github.com/nrkno/tv-automation-server-core/commit/b29dae1)) -* relative durations causing type warnings for ui code ([5249435](https://github.com/nrkno/tv-automation-server-core/commit/5249435)) -* Release 3 only: disable config missing warning ([921cc82](https://github.com/nrkno/tv-automation-server-core/commit/921cc82)) -* remount monaco ([4ce1566](https://github.com/nrkno/tv-automation-server-core/commit/4ce1566)) -* remove 'computation stopped' notifications ([bf4d8d8](https://github.com/nrkno/tv-automation-server-core/commit/bf4d8d8)) -* remove check that didn't work ([fdc917f](https://github.com/nrkno/tv-automation-server-core/commit/fdc917f)) -* remove config didn't work ([893717e](https://github.com/nrkno/tv-automation-server-core/commit/893717e)) -* remove debug line in nightly cronjob ([dda3017](https://github.com/nrkno/tv-automation-server-core/commit/dda3017)) -* remove deprecated options ([ab7275b](https://github.com/nrkno/tv-automation-server-core/commit/ab7275b)) -* Remove empty translations ([d2f1bd0](https://github.com/nrkno/tv-automation-server-core/commit/d2f1bd0)) -* remove expectedMediaItems when ro is removed ([5230695](https://github.com/nrkno/tv-automation-server-core/commit/5230695)) -* remove full-screen button, add label ([5e9826e](https://github.com/nrkno/tv-automation-server-core/commit/5e9826e)) -* remove full-screen button, add label ([5c9a3e5](https://github.com/nrkno/tv-automation-server-core/commit/5c9a3e5)) -* remove leftover debug info ([d475b76](https://github.com/nrkno/tv-automation-server-core/commit/d475b76)) -* remove some console.logs ([a9f3f53](https://github.com/nrkno/tv-automation-server-core/commit/a9f3f53)) -* Remove timestamps from blueprint backups ([74fa1b3](https://github.com/nrkno/tv-automation-server-core/commit/74fa1b3)) -* remove unneccessary margin in some headers ([32874a1](https://github.com/nrkno/tv-automation-server-core/commit/32874a1)) -* remove unneccessary margin in some headers ([b47ea11](https://github.com/nrkno/tv-automation-server-core/commit/b47ea11)) -* **ro list:** translatify & hide 'Unsynced from MOS' label when no unsynced items ([fa56ecd](https://github.com/nrkno/tv-automation-server-core/commit/fa56ecd)) -* remove unused imports ([5fe6ac3](https://github.com/nrkno/tv-automation-server-core/commit/5fe6ac3)) -* remove unused translation helper ([e545a9e](https://github.com/nrkno/tv-automation-server-core/commit/e545a9e)) -* removed autopublish and insecure packages, we'll implement publications and allow/deny rules from now on ([213998d](https://github.com/nrkno/tv-automation-server-core/commit/213998d)) -* removed ntp server debug code ([b9857e7](https://github.com/nrkno/tv-automation-server-core/commit/b9857e7)) -* removed old, deprecated attr ([bf0cdfd](https://github.com/nrkno/tv-automation-server-core/commit/bf0cdfd)) -* Removed the hard-coded link in the header that set the translation to Norwegian Bokmål. ([4515066](https://github.com/nrkno/tv-automation-server-core/commit/4515066)) -* removed uploadFileToAtem function, this should be done in devicesMakeReady ([4e96bb3](https://github.com/nrkno/tv-automation-server-core/commit/4e96bb3)) -* removed wrongful error throw ([852c495](https://github.com/nrkno/tv-automation-server-core/commit/852c495)) -* removed wrongful error throw ([b3deed1](https://github.com/nrkno/tv-automation-server-core/commit/b3deed1)) -* Removing trailing slashes in url defaults ([f6fa32c](https://github.com/nrkno/tv-automation-server-core/commit/f6fa32c)) -* **record:** Hide internal layer mappings ([24dfef1](https://github.com/nrkno/tv-automation-server-core/commit/24dfef1)) -* rename method getShowStyleRef => getShowStyleConfigRef ([c8bbe95](https://github.com/nrkno/tv-automation-server-core/commit/c8bbe95)) -* rename restoreBackups page to Snapshots ([0c5103f](https://github.com/nrkno/tv-automation-server-core/commit/0c5103f)) -* rename rundownAPI => runningOrderAPI ([89d48d0](https://github.com/nrkno/tv-automation-server-core/commit/89d48d0)) -* rename version 0.20.0 => 0.21.0 (release 6) ([7b1ee3a](https://github.com/nrkno/tv-automation-server-core/commit/7b1ee3a)) -* resetRunningOrder functionality in GUI ([4eb096a](https://github.com/nrkno/tv-automation-server-core/commit/4eb096a)) -* resetRunningorder should update timeline ([0d01e6a](https://github.com/nrkno/tv-automation-server-core/commit/0d01e6a)) -* resetRunningorder should update timeline ([35451b1](https://github.com/nrkno/tv-automation-server-core/commit/35451b1)) -* resetting running order rewind ([a122f2c](https://github.com/nrkno/tv-automation-server-core/commit/a122f2c)) -* resolve a typo in rabbitMQ.ts ([3b36ae3](https://github.com/nrkno/tv-automation-server-core/commit/3b36ae3)) -* resolve issue with ContextMenus in RO view ([8d9ba96](https://github.com/nrkno/tv-automation-server-core/commit/8d9ba96)) -* resolve issue with hit-area of Notification Center ([1618619](https://github.com/nrkno/tv-automation-server-core/commit/1618619)) -* resolve issue with lowPriority cron jobs ([f7c3c83](https://github.com/nrkno/tv-automation-server-core/commit/f7c3c83)) -* resolve Media Object Status notifications bug ([367dcce](https://github.com/nrkno/tv-automation-server-core/commit/367dcce)) -* resolve merge issue ([0cbc75a](https://github.com/nrkno/tv-automation-server-core/commit/0cbc75a)) -* Respect disableOutTransition on SegmentLine during manual takes (not just autonext) ([f19788d](https://github.com/nrkno/tv-automation-server-core/commit/f19788d)) -* restore blueprint settings page ([faa7fdd](https://github.com/nrkno/tv-automation-server-core/commit/faa7fdd)) -* restore running order 'backup' fails if doesnt already exist ([87b3300](https://github.com/nrkno/tv-automation-server-core/commit/87b3300)) -* retry strategy for restart casparcg cronjob ([b54f0f6](https://github.com/nrkno/tv-automation-server-core/commit/b54f0f6)) -* reversed logic during refactoring by mistake ([694191e](https://github.com/nrkno/tv-automation-server-core/commit/694191e)) -* Revert 594a1e7 ([edeb166](https://github.com/nrkno/tv-automation-server-core/commit/edeb166)) -* rewind icon was not responsive in ROFullscreenControls ([0e494df](https://github.com/nrkno/tv-automation-server-core/commit/0e494df)) -* rewind icon was not responsive in ROFullscreenControls ([2e7c1d2](https://github.com/nrkno/tv-automation-server-core/commit/2e7c1d2)) -* **hold:** Disable transition when leaving HOLD ([809dd34](https://github.com/nrkno/tv-automation-server-core/commit/809dd34)) -* rewind UI even if reset returns error ([3bd5417](https://github.com/nrkno/tv-automation-server-core/commit/3bd5417)) -* rewind UI even if reset returns error ([08c5d6b](https://github.com/nrkno/tv-automation-server-core/commit/08c5d6b)) -* reworked systemStatus to use components instead ([cccfe3c](https://github.com/nrkno/tv-automation-server-core/commit/cccfe3c)) -* RO buttons z-order ([3c53254](https://github.com/nrkno/tv-automation-server-core/commit/3c53254)) -* RO buttons z-order ([15e9da8](https://github.com/nrkno/tv-automation-server-core/commit/15e9da8)) -* RO notification action ([36cf900](https://github.com/nrkno/tv-automation-server-core/commit/36cf900)) -* **adlib:** Allow for overlap of adlib sli to give preload time ([d2f0dcd](https://github.com/nrkno/tv-automation-server-core/commit/d2f0dcd)) -* **adlib:** An adlib replacing the main sli of a sl would not adjust the length of the original. F5/F6 sometimes failed to insert a sli correctly, causing black ([fca6f05](https://github.com/nrkno/tv-automation-server-core/commit/fca6f05)) -* **adlib:** Set as next on SL after using F5/F6 would not restore correctly ([3829293](https://github.com/nrkno/tv-automation-server-core/commit/3829293)) -* **asRunLog:** wrong id, typo ([636fc41](https://github.com/nrkno/tv-automation-server-core/commit/636fc41)) -* **blueprint:** Fill in missing TimelineObj fields ([0ed7663](https://github.com/nrkno/tv-automation-server-core/commit/0ed7663)) -* **blueprint:** fix manifest config add item showing an 'undefined' option ([fa6182a](https://github.com/nrkno/tv-automation-server-core/commit/fa6182a)) -* **blueprint:** Remove invalid backup restore code ([2e00eca](https://github.com/nrkno/tv-automation-server-core/commit/2e00eca)) -* **blueprints:** Ensure ids are not duplicated ([fbd0a04](https://github.com/nrkno/tv-automation-server-core/commit/fbd0a04)) -* **blueprints:** Ensure the object ids generated by the post-process blueprint are unique ([bdee540](https://github.com/nrkno/tv-automation-server-core/commit/bdee540)) -* **cam/dir:** clear hotkeys ([2545de8](https://github.com/nrkno/tv-automation-server-core/commit/2545de8)) -* **clip metadata:** timebase info ([5c39ea8](https://github.com/nrkno/tv-automation-server-core/commit/5c39ea8)) -* **countdowns:** ignore sourceLayers that we don't have an icon for ([27b2ac0](https://github.com/nrkno/tv-automation-server-core/commit/27b2ac0)) -* **Devices:** Better strings and device list layouts (less details) ([be26a18](https://github.com/nrkno/tv-automation-server-core/commit/be26a18)) -* **emberplus:** changes intiDB mapping to new .-delimited string format ([b6d8bc7](https://github.com/nrkno/tv-automation-server-core/commit/b6d8bc7)) -* **expected media items:** use a function instead of fat arrow ([fa23c05](https://github.com/nrkno/tv-automation-server-core/commit/fa23c05)) -* **externalMessage:** encode proper html-entities in strings ([243995c](https://github.com/nrkno/tv-automation-server-core/commit/243995c)) -* **FirstObjects:** Reverts regression introduced by removing isAbstract from firstObject items ([8f1608b](https://github.com/nrkno/tv-automation-server-core/commit/8f1608b)) -* **hold:** Disable transition when in HOLD ([cfcb141](https://github.com/nrkno/tv-automation-server-core/commit/cfcb141)) -* **hold:** Disable transition when leaving HOLD ([6b7184c](https://github.com/nrkno/tv-automation-server-core/commit/6b7184c)) -* **hold:** Disable transition when leaving or leaving HOLD ([ef5cbcb](https://github.com/nrkno/tv-automation-server-core/commit/ef5cbcb)) -* **hold:** Ensure the original stk does not get picked up as a dynamic object when setting the sl as next ([b10f48d](https://github.com/nrkno/tv-automation-server-core/commit/b10f48d)) -* **hold:** Ensure the original stk does not get picked up as a dynamic object when setting the sl as next ([225304d](https://github.com/nrkno/tv-automation-server-core/commit/225304d)) -* **hold:** Ensure the original stk does not get picked up as a dynamic object when setting the sl as next ([22da4d8](https://github.com/nrkno/tv-automation-server-core/commit/22da4d8)) -* **hold:** keep showing any infinite items that existed on the previous sl ([21a9973](https://github.com/nrkno/tv-automation-server-core/commit/21a9973)) -* **hold:** Too many sli being extended for hold mode ([f644e32](https://github.com/nrkno/tv-automation-server-core/commit/f644e32)) -* **hold:** When extending a sli during hold, use the original id to make any triggers on the sli work ([a3fd1a6](https://github.com/nrkno/tv-automation-server-core/commit/a3fd1a6)) -* **hold:** When extending a sli during hold, use the original id to make any triggers on the sli work ([669a4b2](https://github.com/nrkno/tv-automation-server-core/commit/669a4b2)) -* **infinite:** Persist overrideDuration when updating infinites ([72670d5](https://github.com/nrkno/tv-automation-server-core/commit/72670d5)) -* **infinite items:** removes infinite icon from outOnNextSegment ([4a75d7d](https://github.com/nrkno/tv-automation-server-core/commit/4a75d7d)) -* **init:** Adds default lawo device settings ([28759df](https://github.com/nrkno/tv-automation-server-core/commit/28759df)) -* **init:** adds qwerty to bakskjerm ([7329976](https://github.com/nrkno/tv-automation-server-core/commit/7329976)) -* **init:** adds qwerty to bakskjerm ([78198c9](https://github.com/nrkno/tv-automation-server-core/commit/78198c9)) -* **init:** adds qwerty to bakskjerm ([a45de4d](https://github.com/nrkno/tv-automation-server-core/commit/a45de4d)) -* **init:** hides klokke and logo layers by default ([1847ca4](https://github.com/nrkno/tv-automation-server-core/commit/1847ca4)) -* **init:** Layer names ([221b374](https://github.com/nrkno/tv-automation-server-core/commit/221b374)) -* **init:** Layer names ([16a504c](https://github.com/nrkno/tv-automation-server-core/commit/16a504c)) -* **init:** Splits init_layers and init_config. ([e056e5a](https://github.com/nrkno/tv-automation-server-core/commit/e056e5a)) -* **init:** swaps MP2 and MP1NXT layers ([b8a370c](https://github.com/nrkno/tv-automation-server-core/commit/b8a370c)) -* **init:** updated channel orders after 2-caspar setup ([3404b9b](https://github.com/nrkno/tv-automation-server-core/commit/3404b9b)) -* **Init:** Creat empty settings for Nora ([f8d0669](https://github.com/nrkno/tv-automation-server-core/commit/f8d0669)) -* **Init:** fixes wrong mapping of Lawo RMs ([ee68432](https://github.com/nrkno/tv-automation-server-core/commit/ee68432)) -* **Init:** Sets init defaults to xpro ([fd9c182](https://github.com/nrkno/tv-automation-server-core/commit/fd9c182)) -* **Initdb:** Preload vignett ([156a454](https://github.com/nrkno/tv-automation-server-core/commit/156a454)) -* **Initdb:** Preload vignett ([9470318](https://github.com/nrkno/tv-automation-server-core/commit/9470318)) -* **iterateDeeply:** typos ([c9198f1](https://github.com/nrkno/tv-automation-server-core/commit/c9198f1)) -* **L3rd pop-up:** filter out properties starting with @ ([c85ebeb](https://github.com/nrkno/tv-automation-server-core/commit/c85ebeb)) -* **L3rd pop-up:** filter out properties starting with @ ([19977e7](https://github.com/nrkno/tv-automation-server-core/commit/19977e7)) -* **lawo:** changes tempaltes to new structure ([29bf666](https://github.com/nrkno/tv-automation-server-core/commit/29bf666)) -* **lawo:** more generic timeline object ([b0418ab](https://github.com/nrkno/tv-automation-server-core/commit/b0418ab)) -* **lookahead:** clear inGroup in a better fashion ([60541cc](https://github.com/nrkno/tv-automation-server-core/commit/60541cc)) -* **lookahead:** consider transitions properly in lookahead ([c78c6fa](https://github.com/nrkno/tv-automation-server-core/commit/c78c6fa)) -* **lookahead:** Dont run lookahead on abs0 sli if there is an active transition. ([191df09](https://github.com/nrkno/tv-automation-server-core/commit/191df09)) -* **lookahead:** Dont run lookahead on abs0 sli if there is an active transition. ([bb4123a](https://github.com/nrkno/tv-automation-server-core/commit/bb4123a)) -* **lookahead:** Fix lookahead when transition does not define clip. Fix duplicate key exception when using hold multiple times at the same point ([a1bb026](https://github.com/nrkno/tv-automation-server-core/commit/a1bb026)) -* **lookahead:** Fix lookahead when transition object starts at abs0 ([bd3edbd](https://github.com/nrkno/tv-automation-server-core/commit/bd3edbd)) -* **lookahead:** Fix lookahead when transition object starts at abs0 ([c88c830](https://github.com/nrkno/tv-automation-server-core/commit/c88c830)) -* **lookahead:** Ignore transition if this is the first sl and so no transition will be used ([3df2e1e](https://github.com/nrkno/tv-automation-server-core/commit/3df2e1e)) -* **lookahead:** Not using transition info when in a segmentline with no previous segmentline ([917b34e](https://github.com/nrkno/tv-automation-server-core/commit/917b34e)) -* **lookahead:** Resolving an object for both transition clip and main clip causing an extra loadbg ([875bd1a](https://github.com/nrkno/tv-automation-server-core/commit/875bd1a)) -* **lookahead:** Resolving an object for both transition clip and main clip causing an extra loadbg ([739b5e4](https://github.com/nrkno/tv-automation-server-core/commit/739b5e4)) -* **lookahead:** RETAIN mode now follows the WHEN_CLEAR behaviour instead of PRELOAD ([f0df41c](https://github.com/nrkno/tv-automation-server-core/commit/f0df41c)) -* **media formats:** do not 2x interlaced frame rates ([1639c32](https://github.com/nrkno/tv-automation-server-core/commit/1639c32)) -* **media manager:** label on MM workFlow ([fc2e8d5](https://github.com/nrkno/tv-automation-server-core/commit/fc2e8d5)) -* **media manager ui:** display work step labels correctly ([05cce78](https://github.com/nrkno/tv-automation-server-core/commit/05cce78)) -* **media manager ui:** fix task list layout issue ([9902dc1](https://github.com/nrkno/tv-automation-server-core/commit/9902dc1)) -* **media manager ui:** media manager flow order ([1eb1c48](https://github.com/nrkno/tv-automation-server-core/commit/1eb1c48)) -* **migration:** Missing studio0_audio_bed ([1c6edcc](https://github.com/nrkno/tv-automation-server-core/commit/1c6edcc)) -* **migration:** overrideSteps should be applied before .validate() is run, so overrideSteps works independent of the validation result. ([c9c1f25](https://github.com/nrkno/tv-automation-server-core/commit/c9c1f25)) -* **migrations:** Broken StudioContext.updateDevice method ([7311d10](https://github.com/nrkno/tv-automation-server-core/commit/7311d10)) -* **migrations:** Broken StudioContext.updateDevice method ([d882e8b](https://github.com/nrkno/tv-automation-server-core/commit/d882e8b)) -* **migrations:** Check migrate function exists before trying to run it ([cf076f5](https://github.com/nrkno/tv-automation-server-core/commit/cf076f5)) -* **migrations:** Create ShowStyleVariant with ShowStyleBase in the migrations and setup studio to use it as its default ([75073d4](https://github.com/nrkno/tv-automation-server-core/commit/75073d4)) -* **migrations:** DependOnResultFrom id was not being prefixed causing it to never work ([5830754](https://github.com/nrkno/tv-automation-server-core/commit/5830754)) -* **migrations:** DependOnResultFrom id was not being prefixed causing it to never work ([602740c](https://github.com/nrkno/tv-automation-server-core/commit/602740c)) -* **migrations:** Uncomment mos check migration ([c262fff](https://github.com/nrkno/tv-automation-server-core/commit/c262fff)) -* **migrations:** Various problems when running from empty ([11d1d0b](https://github.com/nrkno/tv-automation-server-core/commit/11d1d0b)) -* **notification center:** fix notification center toggle button in RO view ([894c1e2](https://github.com/nrkno/tv-automation-server-core/commit/894c1e2)) -* **notification center:** fix running order overview to line up with the Segments column ([0906cab](https://github.com/nrkno/tv-automation-server-core/commit/0906cab)) -* **notification center:** notification count position ([1d8d2cb](https://github.com/nrkno/tv-automation-server-core/commit/1d8d2cb)) -* **notification center:** reintroduce RunningOrderNotifier into RunningOrderView ([e70e5c9](https://github.com/nrkno/tv-automation-server-core/commit/e70e5c9)) -* **notifications:** change unknown to any ([7ac8008](https://github.com/nrkno/tv-automation-server-core/commit/7ac8008)) -* **NRK Template:** Use LLayers Enum ([84ed5df](https://github.com/nrkno/tv-automation-server-core/commit/84ed5df)) -* **pharos:** add missing settingsType and migration step ([be618d2](https://github.com/nrkno/tv-automation-server-core/commit/be618d2)) -* **pharos:** add missing settingsType and migration step ([9f73a8e](https://github.com/nrkno/tv-automation-server-core/commit/9f73a8e)) -* **playout:** bad timing during autonext ([5524e3b](https://github.com/nrkno/tv-automation-server-core/commit/5524e3b)) -* **playout:** Better account for duration and overlaps with transitions etc. ([dc249a3](https://github.com/nrkno/tv-automation-server-core/commit/dc249a3)) -* **playout:** Double head2 headline out animation ([7ec91ff](https://github.com/nrkno/tv-automation-server-core/commit/7ec91ff)) -* **playout:** Double head2 headline out animation ([165e2c0](https://github.com/nrkno/tv-automation-server-core/commit/165e2c0)) -* **playout:** Ensure that infinite segmentLineItems are reset correctly after being removed by some hotkeys ([045c9b1](https://github.com/nrkno/tv-automation-server-core/commit/045c9b1)) -* **playout:** Ensure that infinite segmentLineItems are reset correctly after being removed by some hotkeys ([e4f8a83](https://github.com/nrkno/tv-automation-server-core/commit/e4f8a83)) -* **playout:** Fix overlap tests ([15628a2](https://github.com/nrkno/tv-automation-server-core/commit/15628a2)) -* **playout:** ID prefixing did not handle logical object id references ([44f2883](https://github.com/nrkno/tv-automation-server-core/commit/44f2883)) -* **playout:** Infinite item continuations were not always updated correctly ([7a7aed6](https://github.com/nrkno/tv-automation-server-core/commit/7a7aed6)) -* **playout:** Objects being written out without an id ([b05a851](https://github.com/nrkno/tv-automation-server-core/commit/b05a851)) -* **playout:** Optimise layers of promises in infinite generation logic, and reorder function parameters ([e400c7c](https://github.com/nrkno/tv-automation-server-core/commit/e400c7c)) -* **playout:** R4 only partial merge of dc249a31b342e8bdbeb7faac064dd97cec15c3e8. Fix sl duration with autonext and no transitions ([17175c3](https://github.com/nrkno/tv-automation-server-core/commit/17175c3)) -* timelineObj _id missing ([1dcedbf](https://github.com/nrkno/tv-automation-server-core/commit/1dcedbf)) -* **playout:** Refactor setting object siId ([48de044](https://github.com/nrkno/tv-automation-server-core/commit/48de044)) -* **playout:** sl with autoNextOverlap not getting applied properly ([eb22967](https://github.com/nrkno/tv-automation-server-core/commit/eb22967)) -* RO Notifications fixes attempt no. 3 ([f0eee1f](https://github.com/nrkno/tv-automation-server-core/commit/f0eee1f)) -* RO overview crashed during rebuild of RO ([d2c62a1](https://github.com/nrkno/tv-automation-server-core/commit/d2c62a1)) -* ro-reset does not reset properly ([6367658](https://github.com/nrkno/tv-automation-server-core/commit/6367658)) -* roReset should reset holdItems and infinites ([bdf8385](https://github.com/nrkno/tv-automation-server-core/commit/bdf8385)) -* run afterUpdateTimeline after timelineTriggerTime ([98ece60](https://github.com/nrkno/tv-automation-server-core/commit/98ece60)) -* Rundown name dissappearing from view ([91dcc21](https://github.com/nrkno/tv-automation-server-core/commit/91dcc21)) -* running blueprint migrations ([fe1e7fd](https://github.com/nrkno/tv-automation-server-core/commit/fe1e7fd)) -* Running blueprints and migrations ([3b29df3](https://github.com/nrkno/tv-automation-server-core/commit/3b29df3)) -* running order closing prompt ([7074cc3](https://github.com/nrkno/tv-automation-server-core/commit/7074cc3)) -* running order closing prompt ([3024543](https://github.com/nrkno/tv-automation-server-core/commit/3024543)) -* Running Order Notifications in activeRo view ([63658b1](https://github.com/nrkno/tv-automation-server-core/commit/63658b1)) -* running order view notifications in production build ([b593323](https://github.com/nrkno/tv-automation-server-core/commit/b593323)) -* separate warnings for black frames & freeze frames ([e2acad5](https://github.com/nrkno/tv-automation-server-core/commit/e2acad5)) -* Set KAM source layer, and a probably incorrect duration (but its now non-zero) ([6e152f0](https://github.com/nrkno/tv-automation-server-core/commit/6e152f0)) -* set tsr multithreading from UI instead of CLI ([c8be25b](https://github.com/nrkno/tv-automation-server-core/commit/c8be25b)) -* setAsNext on previous ([4ffe665](https://github.com/nrkno/tv-automation-server-core/commit/4ffe665)) -* setAsNext on previous ([6ced09b](https://github.com/nrkno/tv-automation-server-core/commit/6ced09b)) -* setAsNext on previous line no longer shows default state, but now instead stalls when attempting to take ([e441aaf](https://github.com/nrkno/tv-automation-server-core/commit/e441aaf)) -* show connected devices in RO view ([e804d1e](https://github.com/nrkno/tv-automation-server-core/commit/e804d1e)) -* show media errors in segment header ([3775d2e](https://github.com/nrkno/tv-automation-server-core/commit/3775d2e)) -* show ShowStyleBase name as a part of the ShowStyleVariant name in Studios ([ba67011](https://github.com/nrkno/tv-automation-server-core/commit/ba67011)) -* since afterUpdateTimeline is called in from a syncFunctionIgnore-function, we can remove the timeout ([e7f8f25](https://github.com/nrkno/tv-automation-server-core/commit/e7f8f25)) -* sl prod init ([2ff4a46](https://github.com/nrkno/tv-automation-server-core/commit/2ff4a46)) -* smoother handling when reloading ENPS data ([83be7cb](https://github.com/nrkno/tv-automation-server-core/commit/83be7cb)) -* snapshots ([182c221](https://github.com/nrkno/tv-automation-server-core/commit/182c221)) -* SOAP message encoding ([b19ea77](https://github.com/nrkno/tv-automation-server-core/commit/b19ea77)) -* SOAP message encoding ([63d8634](https://github.com/nrkno/tv-automation-server-core/commit/63d8634)) -* Use new mediaPreviewsUrl setting ([1bd0ba4](https://github.com/nrkno/tv-automation-server-core/commit/1bd0ba4)) -* **rabbitmq:** send persistant messages ([ff8d375](https://github.com/nrkno/tv-automation-server-core/commit/ff8d375)) -* some minor react errors in the settings ([d7bb849](https://github.com/nrkno/tv-automation-server-core/commit/d7bb849)) -* some more margin touch-ups ([71a291a](https://github.com/nrkno/tv-automation-server-core/commit/71a291a)) -* some more margin touch-ups ([c8b6f1e](https://github.com/nrkno/tv-automation-server-core/commit/c8b6f1e)) -* Start on template for KAM ÅPNING ([4cd682f](https://github.com/nrkno/tv-automation-server-core/commit/4cd682f)) -* status colors ([46fdaf1](https://github.com/nrkno/tv-automation-server-core/commit/46fdaf1)) -* StudioInstallation key-value config tidying ([4b0bc1a](https://github.com/nrkno/tv-automation-server-core/commit/4b0bc1a)) -* styling fix for z-order with menu and RO buttons ([1b0717e](https://github.com/nrkno/tv-automation-server-core/commit/1b0717e)) -* subscription handling ([8aaa3ec](https://github.com/nrkno/tv-automation-server-core/commit/8aaa3ec)) -* super.componentWillUnmount is required ([2342e48](https://github.com/nrkno/tv-automation-server-core/commit/2342e48)) -* syntax errors in test file ([a8f5d1e](https://github.com/nrkno/tv-automation-server-core/commit/a8f5d1e)) -* systemStatus _internal messages ([05fd6c8](https://github.com/nrkno/tv-automation-server-core/commit/05fd6c8)) -* systemStatus _internal messages ([d150f54](https://github.com/nrkno/tv-automation-server-core/commit/d150f54)) -* systemStatus messages ([17420cc](https://github.com/nrkno/tv-automation-server-core/commit/17420cc)) -* systemStatus messages ([e595e5b](https://github.com/nrkno/tv-automation-server-core/commit/e595e5b)) -* take action should not throw as nasty errors when called by user. ([6791d50](https://github.com/nrkno/tv-automation-server-core/commit/6791d50)) -* templates with wipe. Readd seperate audio file ([5be2802](https://github.com/nrkno/tv-automation-server-core/commit/5be2802)) -* temporary fix for the "UnhandledPromiseRejectionWarning" bug, supressing the error when used ([7aa7cf8](https://github.com/nrkno/tv-automation-server-core/commit/7aa7cf8)) -* temporary fix of typing error ([73bf56d](https://github.com/nrkno/tv-automation-server-core/commit/73bf56d)) -* test-tools decklink input format dropdown has no options ([b02f447](https://github.com/nrkno/tv-automation-server-core/commit/b02f447)) -* text shadow in SegmentLineLabels ([3a310b1](https://github.com/nrkno/tv-automation-server-core/commit/3a310b1)) -* tie snapshot to evaluation ([ec18370](https://github.com/nrkno/tv-automation-server-core/commit/ec18370)) -* Timeline always being built without previous segmentline ([a077805](https://github.com/nrkno/tv-automation-server-core/commit/a077805)) -* timeline dep ([b26eecb](https://github.com/nrkno/tv-automation-server-core/commit/b26eecb)) -* timeline resolution bug for non-infinite items ([35fc40a](https://github.com/nrkno/tv-automation-server-core/commit/35fc40a)) -* timeline statobj didn't update on inactivate (empty timeline) ([839b906](https://github.com/nrkno/tv-automation-server-core/commit/839b906)) -* timeline statObject: updated hashing function ([e00a01c](https://github.com/nrkno/tv-automation-server-core/commit/e00a01c)) -* timelineObj _id missing ([0f8e0da](https://github.com/nrkno/tv-automation-server-core/commit/0f8e0da)) -* timesync: better retry strategy on startup sync ([eda632a](https://github.com/nrkno/tv-automation-server-core/commit/eda632a)) -* toc trace message ([c53124f](https://github.com/nrkno/tv-automation-server-core/commit/c53124f)) -* too long script out-words could overlap with previous items ([8f8a9a2](https://github.com/nrkno/tv-automation-server-core/commit/8f8a9a2)) -* Tooltip import ([cd2b65a](https://github.com/nrkno/tv-automation-server-core/commit/cd2b65a)) -* tooltips after import change ([a82140f](https://github.com/nrkno/tv-automation-server-core/commit/a82140f)) -* top RO overview labels clipped in wrong places ([5e5c228](https://github.com/nrkno/tv-automation-server-core/commit/5e5c228)) -* Tweaked styling of evaluation form, warning messages, color of the next lines, translations, capialized warning icon file name, and optimized png and svg icons. ([50d2753](https://github.com/nrkno/tv-automation-server-core/commit/50d2753)) -* tweaks on externalMessage send function, limiting the number of messages sent in one go ([046ae38](https://github.com/nrkno/tv-automation-server-core/commit/046ae38)) -* type bug ([de43835](https://github.com/nrkno/tv-automation-server-core/commit/de43835)) -* type error in SegmentTimelineContainer ([c4d6b4d](https://github.com/nrkno/tv-automation-server-core/commit/c4d6b4d)) -* type error, ensure string ([76da25d](https://github.com/nrkno/tv-automation-server-core/commit/76da25d)) -* typing ([7c21efe](https://github.com/nrkno/tv-automation-server-core/commit/7c21efe)) -* typing fix: cannot find name 'monaco' ([3ad88ce](https://github.com/nrkno/tv-automation-server-core/commit/3ad88ce)) -* typing fixes, to work with updated packages ([b4362f7](https://github.com/nrkno/tv-automation-server-core/commit/b4362f7)) -* typings error, ensuring string ([1e25345](https://github.com/nrkno/tv-automation-server-core/commit/1e25345)) -* typo bug in performanceMonitor ([797c393](https://github.com/nrkno/tv-automation-server-core/commit/797c393)) -* typo bug in performanceMonitor ([6a5eeb4](https://github.com/nrkno/tv-automation-server-core/commit/6a5eeb4)) -* typo MediaResolutions vs mediaResolutions ([6a72e09](https://github.com/nrkno/tv-automation-server-core/commit/6a72e09)) -* Typographic tweaks for prompter. ([068d535](https://github.com/nrkno/tv-automation-server-core/commit/068d535)) -* UI crash when outputLayer is undefined ([e6dd558](https://github.com/nrkno/tv-automation-server-core/commit/e6dd558)) -* ui manualPlayback key ([ca1a943](https://github.com/nrkno/tv-automation-server-core/commit/ca1a943)) -* ui manualPlayback key ([5d4e49f](https://github.com/nrkno/tv-automation-server-core/commit/5d4e49f)) -* UI tweaks for messages status view. so it doesn't break when having long error messages ([ca1e3ae](https://github.com/nrkno/tv-automation-server-core/commit/ca1e3ae)) -* UI: improve shapshot comment edit field ([093e6cb](https://github.com/nrkno/tv-automation-server-core/commit/093e6cb)) -* upd meteor typings ([53f17d2](https://github.com/nrkno/tv-automation-server-core/commit/53f17d2)) -* update all data in roReplaceMetadata ([8a5a671](https://github.com/nrkno/tv-automation-server-core/commit/8a5a671)) -* update asRunLog typings ([5d18c66](https://github.com/nrkno/tv-automation-server-core/commit/5d18c66)) -* update blueprints-integration ([28d17c2](https://github.com/nrkno/tv-automation-server-core/commit/28d17c2)) -* update design of presenter screen ([4f41195](https://github.com/nrkno/tv-automation-server-core/commit/4f41195)) -* Update names passed to SegmentLineItems ([ed0fc0d](https://github.com/nrkno/tv-automation-server-core/commit/ed0fc0d)) -* update Next-line when inserting story just before it, also added property to track if the next point was set manually ([d82dbc6](https://github.com/nrkno/tv-automation-server-core/commit/d82dbc6)) -* update ro data cache when getting new metadata ([d700783](https://github.com/nrkno/tv-automation-server-core/commit/d700783)) -* Update some playout timelineobj types ([fe883a8](https://github.com/nrkno/tv-automation-server-core/commit/fe883a8)) -* update supertimeline ([28bccfe](https://github.com/nrkno/tv-automation-server-core/commit/28bccfe)) -* update timeline dependency ([b83f6be](https://github.com/nrkno/tv-automation-server-core/commit/b83f6be)) -* Update timeline on removing a mos story ([fd3d443](https://github.com/nrkno/tv-automation-server-core/commit/fd3d443)) -* Update TimelineObjCCGRoute. ([203ef91](https://github.com/nrkno/tv-automation-server-core/commit/203ef91)) -* update typings to match blueprints-integration ([f97f177](https://github.com/nrkno/tv-automation-server-core/commit/f97f177)) -* updated health endpoint according to spec ([c196382](https://github.com/nrkno/tv-automation-server-core/commit/c196382)) -* updated health endpoint according to spec ([900728b](https://github.com/nrkno/tv-automation-server-core/commit/900728b)) -* updated mock data ([3e140c6](https://github.com/nrkno/tv-automation-server-core/commit/3e140c6)) -* updated mock data ([a7a4ae5](https://github.com/nrkno/tv-automation-server-core/commit/a7a4ae5)) -* updated nightly cronjob: restart casparcg devices, to work with new restartCasparCG function implementation ([3f9344d](https://github.com/nrkno/tv-automation-server-core/commit/3f9344d)) -* updated nightly cronjob: restart casparcg devices, to work with new restartCasparCG function implementation ([edbc186](https://github.com/nrkno/tv-automation-server-core/commit/edbc186)) -* updated package-lock.json ([bf0cfde](https://github.com/nrkno/tv-automation-server-core/commit/bf0cfde)) -* updated systemTime endpoint ([503d2c8](https://github.com/nrkno/tv-automation-server-core/commit/503d2c8)) -* updated timeline dep (bugfixes) ([ff29ce6](https://github.com/nrkno/tv-automation-server-core/commit/ff29ce6)) -* updated versions file ([f6c9869](https://github.com/nrkno/tv-automation-server-core/commit/f6c9869)) -* updateExpectedMediaItems failing was causing the post-process blueprint to not be run. Errors from this are still logged, but no longer block blueprint execution ([2fe22bb](https://github.com/nrkno/tv-automation-server-core/commit/2fe22bb)) -* use admin as parameter instead of all ([20751b4](https://github.com/nrkno/tv-automation-server-core/commit/20751b4)) -* use DisplayName field for graphic elements ([e2e9014](https://github.com/nrkno/tv-automation-server-core/commit/e2e9014)) -* Use more consistent inputs in Blueprints page ([d223d11](https://github.com/nrkno/tv-automation-server-core/commit/d223d11)) -* use studioInstallationId of parent peripheralDevice ([7dedf9b](https://github.com/nrkno/tv-automation-server-core/commit/7dedf9b)) -* Use thin styling for a solo 'AUTO' label ([74b5f15](https://github.com/nrkno/tv-automation-server-core/commit/74b5f15)) -* Use thin styling for a solo 'AUTO' label ([0c26d38](https://github.com/nrkno/tv-automation-server-core/commit/0c26d38)) -* use unique id for baseline items cache entries ([cf89409](https://github.com/nrkno/tv-automation-server-core/commit/cf89409)) -* userAction: increased timeout value for "waiting for..." notification ([f00e273](https://github.com/nrkno/tv-automation-server-core/commit/f00e273)) -* useractions: proper handling of the this keyword ([a2686db](https://github.com/nrkno/tv-automation-server-core/commit/a2686db)) -* useractions: proper handling of the this keyword ([49a44a7](https://github.com/nrkno/tv-automation-server-core/commit/49a44a7)) -* **playout:** Typo in ID prefixing ([249b35d](https://github.com/nrkno/tv-automation-server-core/commit/249b35d)) -* **playout:** Use original sli id when adding infinite to the timeline, to ensure that any triggers on other objects resolve ([c0382ec](https://github.com/nrkno/tv-automation-server-core/commit/c0382ec)) -* **playout:** Use original sli id when adding infinite to the timeline, to ensure that any triggers on other objects resolve ([e7eb871](https://github.com/nrkno/tv-automation-server-core/commit/e7eb871)) -* **presenter screen:** display hours correctly ([e242a9e](https://github.com/nrkno/tv-automation-server-core/commit/e242a9e)) -* **record:** CR changes ([b3adbec](https://github.com/nrkno/tv-automation-server-core/commit/b3adbec)) -* **refactor:** existing runningOrders were not migrated to the new data structure ([b20bc2d](https://github.com/nrkno/tv-automation-server-core/commit/b20bc2d)) -* **refactor:** remove stray debugger calls ([3be5c22](https://github.com/nrkno/tv-automation-server-core/commit/3be5c22)) -* **ro list:** translatify & hide 'Unsynced from MOS' label when no unsynced items ([11b0f29](https://github.com/nrkno/tv-automation-server-core/commit/11b0f29)) -* **RO view:** Always persist original event in user-action methods ([6ba7df8](https://github.com/nrkno/tv-automation-server-core/commit/6ba7df8)) -* **runtimeArgs:** Removing infinite items from changed sl and anything following ([28ffd5d](https://github.com/nrkno/tv-automation-server-core/commit/28ffd5d)) -* **snapshot:** SegmentLines were not being included in the snapshot ([224f806](https://github.com/nrkno/tv-automation-server-core/commit/224f806)) -* **snapshot:** SegmentLines were not being included in the snapshot ([d9a427e](https://github.com/nrkno/tv-automation-server-core/commit/d9a427e)) -* **sticky:** Fix sticky items with objects using relative triggers or durations ([0c47cff](https://github.com/nrkno/tv-automation-server-core/commit/0c47cff)) -* **template:** Caspar portion of in-transition for segmentline rerun whenever timeline was recalculated ([3373457](https://github.com/nrkno/tv-automation-server-core/commit/3373457)) -* userActivity executionTime logging ([a3e763e](https://github.com/nrkno/tv-automation-server-core/commit/a3e763e)) -* various fixes after refactoring ([1a17414](https://github.com/nrkno/tv-automation-server-core/commit/1a17414)) -* when activating, set Next if not set ([c9f71a1](https://github.com/nrkno/tv-automation-server-core/commit/c9f71a1)) -* when overriding componentWillUnmount, we need to call this._cleanup() ([0f39cd4](https://github.com/nrkno/tv-automation-server-core/commit/0f39cd4)) -* **zoom:** moved zoom modifier for scroll action to ctrl ([863d81e](https://github.com/nrkno/tv-automation-server-core/commit/863d81e)) -* wrap ntpClient.getNetworkTime() in try/catch, as an attempt to fix fatal error thrown ([cd44862](https://github.com/nrkno/tv-automation-server-core/commit/cd44862)) -* **zoom:** moved zoom modifier for scroll action to ctrl ([80829f2](https://github.com/nrkno/tv-automation-server-core/commit/80829f2)) -* Wrong icon for split in presenter view ([1ec1c56](https://github.com/nrkno/tv-automation-server-core/commit/1ec1c56)) -* Wrong icon for split in presenter view ([08c8df8](https://github.com/nrkno/tv-automation-server-core/commit/08c8df8)) -* **template:** graphic supers group using wrong trigger. ([e28d1ef](https://github.com/nrkno/tv-automation-server-core/commit/e28d1ef)) -* **template:** Reduce volume of head wipes ([b2092cc](https://github.com/nrkno/tv-automation-server-core/commit/b2092cc)) -* **template:** setup dsk properly ([2e8309c](https://github.com/nrkno/tv-automation-server-core/commit/2e8309c)) -* **templates:** Fix incorrect camera number used with head transition. Hook in sluttvignett. Fix segments not respecting overlapduration if no transition is used ([00b7cdd](https://github.com/nrkno/tv-automation-server-core/commit/00b7cdd)) -* **templates:** use enum for nora channels ([55c0cfc](https://github.com/nrkno/tv-automation-server-core/commit/55c0cfc)) -* **templates:** Various tweaks ([eb93c6a](https://github.com/nrkno/tv-automation-server-core/commit/eb93c6a)) -* **Test:** Verifying build and deploy script ([0b13e18](https://github.com/nrkno/tv-automation-server-core/commit/0b13e18)) -* **timeline:** don't round items in relative mode ([2938819](https://github.com/nrkno/tv-automation-server-core/commit/2938819)) -* **timeline:** Infinite sli do not update properly on new mos data. Fix detection of the end of the chain, and ensure the last is set to not infinite ([61b2930](https://github.com/nrkno/tv-automation-server-core/commit/61b2930)) -* **timeline:** Infinite sli do not update properly on new mos data. Fix detection of the end of the chain, and ensure the last is set to not infinite ([16d9715](https://github.com/nrkno/tv-automation-server-core/commit/16d9715)) -* **Timeline:** Corrects the angle of the gradient indication mix-in-transition on a segmentLineItem ([151ecf9](https://github.com/nrkno/tv-automation-server-core/commit/151ecf9)) -* **transition:** Delay sli not contents, to ensure relative triggers against the sli are correct (fixes sluttvignett with transition) ([856da4b](https://github.com/nrkno/tv-automation-server-core/commit/856da4b)) -* **transition:** reverses direction of wipe transitions ([9961a3f](https://github.com/nrkno/tv-automation-server-core/commit/9961a3f)) -* **transition:** Using wrong overlap when combined with autonext ([4c56102](https://github.com/nrkno/tv-automation-server-core/commit/4c56102)) -* **transitions:** Ensure they are run with the correct overlap on autonext ([bbc6ca2](https://github.com/nrkno/tv-automation-server-core/commit/bbc6ca2)) -* **transitions:** Timed graphics being run wrong ([8b39960](https://github.com/nrkno/tv-automation-server-core/commit/8b39960)) -* **UI:** Improves device settings and status page by removing information ([267c10c](https://github.com/nrkno/tv-automation-server-core/commit/267c10c)) -* **unsync:** refactor, add method to unsync runningOrder ([d54c147](https://github.com/nrkno/tv-automation-server-core/commit/d54c147)) -* **vignett:** do not preload vignett, as it is risky business preloading sluttvignett. Could be done better by separating vignett and sluttvignett ([b0da067](https://github.com/nrkno/tv-automation-server-core/commit/b0da067)) -* **vignett:** do not preload vignett, as it is risky business preloading sluttvignett. Could be done better by separating vignett and sluttvignett ([8bf7ff8](https://github.com/nrkno/tv-automation-server-core/commit/8bf7ff8)) - +- &nbps; in a string instead of A0 ([299ba28](https://github.com/nrkno/tv-automation-server-core/commit/299ba28)) +- accepted resolutions should not be separated by space. ([1b80a2c](https://github.com/nrkno/tv-automation-server-core/commit/1b80a2c)) +- activate past ROs ([c20af5d](https://github.com/nrkno/tv-automation-server-core/commit/c20af5d)) +- activate past ROs ([4b128a5](https://github.com/nrkno/tv-automation-server-core/commit/4b128a5)) +- add (preliminary) security rules for all collections ([6fd60e2](https://github.com/nrkno/tv-automation-server-core/commit/6fd60e2)) +- Add default exclusivity groups to InitDB ([dfd1782](https://github.com/nrkno/tv-automation-server-core/commit/dfd1782)) +- add dependency: timeline-state-resolver-types ([cd2db55](https://github.com/nrkno/tv-automation-server-core/commit/cd2db55)) +- add missing translation json-file ([6059965](https://github.com/nrkno/tv-automation-server-core/commit/6059965)) +- add missing \_id ([970fbf8](https://github.com/nrkno/tv-automation-server-core/commit/970fbf8)) +- add missing \_id ([c948d09](https://github.com/nrkno/tv-automation-server-core/commit/c948d09)) +- Add missing \_rank field to SegmentLineAdLibItem ([9cd15fa](https://github.com/nrkno/tv-automation-server-core/commit/9cd15fa)) +- add missing asRunEvent in AsRunEventContext ([b8def27](https://github.com/nrkno/tv-automation-server-core/commit/b8def27)) +- add missing core version ([8ad3a9e](https://github.com/nrkno/tv-automation-server-core/commit/8ad3a9e)) +- add missing function ([de2b81f](https://github.com/nrkno/tv-automation-server-core/commit/de2b81f)) +- Add missing layers to initdb. Use readtime as possible duration of segmentline when calculating story length ([e388d63](https://github.com/nrkno/tv-automation-server-core/commit/e388d63)) +- add nn translation to whitelist ([4663e3b](https://github.com/nrkno/tv-automation-server-core/commit/4663e3b)) +- add parseDateTime code hints to template editor ([c38b2f7](https://github.com/nrkno/tv-automation-server-core/commit/c38b2f7)) +- added \_valid: true to mock-data ([6c2775b](https://github.com/nrkno/tv-automation-server-core/commit/6c2775b)) +- added a place to run updateExpectedMediaItems ([c70704d](https://github.com/nrkno/tv-automation-server-core/commit/c70704d)) +- added missing "force" parameter ([7b50a97](https://github.com/nrkno/tv-automation-server-core/commit/7b50a97)) +- added missing debug-logging setting ([8f616ca](https://github.com/nrkno/tv-automation-server-core/commit/8f616ca)) +- added missing getRank import ([9d37eb8](https://github.com/nrkno/tv-automation-server-core/commit/9d37eb8)) +- added MomentFromNow, to use instead of ([aefea31](https://github.com/nrkno/tv-automation-server-core/commit/aefea31)) +- added peripheralDevices subscription, used by status display ([ccb309d](https://github.com/nrkno/tv-automation-server-core/commit/ccb309d)) +- added sorting of runtimeFunctions when generating backup, so diffing works ([b3ba3f6](https://github.com/nrkno/tv-automation-server-core/commit/b3ba3f6)) +- added sorting of runtimeFunctions when generating backup, so diffing works ([17639a0](https://github.com/nrkno/tv-automation-server-core/commit/17639a0)) +- added virtual lines to the generated function, so that line numbers add up in error messages ([df2366a](https://github.com/nrkno/tv-automation-server-core/commit/df2366a)) +- adlib items conflict with programmed content ([a304238](https://github.com/nrkno/tv-automation-server-core/commit/a304238)) +- after broadcast form failed to saveEvaluation ([f55546b](https://github.com/nrkno/tv-automation-server-core/commit/f55546b)) +- allow duration 0 of segmentLines ([11a18ae](https://github.com/nrkno/tv-automation-server-core/commit/11a18ae)) +- allow esc & enter in modalDialog ([cd511b6](https://github.com/nrkno/tv-automation-server-core/commit/cd511b6)) +- allow re-sync of unsynced RO while it is active ([b824d72](https://github.com/nrkno/tv-automation-server-core/commit/b824d72)) +- allow removing peripheralDevices from Settings page ([948675f](https://github.com/nrkno/tv-automation-server-core/commit/948675f)) +- allow removing peripheralDevices from Settings page ([b14e56a](https://github.com/nrkno/tv-automation-server-core/commit/b14e56a)) +- allow timelineobjs to be declared as abstract, and always route those with the core_abstract layer ([9bfa6c4](https://github.com/nrkno/tv-automation-server-core/commit/9bfa6c4)) +- also defer sendStoryStatus, as that's not critical for playback ([9417862](https://github.com/nrkno/tv-automation-server-core/commit/9417862)) +- always rewind GUI on roReset, roResetAndActivate ([4502d90](https://github.com/nrkno/tv-automation-server-core/commit/4502d90)) +- always rewind GUI on roReset, roResetAndActivate ([11744c9](https://github.com/nrkno/tv-automation-server-core/commit/11744c9)) +- anomaly timings as numbers ([d0c0d36](https://github.com/nrkno/tv-automation-server-core/commit/d0c0d36)) +- another bugfix ([c7ed208](https://github.com/nrkno/tv-automation-server-core/commit/c7ed208)) +- apning with no heads ([dfb1976](https://github.com/nrkno/tv-automation-server-core/commit/dfb1976)) +- apparently componentwillmount is running in a reactive context and causes issues ([a8e53b6](https://github.com/nrkno/tv-automation-server-core/commit/a8e53b6)) +- asRunLog: defer handleEvent, to make sure all events have been reported before running. ([6c56ec7](https://github.com/nrkno/tv-automation-server-core/commit/6c56ec7)) +- atem mappings ([8d4ea2d](https://github.com/nrkno/tv-automation-server-core/commit/8d4ea2d)) +- autoNext should update yellow line (it didn't) ([ff42a81](https://github.com/nrkno/tv-automation-server-core/commit/ff42a81)) +- baselineTemplates not being calculated correctly for showstyle ([e4799b4](https://github.com/nrkno/tv-automation-server-core/commit/e4799b4)) +- Basic rundown playback ([3b88d2a](https://github.com/nrkno/tv-automation-server-core/commit/3b88d2a)) +- be able to reset & activate inactivated RO ([18e01f4](https://github.com/nrkno/tv-automation-server-core/commit/18e01f4)) +- be able to reset & activate inactivated RO ([e7d52da](https://github.com/nrkno/tv-automation-server-core/commit/e7d52da)) +- better debug message ([17e1b4e](https://github.com/nrkno/tv-automation-server-core/commit/17e1b4e)) +- better handling of template-errors ([9f98100](https://github.com/nrkno/tv-automation-server-core/commit/9f98100)) +- better implementation of push update to local objects ([d692c96](https://github.com/nrkno/tv-automation-server-core/commit/d692c96)) +- BIG optimization in roTake and affected functions, made database fetches async & parallel where possible. This should not affect the functionality, though testing is needed. ([aa6f4bd](https://github.com/nrkno/tv-automation-server-core/commit/aa6f4bd)) +- bind keydown for any keyup events to prevent their default behaviour ([83e42e4](https://github.com/nrkno/tv-automation-server-core/commit/83e42e4)) +- blueprint config from manifest is reenabled and used for show style base and variant ([59b2f2f](https://github.com/nrkno/tv-automation-server-core/commit/59b2f2f)) +- blueprint settings page ([5697afe](https://github.com/nrkno/tv-automation-server-core/commit/5697afe)) +- break long script better in hoverscrub ([5697493](https://github.com/nrkno/tv-automation-server-core/commit/5697493)) +- break long script better in hoverscrub ([2d2f26d](https://github.com/nrkno/tv-automation-server-core/commit/2d2f26d)) +- broken GUI SegmentLineItems resolution, when simulating timeline output ([60fb843](https://github.com/nrkno/tv-automation-server-core/commit/60fb843)) +- broken settings page ([1e99ff7](https://github.com/nrkno/tv-automation-server-core/commit/1e99ff7)) +- bug in popup: nora payload can be deep objects, causing ui crash ([30bfca9](https://github.com/nrkno/tv-automation-server-core/commit/30bfca9)) +- bug in storePath migration step ([b623973](https://github.com/nrkno/tv-automation-server-core/commit/b623973)) +- bug that caused unhandledPromiseRejection. Also added logging of result of user action ([e799277](https://github.com/nrkno/tv-automation-server-core/commit/e799277)) +- bug when moving story to last ([83cef62](https://github.com/nrkno/tv-automation-server-core/commit/83cef62)) +- bug when moving story to last ([2b86f1a](https://github.com/nrkno/tv-automation-server-core/commit/2b86f1a)) +- bugfix ([943ff72](https://github.com/nrkno/tv-automation-server-core/commit/943ff72)) +- bugfix, some keys didn't work in text inputs ([36e99cb](https://github.com/nrkno/tv-automation-server-core/commit/36e99cb)) +- bugfix: didn't correctly find the right segmentLineItem in next segmentLine ([0f9313f](https://github.com/nrkno/tv-automation-server-core/commit/0f9313f)) +- bugfix: executeFunction didn't really time out ([acba08c](https://github.com/nrkno/tv-automation-server-core/commit/acba08c)) +- bugfix: timeline wasn't updated when going rehersal => roResetAndActivate ([ca76732](https://github.com/nrkno/tv-automation-server-core/commit/ca76732)) +- bugfix: undefined storePath ([cbfdde5](https://github.com/nrkno/tv-automation-server-core/commit/cbfdde5)) +- bugfix: update local object when updating database ([9d3b05b](https://github.com/nrkno/tv-automation-server-core/commit/9d3b05b)) +- bugfix: updateExpectedMediaItems used all segmentLineItems in RO, not just in segmmentLine ([406829b](https://github.com/nrkno/tv-automation-server-core/commit/406829b)) +- bugfix: When updating collection, documents with removed properties didn't get their properties removed. ([237b8ff](https://github.com/nrkno/tv-automation-server-core/commit/237b8ff)) +- bugfix: When updating collection, documents with removed properties didn't get their properties removed. ([93dd81e](https://github.com/nrkno/tv-automation-server-core/commit/93dd81e)) +- build errors ([81382f7](https://github.com/nrkno/tv-automation-server-core/commit/81382f7)) +- build errors ([34889b9](https://github.com/nrkno/tv-automation-server-core/commit/34889b9)) +- bumps expected version ([bd06edc](https://github.com/nrkno/tv-automation-server-core/commit/bd06edc)) +- change lawo enum & interface ([3959761](https://github.com/nrkno/tv-automation-server-core/commit/3959761)) +- changed backup sorting to use templateId instead of \_id ([d7047a5](https://github.com/nrkno/tv-automation-server-core/commit/d7047a5)) +- changed default chortcuts ([ba33bb7](https://github.com/nrkno/tv-automation-server-core/commit/ba33bb7)) +- changed header colors ([b9efc61](https://github.com/nrkno/tv-automation-server-core/commit/b9efc61)) +- changed how i18n is initialized & exported ([cc674aa](https://github.com/nrkno/tv-automation-server-core/commit/cc674aa)) +- changes attr. paths in lawo source objs ([55f8c7b](https://github.com/nrkno/tv-automation-server-core/commit/55f8c7b)) +- changes lawo mapping with the effects change ([dbe58fe](https://github.com/nrkno/tv-automation-server-core/commit/dbe58fe)) +- check content.path before creating an ExpectedMediaItem ([0914e98](https://github.com/nrkno/tv-automation-server-core/commit/0914e98)) +- clean up imports in ROV ([58067a6](https://github.com/nrkno/tv-automation-server-core/commit/58067a6)) +- clean up more collections when removing RO ([b84ed59](https://github.com/nrkno/tv-automation-server-core/commit/b84ed59)) +- clean up onBeforeUnload handler ([51adbba](https://github.com/nrkno/tv-automation-server-core/commit/51adbba)) +- clear queued adlibs when resetting running order ([83ed11a](https://github.com/nrkno/tv-automation-server-core/commit/83ed11a)) +- clear runtimeArguments on resetRunningOrder ([350dd45](https://github.com/nrkno/tv-automation-server-core/commit/350dd45)) +- collection name ([e014558](https://github.com/nrkno/tv-automation-server-core/commit/e014558)) +- ConfigRef fix ([f557052](https://github.com/nrkno/tv-automation-server-core/commit/f557052)) +- Correct some TimelineObj typings ([eb36ef9](https://github.com/nrkno/tv-automation-server-core/commit/eb36ef9)) +- corrects the default baseline template ([bf4eb03](https://github.com/nrkno/tv-automation-server-core/commit/bf4eb03)) +- Ctrl-S in template editor triggers a save ([bacbc3e](https://github.com/nrkno/tv-automation-server-core/commit/bacbc3e)) +- defer triggerExternalMessage so as not to block timelineUpdate's ([ba7383f](https://github.com/nrkno/tv-automation-server-core/commit/ba7383f)) +- detect and discard double as-run events ([98f65a2](https://github.com/nrkno/tv-automation-server-core/commit/98f65a2)) +- dev Collections bug, due to collections being filled in later ([43e8856](https://github.com/nrkno/tv-automation-server-core/commit/43e8856)) +- dev debug data function ([e4570e2](https://github.com/nrkno/tv-automation-server-core/commit/e4570e2)) +- device is first created as Abstract ([98dca79](https://github.com/nrkno/tv-automation-server-core/commit/98dca79)) +- device status notifications ([7ab4a4c](https://github.com/nrkno/tv-automation-server-core/commit/7ab4a4c)) +- disable client-side RO updates ([72ba831](https://github.com/nrkno/tv-automation-server-core/commit/72ba831)) +- disable fullscreen overlay in developer mode ([7cc2e43](https://github.com/nrkno/tv-automation-server-core/commit/7cc2e43)) +- disable runtimeFunction caching during code-test & save ([e21f8dd](https://github.com/nrkno/tv-automation-server-core/commit/e21f8dd)) +- disable runtimeFunction caching during code-test & save ([74d6d34](https://github.com/nrkno/tv-automation-server-core/commit/74d6d34)) +- Do not allow queue ad lib during hold mode ([c378fc8](https://github.com/nrkno/tv-automation-server-core/commit/c378fc8)) +- do not allow toggling sl arguments during hold mode ([3311f0a](https://github.com/nrkno/tv-automation-server-core/commit/3311f0a)) +- do not display notification count if = 0 ([1fe9a39](https://github.com/nrkno/tv-automation-server-core/commit/1fe9a39)) +- do not error CountdownItemLabel when sourceLayer is not found ([9451d1c](https://github.com/nrkno/tv-automation-server-core/commit/9451d1c)) +- do not show empty string values in L3rd popup ([b0c6c8e](https://github.com/nrkno/tv-automation-server-core/commit/b0c6c8e)) +- don't send devicesMakeReady until verified no other runningOrders are active ([953a1a7](https://github.com/nrkno/tv-automation-server-core/commit/953a1a7)) +- don't update device name if already got one ([833196a](https://github.com/nrkno/tv-automation-server-core/commit/833196a)) +- don't wait for subscriptions before rendering ([2bbfa20](https://github.com/nrkno/tv-automation-server-core/commit/2bbfa20)) +- Dont generate ui outputlayers for sli which are virtual ([c0ad368](https://github.com/nrkno/tv-automation-server-core/commit/c0ad368)) +- dont set nora\_\* config values in initDB ([1330008](https://github.com/nrkno/tv-automation-server-core/commit/1330008)) +- Dont show unset optional config in the config list ([5689865](https://github.com/nrkno/tv-automation-server-core/commit/5689865)) +- duration settling ([0648f57](https://github.com/nrkno/tv-automation-server-core/commit/0648f57)) +- Editattribute type typing ([1206d0c](https://github.com/nrkno/tv-automation-server-core/commit/1206d0c)) +- Editattribute type typing ([392f4aa](https://github.com/nrkno/tv-automation-server-core/commit/392f4aa)) +- EditAttribute: dropdown options was always strings ([814cdf7](https://github.com/nrkno/tv-automation-server-core/commit/814cdf7)) +- End of Show marker line doesn't end where it should ([e188c97](https://github.com/nrkno/tv-automation-server-core/commit/e188c97)) +- enforce workflow data structure ([d01245f](https://github.com/nrkno/tv-automation-server-core/commit/d01245f)) +- Ensure lookahead ids are always unique ([26f6637](https://github.com/nrkno/tv-automation-server-core/commit/26f6637)) +- ensure that the connection notification is always on top ([662cd7a](https://github.com/nrkno/tv-automation-server-core/commit/662cd7a)) +- ensure the same overlap is used for autonext and the previous sl ([efb39e6](https://github.com/nrkno/tv-automation-server-core/commit/efb39e6)) +- Ensure the sl overlapDuration is respected on autonext. ([8c3bf3e](https://github.com/nrkno/tv-automation-server-core/commit/8c3bf3e)) +- Ensure typeVariant on SegmentLine is preserved when a roList is received ([98b224c](https://github.com/nrkno/tv-automation-server-core/commit/98b224c)) +- error when content.boxSourceConfiguration is undefined ([81c896b](https://github.com/nrkno/tv-automation-server-core/commit/81c896b)) +- error when content.boxSourceConfiguration is undefined ([fc7ec40](https://github.com/nrkno/tv-automation-server-core/commit/fc7ec40)) +- expectedMediaItems: make ids uniquer ([e16594a](https://github.com/nrkno/tv-automation-server-core/commit/e16594a)) +- externalMessage: priority of messages to send ([cffcd97](https://github.com/nrkno/tv-automation-server-core/commit/cffcd97)) +- externalMessageQueue id ([5c8c39d](https://github.com/nrkno/tv-automation-server-core/commit/5c8c39d)) +- externalMessages upd ([a803882](https://github.com/nrkno/tv-automation-server-core/commit/a803882)) +- failing on startup if dp property missing ([041fc3e](https://github.com/nrkno/tv-automation-server-core/commit/041fc3e)) +- filter on json files on restore backup file selector ([1a0b867](https://github.com/nrkno/tv-automation-server-core/commit/1a0b867)) +- Fix context.runHelper not working in templates. ([36ca5f3](https://github.com/nrkno/tv-automation-server-core/commit/36ca5f3)) +- Fix device status notifications ([b9f274e](https://github.com/nrkno/tv-automation-server-core/commit/b9f274e)) +- fix for strange (temporary?) error about method missing ([0db30ae](https://github.com/nrkno/tv-automation-server-core/commit/0db30ae)) +- fix more typings and add some null checks in unusual places ([d0c53c3](https://github.com/nrkno/tv-automation-server-core/commit/d0c53c3)) +- fix notifications toggle button cursor ([b0d8dcb](https://github.com/nrkno/tv-automation-server-core/commit/b0d8dcb)) +- fix notifications toggle button cursor ([402486b](https://github.com/nrkno/tv-automation-server-core/commit/402486b)) +- fix PTZ Testing harness ([97bccc7](https://github.com/nrkno/tv-automation-server-core/commit/97bccc7)) +- fix Segment Line notifications ([3753250](https://github.com/nrkno/tv-automation-server-core/commit/3753250)) +- fix typings to match with the stronger typings ([ae1bd4f](https://github.com/nrkno/tv-automation-server-core/commit/ae1bd4f)) +- fix zoom area height ([24d2e38](https://github.com/nrkno/tv-automation-server-core/commit/24d2e38)) +- force lookahead inGroup field to be emptied. Fixes mismatched statobj ([c76209c](https://github.com/nrkno/tv-automation-server-core/commit/c76209c)) +- freeze/black in begin/end of mediafile gets special warning ([ea950e2](https://github.com/nrkno/tv-automation-server-core/commit/ea950e2)) +- generate statObject per device ([82a0736](https://github.com/nrkno/tv-automation-server-core/commit/82a0736)) +- getSnapshot: don't ask devices of type OTHER ([ea874d4](https://github.com/nrkno/tv-automation-server-core/commit/ea874d4)) +- getting monaco to work runtime while still having typings ([5db8218](https://github.com/nrkno/tv-automation-server-core/commit/5db8218)) +- global ad-lib order was wrong, basline blueprint did not set \_rank ([ffbacc8](https://github.com/nrkno/tv-automation-server-core/commit/ffbacc8)) +- Guard against there being no next segmentline ([849d97f](https://github.com/nrkno/tv-automation-server-core/commit/849d97f)) +- GUI externalMessages json formatting ([0b7cd2c](https://github.com/nrkno/tv-automation-server-core/commit/0b7cd2c)) +- GUI: new try on rewinding the viewport on RO reset ([b0edaf4](https://github.com/nrkno/tv-automation-server-core/commit/b0edaf4)) +- GUI: round number of frames ([c90021f](https://github.com/nrkno/tv-automation-server-core/commit/c90021f)) +- GUI: settings: only show parent-devices in left menu (only they have settings on them) ([ecb164e](https://github.com/nrkno/tv-automation-server-core/commit/ecb164e)) +- GUI: unexpected behaviour in blueprint configuration ([f5bed4e](https://github.com/nrkno/tv-automation-server-core/commit/f5bed4e)) +- handle both update & insert of runningOrder ([3701bb3](https://github.com/nrkno/tv-automation-server-core/commit/3701bb3)) +- handle both update & insert of runningOrder ([84a6c53](https://github.com/nrkno/tv-automation-server-core/commit/84a6c53)) +- handle promises correctly.. ([b952e1d](https://github.com/nrkno/tv-automation-server-core/commit/b952e1d)) +- handle promises correctly.. ([2e57296](https://github.com/nrkno/tv-automation-server-core/commit/2e57296)) +- handle when nexting before start or after end ([506bb8a](https://github.com/nrkno/tv-automation-server-core/commit/506bb8a)) +- has played styling shouldn't be applied to Guest and Remote segments ([18bdc82](https://github.com/nrkno/tv-automation-server-core/commit/18bdc82)) +- head mute audio and hold on last frame ([ceec7f6](https://github.com/nrkno/tv-automation-server-core/commit/ceec7f6)) +- header context menu z-order fix ([c68244b](https://github.com/nrkno/tv-automation-server-core/commit/c68244b)) +- Hide child devices from being added to the studio ([852ec9b](https://github.com/nrkno/tv-automation-server-core/commit/852ec9b)) +- Hide Keyboard focus marker when not in studio mode ([70dc6b0](https://github.com/nrkno/tv-automation-server-core/commit/70dc6b0)) +- HOLD add new llayer to initDB ([650b6e6](https://github.com/nrkno/tv-automation-server-core/commit/650b6e6)) +- hold-copy of the SLI should provide seek information to offset markers on the SLI ([3967d03](https://github.com/nrkno/tv-automation-server-core/commit/3967d03)) +- holdState = 0 displayed a status ([49c7ead](https://github.com/nrkno/tv-automation-server-core/commit/49c7ead)) +- holdState = 0 displayed a status ([aacd140](https://github.com/nrkno/tv-automation-server-core/commit/aacd140)) +- hot fix for rehearsal activation when an RO is already active ([648c02d](https://github.com/nrkno/tv-automation-server-core/commit/648c02d)) +- houskeeping: remove uneccessary logs ([0c054f9](https://github.com/nrkno/tv-automation-server-core/commit/0c054f9)) +- if the next:ed segment is removed, instead next the one in its place ([22597b3](https://github.com/nrkno/tv-automation-server-core/commit/22597b3)) +- Importing of some mock running orders ([eadf225](https://github.com/nrkno/tv-automation-server-core/commit/eadf225)) +- improve evaluation form visuals ([30af081](https://github.com/nrkno/tv-automation-server-core/commit/30af081)) +- Improve group label visuals ([39b43e1](https://github.com/nrkno/tv-automation-server-core/commit/39b43e1)) +- Improve missing mosId error message ([89695fb](https://github.com/nrkno/tv-automation-server-core/commit/89695fb)) +- improve notification center button ([0b4d082](https://github.com/nrkno/tv-automation-server-core/commit/0b4d082)) +- improve notifications highlighting animation ([abda2c3](https://github.com/nrkno/tv-automation-server-core/commit/abda2c3)) +- improve notifications highlighting animation ([afeb568](https://github.com/nrkno/tv-automation-server-core/commit/afeb568)) +- improve some error logging ([60af59b](https://github.com/nrkno/tv-automation-server-core/commit/60af59b)) +- improved queries & added index ([159f6d5](https://github.com/nrkno/tv-automation-server-core/commit/159f6d5)) +- incorrect typings for template editor ([9d021df](https://github.com/nrkno/tv-automation-server-core/commit/9d021df)) +- Increase size of template editor to make it better fill the screen ([3212d7b](https://github.com/nrkno/tv-automation-server-core/commit/3212d7b)) +- increase upload limit for backup files ([5effaa9](https://github.com/nrkno/tv-automation-server-core/commit/5effaa9)) +- increase upload limit for backup files ([e658f12](https://github.com/nrkno/tv-automation-server-core/commit/e658f12)) +- Infinite items dont stop against a absolute 0 item properly. ([78c1499](https://github.com/nrkno/tv-automation-server-core/commit/78c1499)) +- infinite segment line tidying and fixes ([8469ffb](https://github.com/nrkno/tv-automation-server-core/commit/8469ffb)) +- Infinite segmentline bad guard when calculating the current infinites that caused the process to stop early ([2f9abeb](https://github.com/nrkno/tv-automation-server-core/commit/2f9abeb)) +- infinite segmentlines crossing an autonext throwing a duplicate key exception ([93b2a30](https://github.com/nrkno/tv-automation-server-core/commit/93b2a30)) +- init state properly ([2572cdc](https://github.com/nrkno/tv-automation-server-core/commit/2572cdc)) +- initDB for pharos lights ([57fbc73](https://github.com/nrkno/tv-automation-server-core/commit/57fbc73)) +- initial optimization of updateSourceLayerInfinitesAfterLine ([5cd8235](https://github.com/nrkno/tv-automation-server-core/commit/5cd8235)) +- initial optimization of updateSourceLayerInfinitesAfterLine ([871bdd2](https://github.com/nrkno/tv-automation-server-core/commit/871bdd2)) +- initiateDB update for PTZ ([e529782](https://github.com/nrkno/tv-automation-server-core/commit/e529782)) +- issue with rehearsal double-activation warning ([17b4e95](https://github.com/nrkno/tv-automation-server-core/commit/17b4e95)) +- issue with roPrepareForBroadcast ([c3ad30c](https://github.com/nrkno/tv-automation-server-core/commit/c3ad30c)) +- issue with source layers marked as used even though they were used in the following segmentLine ([71acfb3](https://github.com/nrkno/tv-automation-server-core/commit/71acfb3)) +- JSX props typings fix in Header ([7596557](https://github.com/nrkno/tv-automation-server-core/commit/7596557)) +- keep device header in Mos parent properties settings ([4ff9b91](https://github.com/nrkno/tv-automation-server-core/commit/4ff9b91)) +- keep device header in Mos parent properties settings ([2f2529d](https://github.com/nrkno/tv-automation-server-core/commit/2f2529d)) +- Keep the devices header visible when editing device ([cb2d7d9](https://github.com/nrkno/tv-automation-server-core/commit/cb2d7d9)) +- Keep the devices header visible when editing device ([90dbe05](https://github.com/nrkno/tv-automation-server-core/commit/90dbe05)) +- keys should be handled at up, not down ([957f583](https://github.com/nrkno/tv-automation-server-core/commit/957f583)) +- labels in modal dialogs ([3af18fc](https://github.com/nrkno/tv-automation-server-core/commit/3af18fc)) +- limit db fetches to active running order ([f3aca8f](https://github.com/nrkno/tv-automation-server-core/commit/f3aca8f)) +- lock down package.json & update package-lock, to get release2 to build ([472f8ab](https://github.com/nrkno/tv-automation-server-core/commit/472f8ab)) +- locked [@babel](https://github.com/babel)/runtime version & updated package-lock ([8e62d2f](https://github.com/nrkno/tv-automation-server-core/commit/8e62d2f)) +- logics bugfix after optimization ([fe85cd3](https://github.com/nrkno/tv-automation-server-core/commit/fe85cd3)) +- logics bugfix after optimization ([2b8fa3c](https://github.com/nrkno/tv-automation-server-core/commit/2b8fa3c)) +- lookahead object id not being set correctly ([594a1e7](https://github.com/nrkno/tv-automation-server-core/commit/594a1e7)) +- made editor height dynamic ([7f5f40e](https://github.com/nrkno/tv-automation-server-core/commit/7f5f40e)) +- made editor height dynamic ([c68ac4f](https://github.com/nrkno/tv-automation-server-core/commit/c68ac4f)) +- Major refactoring, splitting code into separate files depending on their areas: "rundown": General rundown manipulation, "media-scanner": Media-scanner, "mos": mos-specific functions ([db82375](https://github.com/nrkno/tv-automation-server-core/commit/db82375)) +- make 'Lights' source layer type translatable in the Settings ([65d5b76](https://github.com/nrkno/tv-automation-server-core/commit/65d5b76)) +- make sure that the adlib shelf isn't obstructed by the right-hand bar ([8783819](https://github.com/nrkno/tv-automation-server-core/commit/8783819)) +- make the context menu available in the entire header ([0590f9d](https://github.com/nrkno/tv-automation-server-core/commit/0590f9d)) +- make the FullScreen detection more lenient ([215d73c](https://github.com/nrkno/tv-automation-server-core/commit/215d73c)) +- make the FullScreen detection more lenient ([28b689a](https://github.com/nrkno/tv-automation-server-core/commit/28b689a)) +- Make the head to kam wipe not use the mosartVariant field. Correct the head order checking ([6030755](https://github.com/nrkno/tv-automation-server-core/commit/6030755)) +- media-manager: rename keyStep => criticalStep ([77f4d6a](https://github.com/nrkno/tv-automation-server-core/commit/77f4d6a)) +- mediainfo typings & timebase ([67f16be](https://github.com/nrkno/tv-automation-server-core/commit/67f16be)) +- mediaobjects to use computed field ([dba858f](https://github.com/nrkno/tv-automation-server-core/commit/dba858f)) +- mediaobjects to use computed field ([39d13b5](https://github.com/nrkno/tv-automation-server-core/commit/39d13b5)) +- Migration for stk&full audio remapping ([2491f52](https://github.com/nrkno/tv-automation-server-core/commit/2491f52)) +- migration helpers ([40228e8](https://github.com/nrkno/tv-automation-server-core/commit/40228e8)) +- Migration UI fixes ([b141243](https://github.com/nrkno/tv-automation-server-core/commit/b141243)) +- Migrations internal server error ([45d0238](https://github.com/nrkno/tv-automation-server-core/commit/45d0238)) +- minor ui fix on status page ([97fc3c2](https://github.com/nrkno/tv-automation-server-core/commit/97fc3c2)) +- miss in merge ([93106b1](https://github.com/nrkno/tv-automation-server-core/commit/93106b1)) +- missing argument for mediaStatusCheck ([658e82a](https://github.com/nrkno/tv-automation-server-core/commit/658e82a)) +- Missing typings on ShowStyle ([a0a4e14](https://github.com/nrkno/tv-automation-server-core/commit/a0a4e14)) +- Mix transitions ([5cf2314](https://github.com/nrkno/tv-automation-server-core/commit/5cf2314)) +- Mix transitions ([0ebf3e1](https://github.com/nrkno/tv-automation-server-core/commit/0ebf3e1)) +- modified timestamp on imported blueprints was not being set, causing the cache to not be cleared properly ([2f3fd17](https://github.com/nrkno/tv-automation-server-core/commit/2f3fd17)) +- monaco typing error fix ([e73467e](https://github.com/nrkno/tv-automation-server-core/commit/e73467e)) +- move all segment notes away from header, show only summary, clickable summary ([d0a4801](https://github.com/nrkno/tv-automation-server-core/commit/d0a4801)) +- move all segment notes away from header, show only summary, clickable summary ([aee3d01](https://github.com/nrkno/tv-automation-server-core/commit/aee3d01)) +- move back executeFunction to peripheralDeviceAPI ([226289f](https://github.com/nrkno/tv-automation-server-core/commit/226289f)) +- move notifications pop-ups when NC is open ([d6ce260](https://github.com/nrkno/tv-automation-server-core/commit/d6ce260)) +- move notifications pop-ups when NC is open ([6f7759f](https://github.com/nrkno/tv-automation-server-core/commit/6f7759f)) +- new implementation of runtime caching ([92e09be](https://github.com/nrkno/tv-automation-server-core/commit/92e09be)) +- new implementation of runtime caching ([767fbb7](https://github.com/nrkno/tv-automation-server-core/commit/767fbb7)) +- new lawo source mappings ([20f7d5a](https://github.com/nrkno/tv-automation-server-core/commit/20f7d5a)) +- non-persistent pop-ups should be prioritized over persistent ones ([99f147a](https://github.com/nrkno/tv-automation-server-core/commit/99f147a)) +- normalize naming scheme to 'runtimeArguments', normalize hotkey labels ([528679d](https://github.com/nrkno/tv-automation-server-core/commit/528679d)) +- note type got lost ([863e49d](https://github.com/nrkno/tv-automation-server-core/commit/863e49d)) +- notification center panel shadow ([1010dda](https://github.com/nrkno/tv-automation-server-core/commit/1010dda)) +- Notification Center width calculations ([fa31d65](https://github.com/nrkno/tv-automation-server-core/commit/fa31d65)) +- notification equality check, resolves 'republished' RO notifications ([27b6102](https://github.com/nrkno/tv-automation-server-core/commit/27b6102)) +- NotificationCenter visual fix for other pages ([10b1afa](https://github.com/nrkno/tv-automation-server-core/commit/10b1afa)) +- NotificationCenter visual fix for other pages ([2c5da97](https://github.com/nrkno/tv-automation-server-core/commit/2c5da97)) +- Notifications panel styling fix ([7f7f5cb](https://github.com/nrkno/tv-automation-server-core/commit/7f7f5cb)) +- NymansPlayground caused issues in Timeline ([83e772d](https://github.com/nrkno/tv-automation-server-core/commit/83e772d)) +- on startup, clear old connection statuses ([e9d7cba](https://github.com/nrkno/tv-automation-server-core/commit/e9d7cba)) +- onAir line jumping around on takes ([8330112](https://github.com/nrkno/tv-automation-server-core/commit/8330112)) +- optimizations during adlibs (thanks to [@baltedewit](https://github.com/baltedewit)) ([f50b60e](https://github.com/nrkno/tv-automation-server-core/commit/f50b60e)) +- optimizations during adlibs (thanks to [@baltedewit](https://github.com/baltedewit)) ([daa135b](https://github.com/nrkno/tv-automation-server-core/commit/daa135b)) +- optimize saveIntoDB ([65c189e](https://github.com/nrkno/tv-automation-server-core/commit/65c189e)) +- Pass SofieHostURL to blueprints config ([8c18821](https://github.com/nrkno/tv-automation-server-core/commit/8c18821)) +- peripheralDevices subscription for RO data ([90b4e13](https://github.com/nrkno/tv-automation-server-core/commit/90b4e13)) +- Persist SegmentLine.updateStoryStatus ([427b24c](https://github.com/nrkno/tv-automation-server-core/commit/427b24c)) +- playout ([969e316](https://github.com/nrkno/tv-automation-server-core/commit/969e316)) +- playout, lookahead: use the originalLayer instear of isAbstract ([30fe842](https://github.com/nrkno/tv-automation-server-core/commit/30fe842)) +- PR changes ([c877aad](https://github.com/nrkno/tv-automation-server-core/commit/c877aad)) +- prevent default action for f1 & f3 ([53b2f22](https://github.com/nrkno/tv-automation-server-core/commit/53b2f22)) +- prevent resetting rundown when on-air ([d842922](https://github.com/nrkno/tv-automation-server-core/commit/d842922)) +- prevent take + autotake bug ([b3d9a4d](https://github.com/nrkno/tv-automation-server-core/commit/b3d9a4d)) +- proper dispose of executeFunction checkReply after execution is done ([523ec99](https://github.com/nrkno/tv-automation-server-core/commit/523ec99)) +- queued adlib should have infinite sli's ([75452dc](https://github.com/nrkno/tv-automation-server-core/commit/75452dc)) +- R3 ONLY: bugfix: reload data from ENPS ([cc6ed44](https://github.com/nrkno/tv-automation-server-core/commit/cc6ed44)) +- rabbitMQ sending messages ([df72c4c](https://github.com/nrkno/tv-automation-server-core/commit/df72c4c)) +- re-add blueprint & mosdatacache restore (to be deprecated later) ([886c756](https://github.com/nrkno/tv-automation-server-core/commit/886c756)) +- re-added monaco typings and disabled import, so it works client-side ([1226763](https://github.com/nrkno/tv-automation-server-core/commit/1226763)) +- re-timing vignett ([17fbced](https://github.com/nrkno/tv-automation-server-core/commit/17fbced)) +- react errors while rendering nymansPlayground ([0c245d3](https://github.com/nrkno/tv-automation-server-core/commit/0c245d3)) +- React unique keys ([4f728d9](https://github.com/nrkno/tv-automation-server-core/commit/4f728d9)) +- RecordedFiles index ([f1aae5e](https://github.com/nrkno/tv-automation-server-core/commit/f1aae5e)) +- refactor storeSnapshot methods ([6e66394](https://github.com/nrkno/tv-automation-server-core/commit/6e66394)) +- refactor updateExternalMessageQueueStatus to avoid fatal startup bug ([b54b09d](https://github.com/nrkno/tv-automation-server-core/commit/b54b09d)) +- refactored execMethod, so it doesn't use promises and causes unhandled promise rejections ([24da71b](https://github.com/nrkno/tv-automation-server-core/commit/24da71b)) +- refactored reset-segmentLine further ([0523eb6](https://github.com/nrkno/tv-automation-server-core/commit/0523eb6)) +- refactored/DRYd adminMode & studioMode, disabled trashbin-button for externalMessages when not in adminMode ([b29dae1](https://github.com/nrkno/tv-automation-server-core/commit/b29dae1)) +- relative durations causing type warnings for ui code ([5249435](https://github.com/nrkno/tv-automation-server-core/commit/5249435)) +- Release 3 only: disable config missing warning ([921cc82](https://github.com/nrkno/tv-automation-server-core/commit/921cc82)) +- remount monaco ([4ce1566](https://github.com/nrkno/tv-automation-server-core/commit/4ce1566)) +- remove 'computation stopped' notifications ([bf4d8d8](https://github.com/nrkno/tv-automation-server-core/commit/bf4d8d8)) +- remove check that didn't work ([fdc917f](https://github.com/nrkno/tv-automation-server-core/commit/fdc917f)) +- remove config didn't work ([893717e](https://github.com/nrkno/tv-automation-server-core/commit/893717e)) +- remove debug line in nightly cronjob ([dda3017](https://github.com/nrkno/tv-automation-server-core/commit/dda3017)) +- remove deprecated options ([ab7275b](https://github.com/nrkno/tv-automation-server-core/commit/ab7275b)) +- Remove empty translations ([d2f1bd0](https://github.com/nrkno/tv-automation-server-core/commit/d2f1bd0)) +- remove expectedMediaItems when ro is removed ([5230695](https://github.com/nrkno/tv-automation-server-core/commit/5230695)) +- remove full-screen button, add label ([5e9826e](https://github.com/nrkno/tv-automation-server-core/commit/5e9826e)) +- remove full-screen button, add label ([5c9a3e5](https://github.com/nrkno/tv-automation-server-core/commit/5c9a3e5)) +- remove leftover debug info ([d475b76](https://github.com/nrkno/tv-automation-server-core/commit/d475b76)) +- remove some console.logs ([a9f3f53](https://github.com/nrkno/tv-automation-server-core/commit/a9f3f53)) +- Remove timestamps from blueprint backups ([74fa1b3](https://github.com/nrkno/tv-automation-server-core/commit/74fa1b3)) +- remove unneccessary margin in some headers ([32874a1](https://github.com/nrkno/tv-automation-server-core/commit/32874a1)) +- remove unneccessary margin in some headers ([b47ea11](https://github.com/nrkno/tv-automation-server-core/commit/b47ea11)) +- **ro list:** translatify & hide 'Unsynced from MOS' label when no unsynced items ([fa56ecd](https://github.com/nrkno/tv-automation-server-core/commit/fa56ecd)) +- remove unused imports ([5fe6ac3](https://github.com/nrkno/tv-automation-server-core/commit/5fe6ac3)) +- remove unused translation helper ([e545a9e](https://github.com/nrkno/tv-automation-server-core/commit/e545a9e)) +- removed autopublish and insecure packages, we'll implement publications and allow/deny rules from now on ([213998d](https://github.com/nrkno/tv-automation-server-core/commit/213998d)) +- removed ntp server debug code ([b9857e7](https://github.com/nrkno/tv-automation-server-core/commit/b9857e7)) +- removed old, deprecated attr ([bf0cdfd](https://github.com/nrkno/tv-automation-server-core/commit/bf0cdfd)) +- Removed the hard-coded link in the header that set the translation to Norwegian Bokmål. ([4515066](https://github.com/nrkno/tv-automation-server-core/commit/4515066)) +- removed uploadFileToAtem function, this should be done in devicesMakeReady ([4e96bb3](https://github.com/nrkno/tv-automation-server-core/commit/4e96bb3)) +- removed wrongful error throw ([852c495](https://github.com/nrkno/tv-automation-server-core/commit/852c495)) +- removed wrongful error throw ([b3deed1](https://github.com/nrkno/tv-automation-server-core/commit/b3deed1)) +- Removing trailing slashes in url defaults ([f6fa32c](https://github.com/nrkno/tv-automation-server-core/commit/f6fa32c)) +- **record:** Hide internal layer mappings ([24dfef1](https://github.com/nrkno/tv-automation-server-core/commit/24dfef1)) +- rename method getShowStyleRef => getShowStyleConfigRef ([c8bbe95](https://github.com/nrkno/tv-automation-server-core/commit/c8bbe95)) +- rename restoreBackups page to Snapshots ([0c5103f](https://github.com/nrkno/tv-automation-server-core/commit/0c5103f)) +- rename rundownAPI => runningOrderAPI ([89d48d0](https://github.com/nrkno/tv-automation-server-core/commit/89d48d0)) +- rename version 0.20.0 => 0.21.0 (release 6) ([7b1ee3a](https://github.com/nrkno/tv-automation-server-core/commit/7b1ee3a)) +- resetRunningOrder functionality in GUI ([4eb096a](https://github.com/nrkno/tv-automation-server-core/commit/4eb096a)) +- resetRunningorder should update timeline ([0d01e6a](https://github.com/nrkno/tv-automation-server-core/commit/0d01e6a)) +- resetRunningorder should update timeline ([35451b1](https://github.com/nrkno/tv-automation-server-core/commit/35451b1)) +- resetting running order rewind ([a122f2c](https://github.com/nrkno/tv-automation-server-core/commit/a122f2c)) +- resolve a typo in rabbitMQ.ts ([3b36ae3](https://github.com/nrkno/tv-automation-server-core/commit/3b36ae3)) +- resolve issue with ContextMenus in RO view ([8d9ba96](https://github.com/nrkno/tv-automation-server-core/commit/8d9ba96)) +- resolve issue with hit-area of Notification Center ([1618619](https://github.com/nrkno/tv-automation-server-core/commit/1618619)) +- resolve issue with lowPriority cron jobs ([f7c3c83](https://github.com/nrkno/tv-automation-server-core/commit/f7c3c83)) +- resolve Media Object Status notifications bug ([367dcce](https://github.com/nrkno/tv-automation-server-core/commit/367dcce)) +- resolve merge issue ([0cbc75a](https://github.com/nrkno/tv-automation-server-core/commit/0cbc75a)) +- Respect disableOutTransition on SegmentLine during manual takes (not just autonext) ([f19788d](https://github.com/nrkno/tv-automation-server-core/commit/f19788d)) +- restore blueprint settings page ([faa7fdd](https://github.com/nrkno/tv-automation-server-core/commit/faa7fdd)) +- restore running order 'backup' fails if doesnt already exist ([87b3300](https://github.com/nrkno/tv-automation-server-core/commit/87b3300)) +- retry strategy for restart casparcg cronjob ([b54f0f6](https://github.com/nrkno/tv-automation-server-core/commit/b54f0f6)) +- reversed logic during refactoring by mistake ([694191e](https://github.com/nrkno/tv-automation-server-core/commit/694191e)) +- Revert 594a1e7 ([edeb166](https://github.com/nrkno/tv-automation-server-core/commit/edeb166)) +- rewind icon was not responsive in ROFullscreenControls ([0e494df](https://github.com/nrkno/tv-automation-server-core/commit/0e494df)) +- rewind icon was not responsive in ROFullscreenControls ([2e7c1d2](https://github.com/nrkno/tv-automation-server-core/commit/2e7c1d2)) +- **hold:** Disable transition when leaving HOLD ([809dd34](https://github.com/nrkno/tv-automation-server-core/commit/809dd34)) +- rewind UI even if reset returns error ([3bd5417](https://github.com/nrkno/tv-automation-server-core/commit/3bd5417)) +- rewind UI even if reset returns error ([08c5d6b](https://github.com/nrkno/tv-automation-server-core/commit/08c5d6b)) +- reworked systemStatus to use components instead ([cccfe3c](https://github.com/nrkno/tv-automation-server-core/commit/cccfe3c)) +- RO buttons z-order ([3c53254](https://github.com/nrkno/tv-automation-server-core/commit/3c53254)) +- RO buttons z-order ([15e9da8](https://github.com/nrkno/tv-automation-server-core/commit/15e9da8)) +- RO notification action ([36cf900](https://github.com/nrkno/tv-automation-server-core/commit/36cf900)) +- **adlib:** Allow for overlap of adlib sli to give preload time ([d2f0dcd](https://github.com/nrkno/tv-automation-server-core/commit/d2f0dcd)) +- **adlib:** An adlib replacing the main sli of a sl would not adjust the length of the original. F5/F6 sometimes failed to insert a sli correctly, causing black ([fca6f05](https://github.com/nrkno/tv-automation-server-core/commit/fca6f05)) +- **adlib:** Set as next on SL after using F5/F6 would not restore correctly ([3829293](https://github.com/nrkno/tv-automation-server-core/commit/3829293)) +- **asRunLog:** wrong id, typo ([636fc41](https://github.com/nrkno/tv-automation-server-core/commit/636fc41)) +- **blueprint:** Fill in missing TimelineObj fields ([0ed7663](https://github.com/nrkno/tv-automation-server-core/commit/0ed7663)) +- **blueprint:** fix manifest config add item showing an 'undefined' option ([fa6182a](https://github.com/nrkno/tv-automation-server-core/commit/fa6182a)) +- **blueprint:** Remove invalid backup restore code ([2e00eca](https://github.com/nrkno/tv-automation-server-core/commit/2e00eca)) +- **blueprints:** Ensure ids are not duplicated ([fbd0a04](https://github.com/nrkno/tv-automation-server-core/commit/fbd0a04)) +- **blueprints:** Ensure the object ids generated by the post-process blueprint are unique ([bdee540](https://github.com/nrkno/tv-automation-server-core/commit/bdee540)) +- **cam/dir:** clear hotkeys ([2545de8](https://github.com/nrkno/tv-automation-server-core/commit/2545de8)) +- **clip metadata:** timebase info ([5c39ea8](https://github.com/nrkno/tv-automation-server-core/commit/5c39ea8)) +- **countdowns:** ignore sourceLayers that we don't have an icon for ([27b2ac0](https://github.com/nrkno/tv-automation-server-core/commit/27b2ac0)) +- **Devices:** Better strings and device list layouts (less details) ([be26a18](https://github.com/nrkno/tv-automation-server-core/commit/be26a18)) +- **emberplus:** changes intiDB mapping to new .-delimited string format ([b6d8bc7](https://github.com/nrkno/tv-automation-server-core/commit/b6d8bc7)) +- **expected media items:** use a function instead of fat arrow ([fa23c05](https://github.com/nrkno/tv-automation-server-core/commit/fa23c05)) +- **externalMessage:** encode proper html-entities in strings ([243995c](https://github.com/nrkno/tv-automation-server-core/commit/243995c)) +- **FirstObjects:** Reverts regression introduced by removing isAbstract from firstObject items ([8f1608b](https://github.com/nrkno/tv-automation-server-core/commit/8f1608b)) +- **hold:** Disable transition when in HOLD ([cfcb141](https://github.com/nrkno/tv-automation-server-core/commit/cfcb141)) +- **hold:** Disable transition when leaving HOLD ([6b7184c](https://github.com/nrkno/tv-automation-server-core/commit/6b7184c)) +- **hold:** Disable transition when leaving or leaving HOLD ([ef5cbcb](https://github.com/nrkno/tv-automation-server-core/commit/ef5cbcb)) +- **hold:** Ensure the original stk does not get picked up as a dynamic object when setting the sl as next ([b10f48d](https://github.com/nrkno/tv-automation-server-core/commit/b10f48d)) +- **hold:** Ensure the original stk does not get picked up as a dynamic object when setting the sl as next ([225304d](https://github.com/nrkno/tv-automation-server-core/commit/225304d)) +- **hold:** Ensure the original stk does not get picked up as a dynamic object when setting the sl as next ([22da4d8](https://github.com/nrkno/tv-automation-server-core/commit/22da4d8)) +- **hold:** keep showing any infinite items that existed on the previous sl ([21a9973](https://github.com/nrkno/tv-automation-server-core/commit/21a9973)) +- **hold:** Too many sli being extended for hold mode ([f644e32](https://github.com/nrkno/tv-automation-server-core/commit/f644e32)) +- **hold:** When extending a sli during hold, use the original id to make any triggers on the sli work ([a3fd1a6](https://github.com/nrkno/tv-automation-server-core/commit/a3fd1a6)) +- **hold:** When extending a sli during hold, use the original id to make any triggers on the sli work ([669a4b2](https://github.com/nrkno/tv-automation-server-core/commit/669a4b2)) +- **infinite:** Persist overrideDuration when updating infinites ([72670d5](https://github.com/nrkno/tv-automation-server-core/commit/72670d5)) +- **infinite items:** removes infinite icon from outOnNextSegment ([4a75d7d](https://github.com/nrkno/tv-automation-server-core/commit/4a75d7d)) +- **init:** Adds default lawo device settings ([28759df](https://github.com/nrkno/tv-automation-server-core/commit/28759df)) +- **init:** adds qwerty to bakskjerm ([7329976](https://github.com/nrkno/tv-automation-server-core/commit/7329976)) +- **init:** adds qwerty to bakskjerm ([78198c9](https://github.com/nrkno/tv-automation-server-core/commit/78198c9)) +- **init:** adds qwerty to bakskjerm ([a45de4d](https://github.com/nrkno/tv-automation-server-core/commit/a45de4d)) +- **init:** hides klokke and logo layers by default ([1847ca4](https://github.com/nrkno/tv-automation-server-core/commit/1847ca4)) +- **init:** Layer names ([221b374](https://github.com/nrkno/tv-automation-server-core/commit/221b374)) +- **init:** Layer names ([16a504c](https://github.com/nrkno/tv-automation-server-core/commit/16a504c)) +- **init:** Splits init_layers and init_config. ([e056e5a](https://github.com/nrkno/tv-automation-server-core/commit/e056e5a)) +- **init:** swaps MP2 and MP1NXT layers ([b8a370c](https://github.com/nrkno/tv-automation-server-core/commit/b8a370c)) +- **init:** updated channel orders after 2-caspar setup ([3404b9b](https://github.com/nrkno/tv-automation-server-core/commit/3404b9b)) +- **Init:** Creat empty settings for Nora ([f8d0669](https://github.com/nrkno/tv-automation-server-core/commit/f8d0669)) +- **Init:** fixes wrong mapping of Lawo RMs ([ee68432](https://github.com/nrkno/tv-automation-server-core/commit/ee68432)) +- **Init:** Sets init defaults to xpro ([fd9c182](https://github.com/nrkno/tv-automation-server-core/commit/fd9c182)) +- **Initdb:** Preload vignett ([156a454](https://github.com/nrkno/tv-automation-server-core/commit/156a454)) +- **Initdb:** Preload vignett ([9470318](https://github.com/nrkno/tv-automation-server-core/commit/9470318)) +- **iterateDeeply:** typos ([c9198f1](https://github.com/nrkno/tv-automation-server-core/commit/c9198f1)) +- **L3rd pop-up:** filter out properties starting with @ ([c85ebeb](https://github.com/nrkno/tv-automation-server-core/commit/c85ebeb)) +- **L3rd pop-up:** filter out properties starting with @ ([19977e7](https://github.com/nrkno/tv-automation-server-core/commit/19977e7)) +- **lawo:** changes tempaltes to new structure ([29bf666](https://github.com/nrkno/tv-automation-server-core/commit/29bf666)) +- **lawo:** more generic timeline object ([b0418ab](https://github.com/nrkno/tv-automation-server-core/commit/b0418ab)) +- **lookahead:** clear inGroup in a better fashion ([60541cc](https://github.com/nrkno/tv-automation-server-core/commit/60541cc)) +- **lookahead:** consider transitions properly in lookahead ([c78c6fa](https://github.com/nrkno/tv-automation-server-core/commit/c78c6fa)) +- **lookahead:** Dont run lookahead on abs0 sli if there is an active transition. ([191df09](https://github.com/nrkno/tv-automation-server-core/commit/191df09)) +- **lookahead:** Dont run lookahead on abs0 sli if there is an active transition. ([bb4123a](https://github.com/nrkno/tv-automation-server-core/commit/bb4123a)) +- **lookahead:** Fix lookahead when transition does not define clip. Fix duplicate key exception when using hold multiple times at the same point ([a1bb026](https://github.com/nrkno/tv-automation-server-core/commit/a1bb026)) +- **lookahead:** Fix lookahead when transition object starts at abs0 ([bd3edbd](https://github.com/nrkno/tv-automation-server-core/commit/bd3edbd)) +- **lookahead:** Fix lookahead when transition object starts at abs0 ([c88c830](https://github.com/nrkno/tv-automation-server-core/commit/c88c830)) +- **lookahead:** Ignore transition if this is the first sl and so no transition will be used ([3df2e1e](https://github.com/nrkno/tv-automation-server-core/commit/3df2e1e)) +- **lookahead:** Not using transition info when in a segmentline with no previous segmentline ([917b34e](https://github.com/nrkno/tv-automation-server-core/commit/917b34e)) +- **lookahead:** Resolving an object for both transition clip and main clip causing an extra loadbg ([875bd1a](https://github.com/nrkno/tv-automation-server-core/commit/875bd1a)) +- **lookahead:** Resolving an object for both transition clip and main clip causing an extra loadbg ([739b5e4](https://github.com/nrkno/tv-automation-server-core/commit/739b5e4)) +- **lookahead:** RETAIN mode now follows the WHEN_CLEAR behaviour instead of PRELOAD ([f0df41c](https://github.com/nrkno/tv-automation-server-core/commit/f0df41c)) +- **media formats:** do not 2x interlaced frame rates ([1639c32](https://github.com/nrkno/tv-automation-server-core/commit/1639c32)) +- **media manager:** label on MM workFlow ([fc2e8d5](https://github.com/nrkno/tv-automation-server-core/commit/fc2e8d5)) +- **media manager ui:** display work step labels correctly ([05cce78](https://github.com/nrkno/tv-automation-server-core/commit/05cce78)) +- **media manager ui:** fix task list layout issue ([9902dc1](https://github.com/nrkno/tv-automation-server-core/commit/9902dc1)) +- **media manager ui:** media manager flow order ([1eb1c48](https://github.com/nrkno/tv-automation-server-core/commit/1eb1c48)) +- **migration:** Missing studio0_audio_bed ([1c6edcc](https://github.com/nrkno/tv-automation-server-core/commit/1c6edcc)) +- **migration:** overrideSteps should be applied before .validate() is run, so overrideSteps works independent of the validation result. ([c9c1f25](https://github.com/nrkno/tv-automation-server-core/commit/c9c1f25)) +- **migrations:** Broken StudioContext.updateDevice method ([7311d10](https://github.com/nrkno/tv-automation-server-core/commit/7311d10)) +- **migrations:** Broken StudioContext.updateDevice method ([d882e8b](https://github.com/nrkno/tv-automation-server-core/commit/d882e8b)) +- **migrations:** Check migrate function exists before trying to run it ([cf076f5](https://github.com/nrkno/tv-automation-server-core/commit/cf076f5)) +- **migrations:** Create ShowStyleVariant with ShowStyleBase in the migrations and setup studio to use it as its default ([75073d4](https://github.com/nrkno/tv-automation-server-core/commit/75073d4)) +- **migrations:** DependOnResultFrom id was not being prefixed causing it to never work ([5830754](https://github.com/nrkno/tv-automation-server-core/commit/5830754)) +- **migrations:** DependOnResultFrom id was not being prefixed causing it to never work ([602740c](https://github.com/nrkno/tv-automation-server-core/commit/602740c)) +- **migrations:** Uncomment mos check migration ([c262fff](https://github.com/nrkno/tv-automation-server-core/commit/c262fff)) +- **migrations:** Various problems when running from empty ([11d1d0b](https://github.com/nrkno/tv-automation-server-core/commit/11d1d0b)) +- **notification center:** fix notification center toggle button in RO view ([894c1e2](https://github.com/nrkno/tv-automation-server-core/commit/894c1e2)) +- **notification center:** fix running order overview to line up with the Segments column ([0906cab](https://github.com/nrkno/tv-automation-server-core/commit/0906cab)) +- **notification center:** notification count position ([1d8d2cb](https://github.com/nrkno/tv-automation-server-core/commit/1d8d2cb)) +- **notification center:** reintroduce RunningOrderNotifier into RunningOrderView ([e70e5c9](https://github.com/nrkno/tv-automation-server-core/commit/e70e5c9)) +- **notifications:** change unknown to any ([7ac8008](https://github.com/nrkno/tv-automation-server-core/commit/7ac8008)) +- **NRK Template:** Use LLayers Enum ([84ed5df](https://github.com/nrkno/tv-automation-server-core/commit/84ed5df)) +- **pharos:** add missing settingsType and migration step ([be618d2](https://github.com/nrkno/tv-automation-server-core/commit/be618d2)) +- **pharos:** add missing settingsType and migration step ([9f73a8e](https://github.com/nrkno/tv-automation-server-core/commit/9f73a8e)) +- **playout:** bad timing during autonext ([5524e3b](https://github.com/nrkno/tv-automation-server-core/commit/5524e3b)) +- **playout:** Better account for duration and overlaps with transitions etc. ([dc249a3](https://github.com/nrkno/tv-automation-server-core/commit/dc249a3)) +- **playout:** Double head2 headline out animation ([7ec91ff](https://github.com/nrkno/tv-automation-server-core/commit/7ec91ff)) +- **playout:** Double head2 headline out animation ([165e2c0](https://github.com/nrkno/tv-automation-server-core/commit/165e2c0)) +- **playout:** Ensure that infinite segmentLineItems are reset correctly after being removed by some hotkeys ([045c9b1](https://github.com/nrkno/tv-automation-server-core/commit/045c9b1)) +- **playout:** Ensure that infinite segmentLineItems are reset correctly after being removed by some hotkeys ([e4f8a83](https://github.com/nrkno/tv-automation-server-core/commit/e4f8a83)) +- **playout:** Fix overlap tests ([15628a2](https://github.com/nrkno/tv-automation-server-core/commit/15628a2)) +- **playout:** ID prefixing did not handle logical object id references ([44f2883](https://github.com/nrkno/tv-automation-server-core/commit/44f2883)) +- **playout:** Infinite item continuations were not always updated correctly ([7a7aed6](https://github.com/nrkno/tv-automation-server-core/commit/7a7aed6)) +- **playout:** Objects being written out without an id ([b05a851](https://github.com/nrkno/tv-automation-server-core/commit/b05a851)) +- **playout:** Optimise layers of promises in infinite generation logic, and reorder function parameters ([e400c7c](https://github.com/nrkno/tv-automation-server-core/commit/e400c7c)) +- **playout:** R4 only partial merge of dc249a31b342e8bdbeb7faac064dd97cec15c3e8. Fix sl duration with autonext and no transitions ([17175c3](https://github.com/nrkno/tv-automation-server-core/commit/17175c3)) +- timelineObj \_id missing ([1dcedbf](https://github.com/nrkno/tv-automation-server-core/commit/1dcedbf)) +- **playout:** Refactor setting object siId ([48de044](https://github.com/nrkno/tv-automation-server-core/commit/48de044)) +- **playout:** sl with autoNextOverlap not getting applied properly ([eb22967](https://github.com/nrkno/tv-automation-server-core/commit/eb22967)) +- RO Notifications fixes attempt no. 3 ([f0eee1f](https://github.com/nrkno/tv-automation-server-core/commit/f0eee1f)) +- RO overview crashed during rebuild of RO ([d2c62a1](https://github.com/nrkno/tv-automation-server-core/commit/d2c62a1)) +- ro-reset does not reset properly ([6367658](https://github.com/nrkno/tv-automation-server-core/commit/6367658)) +- roReset should reset holdItems and infinites ([bdf8385](https://github.com/nrkno/tv-automation-server-core/commit/bdf8385)) +- run afterUpdateTimeline after timelineTriggerTime ([98ece60](https://github.com/nrkno/tv-automation-server-core/commit/98ece60)) +- Rundown name dissappearing from view ([91dcc21](https://github.com/nrkno/tv-automation-server-core/commit/91dcc21)) +- running blueprint migrations ([fe1e7fd](https://github.com/nrkno/tv-automation-server-core/commit/fe1e7fd)) +- Running blueprints and migrations ([3b29df3](https://github.com/nrkno/tv-automation-server-core/commit/3b29df3)) +- running order closing prompt ([7074cc3](https://github.com/nrkno/tv-automation-server-core/commit/7074cc3)) +- running order closing prompt ([3024543](https://github.com/nrkno/tv-automation-server-core/commit/3024543)) +- Running Order Notifications in activeRo view ([63658b1](https://github.com/nrkno/tv-automation-server-core/commit/63658b1)) +- running order view notifications in production build ([b593323](https://github.com/nrkno/tv-automation-server-core/commit/b593323)) +- separate warnings for black frames & freeze frames ([e2acad5](https://github.com/nrkno/tv-automation-server-core/commit/e2acad5)) +- Set KAM source layer, and a probably incorrect duration (but its now non-zero) ([6e152f0](https://github.com/nrkno/tv-automation-server-core/commit/6e152f0)) +- set tsr multithreading from UI instead of CLI ([c8be25b](https://github.com/nrkno/tv-automation-server-core/commit/c8be25b)) +- setAsNext on previous ([4ffe665](https://github.com/nrkno/tv-automation-server-core/commit/4ffe665)) +- setAsNext on previous ([6ced09b](https://github.com/nrkno/tv-automation-server-core/commit/6ced09b)) +- setAsNext on previous line no longer shows default state, but now instead stalls when attempting to take ([e441aaf](https://github.com/nrkno/tv-automation-server-core/commit/e441aaf)) +- show connected devices in RO view ([e804d1e](https://github.com/nrkno/tv-automation-server-core/commit/e804d1e)) +- show media errors in segment header ([3775d2e](https://github.com/nrkno/tv-automation-server-core/commit/3775d2e)) +- show ShowStyleBase name as a part of the ShowStyleVariant name in Studios ([ba67011](https://github.com/nrkno/tv-automation-server-core/commit/ba67011)) +- since afterUpdateTimeline is called in from a syncFunctionIgnore-function, we can remove the timeout ([e7f8f25](https://github.com/nrkno/tv-automation-server-core/commit/e7f8f25)) +- sl prod init ([2ff4a46](https://github.com/nrkno/tv-automation-server-core/commit/2ff4a46)) +- smoother handling when reloading ENPS data ([83be7cb](https://github.com/nrkno/tv-automation-server-core/commit/83be7cb)) +- snapshots ([182c221](https://github.com/nrkno/tv-automation-server-core/commit/182c221)) +- SOAP message encoding ([b19ea77](https://github.com/nrkno/tv-automation-server-core/commit/b19ea77)) +- SOAP message encoding ([63d8634](https://github.com/nrkno/tv-automation-server-core/commit/63d8634)) +- Use new mediaPreviewsUrl setting ([1bd0ba4](https://github.com/nrkno/tv-automation-server-core/commit/1bd0ba4)) +- **rabbitmq:** send persistant messages ([ff8d375](https://github.com/nrkno/tv-automation-server-core/commit/ff8d375)) +- some minor react errors in the settings ([d7bb849](https://github.com/nrkno/tv-automation-server-core/commit/d7bb849)) +- some more margin touch-ups ([71a291a](https://github.com/nrkno/tv-automation-server-core/commit/71a291a)) +- some more margin touch-ups ([c8b6f1e](https://github.com/nrkno/tv-automation-server-core/commit/c8b6f1e)) +- Start on template for KAM ÅPNING ([4cd682f](https://github.com/nrkno/tv-automation-server-core/commit/4cd682f)) +- status colors ([46fdaf1](https://github.com/nrkno/tv-automation-server-core/commit/46fdaf1)) +- StudioInstallation key-value config tidying ([4b0bc1a](https://github.com/nrkno/tv-automation-server-core/commit/4b0bc1a)) +- styling fix for z-order with menu and RO buttons ([1b0717e](https://github.com/nrkno/tv-automation-server-core/commit/1b0717e)) +- subscription handling ([8aaa3ec](https://github.com/nrkno/tv-automation-server-core/commit/8aaa3ec)) +- super.componentWillUnmount is required ([2342e48](https://github.com/nrkno/tv-automation-server-core/commit/2342e48)) +- syntax errors in test file ([a8f5d1e](https://github.com/nrkno/tv-automation-server-core/commit/a8f5d1e)) +- systemStatus \_internal messages ([05fd6c8](https://github.com/nrkno/tv-automation-server-core/commit/05fd6c8)) +- systemStatus \_internal messages ([d150f54](https://github.com/nrkno/tv-automation-server-core/commit/d150f54)) +- systemStatus messages ([17420cc](https://github.com/nrkno/tv-automation-server-core/commit/17420cc)) +- systemStatus messages ([e595e5b](https://github.com/nrkno/tv-automation-server-core/commit/e595e5b)) +- take action should not throw as nasty errors when called by user. ([6791d50](https://github.com/nrkno/tv-automation-server-core/commit/6791d50)) +- templates with wipe. Readd seperate audio file ([5be2802](https://github.com/nrkno/tv-automation-server-core/commit/5be2802)) +- temporary fix for the "UnhandledPromiseRejectionWarning" bug, supressing the error when used ([7aa7cf8](https://github.com/nrkno/tv-automation-server-core/commit/7aa7cf8)) +- temporary fix of typing error ([73bf56d](https://github.com/nrkno/tv-automation-server-core/commit/73bf56d)) +- test-tools decklink input format dropdown has no options ([b02f447](https://github.com/nrkno/tv-automation-server-core/commit/b02f447)) +- text shadow in SegmentLineLabels ([3a310b1](https://github.com/nrkno/tv-automation-server-core/commit/3a310b1)) +- tie snapshot to evaluation ([ec18370](https://github.com/nrkno/tv-automation-server-core/commit/ec18370)) +- Timeline always being built without previous segmentline ([a077805](https://github.com/nrkno/tv-automation-server-core/commit/a077805)) +- timeline dep ([b26eecb](https://github.com/nrkno/tv-automation-server-core/commit/b26eecb)) +- timeline resolution bug for non-infinite items ([35fc40a](https://github.com/nrkno/tv-automation-server-core/commit/35fc40a)) +- timeline statobj didn't update on inactivate (empty timeline) ([839b906](https://github.com/nrkno/tv-automation-server-core/commit/839b906)) +- timeline statObject: updated hashing function ([e00a01c](https://github.com/nrkno/tv-automation-server-core/commit/e00a01c)) +- timelineObj \_id missing ([0f8e0da](https://github.com/nrkno/tv-automation-server-core/commit/0f8e0da)) +- timesync: better retry strategy on startup sync ([eda632a](https://github.com/nrkno/tv-automation-server-core/commit/eda632a)) +- toc trace message ([c53124f](https://github.com/nrkno/tv-automation-server-core/commit/c53124f)) +- too long script out-words could overlap with previous items ([8f8a9a2](https://github.com/nrkno/tv-automation-server-core/commit/8f8a9a2)) +- Tooltip import ([cd2b65a](https://github.com/nrkno/tv-automation-server-core/commit/cd2b65a)) +- tooltips after import change ([a82140f](https://github.com/nrkno/tv-automation-server-core/commit/a82140f)) +- top RO overview labels clipped in wrong places ([5e5c228](https://github.com/nrkno/tv-automation-server-core/commit/5e5c228)) +- Tweaked styling of evaluation form, warning messages, color of the next lines, translations, capialized warning icon file name, and optimized png and svg icons. ([50d2753](https://github.com/nrkno/tv-automation-server-core/commit/50d2753)) +- tweaks on externalMessage send function, limiting the number of messages sent in one go ([046ae38](https://github.com/nrkno/tv-automation-server-core/commit/046ae38)) +- type bug ([de43835](https://github.com/nrkno/tv-automation-server-core/commit/de43835)) +- type error in SegmentTimelineContainer ([c4d6b4d](https://github.com/nrkno/tv-automation-server-core/commit/c4d6b4d)) +- type error, ensure string ([76da25d](https://github.com/nrkno/tv-automation-server-core/commit/76da25d)) +- typing ([7c21efe](https://github.com/nrkno/tv-automation-server-core/commit/7c21efe)) +- typing fix: cannot find name 'monaco' ([3ad88ce](https://github.com/nrkno/tv-automation-server-core/commit/3ad88ce)) +- typing fixes, to work with updated packages ([b4362f7](https://github.com/nrkno/tv-automation-server-core/commit/b4362f7)) +- typings error, ensuring string ([1e25345](https://github.com/nrkno/tv-automation-server-core/commit/1e25345)) +- typo bug in performanceMonitor ([797c393](https://github.com/nrkno/tv-automation-server-core/commit/797c393)) +- typo bug in performanceMonitor ([6a5eeb4](https://github.com/nrkno/tv-automation-server-core/commit/6a5eeb4)) +- typo MediaResolutions vs mediaResolutions ([6a72e09](https://github.com/nrkno/tv-automation-server-core/commit/6a72e09)) +- Typographic tweaks for prompter. ([068d535](https://github.com/nrkno/tv-automation-server-core/commit/068d535)) +- UI crash when outputLayer is undefined ([e6dd558](https://github.com/nrkno/tv-automation-server-core/commit/e6dd558)) +- ui manualPlayback key ([ca1a943](https://github.com/nrkno/tv-automation-server-core/commit/ca1a943)) +- ui manualPlayback key ([5d4e49f](https://github.com/nrkno/tv-automation-server-core/commit/5d4e49f)) +- UI tweaks for messages status view. so it doesn't break when having long error messages ([ca1e3ae](https://github.com/nrkno/tv-automation-server-core/commit/ca1e3ae)) +- UI: improve shapshot comment edit field ([093e6cb](https://github.com/nrkno/tv-automation-server-core/commit/093e6cb)) +- upd meteor typings ([53f17d2](https://github.com/nrkno/tv-automation-server-core/commit/53f17d2)) +- update all data in roReplaceMetadata ([8a5a671](https://github.com/nrkno/tv-automation-server-core/commit/8a5a671)) +- update asRunLog typings ([5d18c66](https://github.com/nrkno/tv-automation-server-core/commit/5d18c66)) +- update blueprints-integration ([28d17c2](https://github.com/nrkno/tv-automation-server-core/commit/28d17c2)) +- update design of presenter screen ([4f41195](https://github.com/nrkno/tv-automation-server-core/commit/4f41195)) +- Update names passed to SegmentLineItems ([ed0fc0d](https://github.com/nrkno/tv-automation-server-core/commit/ed0fc0d)) +- update Next-line when inserting story just before it, also added property to track if the next point was set manually ([d82dbc6](https://github.com/nrkno/tv-automation-server-core/commit/d82dbc6)) +- update ro data cache when getting new metadata ([d700783](https://github.com/nrkno/tv-automation-server-core/commit/d700783)) +- Update some playout timelineobj types ([fe883a8](https://github.com/nrkno/tv-automation-server-core/commit/fe883a8)) +- update supertimeline ([28bccfe](https://github.com/nrkno/tv-automation-server-core/commit/28bccfe)) +- update timeline dependency ([b83f6be](https://github.com/nrkno/tv-automation-server-core/commit/b83f6be)) +- Update timeline on removing a mos story ([fd3d443](https://github.com/nrkno/tv-automation-server-core/commit/fd3d443)) +- Update TimelineObjCCGRoute. ([203ef91](https://github.com/nrkno/tv-automation-server-core/commit/203ef91)) +- update typings to match blueprints-integration ([f97f177](https://github.com/nrkno/tv-automation-server-core/commit/f97f177)) +- updated health endpoint according to spec ([c196382](https://github.com/nrkno/tv-automation-server-core/commit/c196382)) +- updated health endpoint according to spec ([900728b](https://github.com/nrkno/tv-automation-server-core/commit/900728b)) +- updated mock data ([3e140c6](https://github.com/nrkno/tv-automation-server-core/commit/3e140c6)) +- updated mock data ([a7a4ae5](https://github.com/nrkno/tv-automation-server-core/commit/a7a4ae5)) +- updated nightly cronjob: restart casparcg devices, to work with new restartCasparCG function implementation ([3f9344d](https://github.com/nrkno/tv-automation-server-core/commit/3f9344d)) +- updated nightly cronjob: restart casparcg devices, to work with new restartCasparCG function implementation ([edbc186](https://github.com/nrkno/tv-automation-server-core/commit/edbc186)) +- updated package-lock.json ([bf0cfde](https://github.com/nrkno/tv-automation-server-core/commit/bf0cfde)) +- updated systemTime endpoint ([503d2c8](https://github.com/nrkno/tv-automation-server-core/commit/503d2c8)) +- updated timeline dep (bugfixes) ([ff29ce6](https://github.com/nrkno/tv-automation-server-core/commit/ff29ce6)) +- updated versions file ([f6c9869](https://github.com/nrkno/tv-automation-server-core/commit/f6c9869)) +- updateExpectedMediaItems failing was causing the post-process blueprint to not be run. Errors from this are still logged, but no longer block blueprint execution ([2fe22bb](https://github.com/nrkno/tv-automation-server-core/commit/2fe22bb)) +- use admin as parameter instead of all ([20751b4](https://github.com/nrkno/tv-automation-server-core/commit/20751b4)) +- use DisplayName field for graphic elements ([e2e9014](https://github.com/nrkno/tv-automation-server-core/commit/e2e9014)) +- Use more consistent inputs in Blueprints page ([d223d11](https://github.com/nrkno/tv-automation-server-core/commit/d223d11)) +- use studioInstallationId of parent peripheralDevice ([7dedf9b](https://github.com/nrkno/tv-automation-server-core/commit/7dedf9b)) +- Use thin styling for a solo 'AUTO' label ([74b5f15](https://github.com/nrkno/tv-automation-server-core/commit/74b5f15)) +- Use thin styling for a solo 'AUTO' label ([0c26d38](https://github.com/nrkno/tv-automation-server-core/commit/0c26d38)) +- use unique id for baseline items cache entries ([cf89409](https://github.com/nrkno/tv-automation-server-core/commit/cf89409)) +- userAction: increased timeout value for "waiting for..." notification ([f00e273](https://github.com/nrkno/tv-automation-server-core/commit/f00e273)) +- useractions: proper handling of the this keyword ([a2686db](https://github.com/nrkno/tv-automation-server-core/commit/a2686db)) +- useractions: proper handling of the this keyword ([49a44a7](https://github.com/nrkno/tv-automation-server-core/commit/49a44a7)) +- **playout:** Typo in ID prefixing ([249b35d](https://github.com/nrkno/tv-automation-server-core/commit/249b35d)) +- **playout:** Use original sli id when adding infinite to the timeline, to ensure that any triggers on other objects resolve ([c0382ec](https://github.com/nrkno/tv-automation-server-core/commit/c0382ec)) +- **playout:** Use original sli id when adding infinite to the timeline, to ensure that any triggers on other objects resolve ([e7eb871](https://github.com/nrkno/tv-automation-server-core/commit/e7eb871)) +- **presenter screen:** display hours correctly ([e242a9e](https://github.com/nrkno/tv-automation-server-core/commit/e242a9e)) +- **record:** CR changes ([b3adbec](https://github.com/nrkno/tv-automation-server-core/commit/b3adbec)) +- **refactor:** existing runningOrders were not migrated to the new data structure ([b20bc2d](https://github.com/nrkno/tv-automation-server-core/commit/b20bc2d)) +- **refactor:** remove stray debugger calls ([3be5c22](https://github.com/nrkno/tv-automation-server-core/commit/3be5c22)) +- **ro list:** translatify & hide 'Unsynced from MOS' label when no unsynced items ([11b0f29](https://github.com/nrkno/tv-automation-server-core/commit/11b0f29)) +- **RO view:** Always persist original event in user-action methods ([6ba7df8](https://github.com/nrkno/tv-automation-server-core/commit/6ba7df8)) +- **runtimeArgs:** Removing infinite items from changed sl and anything following ([28ffd5d](https://github.com/nrkno/tv-automation-server-core/commit/28ffd5d)) +- **snapshot:** SegmentLines were not being included in the snapshot ([224f806](https://github.com/nrkno/tv-automation-server-core/commit/224f806)) +- **snapshot:** SegmentLines were not being included in the snapshot ([d9a427e](https://github.com/nrkno/tv-automation-server-core/commit/d9a427e)) +- **sticky:** Fix sticky items with objects using relative triggers or durations ([0c47cff](https://github.com/nrkno/tv-automation-server-core/commit/0c47cff)) +- **template:** Caspar portion of in-transition for segmentline rerun whenever timeline was recalculated ([3373457](https://github.com/nrkno/tv-automation-server-core/commit/3373457)) +- userActivity executionTime logging ([a3e763e](https://github.com/nrkno/tv-automation-server-core/commit/a3e763e)) +- various fixes after refactoring ([1a17414](https://github.com/nrkno/tv-automation-server-core/commit/1a17414)) +- when activating, set Next if not set ([c9f71a1](https://github.com/nrkno/tv-automation-server-core/commit/c9f71a1)) +- when overriding componentWillUnmount, we need to call this.\_cleanup() ([0f39cd4](https://github.com/nrkno/tv-automation-server-core/commit/0f39cd4)) +- **zoom:** moved zoom modifier for scroll action to ctrl ([863d81e](https://github.com/nrkno/tv-automation-server-core/commit/863d81e)) +- wrap ntpClient.getNetworkTime() in try/catch, as an attempt to fix fatal error thrown ([cd44862](https://github.com/nrkno/tv-automation-server-core/commit/cd44862)) +- **zoom:** moved zoom modifier for scroll action to ctrl ([80829f2](https://github.com/nrkno/tv-automation-server-core/commit/80829f2)) +- Wrong icon for split in presenter view ([1ec1c56](https://github.com/nrkno/tv-automation-server-core/commit/1ec1c56)) +- Wrong icon for split in presenter view ([08c8df8](https://github.com/nrkno/tv-automation-server-core/commit/08c8df8)) +- **template:** graphic supers group using wrong trigger. ([e28d1ef](https://github.com/nrkno/tv-automation-server-core/commit/e28d1ef)) +- **template:** Reduce volume of head wipes ([b2092cc](https://github.com/nrkno/tv-automation-server-core/commit/b2092cc)) +- **template:** setup dsk properly ([2e8309c](https://github.com/nrkno/tv-automation-server-core/commit/2e8309c)) +- **templates:** Fix incorrect camera number used with head transition. Hook in sluttvignett. Fix segments not respecting overlapduration if no transition is used ([00b7cdd](https://github.com/nrkno/tv-automation-server-core/commit/00b7cdd)) +- **templates:** use enum for nora channels ([55c0cfc](https://github.com/nrkno/tv-automation-server-core/commit/55c0cfc)) +- **templates:** Various tweaks ([eb93c6a](https://github.com/nrkno/tv-automation-server-core/commit/eb93c6a)) +- **Test:** Verifying build and deploy script ([0b13e18](https://github.com/nrkno/tv-automation-server-core/commit/0b13e18)) +- **timeline:** don't round items in relative mode ([2938819](https://github.com/nrkno/tv-automation-server-core/commit/2938819)) +- **timeline:** Infinite sli do not update properly on new mos data. Fix detection of the end of the chain, and ensure the last is set to not infinite ([61b2930](https://github.com/nrkno/tv-automation-server-core/commit/61b2930)) +- **timeline:** Infinite sli do not update properly on new mos data. Fix detection of the end of the chain, and ensure the last is set to not infinite ([16d9715](https://github.com/nrkno/tv-automation-server-core/commit/16d9715)) +- **Timeline:** Corrects the angle of the gradient indication mix-in-transition on a segmentLineItem ([151ecf9](https://github.com/nrkno/tv-automation-server-core/commit/151ecf9)) +- **transition:** Delay sli not contents, to ensure relative triggers against the sli are correct (fixes sluttvignett with transition) ([856da4b](https://github.com/nrkno/tv-automation-server-core/commit/856da4b)) +- **transition:** reverses direction of wipe transitions ([9961a3f](https://github.com/nrkno/tv-automation-server-core/commit/9961a3f)) +- **transition:** Using wrong overlap when combined with autonext ([4c56102](https://github.com/nrkno/tv-automation-server-core/commit/4c56102)) +- **transitions:** Ensure they are run with the correct overlap on autonext ([bbc6ca2](https://github.com/nrkno/tv-automation-server-core/commit/bbc6ca2)) +- **transitions:** Timed graphics being run wrong ([8b39960](https://github.com/nrkno/tv-automation-server-core/commit/8b39960)) +- **UI:** Improves device settings and status page by removing information ([267c10c](https://github.com/nrkno/tv-automation-server-core/commit/267c10c)) +- **unsync:** refactor, add method to unsync runningOrder ([d54c147](https://github.com/nrkno/tv-automation-server-core/commit/d54c147)) +- **vignett:** do not preload vignett, as it is risky business preloading sluttvignett. Could be done better by separating vignett and sluttvignett ([b0da067](https://github.com/nrkno/tv-automation-server-core/commit/b0da067)) +- **vignett:** do not preload vignett, as it is risky business preloading sluttvignett. Could be done better by separating vignett and sluttvignett ([8bf7ff8](https://github.com/nrkno/tv-automation-server-core/commit/8bf7ff8)) ### Features -* add a subtle line underneath segment title when has-remote-items and has-guest-items ([4b1d582](https://github.com/nrkno/tv-automation-server-core/commit/4b1d582)) -* add a subtle line underneath segment title when has-remote-items and has-guest-items ([a02b50d](https://github.com/nrkno/tv-automation-server-core/commit/a02b50d)) -* Add backup link to backup only active template data ([cdfffdf](https://github.com/nrkno/tv-automation-server-core/commit/cdfffdf)) -* Add backup restore method to import mock rundowns similar to the embedded mocks ([251555b](https://github.com/nrkno/tv-automation-server-core/commit/251555b)) -* Add backup restore method to import mock rundowns similar to the embedded mocks ([d71d9c7](https://github.com/nrkno/tv-automation-server-core/commit/d71d9c7)) -* add expected media items collection ([931536e](https://github.com/nrkno/tv-automation-server-core/commit/931536e)) -* Add runHelper method to template context ([ebc477a](https://github.com/nrkno/tv-automation-server-core/commit/ebc477a)) -* **blueprint:** refactor getConfigValue into the blueprints, with context exposing the raw array as getConfig instead ([5b0ac39](https://github.com/nrkno/tv-automation-server-core/commit/5b0ac39)) -* Add expected media items collection ([04c15a9](https://github.com/nrkno/tv-automation-server-core/commit/04c15a9)) -* Add http put request timeline object ([14f391c](https://github.com/nrkno/tv-automation-server-core/commit/14f391c)) -* add link to compatible studios from ShowStyle page ([4be495c](https://github.com/nrkno/tv-automation-server-core/commit/4be495c)) -* Add LOG_FILE env var to specify the file to log to ([d2ad941](https://github.com/nrkno/tv-automation-server-core/commit/d2ad941)) -* Add LOG_FILE env var to specify the file to log to ([8a192bc](https://github.com/nrkno/tv-automation-server-core/commit/8a192bc)) -* Add Media_Manager DeviceType ([2b612c7](https://github.com/nrkno/tv-automation-server-core/commit/2b612c7)) -* add methods for insert/remove blueprints ([8acb72b](https://github.com/nrkno/tv-automation-server-core/commit/8acb72b)) -* add migration steps, logging ([96aae63](https://github.com/nrkno/tv-automation-server-core/commit/96aae63)) -* add nn translation and update nb translation ([922b93b](https://github.com/nrkno/tv-automation-server-core/commit/922b93b)) -* add nn-nynorsk and update nb-bokmal translation ([6db7a99](https://github.com/nrkno/tv-automation-server-core/commit/6db7a99)) -* Add OSC Playout device type ([bf426b5](https://github.com/nrkno/tv-automation-server-core/commit/bf426b5)) -* add performance monitor and track all server-side methods ([2733d74](https://github.com/nrkno/tv-automation-server-core/commit/2733d74)) -* add performance monitor and track all server-side methods ([385f703](https://github.com/nrkno/tv-automation-server-core/commit/385f703)) -* add peripheralDevice expectedVersions, to throw error if device version is too low. Refactor /health endpoint. ([51ed4c3](https://github.com/nrkno/tv-automation-server-core/commit/51ed4c3)) -* add property .deviceId to MediaWorkFlow & MedieWorkFlowStep, to indicate ownership. (preliminary implementation) ([62ac066](https://github.com/nrkno/tv-automation-server-core/commit/62ac066)) -* add restart button ([6083145](https://github.com/nrkno/tv-automation-server-core/commit/6083145)) -* add restart button ([9b43d6f](https://github.com/nrkno/tv-automation-server-core/commit/9b43d6f)) -* add rewind button ([9fd61b5](https://github.com/nrkno/tv-automation-server-core/commit/9fd61b5)) -* add rewind button ([f235a25](https://github.com/nrkno/tv-automation-server-core/commit/f235a25)) -* Add running order name to top of run page ([674c392](https://github.com/nrkno/tv-automation-server-core/commit/674c392)) -* Add SegmentLineItem.infiniteMode value for items which are infinite within the SegmentLine ([e99c661](https://github.com/nrkno/tv-automation-server-core/commit/e99c661)) -* add setting for playout device: multiThreadedResolver ([37f2aa7](https://github.com/nrkno/tv-automation-server-core/commit/37f2aa7)) -* add snapshot restore statistics to logging ([45115f3](https://github.com/nrkno/tv-automation-server-core/commit/45115f3)) -* Add some new template config data for sources information ([3e48508](https://github.com/nrkno/tv-automation-server-core/commit/3e48508)) -* add sourceLayerType.LIGHTS ([0554251](https://github.com/nrkno/tv-automation-server-core/commit/0554251)) -* add stoppedPlayback tracking ([ddbdd66](https://github.com/nrkno/tv-automation-server-core/commit/ddbdd66)) -* add stoppedPlayback tracking ([7345856](https://github.com/nrkno/tv-automation-server-core/commit/7345856)) -* add studioInstallation.settings, mediaPreviewsUrl and sofieUrl, to replace configs ([adc6cb5](https://github.com/nrkno/tv-automation-server-core/commit/adc6cb5)) -* add support for Config References (to be used for referencing usernames & passwords) ([6df8c6e](https://github.com/nrkno/tv-automation-server-core/commit/6df8c6e)) -* add support for refs in rabbitMQ-messages (for username & password) ([5b3ea33](https://github.com/nrkno/tv-automation-server-core/commit/5b3ea33)) -* add support for refs in rabbitMQ-messages (for username & password) ([e34ee34](https://github.com/nrkno/tv-automation-server-core/commit/e34ee34)) -* Add support for RuntimeArguments in blueprint migrations ([82e5286](https://github.com/nrkno/tv-automation-server-core/commit/82e5286)) -* Add support panel in Running Order View ([e3cee77](https://github.com/nrkno/tv-automation-server-core/commit/e3cee77)) -* Add typeSubVariant field to SegmentLine. ([#46](https://github.com/nrkno/tv-automation-server-core/issues/46)) ([82bd4bd](https://github.com/nrkno/tv-automation-server-core/commit/82bd4bd)) -* Add typeSubVariant field to SegmentLine. ([#46](https://github.com/nrkno/tv-automation-server-core/issues/46)) ([4af88d3](https://github.com/nrkno/tv-automation-server-core/commit/4af88d3)) -* Add version string field to blueprint collection ([869dd02](https://github.com/nrkno/tv-automation-server-core/commit/869dd02)) -* add versions to /health endpoint ([a324213](https://github.com/nrkno/tv-automation-server-core/commit/a324213)) -* add warnings for wrong field order ([c4d23d8](https://github.com/nrkno/tv-automation-server-core/commit/c4d23d8)) -* added .timings object to SegmentLine, to track take/playout times during playout ([5d860b3](https://github.com/nrkno/tv-automation-server-core/commit/5d860b3)) -* added "develop=1" to url, which re-enables right-click, for dev ([b73522c](https://github.com/nrkno/tv-automation-server-core/commit/b73522c)) -* added afterBroadcast form ([e98b59e](https://github.com/nrkno/tv-automation-server-core/commit/e98b59e)) -* added async database functions ([a754a24](https://github.com/nrkno/tv-automation-server-core/commit/a754a24)) -* added client-side logging wrapper ([06597be](https://github.com/nrkno/tv-automation-server-core/commit/06597be)) -* added connection status of peripheralDevices ([c0e0a94](https://github.com/nrkno/tv-automation-server-core/commit/c0e0a94)) -* added context.runningOrder, for blueprints to use ([855f6d4](https://github.com/nrkno/tv-automation-server-core/commit/855f6d4)) -* added device version to status page ([ed0acda](https://github.com/nrkno/tv-automation-server-core/commit/ed0acda)) -* Added dynamic template context ([0ea4849](https://github.com/nrkno/tv-automation-server-core/commit/0ea4849)) -* added executionTime to userAction ([1ca92c1](https://github.com/nrkno/tv-automation-server-core/commit/1ca92c1)) -* added getAllSegments, to use in metadata-template ([f8a5514](https://github.com/nrkno/tv-automation-server-core/commit/f8a5514)) -* added indexes for all collections ([6ef324c](https://github.com/nrkno/tv-automation-server-core/commit/6ef324c)) -* added kill process buttons to device status UI ([6fdab68](https://github.com/nrkno/tv-automation-server-core/commit/6fdab68)) -* added killProcess method, to be used by integration tests of gateways in closed environments ([7f2b42c](https://github.com/nrkno/tv-automation-server-core/commit/7f2b42c)) -* added MeteorReactComponent, which exposes subscribe & autorun, which will stop automatically on component unmount ([cf11808](https://github.com/nrkno/tv-automation-server-core/commit/cf11808)) -* added name and type to peripheralDevice ([915c518](https://github.com/nrkno/tv-automation-server-core/commit/915c518)) -* added packages: mocha and typescript ([8b19269](https://github.com/nrkno/tv-automation-server-core/commit/8b19269)) -* added peripheralDevice.lastConnected, to be used for sorting so they wont jump around in the UI ([08e97f7](https://github.com/nrkno/tv-automation-server-core/commit/08e97f7)) -* added pingWithCommand method, used by watchdog ([6f6427b](https://github.com/nrkno/tv-automation-server-core/commit/6f6427b)) -* Added publications for all running order data, and changed some interfaces ([2365fd2](https://github.com/nrkno/tv-automation-server-core/commit/2365fd2)) -* added SegmentLine.timings.stoppedPlayback property ([2121245](https://github.com/nrkno/tv-automation-server-core/commit/2121245)) -* added SegmentLine.timings.takeDone property ([d18d539](https://github.com/nrkno/tv-automation-server-core/commit/d18d539)) -* added some shadow to the status dots ([04df33c](https://github.com/nrkno/tv-automation-server-core/commit/04df33c)) -* added support for typescript ([d3471b3](https://github.com/nrkno/tv-automation-server-core/commit/d3471b3)) -* added temporary deploy script ([244fb5b](https://github.com/nrkno/tv-automation-server-core/commit/244fb5b)) -* added test-data for testing and mocking ([b277c3c](https://github.com/nrkno/tv-automation-server-core/commit/b277c3c)) -* added tests stub ([edd4b6e](https://github.com/nrkno/tv-automation-server-core/commit/edd4b6e)) -* added tictac for troubleshooting timings ([df91cea](https://github.com/nrkno/tv-automation-server-core/commit/df91cea)) -* added Timeline data structure ([35ce6db](https://github.com/nrkno/tv-automation-server-core/commit/35ce6db)) -* added Timeline.objectType and implemented the typing changes all around ([a69e626](https://github.com/nrkno/tv-automation-server-core/commit/a69e626)) -* added timestamp to externalMessage error ([e13d1d8](https://github.com/nrkno/tv-automation-server-core/commit/e13d1d8)) -* added timings property to adlig segmentLineItems ([b333bf1](https://github.com/nrkno/tv-automation-server-core/commit/b333bf1)) -* added unsyncedTime ([8fcffb5](https://github.com/nrkno/tv-automation-server-core/commit/8fcffb5)) -* added updateStoryStatus. The yellow line will only be driven when this is set to true ([c7ec8da](https://github.com/nrkno/tv-automation-server-core/commit/c7ec8da)) -* Adjust split box values ([680eb11](https://github.com/nrkno/tv-automation-server-core/commit/680eb11)) -* allow ? as 'any' field/frame type ([c950fba](https://github.com/nrkno/tv-automation-server-core/commit/c950fba)) -* allow a string array as mediaFlowIds in SLI content ([7ac6fb5](https://github.com/nrkno/tv-automation-server-core/commit/7ac6fb5)) -* allow reconnection action on click ([3575f4f](https://github.com/nrkno/tv-automation-server-core/commit/3575f4f)) -* Allow StudioInstallation to define entries in the hotkey legend ([74c1c1c](https://github.com/nrkno/tv-automation-server-core/commit/74c1c1c)) -* Allow to specify blueprint name in request query string ([e8c2dc9](https://github.com/nrkno/tv-automation-server-core/commit/e8c2dc9)) -* ask before closing an active RO (if allowed by browser) ([16ee66b](https://github.com/nrkno/tv-automation-server-core/commit/16ee66b)) -* Atem SuperSource properties support ([2688142](https://github.com/nrkno/tv-automation-server-core/commit/2688142)) -* autonext property is defined on the current SegmentLine rather than the next ([09441db](https://github.com/nrkno/tv-automation-server-core/commit/09441db)) -* backend implementation of migration (wip) ([8762ca3](https://github.com/nrkno/tv-automation-server-core/commit/8762ca3)) -* backup and restore show styles (including templates) through ui ([9758b2c](https://github.com/nrkno/tv-automation-server-core/commit/9758b2c)) -* be able to remove stored snapshots ([849f906](https://github.com/nrkno/tv-automation-server-core/commit/849f906)) -* better return type from post-process ([a971b43](https://github.com/nrkno/tv-automation-server-core/commit/a971b43)) -* BIG refactoring of Core ([9d6ae9e](https://github.com/nrkno/tv-automation-server-core/commit/9d6ae9e)) -* black / freeze frame detection warnings ([7166177](https://github.com/nrkno/tv-automation-server-core/commit/7166177)) -* block take if duration since startedPlayback/take less than X ([99d41b9](https://github.com/nrkno/tv-automation-server-core/commit/99d41b9)) -* blueprint migration implementation (it works now) ([15250b2](https://github.com/nrkno/tv-automation-server-core/commit/15250b2)) -* blueprint migration, continued implementation ([ff507ab](https://github.com/nrkno/tv-automation-server-core/commit/ff507ab)) -* blueprintMigrations ([9527cae](https://github.com/nrkno/tv-automation-server-core/commit/9527cae)) -* blueprints context: handle notes externally (to ro notes) or internally (to logger) ([63640f2](https://github.com/nrkno/tv-automation-server-core/commit/63640f2)) -* Break nrk templates into seperate files. Parse KAM templates better ([2ec0433](https://github.com/nrkno/tv-automation-server-core/commit/2ec0433)) -* change heavy-light display style ([91a1931](https://github.com/nrkno/tv-automation-server-core/commit/91a1931)) -* change heavy-light display style ([329e2c6](https://github.com/nrkno/tv-automation-server-core/commit/329e2c6)) -* changed keyboard shortcuts ([ef02f7c](https://github.com/nrkno/tv-automation-server-core/commit/ef02f7c)) -* changed restart CasparCG functionality ([dd567c2](https://github.com/nrkno/tv-automation-server-core/commit/dd567c2)) -* Changes for blueprints-integration typings ([8d1f37d](https://github.com/nrkno/tv-automation-server-core/commit/8d1f37d)) -* cherry-pick changes from the UI feature branch ([dfbb3b4](https://github.com/nrkno/tv-automation-server-core/commit/dfbb3b4)) -* clean up: show style, blueprint, blueprint logic names in UI ([e1ae6a7](https://github.com/nrkno/tv-automation-server-core/commit/e1ae6a7)) -* codeControl: create syncFunctions which finer grained execution control based on arguments ([f53607f](https://github.com/nrkno/tv-automation-server-core/commit/f53607f)) -* componentize WorkFlow item ([f920e4b](https://github.com/nrkno/tv-automation-server-core/commit/f920e4b)) -* configuration UI for media manager ([b1883ec](https://github.com/nrkno/tv-automation-server-core/commit/b1883ec)) -* continued implementation of Migration (wip) ([72fbcb5](https://github.com/nrkno/tv-automation-server-core/commit/72fbcb5)) -* converted app.js to typescript and added an example subscription-implementation ([da439af](https://github.com/nrkno/tv-automation-server-core/commit/da439af)) -* converted more subscriptions (WIP) ([e047fef](https://github.com/nrkno/tv-automation-server-core/commit/e047fef)) -* converted StudioInstallation into a class, adding getConfigValue as member method, a step towards DRY ([4af278e](https://github.com/nrkno/tv-automation-server-core/commit/4af278e)) -* CoreSystem initial implementation ([06369b2](https://github.com/nrkno/tv-automation-server-core/commit/06369b2)) -* countdown to running order expectedStart ([7b505c5](https://github.com/nrkno/tv-automation-server-core/commit/7b505c5)) -* create action buttons in the Support PopUp for reset PG, take snapshot, show hotkeys ([be89893](https://github.com/nrkno/tv-automation-server-core/commit/be89893)) -* cron job for restarting casparcg ([19898d1](https://github.com/nrkno/tv-automation-server-core/commit/19898d1)) -* Crude ui to visualise generated timeline ([6e55382](https://github.com/nrkno/tv-automation-server-core/commit/6e55382)) -* Define all special blueprints as options in the showstyle ([7e1da16](https://github.com/nrkno/tv-automation-server-core/commit/7e1da16)) -* disable in next segmentLine & refactoring ([669166c](https://github.com/nrkno/tv-automation-server-core/commit/669166c)) -* disable shortcut-keys when modalDialog is open ([24bab3f](https://github.com/nrkno/tv-automation-server-core/commit/24bab3f)) -* dismiss all notifcations ([896dbb5](https://github.com/nrkno/tv-automation-server-core/commit/896dbb5)) -* display ms in user activity log ([7fc2744](https://github.com/nrkno/tv-automation-server-core/commit/7fc2744)) -* display ms in user activity log ([5172f2e](https://github.com/nrkno/tv-automation-server-core/commit/5172f2e)) -* do not block click-to-take when trigger is absolute 0 ([cec86ca](https://github.com/nrkno/tv-automation-server-core/commit/cec86ca)) -* don't restore from old snapshots ([bab8bbb](https://github.com/nrkno/tv-automation-server-core/commit/bab8bbb)) -* ensure each sli has a mosId set ([57c977d](https://github.com/nrkno/tv-automation-server-core/commit/57c977d)) -* expected audioTracks property ([250dc79](https://github.com/nrkno/tv-automation-server-core/commit/250dc79)) -* expose moment to templates ([c2a1cc5](https://github.com/nrkno/tv-automation-server-core/commit/c2a1cc5)) -* externalMessage: allow for multiple messages to be generated at the same time ([284efbe](https://github.com/nrkno/tv-automation-server-core/commit/284efbe)) -* externalMessages implementation (it works now) ([3b8e88a](https://github.com/nrkno/tv-automation-server-core/commit/3b8e88a)) -* f9, f10 buttons step next forward & down (shift reverses direction) ([a3be0cf](https://github.com/nrkno/tv-automation-server-core/commit/a3be0cf)) -* First draft at uploading a blueprints blob into a new db collection, and running it instead of the existing baseline ([31c56d8](https://github.com/nrkno/tv-automation-server-core/commit/31c56d8)) -* force some function to run synchronously. experimental, WIP! ([54d83dd](https://github.com/nrkno/tv-automation-server-core/commit/54d83dd)) -* force some function to run synchronously. experimental, WIP! ([55a064c](https://github.com/nrkno/tv-automation-server-core/commit/55a064c)) -* full implementation of mos-functions, profile 0 & 2 ([4bafeeb](https://github.com/nrkno/tv-automation-server-core/commit/4bafeeb)) -* Grafikk lookahead/preload ([30a6b03](https://github.com/nrkno/tv-automation-server-core/commit/30a6b03)) -* Grafikk lookahead/preload ([78828fe](https://github.com/nrkno/tv-automation-server-core/commit/78828fe)) -* handle mos updates with dynamicallyInserted segmentLines ([1d292c0](https://github.com/nrkno/tv-automation-server-core/commit/1d292c0)) -* handle roList reply on reload RunningOrder data, also more refactoring & cleanup ([cee70c5](https://github.com/nrkno/tv-automation-server-core/commit/cee70c5)) -* HOLD mode ([e41c5a4](https://github.com/nrkno/tv-automation-server-core/commit/e41c5a4)) -* HOLD mode ([ae1dacf](https://github.com/nrkno/tv-automation-server-core/commit/ae1dacf)) -* Hold state UI ([d835efc](https://github.com/nrkno/tv-automation-server-core/commit/d835efc)) -* Hold state UI ([c7a17c7](https://github.com/nrkno/tv-automation-server-core/commit/c7a17c7)) -* hyperdeck device ([#49](https://github.com/nrkno/tv-automation-server-core/issues/49)) ([c706628](https://github.com/nrkno/tv-automation-server-core/commit/c706628)) -* if template 'getId' returns null, don't throw an error. Also when templateId is not found, send warning instead of an error ([d98f09d](https://github.com/nrkno/tv-automation-server-core/commit/d98f09d)) -* implement (upcoming) blueprint API ([d86faa5](https://github.com/nrkno/tv-automation-server-core/commit/d86faa5)) -* implement camera number-device mapping for PTZ ([374568d](https://github.com/nrkno/tv-automation-server-core/commit/374568d)) -* implement click-to-adlib completely ([577dcac](https://github.com/nrkno/tv-automation-server-core/commit/577dcac)) -* implement Panasonic PTZ device ([42d8534](https://github.com/nrkno/tv-automation-server-core/commit/42d8534)) -* implement Panasonic PTZ settings ([f7840da](https://github.com/nrkno/tv-automation-server-core/commit/f7840da)) -* implement spliting long scripts into beginning and end in popup ([9fa8006](https://github.com/nrkno/tv-automation-server-core/commit/9fa8006)) -* implementation of blueprint migrations ([5fec7a2](https://github.com/nrkno/tv-automation-server-core/commit/5fec7a2)) -* implementation of disable-next-segmentLineItem ([a06d196](https://github.com/nrkno/tv-automation-server-core/commit/a06d196)) -* implementation of new blueprint API ([34f905f](https://github.com/nrkno/tv-automation-server-core/commit/34f905f)) -* implemented mos profiles 0-2 ([d803da1](https://github.com/nrkno/tv-automation-server-core/commit/d803da1)) -* Implemented Notes into data structure & GUI ([735b8c5](https://github.com/nrkno/tv-automation-server-core/commit/735b8c5)) -* implemented partial timeline fix ([c8b56e4](https://github.com/nrkno/tv-automation-server-core/commit/c8b56e4)) -* implemented stricter typing & changed classes to ReactMeteorComponent where applicable ([9d2166e](https://github.com/nrkno/tv-automation-server-core/commit/9d2166e)) -* implemented userActions ([2b343e6](https://github.com/nrkno/tv-automation-server-core/commit/2b343e6)) -* improved layout for presenter countdowns ([2bd61cc](https://github.com/nrkno/tv-automation-server-core/commit/2bd61cc)) -* include expectedMediaItems in RunningOrder snapshots ([9fcbba0](https://github.com/nrkno/tv-automation-server-core/commit/9fcbba0)) -* Infinite segmentlineitem ([c02a641](https://github.com/nrkno/tv-automation-server-core/commit/c02a641)) -* initial implementation of externalMessages, (not working yet) ([ace91f1](https://github.com/nrkno/tv-automation-server-core/commit/ace91f1)) -* Initial timings for opening templates ([a9bfb66](https://github.com/nrkno/tv-automation-server-core/commit/a9bfb66)) -* Interfaces for describing the timeline, segments (titles), layers ([ea96dfb](https://github.com/nrkno/tv-automation-server-core/commit/ea96dfb)) -* KAM SLUTT variant ([e819269](https://github.com/nrkno/tv-automation-server-core/commit/e819269)) -* List, start and stop test recordings ([df552ab](https://github.com/nrkno/tv-automation-server-core/commit/df552ab)) -* load atem ssrc background when activating RO ([0eda9b4](https://github.com/nrkno/tv-automation-server-core/commit/0eda9b4)) -* log warning message when trying to access a studio.config value that hasn't been set. ([7e706c6](https://github.com/nrkno/tv-automation-server-core/commit/7e706c6)) -* lookahead ([5ed0f13](https://github.com/nrkno/tv-automation-server-core/commit/5ed0f13)) -* manipulator methods for inserting & removing showStyleBase & showStyleVariant ([6bb4e00](https://github.com/nrkno/tv-automation-server-core/commit/6bb4e00)) -* Media Manager actions to restart & abort workflows ([6c94ad6](https://github.com/nrkno/tv-automation-server-core/commit/6c94ad6)) -* Media manager UI ([c83e1ff](https://github.com/nrkno/tv-automation-server-core/commit/c83e1ff)) -* media scanner & casparcg launcher hostnames ([02ec8be](https://github.com/nrkno/tv-automation-server-core/commit/02ec8be)) -* mediamanager: GUI support for SKIPPED step status ([1c39867](https://github.com/nrkno/tv-automation-server-core/commit/1c39867)) -* MeteorReactComponent: return subscription & computation handle ([e20e6de](https://github.com/nrkno/tv-automation-server-core/commit/e20e6de)) -* method "ping" to be called by devices every now and then, to update lastSeen ([41a996c](https://github.com/nrkno/tv-automation-server-core/commit/41a996c)) -* Migration UI & started adding migration steps ([2a117ad](https://github.com/nrkno/tv-automation-server-core/commit/2a117ad)) -* Migration: added more migration steps for 0.16.0 ([2ac06ea](https://github.com/nrkno/tv-automation-server-core/commit/2ac06ea)) -* Migration: continued impl. ([8982701](https://github.com/nrkno/tv-automation-server-core/commit/8982701)) -* monitor externalMessageQueue for system status ([e92f5be](https://github.com/nrkno/tv-automation-server-core/commit/e92f5be)) -* more WIP for support panel ([b23c855](https://github.com/nrkno/tv-automation-server-core/commit/b23c855)) -* more work on notification center ([92196ca](https://github.com/nrkno/tv-automation-server-core/commit/92196ca)) -* more work on notification center ([a34ccd0](https://github.com/nrkno/tv-automation-server-core/commit/a34ccd0)) -* more work on peripheralDevices notifications ([692b1b2](https://github.com/nrkno/tv-automation-server-core/commit/692b1b2)) -* more work on peripheralDevices notifications ([36a0a4b](https://github.com/nrkno/tv-automation-server-core/commit/36a0a4b)) -* Move all device specific TimelineObj types to tsr-types ([55766a5](https://github.com/nrkno/tv-automation-server-core/commit/55766a5)) -* move delete button to peripheralDevice page ([46647c1](https://github.com/nrkno/tv-automation-server-core/commit/46647c1)) -* move delete button to peripheralDevice page ([286d12f](https://github.com/nrkno/tv-automation-server-core/commit/286d12f)) -* Move Mapping types to tsr-types package ([67bd838](https://github.com/nrkno/tv-automation-server-core/commit/67bd838)) -* Move SegmentLine duration calculation into templates ([315eb42](https://github.com/nrkno/tv-automation-server-core/commit/315eb42)) -* Move sofie and metadata urls from templates to config ([af8e388](https://github.com/nrkno/tv-automation-server-core/commit/af8e388)) -* Move types to blueprint-integration ([c305061](https://github.com/nrkno/tv-automation-server-core/commit/c305061)) -* moved nightly cronjob to run after 4am ([8eb4e12](https://github.com/nrkno/tv-automation-server-core/commit/8eb4e12)) -* multiSelect component for selecting compatible Show Styles ([e1a5c35](https://github.com/nrkno/tv-automation-server-core/commit/e1a5c35)) -* only log logger.debug() when in developer mode ([8ed8e71](https://github.com/nrkno/tv-automation-server-core/commit/8ed8e71)) -* optimization: add cache of blueprints, to avoid having to parse text-functions all the time ([1e469d9](https://github.com/nrkno/tv-automation-server-core/commit/1e469d9)) -* output evaluation to log ([7deca0f](https://github.com/nrkno/tv-automation-server-core/commit/7deca0f)) -* output evaluation to log ([f95cfbf](https://github.com/nrkno/tv-automation-server-core/commit/f95cfbf)) -* place all collections in Collections object, for debugging purposes ([9682a89](https://github.com/nrkno/tv-automation-server-core/commit/9682a89)) -* playout device debugLogging (wip) ([7ab4ec6](https://github.com/nrkno/tv-automation-server-core/commit/7ab4ec6)) -* prevent next:ing of currently playing segmentLine ([b9c9ea1](https://github.com/nrkno/tv-automation-server-core/commit/b9c9ea1)) -* prompter-view ([f45a923](https://github.com/nrkno/tv-automation-server-core/commit/f45a923)) -* rabbitMQ: add support for headers ([e3e3d48](https://github.com/nrkno/tv-automation-server-core/commit/e3e3d48)) -* rabbitMQ: headers ([087bb2e](https://github.com/nrkno/tv-automation-server-core/commit/087bb2e)) -* Read all templates from database ([3287f63](https://github.com/nrkno/tv-automation-server-core/commit/3287f63)) -* Refactor blueprint contexts so be different per type to limit exposed api ([f0d1c7c](https://github.com/nrkno/tv-automation-server-core/commit/f0d1c7c)) -* Refactor external message template code ([21ac50e](https://github.com/nrkno/tv-automation-server-core/commit/21ac50e)) -* refactor of subscriptions (WIP) ([2b6f994](https://github.com/nrkno/tv-automation-server-core/commit/2b6f994)) -* Refactor story template code to use new blueprint structure ([104982b](https://github.com/nrkno/tv-automation-server-core/commit/104982b)) -* refactor systemStatus & add status messages on front page ([14da61a](https://github.com/nrkno/tv-automation-server-core/commit/14da61a)) -* refactor to use relative durations. affects infinite segmentlineitems, autonext, segmentline overlapduration property ([67c5444](https://github.com/nrkno/tv-automation-server-core/commit/67c5444)) -* refactored initDB into 2 separate methods, so we can easilly update just the layers and not the infrastructure ([d4fcc3f](https://github.com/nrkno/tv-automation-server-core/commit/d4fcc3f)) -* Reference blueprints-integration api file ([dc1cdb8](https://github.com/nrkno/tv-automation-server-core/commit/dc1cdb8)) -* Reference blueprints-integration utils file ([d94c97b](https://github.com/nrkno/tv-automation-server-core/commit/d94c97b)) -* Reference device options in tsr-types ([049b9bc](https://github.com/nrkno/tv-automation-server-core/commit/049b9bc)) -* reimplement fullscreen/on air button ([4b8658d](https://github.com/nrkno/tv-automation-server-core/commit/4b8658d)) -* Remove monaco ([e417548](https://github.com/nrkno/tv-automation-server-core/commit/e417548)) -* rename /clock into /countdowns/presenter ([96c3136](https://github.com/nrkno/tv-automation-server-core/commit/96c3136)) -* reset 'dirty' segment lines by re-running blueprints on them ([064a84d](https://github.com/nrkno/tv-automation-server-core/commit/064a84d)) -* restart CasparCG from UI ([64509c3](https://github.com/nrkno/tv-automation-server-core/commit/64509c3)) -* reworked externalMessages page ([3b87242](https://github.com/nrkno/tv-automation-server-core/commit/3b87242)) -* reworked the whole activate/deacticate/reset/reload logic ([1fea56e](https://github.com/nrkno/tv-automation-server-core/commit/1fea56e)) -* Rewrite templateContext.getConfigValue to get default values from defaultConfig 'blueprint' and to cache values ([6ce0f97](https://github.com/nrkno/tv-automation-server-core/commit/6ce0f97)) -* running order full-screen marker ([03010ec](https://github.com/nrkno/tv-automation-server-core/commit/03010ec)) -* RunningOrder unsynced notification ([9effce5](https://github.com/nrkno/tv-automation-server-core/commit/9effce5)) -* second upload to atem ([6697a80](https://github.com/nrkno/tv-automation-server-core/commit/6697a80)) -* segment line arguments ([3c5313a](https://github.com/nrkno/tv-automation-server-core/commit/3c5313a)) -* send evaluation message to slack. WIP ([3dcbe3a](https://github.com/nrkno/tv-automation-server-core/commit/3dcbe3a)) -* send evaluation message to slack. WIP ([96e8b81](https://github.com/nrkno/tv-automation-server-core/commit/96e8b81)) -* separate RO list into synced and unsynced lists ([6b92f40](https://github.com/nrkno/tv-automation-server-core/commit/6b92f40)) -* server side implementation of queueabilified adlibs ([0527b3b](https://github.com/nrkno/tv-automation-server-core/commit/0527b3b)) -* set triggerValue to lawo-TimelineObjs, so it triggers upon Nexting ([e3df655](https://github.com/nrkno/tv-automation-server-core/commit/e3df655)) -* settings: add workflow linger time ([9beefda](https://github.com/nrkno/tv-automation-server-core/commit/9beefda)) -* show 99+ instead of actual number for notifications ([1f84e67](https://github.com/nrkno/tv-automation-server-core/commit/1f84e67)) -* show blueprint id in select options in Show Styles, hyphenated show-styles doesn't seem right ([e19802f](https://github.com/nrkno/tv-automation-server-core/commit/e19802f)) -* show changed timestamp on script items ([f2955e1](https://github.com/nrkno/tv-automation-server-core/commit/f2955e1)) -* show user name in evaluations ([c59d7ee](https://github.com/nrkno/tv-automation-server-core/commit/c59d7ee)) -* ShowStyle templates can be marked as helpers and accessed from other templates ([a20ffa7](https://github.com/nrkno/tv-automation-server-core/commit/a20ffa7)) -* Simplify RunningOrderBaseItem type ([2b8257b](https://github.com/nrkno/tv-automation-server-core/commit/2b8257b)) -* some work on notification center ([8e2c269](https://github.com/nrkno/tv-automation-server-core/commit/8e2c269)) -* some work on notification center ([58ad599](https://github.com/nrkno/tv-automation-server-core/commit/58ad599)) -* SOURCE_NOT_SET for SLI Status ([cff64e1](https://github.com/nrkno/tv-automation-server-core/commit/cff64e1)) -* Split (DVE 2LIKE) template ([8ccf23e](https://github.com/nrkno/tv-automation-server-core/commit/8ccf23e)) -* Start moving some migrations to blueprints ([9d4949e](https://github.com/nrkno/tv-automation-server-core/commit/9d4949e)) -* Start of stk and grafikk templates ([0458e3e](https://github.com/nrkno/tv-automation-server-core/commit/0458e3e)) -* Start using types from sofie-blueprints-integration ([6106d99](https://github.com/nrkno/tv-automation-server-core/commit/6106d99)) -* started on mos device data implementation ([1d3b19a](https://github.com/nrkno/tv-automation-server-core/commit/1d3b19a)) -* started working on integration tests, added a client-side stub ([c4cbadc](https://github.com/nrkno/tv-automation-server-core/commit/c4cbadc)) -* status endpoint /health updated to use device statuses ([2c4b7fa](https://github.com/nrkno/tv-automation-server-core/commit/2c4b7fa)) -* Strip out old runtime functions ([880a885](https://github.com/nrkno/tv-automation-server-core/commit/880a885)) -* StudioInstallation key-value config store for template settings ([b37ea17](https://github.com/nrkno/tv-automation-server-core/commit/b37ea17)) -* StudioInstallation key-value config store for template settings ([812c313](https://github.com/nrkno/tv-automation-server-core/commit/812c313)) -* support for multiple notification actions ([09be9c1](https://github.com/nrkno/tv-automation-server-core/commit/09be9c1)) -* support for Pharos device ([4a99fb3](https://github.com/nrkno/tv-automation-server-core/commit/4a99fb3)) -* support media manager integration ([dcbf282](https://github.com/nrkno/tv-automation-server-core/commit/dcbf282)) -* Support panel WIP ([6955fdc](https://github.com/nrkno/tv-automation-server-core/commit/6955fdc)) -* support preload lookahead mode for nora, which swaps out take commands for cue ([4cfd4fe](https://github.com/nrkno/tv-automation-server-core/commit/4cfd4fe)) -* Switch to single-device design ([a268c40](https://github.com/nrkno/tv-automation-server-core/commit/a268c40)) -* System snapshot ([006027b](https://github.com/nrkno/tv-automation-server-core/commit/006027b)) -* **asRunLog:** collection implementation ([0e63c36](https://github.com/nrkno/tv-automation-server-core/commit/0e63c36)) -* **asRunLog:** implementation of asRunLog ([62f5b8c](https://github.com/nrkno/tv-automation-server-core/commit/62f5b8c)) -* use generated svg as icons in countdown ([843ad10](https://github.com/nrkno/tv-automation-server-core/commit/843ad10)) -* **aux:** Adds tecnical error aux 2 ([34ce710](https://github.com/nrkno/tv-automation-server-core/commit/34ce710)) -* **AUX:** adds clock aux ([45479da](https://github.com/nrkno/tv-automation-server-core/commit/45479da)) -* **AUXes:** New AUX-mapping introducing more previews and moves the cleanfeed ([548bd8c](https://github.com/nrkno/tv-automation-server-core/commit/548bd8c)) -* **blueprints:** Add minimum core version to blueprints. Move blueprint restore code to api/blueprints ([2453a16](https://github.com/nrkno/tv-automation-server-core/commit/2453a16)) -* **blueprints:** Add section of studio settings based off a manifest from the blueprints ([4866a79](https://github.com/nrkno/tv-automation-server-core/commit/4866a79)) -* **blueprints:** Expose version string and uploading in the ui ([00875a4](https://github.com/nrkno/tv-automation-server-core/commit/00875a4)) -* **Capabilities:** Added basic Lawo and ATEM capabilities ([90d6edd](https://github.com/nrkno/tv-automation-server-core/commit/90d6edd)) -* **click-to-take:** initial WIP ([8e63808](https://github.com/nrkno/tv-automation-server-core/commit/8e63808)) -* **click-to-take:** more work in progress ([e3549e0](https://github.com/nrkno/tv-automation-server-core/commit/e3549e0)) -* **device:** Custom make-ready commands for httpsend device ([410a2ef](https://github.com/nrkno/tv-automation-server-core/commit/410a2ef)) -* **ENV:** adds ENV vars for default devices - casparcg, atem and lawo ([9bf8eee](https://github.com/nrkno/tv-automation-server-core/commit/9bf8eee)) -* **expected media items:** updateExpectedMediaItems function ([e1ad692](https://github.com/nrkno/tv-automation-server-core/commit/e1ad692)) -* **expected media items:** use segmentLineId as key ([3803e87](https://github.com/nrkno/tv-automation-server-core/commit/3803e87)) -* **externalMessages:** add hold property, to be able to pause sending of messages ([adc69d8](https://github.com/nrkno/tv-automation-server-core/commit/adc69d8)) -* **Guest input:** use isGuestInput like isRemoteInput ([2d40e87](https://github.com/nrkno/tv-automation-server-core/commit/2d40e87)) -* **health check:** statusMessage implementation ([9bcf95a](https://github.com/nrkno/tv-automation-server-core/commit/9bcf95a)) -* **health check:** statusMessage implementation ([b01ac48](https://github.com/nrkno/tv-automation-server-core/commit/b01ac48)) -* **hotkeys:** optional cool down ([c9c2743](https://github.com/nrkno/tv-automation-server-core/commit/c9c2743)) -* **init:** adds clear shortcuts + skippabloe ([f824ae5](https://github.com/nrkno/tv-automation-server-core/commit/f824ae5)) -* **init:** adds multiple bak source layers ([c812510](https://github.com/nrkno/tv-automation-server-core/commit/c812510)) -* **init:** Adds RM 4,5,6 ([0021d7b](https://github.com/nrkno/tv-automation-server-core/commit/0021d7b)) -* **init:** Adds RM 4,5,6 ([dd59d47](https://github.com/nrkno/tv-automation-server-core/commit/dd59d47)) -* **init:** adds studio monitor html player to casparcg ([6533b0f](https://github.com/nrkno/tv-automation-server-core/commit/6533b0f)) -* **init:** bakskjerm type ([8ffe776](https://github.com/nrkno/tv-automation-server-core/commit/8ffe776)) -* **init:** moves countdown to casparcg machine 2, channel 1 ([18c354b](https://github.com/nrkno/tv-automation-server-core/commit/18c354b)) -* **init:** moves countdown to casparcg machine 2, channel 1 ([6c93464](https://github.com/nrkno/tv-automation-server-core/commit/6c93464)) -* **iterateDeeply:** exports iterateDeeply to template context ([42cc886](https://github.com/nrkno/tv-automation-server-core/commit/42cc886)) -* **lawo:** New structure to lawo devices and mappings ([35d812b](https://github.com/nrkno/tv-automation-server-core/commit/35d812b)) -* **loggin:** uses logger for better kibana logs ([8d31691](https://github.com/nrkno/tv-automation-server-core/commit/8d31691)) -* **Media manager settings:** add 'mediaPath' property to storages ([50185b2](https://github.com/nrkno/tv-automation-server-core/commit/50185b2)) -* **media manager ui:** fix animations ([10a38de](https://github.com/nrkno/tv-automation-server-core/commit/10a38de)) -* **media manager ui:** nearly finishing the styling ([1bb3116](https://github.com/nrkno/tv-automation-server-core/commit/1bb3116)) -* **media manager ui:** show workflow creation time ([84a4b71](https://github.com/nrkno/tv-automation-server-core/commit/84a4b71)) -* **media manager UI:** WIP ([ccb54f0](https://github.com/nrkno/tv-automation-server-core/commit/ccb54f0)) -* **migration:** add previousVersion and buttons in GUI to revert database version ([61525a5](https://github.com/nrkno/tv-automation-server-core/commit/61525a5)) -* **migration:** display returned error message in GUI ([6169048](https://github.com/nrkno/tv-automation-server-core/commit/6169048)) -* **migration:** reafactor migrations and add new migration steps ([0966ef6](https://github.com/nrkno/tv-automation-server-core/commit/0966ef6)) -* **migrations:** automatically continue partialMigrations when possible ([f75e907](https://github.com/nrkno/tv-automation-server-core/commit/f75e907)) -* **migrations:** Move playout-device migrations to blueprints ([04029d4](https://github.com/nrkno/tv-automation-server-core/commit/04029d4)) -* **multi-step success:** introduce keyStep property ([fc8aebd](https://github.com/nrkno/tv-automation-server-core/commit/fc8aebd)) -* **Next:** Adds warning/fallback of not loaded clips ([e20bc2f](https://github.com/nrkno/tv-automation-server-core/commit/e20bc2f)) -* **notification center:** hot-links to RO note notifications ([f3e9f59](https://github.com/nrkno/tv-automation-server-core/commit/f3e9f59)) -* **notification center:** notification count ([b8fbcac](https://github.com/nrkno/tv-automation-server-core/commit/b8fbcac)) -* **notification center:** squish segments in RO view when NC is open ([36b514f](https://github.com/nrkno/tv-automation-server-core/commit/36b514f)) -* **notification-center:** connection status notifier et al. ([5aefd52](https://github.com/nrkno/tv-automation-server-core/commit/5aefd52)) -* **notification-center:** connection status notifier et al. ([e529e94](https://github.com/nrkno/tv-automation-server-core/commit/e529e94)) -* **notification-center:** move expand notification center to right-hand status bar ([2750fab](https://github.com/nrkno/tv-automation-server-core/commit/2750fab)) -* **notification-center:** move expand notification center to right-hand status bar ([635c09d](https://github.com/nrkno/tv-automation-server-core/commit/635c09d)) -* **notification-center:** NotificationCenterPanel et al. ([9283909](https://github.com/nrkno/tv-automation-server-core/commit/9283909)) -* **notification-center:** NotificationCenterPanel et al. ([c4794c8](https://github.com/nrkno/tv-automation-server-core/commit/c4794c8)) -* **notification-center:** segment warning tweak ([d4fc5e7](https://github.com/nrkno/tv-automation-server-core/commit/d4fc5e7)) -* **notification-center:** segment warning tweak ([e956488](https://github.com/nrkno/tv-automation-server-core/commit/e956488)) -* **notifications-center:** notification center in other pages than ROV ([5250aab](https://github.com/nrkno/tv-automation-server-core/commit/5250aab)) -* **notifications-center:** notification center in other pages than ROV ([0620115](https://github.com/nrkno/tv-automation-server-core/commit/0620115)) -* **onlySelectedFiles:** support only selected files flag on shared storage options ([dee11d2](https://github.com/nrkno/tv-automation-server-core/commit/dee11d2)) -* **peripheralDevices:** added collection, publication, api, access control and tests ([794b5be](https://github.com/nrkno/tv-automation-server-core/commit/794b5be)) -* **playout:** Add class to sli first_object to indicate if sli is from the current or previous sl ([8de6004](https://github.com/nrkno/tv-automation-server-core/commit/8de6004)) -* **playout:** Add class to sli first_object when the sli is a continuation of another ([d53f06b](https://github.com/nrkno/tv-automation-server-core/commit/d53f06b)) -* **playout:** Add classes to sl-firstobject from the current and prev sl. This will allow for some logical triggers which can be influenced by the prev sl ([632326f](https://github.com/nrkno/tv-automation-server-core/commit/632326f)) -* **playout:** Add object to timeline to indicate whether ro is active or in rehersal ([d0e850d](https://github.com/nrkno/tv-automation-server-core/commit/d0e850d)) -* **Prompter:** implement a simple mirror mode ([8d0be4e](https://github.com/nrkno/tv-automation-server-core/commit/8d0be4e)) -* **rabbit:** initial commit (wip) ([7ed3223](https://github.com/nrkno/tv-automation-server-core/commit/7ed3223)) -* **rabbitmq:** Implementation of RabbitMQ external message queue ([b31e15f](https://github.com/nrkno/tv-automation-server-core/commit/b31e15f)) -* **rabbitmq:** message id ([7ce9e5a](https://github.com/nrkno/tv-automation-server-core/commit/7ce9e5a)) -* **record:** basic video player page ([138b8b9](https://github.com/nrkno/tv-automation-server-core/commit/138b8b9)) -* **record:** Controls to delete files ([4236db2](https://github.com/nrkno/tv-automation-server-core/commit/4236db2)) -* **record:** Create timelineobjects to control recording to the timeline. Add config to the db, and ui to edit it ([b5e4ebf](https://github.com/nrkno/tv-automation-server-core/commit/b5e4ebf)) -* **record:** Input field for user to give recording a name ([116ea9f](https://github.com/nrkno/tv-automation-server-core/commit/116ea9f)) -* **refactor:** move Runtime Arguments for Blueprints from StudioInstallation to ShowStyleBase ([9b2c2d8](https://github.com/nrkno/tv-automation-server-core/commit/9b2c2d8)) -* **RO view:** Introduce a 'duration settling' state to delay the UI update until the actual playout duration is received from playout ([28823c3](https://github.com/nrkno/tv-automation-server-core/commit/28823c3)) -* **Setting:** adds lawo setting to studio and devices ([5ab1717](https://github.com/nrkno/tv-automation-server-core/commit/5ab1717)) -* **settings:** playout devices have threadUsage ([b74410c](https://github.com/nrkno/tv-automation-server-core/commit/b74410c)) -* **shortcuts:** adds shortcuts to remove various graphic layers ([0d1a83d](https://github.com/nrkno/tv-automation-server-core/commit/0d1a83d)) -* **shortcuts:** standarize shortcut label display, support numpad ([4c5ba74](https://github.com/nrkno/tv-automation-server-core/commit/4c5ba74)) -* **snapshot:** continued implementation ([009e9e5](https://github.com/nrkno/tv-automation-server-core/commit/009e9e5)) -* **snapshot:** edit snapshot comments ([264638a](https://github.com/nrkno/tv-automation-server-core/commit/264638a)) -* **snapshot:** Implement snapshots, API endpoints & restore ([72e1a83](https://github.com/nrkno/tv-automation-server-core/commit/72e1a83)) -* **snapshot:** implement support for taking snapshot of settings related to a single studio ([d177113](https://github.com/nrkno/tv-automation-server-core/commit/d177113)) -* **snapshot:** snapshot restore/backup GUI ([c414f70](https://github.com/nrkno/tv-automation-server-core/commit/c414f70)) -* **snapshot:** take snapshot of runningOrder & restore ([fc34f73](https://github.com/nrkno/tv-automation-server-core/commit/fc34f73)) -* system version status monitoring ([1c96263](https://github.com/nrkno/tv-automation-server-core/commit/1c96263)) -* system-wide message ([d7305df](https://github.com/nrkno/tv-automation-server-core/commit/d7305df)) -* take snapshot before running migration ([3ae4e92](https://github.com/nrkno/tv-automation-server-core/commit/3ae4e92)) -* take snapshot when saving evaluation form ([df318bb](https://github.com/nrkno/tv-automation-server-core/commit/df318bb)) -* take snapshot when saving evaluation form ([b98d68f](https://github.com/nrkno/tv-automation-server-core/commit/b98d68f)) -* templates: added format functions for timecode ([ea38081](https://github.com/nrkno/tv-automation-server-core/commit/ea38081)) -* this did not look right button ([1e01a10](https://github.com/nrkno/tv-automation-server-core/commit/1e01a10)) -* **template:** use upstream keyer for vignett playback. Adds some more layers for atem defaults, and overrides to stack changes better ([76b1e10](https://github.com/nrkno/tv-automation-server-core/commit/76b1e10)) -* timings page ([6bc325a](https://github.com/nrkno/tv-automation-server-core/commit/6bc325a)) -* toggle running order argument on an SL with a hotkey ([258c3b3](https://github.com/nrkno/tv-automation-server-core/commit/258c3b3)) -* Transition as a seperate SegmentLineItem, which is not run if the first SegmentLine in the show, or the previous SegmentLine instructs it to not ([e676a43](https://github.com/nrkno/tv-automation-server-core/commit/e676a43)) -* translation improvements ([d3a535d](https://github.com/nrkno/tv-automation-server-core/commit/d3a535d)) -* Treat sli marked as virtual solely as markers for the timeline. They are hidden from the ui and are not allowed to place any contents on the timeline ([25e0f42](https://github.com/nrkno/tv-automation-server-core/commit/25e0f42)) -* **timeline:** some initial work on labels taking account of liveline ([3086eec](https://github.com/nrkno/tv-automation-server-core/commit/3086eec)) -* trim config values (strings) ([d41e07e](https://github.com/nrkno/tv-automation-server-core/commit/d41e07e)) -* updated timeline dependency ([6ef9eb7](https://github.com/nrkno/tv-automation-server-core/commit/6ef9eb7)) -* **template:** setup atem wipe transition ([f0c576c](https://github.com/nrkno/tv-automation-server-core/commit/f0c576c)) -* unsynced mode ([#51](https://github.com/nrkno/tv-automation-server-core/issues/51)) ([7e0a263](https://github.com/nrkno/tv-automation-server-core/commit/7e0a263)) -* update blueprint contexts to match new API ([ab6fc5a](https://github.com/nrkno/tv-automation-server-core/commit/ab6fc5a)) -* update meteor typings ([49b6969](https://github.com/nrkno/tv-automation-server-core/commit/49b6969)) -* Update template to use correct media files and durations. Adjust transitions from head to kam ([18f6c44](https://github.com/nrkno/tv-automation-server-core/commit/18f6c44)) -* Update timeline and infinite items on enps update ([db0c041](https://github.com/nrkno/tv-automation-server-core/commit/db0c041)) -* **template:** temporary env variable for nora group (MESOS_NORA_GROUP) ([8b00bc4](https://github.com/nrkno/tv-automation-server-core/commit/8b00bc4)) -* **Template doc:** Added CasparCG resources ([80f98d5](https://github.com/nrkno/tv-automation-server-core/commit/80f98d5)) -* use date-picker for user-activity-log ([5e2c218](https://github.com/nrkno/tv-automation-server-core/commit/5e2c218)) -* **templates:** Use ShowStyle to define default/fallback state. Play and stop head supers ([8375363](https://github.com/nrkno/tv-automation-server-core/commit/8375363)) -* **Templates:** Start parsing some new mos data. Process mesos based graphics. Set some lawo audio states ([df4b670](https://github.com/nrkno/tv-automation-server-core/commit/df4b670)) -* update type dependencies and type references. Removed dependency of mos-connection and replaced it with references to the blueprints-integration. ([85bd795](https://github.com/nrkno/tv-automation-server-core/commit/85bd795)) -* **timeline:** Remove deviceId field from timeline objects ([85c4b89](https://github.com/nrkno/tv-automation-server-core/commit/85c4b89)) -* update types deps & API methods ([7d1a49b](https://github.com/nrkno/tv-automation-server-core/commit/7d1a49b)) -* Update typings for blueprints to be more specific ([53f7281](https://github.com/nrkno/tv-automation-server-core/commit/53f7281)) -* Update typings for message blueprint ([cf13fc9](https://github.com/nrkno/tv-automation-server-core/commit/cf13fc9)) -* updated to match blueprints-integration /develop, started on new message-flow, WIP ([6b84b75](https://github.com/nrkno/tv-automation-server-core/commit/6b84b75)) -* url parameter "all" configures ui modes ([586d5f4](https://github.com/nrkno/tv-automation-server-core/commit/586d5f4)) -* use default renderer for MIC sourceLayerType ([ce845d4](https://github.com/nrkno/tv-automation-server-core/commit/ce845d4)) -* use default renderer for MIC sourceLayerType ([6ab97b7](https://github.com/nrkno/tv-automation-server-core/commit/6ab97b7)) -* **Timeline:** more work on new marker style ([570e408](https://github.com/nrkno/tv-automation-server-core/commit/570e408)) -* warn media status for interlacing and fps ([fc3ac4b](https://github.com/nrkno/tv-automation-server-core/commit/fc3ac4b)) -* warnings for media in wrong resolution ([55135c1](https://github.com/nrkno/tv-automation-server-core/commit/55135c1)) -* WIP: VERY preliminary implementation of quick and dirty manual playback ([a9ec948](https://github.com/nrkno/tv-automation-server-core/commit/a9ec948)) -* wrap blueprint functions, to emit better errors ([14873f1](https://github.com/nrkno/tv-automation-server-core/commit/14873f1)) -* zoom control buttons ([41c1c92](https://github.com/nrkno/tv-automation-server-core/commit/41c1c92)) - - +- add a subtle line underneath segment title when has-remote-items and has-guest-items ([4b1d582](https://github.com/nrkno/tv-automation-server-core/commit/4b1d582)) +- add a subtle line underneath segment title when has-remote-items and has-guest-items ([a02b50d](https://github.com/nrkno/tv-automation-server-core/commit/a02b50d)) +- Add backup link to backup only active template data ([cdfffdf](https://github.com/nrkno/tv-automation-server-core/commit/cdfffdf)) +- Add backup restore method to import mock rundowns similar to the embedded mocks ([251555b](https://github.com/nrkno/tv-automation-server-core/commit/251555b)) +- Add backup restore method to import mock rundowns similar to the embedded mocks ([d71d9c7](https://github.com/nrkno/tv-automation-server-core/commit/d71d9c7)) +- add expected media items collection ([931536e](https://github.com/nrkno/tv-automation-server-core/commit/931536e)) +- Add runHelper method to template context ([ebc477a](https://github.com/nrkno/tv-automation-server-core/commit/ebc477a)) +- **blueprint:** refactor getConfigValue into the blueprints, with context exposing the raw array as getConfig instead ([5b0ac39](https://github.com/nrkno/tv-automation-server-core/commit/5b0ac39)) +- Add expected media items collection ([04c15a9](https://github.com/nrkno/tv-automation-server-core/commit/04c15a9)) +- Add http put request timeline object ([14f391c](https://github.com/nrkno/tv-automation-server-core/commit/14f391c)) +- add link to compatible studios from ShowStyle page ([4be495c](https://github.com/nrkno/tv-automation-server-core/commit/4be495c)) +- Add LOG_FILE env var to specify the file to log to ([d2ad941](https://github.com/nrkno/tv-automation-server-core/commit/d2ad941)) +- Add LOG_FILE env var to specify the file to log to ([8a192bc](https://github.com/nrkno/tv-automation-server-core/commit/8a192bc)) +- Add Media_Manager DeviceType ([2b612c7](https://github.com/nrkno/tv-automation-server-core/commit/2b612c7)) +- add methods for insert/remove blueprints ([8acb72b](https://github.com/nrkno/tv-automation-server-core/commit/8acb72b)) +- add migration steps, logging ([96aae63](https://github.com/nrkno/tv-automation-server-core/commit/96aae63)) +- add nn translation and update nb translation ([922b93b](https://github.com/nrkno/tv-automation-server-core/commit/922b93b)) +- add nn-nynorsk and update nb-bokmal translation ([6db7a99](https://github.com/nrkno/tv-automation-server-core/commit/6db7a99)) +- Add OSC Playout device type ([bf426b5](https://github.com/nrkno/tv-automation-server-core/commit/bf426b5)) +- add performance monitor and track all server-side methods ([2733d74](https://github.com/nrkno/tv-automation-server-core/commit/2733d74)) +- add performance monitor and track all server-side methods ([385f703](https://github.com/nrkno/tv-automation-server-core/commit/385f703)) +- add peripheralDevice expectedVersions, to throw error if device version is too low. Refactor /health endpoint. ([51ed4c3](https://github.com/nrkno/tv-automation-server-core/commit/51ed4c3)) +- add property .deviceId to MediaWorkFlow & MedieWorkFlowStep, to indicate ownership. (preliminary implementation) ([62ac066](https://github.com/nrkno/tv-automation-server-core/commit/62ac066)) +- add restart button ([6083145](https://github.com/nrkno/tv-automation-server-core/commit/6083145)) +- add restart button ([9b43d6f](https://github.com/nrkno/tv-automation-server-core/commit/9b43d6f)) +- add rewind button ([9fd61b5](https://github.com/nrkno/tv-automation-server-core/commit/9fd61b5)) +- add rewind button ([f235a25](https://github.com/nrkno/tv-automation-server-core/commit/f235a25)) +- Add running order name to top of run page ([674c392](https://github.com/nrkno/tv-automation-server-core/commit/674c392)) +- Add SegmentLineItem.infiniteMode value for items which are infinite within the SegmentLine ([e99c661](https://github.com/nrkno/tv-automation-server-core/commit/e99c661)) +- add setting for playout device: multiThreadedResolver ([37f2aa7](https://github.com/nrkno/tv-automation-server-core/commit/37f2aa7)) +- add snapshot restore statistics to logging ([45115f3](https://github.com/nrkno/tv-automation-server-core/commit/45115f3)) +- Add some new template config data for sources information ([3e48508](https://github.com/nrkno/tv-automation-server-core/commit/3e48508)) +- add sourceLayerType.LIGHTS ([0554251](https://github.com/nrkno/tv-automation-server-core/commit/0554251)) +- add stoppedPlayback tracking ([ddbdd66](https://github.com/nrkno/tv-automation-server-core/commit/ddbdd66)) +- add stoppedPlayback tracking ([7345856](https://github.com/nrkno/tv-automation-server-core/commit/7345856)) +- add studioInstallation.settings, mediaPreviewsUrl and sofieUrl, to replace configs ([adc6cb5](https://github.com/nrkno/tv-automation-server-core/commit/adc6cb5)) +- add support for Config References (to be used for referencing usernames & passwords) ([6df8c6e](https://github.com/nrkno/tv-automation-server-core/commit/6df8c6e)) +- add support for refs in rabbitMQ-messages (for username & password) ([5b3ea33](https://github.com/nrkno/tv-automation-server-core/commit/5b3ea33)) +- add support for refs in rabbitMQ-messages (for username & password) ([e34ee34](https://github.com/nrkno/tv-automation-server-core/commit/e34ee34)) +- Add support for RuntimeArguments in blueprint migrations ([82e5286](https://github.com/nrkno/tv-automation-server-core/commit/82e5286)) +- Add support panel in Running Order View ([e3cee77](https://github.com/nrkno/tv-automation-server-core/commit/e3cee77)) +- Add typeSubVariant field to SegmentLine. ([#46](https://github.com/nrkno/tv-automation-server-core/issues/46)) ([82bd4bd](https://github.com/nrkno/tv-automation-server-core/commit/82bd4bd)) +- Add typeSubVariant field to SegmentLine. ([#46](https://github.com/nrkno/tv-automation-server-core/issues/46)) ([4af88d3](https://github.com/nrkno/tv-automation-server-core/commit/4af88d3)) +- Add version string field to blueprint collection ([869dd02](https://github.com/nrkno/tv-automation-server-core/commit/869dd02)) +- add versions to /health endpoint ([a324213](https://github.com/nrkno/tv-automation-server-core/commit/a324213)) +- add warnings for wrong field order ([c4d23d8](https://github.com/nrkno/tv-automation-server-core/commit/c4d23d8)) +- added .timings object to SegmentLine, to track take/playout times during playout ([5d860b3](https://github.com/nrkno/tv-automation-server-core/commit/5d860b3)) +- added "develop=1" to url, which re-enables right-click, for dev ([b73522c](https://github.com/nrkno/tv-automation-server-core/commit/b73522c)) +- added afterBroadcast form ([e98b59e](https://github.com/nrkno/tv-automation-server-core/commit/e98b59e)) +- added async database functions ([a754a24](https://github.com/nrkno/tv-automation-server-core/commit/a754a24)) +- added client-side logging wrapper ([06597be](https://github.com/nrkno/tv-automation-server-core/commit/06597be)) +- added connection status of peripheralDevices ([c0e0a94](https://github.com/nrkno/tv-automation-server-core/commit/c0e0a94)) +- added context.runningOrder, for blueprints to use ([855f6d4](https://github.com/nrkno/tv-automation-server-core/commit/855f6d4)) +- added device version to status page ([ed0acda](https://github.com/nrkno/tv-automation-server-core/commit/ed0acda)) +- Added dynamic template context ([0ea4849](https://github.com/nrkno/tv-automation-server-core/commit/0ea4849)) +- added executionTime to userAction ([1ca92c1](https://github.com/nrkno/tv-automation-server-core/commit/1ca92c1)) +- added getAllSegments, to use in metadata-template ([f8a5514](https://github.com/nrkno/tv-automation-server-core/commit/f8a5514)) +- added indexes for all collections ([6ef324c](https://github.com/nrkno/tv-automation-server-core/commit/6ef324c)) +- added kill process buttons to device status UI ([6fdab68](https://github.com/nrkno/tv-automation-server-core/commit/6fdab68)) +- added killProcess method, to be used by integration tests of gateways in closed environments ([7f2b42c](https://github.com/nrkno/tv-automation-server-core/commit/7f2b42c)) +- added MeteorReactComponent, which exposes subscribe & autorun, which will stop automatically on component unmount ([cf11808](https://github.com/nrkno/tv-automation-server-core/commit/cf11808)) +- added name and type to peripheralDevice ([915c518](https://github.com/nrkno/tv-automation-server-core/commit/915c518)) +- added packages: mocha and typescript ([8b19269](https://github.com/nrkno/tv-automation-server-core/commit/8b19269)) +- added peripheralDevice.lastConnected, to be used for sorting so they wont jump around in the UI ([08e97f7](https://github.com/nrkno/tv-automation-server-core/commit/08e97f7)) +- added pingWithCommand method, used by watchdog ([6f6427b](https://github.com/nrkno/tv-automation-server-core/commit/6f6427b)) +- Added publications for all running order data, and changed some interfaces ([2365fd2](https://github.com/nrkno/tv-automation-server-core/commit/2365fd2)) +- added SegmentLine.timings.stoppedPlayback property ([2121245](https://github.com/nrkno/tv-automation-server-core/commit/2121245)) +- added SegmentLine.timings.takeDone property ([d18d539](https://github.com/nrkno/tv-automation-server-core/commit/d18d539)) +- added some shadow to the status dots ([04df33c](https://github.com/nrkno/tv-automation-server-core/commit/04df33c)) +- added support for typescript ([d3471b3](https://github.com/nrkno/tv-automation-server-core/commit/d3471b3)) +- added temporary deploy script ([244fb5b](https://github.com/nrkno/tv-automation-server-core/commit/244fb5b)) +- added test-data for testing and mocking ([b277c3c](https://github.com/nrkno/tv-automation-server-core/commit/b277c3c)) +- added tests stub ([edd4b6e](https://github.com/nrkno/tv-automation-server-core/commit/edd4b6e)) +- added tictac for troubleshooting timings ([df91cea](https://github.com/nrkno/tv-automation-server-core/commit/df91cea)) +- added Timeline data structure ([35ce6db](https://github.com/nrkno/tv-automation-server-core/commit/35ce6db)) +- added Timeline.objectType and implemented the typing changes all around ([a69e626](https://github.com/nrkno/tv-automation-server-core/commit/a69e626)) +- added timestamp to externalMessage error ([e13d1d8](https://github.com/nrkno/tv-automation-server-core/commit/e13d1d8)) +- added timings property to adlig segmentLineItems ([b333bf1](https://github.com/nrkno/tv-automation-server-core/commit/b333bf1)) +- added unsyncedTime ([8fcffb5](https://github.com/nrkno/tv-automation-server-core/commit/8fcffb5)) +- added updateStoryStatus. The yellow line will only be driven when this is set to true ([c7ec8da](https://github.com/nrkno/tv-automation-server-core/commit/c7ec8da)) +- Adjust split box values ([680eb11](https://github.com/nrkno/tv-automation-server-core/commit/680eb11)) +- allow ? as 'any' field/frame type ([c950fba](https://github.com/nrkno/tv-automation-server-core/commit/c950fba)) +- allow a string array as mediaFlowIds in SLI content ([7ac6fb5](https://github.com/nrkno/tv-automation-server-core/commit/7ac6fb5)) +- allow reconnection action on click ([3575f4f](https://github.com/nrkno/tv-automation-server-core/commit/3575f4f)) +- Allow StudioInstallation to define entries in the hotkey legend ([74c1c1c](https://github.com/nrkno/tv-automation-server-core/commit/74c1c1c)) +- Allow to specify blueprint name in request query string ([e8c2dc9](https://github.com/nrkno/tv-automation-server-core/commit/e8c2dc9)) +- ask before closing an active RO (if allowed by browser) ([16ee66b](https://github.com/nrkno/tv-automation-server-core/commit/16ee66b)) +- Atem SuperSource properties support ([2688142](https://github.com/nrkno/tv-automation-server-core/commit/2688142)) +- autonext property is defined on the current SegmentLine rather than the next ([09441db](https://github.com/nrkno/tv-automation-server-core/commit/09441db)) +- backend implementation of migration (wip) ([8762ca3](https://github.com/nrkno/tv-automation-server-core/commit/8762ca3)) +- backup and restore show styles (including templates) through ui ([9758b2c](https://github.com/nrkno/tv-automation-server-core/commit/9758b2c)) +- be able to remove stored snapshots ([849f906](https://github.com/nrkno/tv-automation-server-core/commit/849f906)) +- better return type from post-process ([a971b43](https://github.com/nrkno/tv-automation-server-core/commit/a971b43)) +- BIG refactoring of Core ([9d6ae9e](https://github.com/nrkno/tv-automation-server-core/commit/9d6ae9e)) +- black / freeze frame detection warnings ([7166177](https://github.com/nrkno/tv-automation-server-core/commit/7166177)) +- block take if duration since startedPlayback/take less than X ([99d41b9](https://github.com/nrkno/tv-automation-server-core/commit/99d41b9)) +- blueprint migration implementation (it works now) ([15250b2](https://github.com/nrkno/tv-automation-server-core/commit/15250b2)) +- blueprint migration, continued implementation ([ff507ab](https://github.com/nrkno/tv-automation-server-core/commit/ff507ab)) +- blueprintMigrations ([9527cae](https://github.com/nrkno/tv-automation-server-core/commit/9527cae)) +- blueprints context: handle notes externally (to ro notes) or internally (to logger) ([63640f2](https://github.com/nrkno/tv-automation-server-core/commit/63640f2)) +- Break nrk templates into seperate files. Parse KAM templates better ([2ec0433](https://github.com/nrkno/tv-automation-server-core/commit/2ec0433)) +- change heavy-light display style ([91a1931](https://github.com/nrkno/tv-automation-server-core/commit/91a1931)) +- change heavy-light display style ([329e2c6](https://github.com/nrkno/tv-automation-server-core/commit/329e2c6)) +- changed keyboard shortcuts ([ef02f7c](https://github.com/nrkno/tv-automation-server-core/commit/ef02f7c)) +- changed restart CasparCG functionality ([dd567c2](https://github.com/nrkno/tv-automation-server-core/commit/dd567c2)) +- Changes for blueprints-integration typings ([8d1f37d](https://github.com/nrkno/tv-automation-server-core/commit/8d1f37d)) +- cherry-pick changes from the UI feature branch ([dfbb3b4](https://github.com/nrkno/tv-automation-server-core/commit/dfbb3b4)) +- clean up: show style, blueprint, blueprint logic names in UI ([e1ae6a7](https://github.com/nrkno/tv-automation-server-core/commit/e1ae6a7)) +- codeControl: create syncFunctions which finer grained execution control based on arguments ([f53607f](https://github.com/nrkno/tv-automation-server-core/commit/f53607f)) +- componentize WorkFlow item ([f920e4b](https://github.com/nrkno/tv-automation-server-core/commit/f920e4b)) +- configuration UI for media manager ([b1883ec](https://github.com/nrkno/tv-automation-server-core/commit/b1883ec)) +- continued implementation of Migration (wip) ([72fbcb5](https://github.com/nrkno/tv-automation-server-core/commit/72fbcb5)) +- converted app.js to typescript and added an example subscription-implementation ([da439af](https://github.com/nrkno/tv-automation-server-core/commit/da439af)) +- converted more subscriptions (WIP) ([e047fef](https://github.com/nrkno/tv-automation-server-core/commit/e047fef)) +- converted StudioInstallation into a class, adding getConfigValue as member method, a step towards DRY ([4af278e](https://github.com/nrkno/tv-automation-server-core/commit/4af278e)) +- CoreSystem initial implementation ([06369b2](https://github.com/nrkno/tv-automation-server-core/commit/06369b2)) +- countdown to running order expectedStart ([7b505c5](https://github.com/nrkno/tv-automation-server-core/commit/7b505c5)) +- create action buttons in the Support PopUp for reset PG, take snapshot, show hotkeys ([be89893](https://github.com/nrkno/tv-automation-server-core/commit/be89893)) +- cron job for restarting casparcg ([19898d1](https://github.com/nrkno/tv-automation-server-core/commit/19898d1)) +- Crude ui to visualise generated timeline ([6e55382](https://github.com/nrkno/tv-automation-server-core/commit/6e55382)) +- Define all special blueprints as options in the showstyle ([7e1da16](https://github.com/nrkno/tv-automation-server-core/commit/7e1da16)) +- disable in next segmentLine & refactoring ([669166c](https://github.com/nrkno/tv-automation-server-core/commit/669166c)) +- disable shortcut-keys when modalDialog is open ([24bab3f](https://github.com/nrkno/tv-automation-server-core/commit/24bab3f)) +- dismiss all notifcations ([896dbb5](https://github.com/nrkno/tv-automation-server-core/commit/896dbb5)) +- display ms in user activity log ([7fc2744](https://github.com/nrkno/tv-automation-server-core/commit/7fc2744)) +- display ms in user activity log ([5172f2e](https://github.com/nrkno/tv-automation-server-core/commit/5172f2e)) +- do not block click-to-take when trigger is absolute 0 ([cec86ca](https://github.com/nrkno/tv-automation-server-core/commit/cec86ca)) +- don't restore from old snapshots ([bab8bbb](https://github.com/nrkno/tv-automation-server-core/commit/bab8bbb)) +- ensure each sli has a mosId set ([57c977d](https://github.com/nrkno/tv-automation-server-core/commit/57c977d)) +- expected audioTracks property ([250dc79](https://github.com/nrkno/tv-automation-server-core/commit/250dc79)) +- expose moment to templates ([c2a1cc5](https://github.com/nrkno/tv-automation-server-core/commit/c2a1cc5)) +- externalMessage: allow for multiple messages to be generated at the same time ([284efbe](https://github.com/nrkno/tv-automation-server-core/commit/284efbe)) +- externalMessages implementation (it works now) ([3b8e88a](https://github.com/nrkno/tv-automation-server-core/commit/3b8e88a)) +- f9, f10 buttons step next forward & down (shift reverses direction) ([a3be0cf](https://github.com/nrkno/tv-automation-server-core/commit/a3be0cf)) +- First draft at uploading a blueprints blob into a new db collection, and running it instead of the existing baseline ([31c56d8](https://github.com/nrkno/tv-automation-server-core/commit/31c56d8)) +- force some function to run synchronously. experimental, WIP! ([54d83dd](https://github.com/nrkno/tv-automation-server-core/commit/54d83dd)) +- force some function to run synchronously. experimental, WIP! ([55a064c](https://github.com/nrkno/tv-automation-server-core/commit/55a064c)) +- full implementation of mos-functions, profile 0 & 2 ([4bafeeb](https://github.com/nrkno/tv-automation-server-core/commit/4bafeeb)) +- Grafikk lookahead/preload ([30a6b03](https://github.com/nrkno/tv-automation-server-core/commit/30a6b03)) +- Grafikk lookahead/preload ([78828fe](https://github.com/nrkno/tv-automation-server-core/commit/78828fe)) +- handle mos updates with dynamicallyInserted segmentLines ([1d292c0](https://github.com/nrkno/tv-automation-server-core/commit/1d292c0)) +- handle roList reply on reload RunningOrder data, also more refactoring & cleanup ([cee70c5](https://github.com/nrkno/tv-automation-server-core/commit/cee70c5)) +- HOLD mode ([e41c5a4](https://github.com/nrkno/tv-automation-server-core/commit/e41c5a4)) +- HOLD mode ([ae1dacf](https://github.com/nrkno/tv-automation-server-core/commit/ae1dacf)) +- Hold state UI ([d835efc](https://github.com/nrkno/tv-automation-server-core/commit/d835efc)) +- Hold state UI ([c7a17c7](https://github.com/nrkno/tv-automation-server-core/commit/c7a17c7)) +- hyperdeck device ([#49](https://github.com/nrkno/tv-automation-server-core/issues/49)) ([c706628](https://github.com/nrkno/tv-automation-server-core/commit/c706628)) +- if template 'getId' returns null, don't throw an error. Also when templateId is not found, send warning instead of an error ([d98f09d](https://github.com/nrkno/tv-automation-server-core/commit/d98f09d)) +- implement (upcoming) blueprint API ([d86faa5](https://github.com/nrkno/tv-automation-server-core/commit/d86faa5)) +- implement camera number-device mapping for PTZ ([374568d](https://github.com/nrkno/tv-automation-server-core/commit/374568d)) +- implement click-to-adlib completely ([577dcac](https://github.com/nrkno/tv-automation-server-core/commit/577dcac)) +- implement Panasonic PTZ device ([42d8534](https://github.com/nrkno/tv-automation-server-core/commit/42d8534)) +- implement Panasonic PTZ settings ([f7840da](https://github.com/nrkno/tv-automation-server-core/commit/f7840da)) +- implement spliting long scripts into beginning and end in popup ([9fa8006](https://github.com/nrkno/tv-automation-server-core/commit/9fa8006)) +- implementation of blueprint migrations ([5fec7a2](https://github.com/nrkno/tv-automation-server-core/commit/5fec7a2)) +- implementation of disable-next-segmentLineItem ([a06d196](https://github.com/nrkno/tv-automation-server-core/commit/a06d196)) +- implementation of new blueprint API ([34f905f](https://github.com/nrkno/tv-automation-server-core/commit/34f905f)) +- implemented mos profiles 0-2 ([d803da1](https://github.com/nrkno/tv-automation-server-core/commit/d803da1)) +- Implemented Notes into data structure & GUI ([735b8c5](https://github.com/nrkno/tv-automation-server-core/commit/735b8c5)) +- implemented partial timeline fix ([c8b56e4](https://github.com/nrkno/tv-automation-server-core/commit/c8b56e4)) +- implemented stricter typing & changed classes to ReactMeteorComponent where applicable ([9d2166e](https://github.com/nrkno/tv-automation-server-core/commit/9d2166e)) +- implemented userActions ([2b343e6](https://github.com/nrkno/tv-automation-server-core/commit/2b343e6)) +- improved layout for presenter countdowns ([2bd61cc](https://github.com/nrkno/tv-automation-server-core/commit/2bd61cc)) +- include expectedMediaItems in RunningOrder snapshots ([9fcbba0](https://github.com/nrkno/tv-automation-server-core/commit/9fcbba0)) +- Infinite segmentlineitem ([c02a641](https://github.com/nrkno/tv-automation-server-core/commit/c02a641)) +- initial implementation of externalMessages, (not working yet) ([ace91f1](https://github.com/nrkno/tv-automation-server-core/commit/ace91f1)) +- Initial timings for opening templates ([a9bfb66](https://github.com/nrkno/tv-automation-server-core/commit/a9bfb66)) +- Interfaces for describing the timeline, segments (titles), layers ([ea96dfb](https://github.com/nrkno/tv-automation-server-core/commit/ea96dfb)) +- KAM SLUTT variant ([e819269](https://github.com/nrkno/tv-automation-server-core/commit/e819269)) +- List, start and stop test recordings ([df552ab](https://github.com/nrkno/tv-automation-server-core/commit/df552ab)) +- load atem ssrc background when activating RO ([0eda9b4](https://github.com/nrkno/tv-automation-server-core/commit/0eda9b4)) +- log warning message when trying to access a studio.config value that hasn't been set. ([7e706c6](https://github.com/nrkno/tv-automation-server-core/commit/7e706c6)) +- lookahead ([5ed0f13](https://github.com/nrkno/tv-automation-server-core/commit/5ed0f13)) +- manipulator methods for inserting & removing showStyleBase & showStyleVariant ([6bb4e00](https://github.com/nrkno/tv-automation-server-core/commit/6bb4e00)) +- Media Manager actions to restart & abort workflows ([6c94ad6](https://github.com/nrkno/tv-automation-server-core/commit/6c94ad6)) +- Media manager UI ([c83e1ff](https://github.com/nrkno/tv-automation-server-core/commit/c83e1ff)) +- media scanner & casparcg launcher hostnames ([02ec8be](https://github.com/nrkno/tv-automation-server-core/commit/02ec8be)) +- mediamanager: GUI support for SKIPPED step status ([1c39867](https://github.com/nrkno/tv-automation-server-core/commit/1c39867)) +- MeteorReactComponent: return subscription & computation handle ([e20e6de](https://github.com/nrkno/tv-automation-server-core/commit/e20e6de)) +- method "ping" to be called by devices every now and then, to update lastSeen ([41a996c](https://github.com/nrkno/tv-automation-server-core/commit/41a996c)) +- Migration UI & started adding migration steps ([2a117ad](https://github.com/nrkno/tv-automation-server-core/commit/2a117ad)) +- Migration: added more migration steps for 0.16.0 ([2ac06ea](https://github.com/nrkno/tv-automation-server-core/commit/2ac06ea)) +- Migration: continued impl. ([8982701](https://github.com/nrkno/tv-automation-server-core/commit/8982701)) +- monitor externalMessageQueue for system status ([e92f5be](https://github.com/nrkno/tv-automation-server-core/commit/e92f5be)) +- more WIP for support panel ([b23c855](https://github.com/nrkno/tv-automation-server-core/commit/b23c855)) +- more work on notification center ([92196ca](https://github.com/nrkno/tv-automation-server-core/commit/92196ca)) +- more work on notification center ([a34ccd0](https://github.com/nrkno/tv-automation-server-core/commit/a34ccd0)) +- more work on peripheralDevices notifications ([692b1b2](https://github.com/nrkno/tv-automation-server-core/commit/692b1b2)) +- more work on peripheralDevices notifications ([36a0a4b](https://github.com/nrkno/tv-automation-server-core/commit/36a0a4b)) +- Move all device specific TimelineObj types to tsr-types ([55766a5](https://github.com/nrkno/tv-automation-server-core/commit/55766a5)) +- move delete button to peripheralDevice page ([46647c1](https://github.com/nrkno/tv-automation-server-core/commit/46647c1)) +- move delete button to peripheralDevice page ([286d12f](https://github.com/nrkno/tv-automation-server-core/commit/286d12f)) +- Move Mapping types to tsr-types package ([67bd838](https://github.com/nrkno/tv-automation-server-core/commit/67bd838)) +- Move SegmentLine duration calculation into templates ([315eb42](https://github.com/nrkno/tv-automation-server-core/commit/315eb42)) +- Move sofie and metadata urls from templates to config ([af8e388](https://github.com/nrkno/tv-automation-server-core/commit/af8e388)) +- Move types to blueprint-integration ([c305061](https://github.com/nrkno/tv-automation-server-core/commit/c305061)) +- moved nightly cronjob to run after 4am ([8eb4e12](https://github.com/nrkno/tv-automation-server-core/commit/8eb4e12)) +- multiSelect component for selecting compatible Show Styles ([e1a5c35](https://github.com/nrkno/tv-automation-server-core/commit/e1a5c35)) +- only log logger.debug() when in developer mode ([8ed8e71](https://github.com/nrkno/tv-automation-server-core/commit/8ed8e71)) +- optimization: add cache of blueprints, to avoid having to parse text-functions all the time ([1e469d9](https://github.com/nrkno/tv-automation-server-core/commit/1e469d9)) +- output evaluation to log ([7deca0f](https://github.com/nrkno/tv-automation-server-core/commit/7deca0f)) +- output evaluation to log ([f95cfbf](https://github.com/nrkno/tv-automation-server-core/commit/f95cfbf)) +- place all collections in Collections object, for debugging purposes ([9682a89](https://github.com/nrkno/tv-automation-server-core/commit/9682a89)) +- playout device debugLogging (wip) ([7ab4ec6](https://github.com/nrkno/tv-automation-server-core/commit/7ab4ec6)) +- prevent next:ing of currently playing segmentLine ([b9c9ea1](https://github.com/nrkno/tv-automation-server-core/commit/b9c9ea1)) +- prompter-view ([f45a923](https://github.com/nrkno/tv-automation-server-core/commit/f45a923)) +- rabbitMQ: add support for headers ([e3e3d48](https://github.com/nrkno/tv-automation-server-core/commit/e3e3d48)) +- rabbitMQ: headers ([087bb2e](https://github.com/nrkno/tv-automation-server-core/commit/087bb2e)) +- Read all templates from database ([3287f63](https://github.com/nrkno/tv-automation-server-core/commit/3287f63)) +- Refactor blueprint contexts so be different per type to limit exposed api ([f0d1c7c](https://github.com/nrkno/tv-automation-server-core/commit/f0d1c7c)) +- Refactor external message template code ([21ac50e](https://github.com/nrkno/tv-automation-server-core/commit/21ac50e)) +- refactor of subscriptions (WIP) ([2b6f994](https://github.com/nrkno/tv-automation-server-core/commit/2b6f994)) +- Refactor story template code to use new blueprint structure ([104982b](https://github.com/nrkno/tv-automation-server-core/commit/104982b)) +- refactor systemStatus & add status messages on front page ([14da61a](https://github.com/nrkno/tv-automation-server-core/commit/14da61a)) +- refactor to use relative durations. affects infinite segmentlineitems, autonext, segmentline overlapduration property ([67c5444](https://github.com/nrkno/tv-automation-server-core/commit/67c5444)) +- refactored initDB into 2 separate methods, so we can easilly update just the layers and not the infrastructure ([d4fcc3f](https://github.com/nrkno/tv-automation-server-core/commit/d4fcc3f)) +- Reference blueprints-integration api file ([dc1cdb8](https://github.com/nrkno/tv-automation-server-core/commit/dc1cdb8)) +- Reference blueprints-integration utils file ([d94c97b](https://github.com/nrkno/tv-automation-server-core/commit/d94c97b)) +- Reference device options in tsr-types ([049b9bc](https://github.com/nrkno/tv-automation-server-core/commit/049b9bc)) +- reimplement fullscreen/on air button ([4b8658d](https://github.com/nrkno/tv-automation-server-core/commit/4b8658d)) +- Remove monaco ([e417548](https://github.com/nrkno/tv-automation-server-core/commit/e417548)) +- rename /clock into /countdowns/presenter ([96c3136](https://github.com/nrkno/tv-automation-server-core/commit/96c3136)) +- reset 'dirty' segment lines by re-running blueprints on them ([064a84d](https://github.com/nrkno/tv-automation-server-core/commit/064a84d)) +- restart CasparCG from UI ([64509c3](https://github.com/nrkno/tv-automation-server-core/commit/64509c3)) +- reworked externalMessages page ([3b87242](https://github.com/nrkno/tv-automation-server-core/commit/3b87242)) +- reworked the whole activate/deacticate/reset/reload logic ([1fea56e](https://github.com/nrkno/tv-automation-server-core/commit/1fea56e)) +- Rewrite templateContext.getConfigValue to get default values from defaultConfig 'blueprint' and to cache values ([6ce0f97](https://github.com/nrkno/tv-automation-server-core/commit/6ce0f97)) +- running order full-screen marker ([03010ec](https://github.com/nrkno/tv-automation-server-core/commit/03010ec)) +- RunningOrder unsynced notification ([9effce5](https://github.com/nrkno/tv-automation-server-core/commit/9effce5)) +- second upload to atem ([6697a80](https://github.com/nrkno/tv-automation-server-core/commit/6697a80)) +- segment line arguments ([3c5313a](https://github.com/nrkno/tv-automation-server-core/commit/3c5313a)) +- send evaluation message to slack. WIP ([3dcbe3a](https://github.com/nrkno/tv-automation-server-core/commit/3dcbe3a)) +- send evaluation message to slack. WIP ([96e8b81](https://github.com/nrkno/tv-automation-server-core/commit/96e8b81)) +- separate RO list into synced and unsynced lists ([6b92f40](https://github.com/nrkno/tv-automation-server-core/commit/6b92f40)) +- server side implementation of queueabilified adlibs ([0527b3b](https://github.com/nrkno/tv-automation-server-core/commit/0527b3b)) +- set triggerValue to lawo-TimelineObjs, so it triggers upon Nexting ([e3df655](https://github.com/nrkno/tv-automation-server-core/commit/e3df655)) +- settings: add workflow linger time ([9beefda](https://github.com/nrkno/tv-automation-server-core/commit/9beefda)) +- show 99+ instead of actual number for notifications ([1f84e67](https://github.com/nrkno/tv-automation-server-core/commit/1f84e67)) +- show blueprint id in select options in Show Styles, hyphenated show-styles doesn't seem right ([e19802f](https://github.com/nrkno/tv-automation-server-core/commit/e19802f)) +- show changed timestamp on script items ([f2955e1](https://github.com/nrkno/tv-automation-server-core/commit/f2955e1)) +- show user name in evaluations ([c59d7ee](https://github.com/nrkno/tv-automation-server-core/commit/c59d7ee)) +- ShowStyle templates can be marked as helpers and accessed from other templates ([a20ffa7](https://github.com/nrkno/tv-automation-server-core/commit/a20ffa7)) +- Simplify RunningOrderBaseItem type ([2b8257b](https://github.com/nrkno/tv-automation-server-core/commit/2b8257b)) +- some work on notification center ([8e2c269](https://github.com/nrkno/tv-automation-server-core/commit/8e2c269)) +- some work on notification center ([58ad599](https://github.com/nrkno/tv-automation-server-core/commit/58ad599)) +- SOURCE_NOT_SET for SLI Status ([cff64e1](https://github.com/nrkno/tv-automation-server-core/commit/cff64e1)) +- Split (DVE 2LIKE) template ([8ccf23e](https://github.com/nrkno/tv-automation-server-core/commit/8ccf23e)) +- Start moving some migrations to blueprints ([9d4949e](https://github.com/nrkno/tv-automation-server-core/commit/9d4949e)) +- Start of stk and grafikk templates ([0458e3e](https://github.com/nrkno/tv-automation-server-core/commit/0458e3e)) +- Start using types from sofie-blueprints-integration ([6106d99](https://github.com/nrkno/tv-automation-server-core/commit/6106d99)) +- started on mos device data implementation ([1d3b19a](https://github.com/nrkno/tv-automation-server-core/commit/1d3b19a)) +- started working on integration tests, added a client-side stub ([c4cbadc](https://github.com/nrkno/tv-automation-server-core/commit/c4cbadc)) +- status endpoint /health updated to use device statuses ([2c4b7fa](https://github.com/nrkno/tv-automation-server-core/commit/2c4b7fa)) +- Strip out old runtime functions ([880a885](https://github.com/nrkno/tv-automation-server-core/commit/880a885)) +- StudioInstallation key-value config store for template settings ([b37ea17](https://github.com/nrkno/tv-automation-server-core/commit/b37ea17)) +- StudioInstallation key-value config store for template settings ([812c313](https://github.com/nrkno/tv-automation-server-core/commit/812c313)) +- support for multiple notification actions ([09be9c1](https://github.com/nrkno/tv-automation-server-core/commit/09be9c1)) +- support for Pharos device ([4a99fb3](https://github.com/nrkno/tv-automation-server-core/commit/4a99fb3)) +- support media manager integration ([dcbf282](https://github.com/nrkno/tv-automation-server-core/commit/dcbf282)) +- Support panel WIP ([6955fdc](https://github.com/nrkno/tv-automation-server-core/commit/6955fdc)) +- support preload lookahead mode for nora, which swaps out take commands for cue ([4cfd4fe](https://github.com/nrkno/tv-automation-server-core/commit/4cfd4fe)) +- Switch to single-device design ([a268c40](https://github.com/nrkno/tv-automation-server-core/commit/a268c40)) +- System snapshot ([006027b](https://github.com/nrkno/tv-automation-server-core/commit/006027b)) +- **asRunLog:** collection implementation ([0e63c36](https://github.com/nrkno/tv-automation-server-core/commit/0e63c36)) +- **asRunLog:** implementation of asRunLog ([62f5b8c](https://github.com/nrkno/tv-automation-server-core/commit/62f5b8c)) +- use generated svg as icons in countdown ([843ad10](https://github.com/nrkno/tv-automation-server-core/commit/843ad10)) +- **aux:** Adds tecnical error aux 2 ([34ce710](https://github.com/nrkno/tv-automation-server-core/commit/34ce710)) +- **AUX:** adds clock aux ([45479da](https://github.com/nrkno/tv-automation-server-core/commit/45479da)) +- **AUXes:** New AUX-mapping introducing more previews and moves the cleanfeed ([548bd8c](https://github.com/nrkno/tv-automation-server-core/commit/548bd8c)) +- **blueprints:** Add minimum core version to blueprints. Move blueprint restore code to api/blueprints ([2453a16](https://github.com/nrkno/tv-automation-server-core/commit/2453a16)) +- **blueprints:** Add section of studio settings based off a manifest from the blueprints ([4866a79](https://github.com/nrkno/tv-automation-server-core/commit/4866a79)) +- **blueprints:** Expose version string and uploading in the ui ([00875a4](https://github.com/nrkno/tv-automation-server-core/commit/00875a4)) +- **Capabilities:** Added basic Lawo and ATEM capabilities ([90d6edd](https://github.com/nrkno/tv-automation-server-core/commit/90d6edd)) +- **click-to-take:** initial WIP ([8e63808](https://github.com/nrkno/tv-automation-server-core/commit/8e63808)) +- **click-to-take:** more work in progress ([e3549e0](https://github.com/nrkno/tv-automation-server-core/commit/e3549e0)) +- **device:** Custom make-ready commands for httpsend device ([410a2ef](https://github.com/nrkno/tv-automation-server-core/commit/410a2ef)) +- **ENV:** adds ENV vars for default devices - casparcg, atem and lawo ([9bf8eee](https://github.com/nrkno/tv-automation-server-core/commit/9bf8eee)) +- **expected media items:** updateExpectedMediaItems function ([e1ad692](https://github.com/nrkno/tv-automation-server-core/commit/e1ad692)) +- **expected media items:** use segmentLineId as key ([3803e87](https://github.com/nrkno/tv-automation-server-core/commit/3803e87)) +- **externalMessages:** add hold property, to be able to pause sending of messages ([adc69d8](https://github.com/nrkno/tv-automation-server-core/commit/adc69d8)) +- **Guest input:** use isGuestInput like isRemoteInput ([2d40e87](https://github.com/nrkno/tv-automation-server-core/commit/2d40e87)) +- **health check:** statusMessage implementation ([9bcf95a](https://github.com/nrkno/tv-automation-server-core/commit/9bcf95a)) +- **health check:** statusMessage implementation ([b01ac48](https://github.com/nrkno/tv-automation-server-core/commit/b01ac48)) +- **hotkeys:** optional cool down ([c9c2743](https://github.com/nrkno/tv-automation-server-core/commit/c9c2743)) +- **init:** adds clear shortcuts + skippabloe ([f824ae5](https://github.com/nrkno/tv-automation-server-core/commit/f824ae5)) +- **init:** adds multiple bak source layers ([c812510](https://github.com/nrkno/tv-automation-server-core/commit/c812510)) +- **init:** Adds RM 4,5,6 ([0021d7b](https://github.com/nrkno/tv-automation-server-core/commit/0021d7b)) +- **init:** Adds RM 4,5,6 ([dd59d47](https://github.com/nrkno/tv-automation-server-core/commit/dd59d47)) +- **init:** adds studio monitor html player to casparcg ([6533b0f](https://github.com/nrkno/tv-automation-server-core/commit/6533b0f)) +- **init:** bakskjerm type ([8ffe776](https://github.com/nrkno/tv-automation-server-core/commit/8ffe776)) +- **init:** moves countdown to casparcg machine 2, channel 1 ([18c354b](https://github.com/nrkno/tv-automation-server-core/commit/18c354b)) +- **init:** moves countdown to casparcg machine 2, channel 1 ([6c93464](https://github.com/nrkno/tv-automation-server-core/commit/6c93464)) +- **iterateDeeply:** exports iterateDeeply to template context ([42cc886](https://github.com/nrkno/tv-automation-server-core/commit/42cc886)) +- **lawo:** New structure to lawo devices and mappings ([35d812b](https://github.com/nrkno/tv-automation-server-core/commit/35d812b)) +- **loggin:** uses logger for better kibana logs ([8d31691](https://github.com/nrkno/tv-automation-server-core/commit/8d31691)) +- **Media manager settings:** add 'mediaPath' property to storages ([50185b2](https://github.com/nrkno/tv-automation-server-core/commit/50185b2)) +- **media manager ui:** fix animations ([10a38de](https://github.com/nrkno/tv-automation-server-core/commit/10a38de)) +- **media manager ui:** nearly finishing the styling ([1bb3116](https://github.com/nrkno/tv-automation-server-core/commit/1bb3116)) +- **media manager ui:** show workflow creation time ([84a4b71](https://github.com/nrkno/tv-automation-server-core/commit/84a4b71)) +- **media manager UI:** WIP ([ccb54f0](https://github.com/nrkno/tv-automation-server-core/commit/ccb54f0)) +- **migration:** add previousVersion and buttons in GUI to revert database version ([61525a5](https://github.com/nrkno/tv-automation-server-core/commit/61525a5)) +- **migration:** display returned error message in GUI ([6169048](https://github.com/nrkno/tv-automation-server-core/commit/6169048)) +- **migration:** reafactor migrations and add new migration steps ([0966ef6](https://github.com/nrkno/tv-automation-server-core/commit/0966ef6)) +- **migrations:** automatically continue partialMigrations when possible ([f75e907](https://github.com/nrkno/tv-automation-server-core/commit/f75e907)) +- **migrations:** Move playout-device migrations to blueprints ([04029d4](https://github.com/nrkno/tv-automation-server-core/commit/04029d4)) +- **multi-step success:** introduce keyStep property ([fc8aebd](https://github.com/nrkno/tv-automation-server-core/commit/fc8aebd)) +- **Next:** Adds warning/fallback of not loaded clips ([e20bc2f](https://github.com/nrkno/tv-automation-server-core/commit/e20bc2f)) +- **notification center:** hot-links to RO note notifications ([f3e9f59](https://github.com/nrkno/tv-automation-server-core/commit/f3e9f59)) +- **notification center:** notification count ([b8fbcac](https://github.com/nrkno/tv-automation-server-core/commit/b8fbcac)) +- **notification center:** squish segments in RO view when NC is open ([36b514f](https://github.com/nrkno/tv-automation-server-core/commit/36b514f)) +- **notification-center:** connection status notifier et al. ([5aefd52](https://github.com/nrkno/tv-automation-server-core/commit/5aefd52)) +- **notification-center:** connection status notifier et al. ([e529e94](https://github.com/nrkno/tv-automation-server-core/commit/e529e94)) +- **notification-center:** move expand notification center to right-hand status bar ([2750fab](https://github.com/nrkno/tv-automation-server-core/commit/2750fab)) +- **notification-center:** move expand notification center to right-hand status bar ([635c09d](https://github.com/nrkno/tv-automation-server-core/commit/635c09d)) +- **notification-center:** NotificationCenterPanel et al. ([9283909](https://github.com/nrkno/tv-automation-server-core/commit/9283909)) +- **notification-center:** NotificationCenterPanel et al. ([c4794c8](https://github.com/nrkno/tv-automation-server-core/commit/c4794c8)) +- **notification-center:** segment warning tweak ([d4fc5e7](https://github.com/nrkno/tv-automation-server-core/commit/d4fc5e7)) +- **notification-center:** segment warning tweak ([e956488](https://github.com/nrkno/tv-automation-server-core/commit/e956488)) +- **notifications-center:** notification center in other pages than ROV ([5250aab](https://github.com/nrkno/tv-automation-server-core/commit/5250aab)) +- **notifications-center:** notification center in other pages than ROV ([0620115](https://github.com/nrkno/tv-automation-server-core/commit/0620115)) +- **onlySelectedFiles:** support only selected files flag on shared storage options ([dee11d2](https://github.com/nrkno/tv-automation-server-core/commit/dee11d2)) +- **peripheralDevices:** added collection, publication, api, access control and tests ([794b5be](https://github.com/nrkno/tv-automation-server-core/commit/794b5be)) +- **playout:** Add class to sli first_object to indicate if sli is from the current or previous sl ([8de6004](https://github.com/nrkno/tv-automation-server-core/commit/8de6004)) +- **playout:** Add class to sli first_object when the sli is a continuation of another ([d53f06b](https://github.com/nrkno/tv-automation-server-core/commit/d53f06b)) +- **playout:** Add classes to sl-firstobject from the current and prev sl. This will allow for some logical triggers which can be influenced by the prev sl ([632326f](https://github.com/nrkno/tv-automation-server-core/commit/632326f)) +- **playout:** Add object to timeline to indicate whether ro is active or in rehersal ([d0e850d](https://github.com/nrkno/tv-automation-server-core/commit/d0e850d)) +- **Prompter:** implement a simple mirror mode ([8d0be4e](https://github.com/nrkno/tv-automation-server-core/commit/8d0be4e)) +- **rabbit:** initial commit (wip) ([7ed3223](https://github.com/nrkno/tv-automation-server-core/commit/7ed3223)) +- **rabbitmq:** Implementation of RabbitMQ external message queue ([b31e15f](https://github.com/nrkno/tv-automation-server-core/commit/b31e15f)) +- **rabbitmq:** message id ([7ce9e5a](https://github.com/nrkno/tv-automation-server-core/commit/7ce9e5a)) +- **record:** basic video player page ([138b8b9](https://github.com/nrkno/tv-automation-server-core/commit/138b8b9)) +- **record:** Controls to delete files ([4236db2](https://github.com/nrkno/tv-automation-server-core/commit/4236db2)) +- **record:** Create timelineobjects to control recording to the timeline. Add config to the db, and ui to edit it ([b5e4ebf](https://github.com/nrkno/tv-automation-server-core/commit/b5e4ebf)) +- **record:** Input field for user to give recording a name ([116ea9f](https://github.com/nrkno/tv-automation-server-core/commit/116ea9f)) +- **refactor:** move Runtime Arguments for Blueprints from StudioInstallation to ShowStyleBase ([9b2c2d8](https://github.com/nrkno/tv-automation-server-core/commit/9b2c2d8)) +- **RO view:** Introduce a 'duration settling' state to delay the UI update until the actual playout duration is received from playout ([28823c3](https://github.com/nrkno/tv-automation-server-core/commit/28823c3)) +- **Setting:** adds lawo setting to studio and devices ([5ab1717](https://github.com/nrkno/tv-automation-server-core/commit/5ab1717)) +- **settings:** playout devices have threadUsage ([b74410c](https://github.com/nrkno/tv-automation-server-core/commit/b74410c)) +- **shortcuts:** adds shortcuts to remove various graphic layers ([0d1a83d](https://github.com/nrkno/tv-automation-server-core/commit/0d1a83d)) +- **shortcuts:** standarize shortcut label display, support numpad ([4c5ba74](https://github.com/nrkno/tv-automation-server-core/commit/4c5ba74)) +- **snapshot:** continued implementation ([009e9e5](https://github.com/nrkno/tv-automation-server-core/commit/009e9e5)) +- **snapshot:** edit snapshot comments ([264638a](https://github.com/nrkno/tv-automation-server-core/commit/264638a)) +- **snapshot:** Implement snapshots, API endpoints & restore ([72e1a83](https://github.com/nrkno/tv-automation-server-core/commit/72e1a83)) +- **snapshot:** implement support for taking snapshot of settings related to a single studio ([d177113](https://github.com/nrkno/tv-automation-server-core/commit/d177113)) +- **snapshot:** snapshot restore/backup GUI ([c414f70](https://github.com/nrkno/tv-automation-server-core/commit/c414f70)) +- **snapshot:** take snapshot of runningOrder & restore ([fc34f73](https://github.com/nrkno/tv-automation-server-core/commit/fc34f73)) +- system version status monitoring ([1c96263](https://github.com/nrkno/tv-automation-server-core/commit/1c96263)) +- system-wide message ([d7305df](https://github.com/nrkno/tv-automation-server-core/commit/d7305df)) +- take snapshot before running migration ([3ae4e92](https://github.com/nrkno/tv-automation-server-core/commit/3ae4e92)) +- take snapshot when saving evaluation form ([df318bb](https://github.com/nrkno/tv-automation-server-core/commit/df318bb)) +- take snapshot when saving evaluation form ([b98d68f](https://github.com/nrkno/tv-automation-server-core/commit/b98d68f)) +- templates: added format functions for timecode ([ea38081](https://github.com/nrkno/tv-automation-server-core/commit/ea38081)) +- this did not look right button ([1e01a10](https://github.com/nrkno/tv-automation-server-core/commit/1e01a10)) +- **template:** use upstream keyer for vignett playback. Adds some more layers for atem defaults, and overrides to stack changes better ([76b1e10](https://github.com/nrkno/tv-automation-server-core/commit/76b1e10)) +- timings page ([6bc325a](https://github.com/nrkno/tv-automation-server-core/commit/6bc325a)) +- toggle running order argument on an SL with a hotkey ([258c3b3](https://github.com/nrkno/tv-automation-server-core/commit/258c3b3)) +- Transition as a seperate SegmentLineItem, which is not run if the first SegmentLine in the show, or the previous SegmentLine instructs it to not ([e676a43](https://github.com/nrkno/tv-automation-server-core/commit/e676a43)) +- translation improvements ([d3a535d](https://github.com/nrkno/tv-automation-server-core/commit/d3a535d)) +- Treat sli marked as virtual solely as markers for the timeline. They are hidden from the ui and are not allowed to place any contents on the timeline ([25e0f42](https://github.com/nrkno/tv-automation-server-core/commit/25e0f42)) +- **timeline:** some initial work on labels taking account of liveline ([3086eec](https://github.com/nrkno/tv-automation-server-core/commit/3086eec)) +- trim config values (strings) ([d41e07e](https://github.com/nrkno/tv-automation-server-core/commit/d41e07e)) +- updated timeline dependency ([6ef9eb7](https://github.com/nrkno/tv-automation-server-core/commit/6ef9eb7)) +- **template:** setup atem wipe transition ([f0c576c](https://github.com/nrkno/tv-automation-server-core/commit/f0c576c)) +- unsynced mode ([#51](https://github.com/nrkno/tv-automation-server-core/issues/51)) ([7e0a263](https://github.com/nrkno/tv-automation-server-core/commit/7e0a263)) +- update blueprint contexts to match new API ([ab6fc5a](https://github.com/nrkno/tv-automation-server-core/commit/ab6fc5a)) +- update meteor typings ([49b6969](https://github.com/nrkno/tv-automation-server-core/commit/49b6969)) +- Update template to use correct media files and durations. Adjust transitions from head to kam ([18f6c44](https://github.com/nrkno/tv-automation-server-core/commit/18f6c44)) +- Update timeline and infinite items on enps update ([db0c041](https://github.com/nrkno/tv-automation-server-core/commit/db0c041)) +- **template:** temporary env variable for nora group (MESOS_NORA_GROUP) ([8b00bc4](https://github.com/nrkno/tv-automation-server-core/commit/8b00bc4)) +- **Template doc:** Added CasparCG resources ([80f98d5](https://github.com/nrkno/tv-automation-server-core/commit/80f98d5)) +- use date-picker for user-activity-log ([5e2c218](https://github.com/nrkno/tv-automation-server-core/commit/5e2c218)) +- **templates:** Use ShowStyle to define default/fallback state. Play and stop head supers ([8375363](https://github.com/nrkno/tv-automation-server-core/commit/8375363)) +- **Templates:** Start parsing some new mos data. Process mesos based graphics. Set some lawo audio states ([df4b670](https://github.com/nrkno/tv-automation-server-core/commit/df4b670)) +- update type dependencies and type references. Removed dependency of mos-connection and replaced it with references to the blueprints-integration. ([85bd795](https://github.com/nrkno/tv-automation-server-core/commit/85bd795)) +- **timeline:** Remove deviceId field from timeline objects ([85c4b89](https://github.com/nrkno/tv-automation-server-core/commit/85c4b89)) +- update types deps & API methods ([7d1a49b](https://github.com/nrkno/tv-automation-server-core/commit/7d1a49b)) +- Update typings for blueprints to be more specific ([53f7281](https://github.com/nrkno/tv-automation-server-core/commit/53f7281)) +- Update typings for message blueprint ([cf13fc9](https://github.com/nrkno/tv-automation-server-core/commit/cf13fc9)) +- updated to match blueprints-integration /develop, started on new message-flow, WIP ([6b84b75](https://github.com/nrkno/tv-automation-server-core/commit/6b84b75)) +- url parameter "all" configures ui modes ([586d5f4](https://github.com/nrkno/tv-automation-server-core/commit/586d5f4)) +- use default renderer for MIC sourceLayerType ([ce845d4](https://github.com/nrkno/tv-automation-server-core/commit/ce845d4)) +- use default renderer for MIC sourceLayerType ([6ab97b7](https://github.com/nrkno/tv-automation-server-core/commit/6ab97b7)) +- **Timeline:** more work on new marker style ([570e408](https://github.com/nrkno/tv-automation-server-core/commit/570e408)) +- warn media status for interlacing and fps ([fc3ac4b](https://github.com/nrkno/tv-automation-server-core/commit/fc3ac4b)) +- warnings for media in wrong resolution ([55135c1](https://github.com/nrkno/tv-automation-server-core/commit/55135c1)) +- WIP: VERY preliminary implementation of quick and dirty manual playback ([a9ec948](https://github.com/nrkno/tv-automation-server-core/commit/a9ec948)) +- wrap blueprint functions, to emit better errors ([14873f1](https://github.com/nrkno/tv-automation-server-core/commit/14873f1)) +- zoom control buttons ([41c1c92](https://github.com/nrkno/tv-automation-server-core/commit/41c1c92)) -## 0.22.0-0 (2019-03-01) +## 0.22.0-0 (2019-03-01) ### Features -* **Media-management** -
*The Media-management support was started prelimenary in the previous release* +- **Media-management** +
_The Media-management support was started prelimenary in the previous release_
add expected media items collection ([931536e](https://github.com/nrkno/tv-automation-server-core/commit/931536e))
add property .deviceId to MediaWorkFlow & MedieWorkFlowStep, to indicate ownership. (prelimina ([62ac066](https://github.com/nrkno/tv-automation-server-core/commit/62ac066))
allow a string array as mediaFlowIds in SLI content ([7ac6fb5](https://github.com/nrkno/tv-automation-server-core/commit/7ac6fb5)) @@ -4136,18 +4141,18 @@ All notable changes to this project will be documented in this file. See [standa
mediamanager: GUI support for SKIPPED step status ([1c39867](https://github.com/nrkno/tv-automation-server-core/commit/1c39867))
support media manager integration ([dcbf282](https://github.com/nrkno/tv-automation-server-core/commit/dcbf282))
configuration UI for media manager ([b1883ec](https://github.com/nrkno/tv-automation-server-core/commit/b1883ec)) -
*Media manager settings*: add 'mediaPath' property to storages ([50185b2](https://github.com/nrkno/tv-automation-server-core/commit/50185b2)) -
*Media manager ui*: fix animations ([10a38de](https://github.com/nrkno/tv-automation-server-core/commit/10a38de)) -
*Media manager ui*: nearly finishing the styling ([1bb3116](https://github.com/nrkno/tv-automation-server-core/commit/1bb3116)) -
*Media manager ui*: show workflow creation time ([84a4b71](https://github.com/nrkno/tv-automation-server-core/commit/84a4b71)) -
*Media manager UI*: WIP ([ccb54f0](https://github.com/nrkno/tv-automation-server-core/commit/ccb54f0)) -
*Expected media items*: updateExpectedMediaItems function ([e1ad692](https://github.com/nrkno/tv-automation-server-core/commit/e1ad692)) -
*Expected media items*: use segmentLineId as key ([3803e87](https://github.com/nrkno/tv-automation-server-core/commit/3803e87)) +
_Media manager settings_: add 'mediaPath' property to storages ([50185b2](https://github.com/nrkno/tv-automation-server-core/commit/50185b2)) +
_Media manager ui_: fix animations ([10a38de](https://github.com/nrkno/tv-automation-server-core/commit/10a38de)) +
_Media manager ui_: nearly finishing the styling ([1bb3116](https://github.com/nrkno/tv-automation-server-core/commit/1bb3116)) +
_Media manager ui_: show workflow creation time ([84a4b71](https://github.com/nrkno/tv-automation-server-core/commit/84a4b71)) +
_Media manager UI_: WIP ([ccb54f0](https://github.com/nrkno/tv-automation-server-core/commit/ccb54f0)) +
_Expected media items_: updateExpectedMediaItems function ([e1ad692](https://github.com/nrkno/tv-automation-server-core/commit/e1ad692)) +
_Expected media items_: use segmentLineId as key ([3803e87](https://github.com/nrkno/tv-automation-server-core/commit/3803e87))
settings: add workflow linger time ([9beefda](https://github.com/nrkno/tv-automation-server-core/commit/9beefda)) -
*Multi-step success*: introduce keyStep property ([fc8aebd](https://github.com/nrkno/tv-automation-server-core/commit/fc8aebd)) -
*OnlySelectedFiles*: support only selected files flag on shared storage options ([dee11d2](https://github.com/nrkno/tv-automation-server-core/commit/dee11d2)) +
_Multi-step success_: introduce keyStep property ([fc8aebd](https://github.com/nrkno/tv-automation-server-core/commit/fc8aebd)) +
_OnlySelectedFiles_: support only selected files flag on shared storage options ([dee11d2](https://github.com/nrkno/tv-automation-server-core/commit/dee11d2)) -* **GUI** +- **GUI**
add nn-nynorsk and update nb-bokmal translation ([6db7a99](https://github.com/nrkno/tv-automation-server-core/commit/6db7a99))
add nn translation and update nb translation ([922b93b](https://github.com/nrkno/tv-automation-server-core/commit/922b93b))
black / freeze frame detection warnings ([7166177](https://github.com/nrkno/tv-automation-server-core/commit/7166177)) @@ -4170,10 +4175,10 @@ All notable changes to this project will be documented in this file. See [standa
support custom notification timeouts ([d4cf9d4](https://github.com/nrkno/tv-automation-server-core/commit/d4cf9d4))
support for multiple notification actions ([09be9c1](https://github.com/nrkno/tv-automation-server-core/commit/09be9c1)) -* **Notification center** +- **Notification center**
dismiss all notifcations ([896dbb5](https://github.com/nrkno/tv-automation-server-core/commit/896dbb5)) -* **As-run logs** +- **As-run logs**
add support for Config References (to be used for referencing usernames & passwords) ([6df8c6e](https://github.com/nrkno/tv-automation-server-core/commit/6df8c6e))
add stoppedPlayback tracking ([7345856](https://github.com/nrkno/tv-automation-server-core/commit/7345856))
add stoppedPlayback tracking ([ddbdd66](https://github.com/nrkno/tv-automation-server-core/commit/ddbdd66)) @@ -4182,237 +4187,237 @@ All notable changes to this project will be documented in this file. See [standa
rabbitMQ: add support for headers ([e3e3d48](https://github.com/nrkno/tv-automation-server-core/commit/e3e3d48))
rabbitMQ: headers ([087bb2e](https://github.com/nrkno/tv-automation-server-core/commit/087bb2e)) -* **Various backend** +- **Various backend**
Add support for RuntimeArguments in blueprint migrations ([82e5286](https://github.com/nrkno/tv-automation-server-core/commit/82e5286))
add versions to /health endpoint ([a324213](https://github.com/nrkno/tv-automation-server-core/commit/a324213))
added Timeline.objectType and implemented the typing changes all around ([a69e626](https://github.com/nrkno/tv-automation-server-core/commit/a69e626))
monitor externalMessageQueue for system status ([e92f5be](https://github.com/nrkno/tv-automation-server-core/commit/e92f5be))
output evaluation to log ([7deca0f](https://github.com/nrkno/tv-automation-server-core/commit/7deca0f))
output evaluation to log ([f95cfbf](https://github.com/nrkno/tv-automation-server-core/commit/f95cfbf)) -
SOURCE_NOT_SET for SLI Status ([cff64e1](https://github.com/nrkno/tv-automation-server-core/commit/cff64e1)) -
*Health check*: statusMessage implementation ([9bcf95a](https://github.com/nrkno/tv-automation-server-core/commit/9bcf95a)) +
SOURCE*NOT_SET for SLI Status ([cff64e1](https://github.com/nrkno/tv-automation-server-core/commit/cff64e1)) +
\_Health check*: statusMessage implementation ([9bcf95a](https://github.com/nrkno/tv-automation-server-core/commit/9bcf95a)) -* **Other** -
Add LOG_FILE env var to specify the file to log to ([8a192bc](https://github.com/nrkno/tv-automation-server-core/commit/8a192bc)) +- **Other** +
Add LOG*FILE env var to specify the file to log to ([8a192bc](https://github.com/nrkno/tv-automation-server-core/commit/8a192bc))
Add LOG_FILE env var to specify the file to log to ([d2ad941](https://github.com/nrkno/tv-automation-server-core/commit/d2ad941))
cherry-pick changes from the UI feature branch ([dfbb3b4](https://github.com/nrkno/tv-automation-server-core/commit/dfbb3b4))
componentize WorkFlow item ([f920e4b](https://github.com/nrkno/tv-automation-server-core/commit/f920e4b))
expected audioTracks property ([250dc79](https://github.com/nrkno/tv-automation-server-core/commit/250dc79))
url parameter "all" configures ui modes ([586d5f4](https://github.com/nrkno/tv-automation-server-core/commit/586d5f4)) -
*Hotkeys*: optional cool down ([c9c2743](https://github.com/nrkno/tv-automation-server-core/commit/c9c2743)) -
*Playout*: Add classes to sl-firstobject from the current and prev sl. This will allow for some ([632326f](https://github.com/nrkno/tv-automation-server-core/commit/632326f)) -
*Settings*: playout devices have threadUsage ([b74410c](https://github.com/nrkno/tv-automation-server-core/commit/b74410c)) +
\_Hotkeys*: optional cool down ([c9c2743](https://github.com/nrkno/tv-automation-server-core/commit/c9c2743)) +
_Playout_: Add classes to sl-firstobject from the current and prev sl. This will allow for some ([632326f](https://github.com/nrkno/tv-automation-server-core/commit/632326f)) +
_Settings_: playout devices have threadUsage ([b74410c](https://github.com/nrkno/tv-automation-server-core/commit/b74410c)) ### Bug Fixes -
add missing translation json-file ([6059965](https://github.com/nrkno/tv-automation-server-core/commit/6059965)) -
add missing _id ([970fbf8](https://github.com/nrkno/tv-automation-server-core/commit/970fbf8)) -
add missing _id ([c948d09](https://github.com/nrkno/tv-automation-server-core/commit/c948d09)) -
add missing core version ([8ad3a9e](https://github.com/nrkno/tv-automation-server-core/commit/8ad3a9e)) -
add nn translation to whitelist ([c4d859a](https://github.com/nrkno/tv-automation-server-core/commit/c4d859a)) -
add nn translation to whitelist ([4663e3b](https://github.com/nrkno/tv-automation-server-core/commit/4663e3b)) -
added a place to run updateExpectedMediaItems ([c70704d](https://github.com/nrkno/tv-automation-server-core/commit/c70704d)) -
allow esc & enter in modalDialog ([cd511b6](https://github.com/nrkno/tv-automation-server-core/commit/cd511b6)) -
allow re-sync of unsynced RO while it is active ([b824d72](https://github.com/nrkno/tv-automation-server-core/commit/b824d72)) -
allow removing peripheralDevices from Settings page ([b14e56a](https://github.com/nrkno/tv-automation-server-core/commit/b14e56a)) -
anomaly timings as numbers ([d0c0d36](https://github.com/nrkno/tv-automation-server-core/commit/d0c0d36)) -
another bugfix ([c7ed208](https://github.com/nrkno/tv-automation-server-core/commit/c7ed208)) -
asRunLog: defer handleEvent, to make sure all events have been reported before running. ([6c56ec7](https://github.com/nrkno/tv-automation-server-core/commit/6c56ec7)) -
break long script better in hoverscrub ([2d2f26d](https://github.com/nrkno/tv-automation-server-core/commit/2d2f26d)) -
break long script better in hoverscrub ([5697493](https://github.com/nrkno/tv-automation-server-core/commit/5697493)) -
bugfix ([943ff72](https://github.com/nrkno/tv-automation-server-core/commit/943ff72)) -
bugfix, some keys didn't work in text inputs ([36e99cb](https://github.com/nrkno/tv-automation-server-core/commit/36e99cb)) -
bugfix: updateExpectedMediaItems used all segmentLineItems in RO, not just in segmmentLine ([406829b](https://github.com/nrkno/tv-automation-server-core/commit/406829b)) -
bumps expected version ([bd06edc](https://github.com/nrkno/tv-automation-server-core/commit/bd06edc)) -
changed how i18n is initialized & exported ([cc674aa](https://github.com/nrkno/tv-automation-server-core/commit/cc674aa)) -
check content.path before creating an ExpectedMediaItem ([0914e98](https://github.com/nrkno/tv-automation-server-core/commit/0914e98)) -
ConfigRef fix ([f557052](https://github.com/nrkno/tv-automation-server-core/commit/f557052)) -
enforce workflow data structure ([d01245f](https://github.com/nrkno/tv-automation-server-core/commit/d01245f)) -
ensure that the connection notification is always on top ([662cd7a](https://github.com/nrkno/tv-automation-server-core/commit/662cd7a)) -
Ensure typeVariant on SegmentLine is preserved when a roList is received ([98b224c](https://github.com/nrkno/tv-automation-server-core/commit/98b224c)) -
expectedMediaItems: make ids uniquer ([e16594a](https://github.com/nrkno/tv-automation-server-core/commit/e16594a)) -
fix notifications toggle button cursor ([b0d8dcb](https://github.com/nrkno/tv-automation-server-core/commit/b0d8dcb)) -
freeze/black in begin/end of mediafile gets special warning ([ea950e2](https://github.com/nrkno/tv-automation-server-core/commit/ea950e2)) -
GUI externalMessages json formatting ([0b7cd2c](https://github.com/nrkno/tv-automation-server-core/commit/0b7cd2c)) -
handle promises correctly.. ([2e57296](https://github.com/nrkno/tv-automation-server-core/commit/2e57296)) -
handle promises correctly.. ([b952e1d](https://github.com/nrkno/tv-automation-server-core/commit/b952e1d)) -
improve notifications highlighting animation ([abda2c3](https://github.com/nrkno/tv-automation-server-core/commit/abda2c3)) -
increase upload limit for backup files ([e658f12](https://github.com/nrkno/tv-automation-server-core/commit/e658f12)) -
initial optimization of updateSourceLayerInfinitesAfterLine ([5cd8235](https://github.com/nrkno/tv-automation-server-core/commit/5cd8235)) -
initial optimization of updateSourceLayerInfinitesAfterLine ([871bdd2](https://github.com/nrkno/tv-automation-server-core/commit/871bdd2)) -
issue with source layers marked as used even though they were used in the following segmentLine ([71acfb3](https://github.com/nrkno/tv-automation-server-core/commit/71acfb3)) -
logics bugfix after optimization ([2b8fa3c](https://github.com/nrkno/tv-automation-server-core/commit/2b8fa3c)) -
logics bugfix after optimization ([fe85cd3](https://github.com/nrkno/tv-automation-server-core/commit/fe85cd3)) -
make sure that the adlib shelf isn't obstructed by the right-hand bar ([8783819](https://github.com/nrkno/tv-automation-server-core/commit/8783819)) -
media-manager: rename keyStep => criticalStep ([77f4d6a](https://github.com/nrkno/tv-automation-server-core/commit/77f4d6a)) -
mediainfo typings & timebase ([67f16be](https://github.com/nrkno/tv-automation-server-core/commit/67f16be)) -
move all segment notes away from header, show only summary, clickable summary ([aee3d01](https://github.com/nrkno/tv-automation-server-core/commit/aee3d01)) -
move notifications pop-ups when NC is open ([6f7759f](https://github.com/nrkno/tv-automation-server-core/commit/6f7759f)) -
non-persistent pop-ups should be prioritized over persistent ones ([99f147a](https://github.com/nrkno/tv-automation-server-core/commit/99f147a)) -
NotificationCenter visual fix for other pages ([2c5da97](https://github.com/nrkno/tv-automation-server-core/commit/2c5da97)) -
optimizations during adlibs (thanks to @baltedewit) ([daa135b](https://github.com/nrkno/tv-automation-server-core/commit/daa135b)) -
optimizations during adlibs (thanks to @baltedewit) ([f50b60e](https://github.com/nrkno/tv-automation-server-core/commit/f50b60e)) -
peripheralDevices subscription for RO data ([90b4e13](https://github.com/nrkno/tv-automation-server-core/commit/90b4e13)) -
rabbitMQ sending messages ([df72c4c](https://github.com/nrkno/tv-automation-server-core/commit/df72c4c)) -
RecordedFiles index ([f1aae5e](https://github.com/nrkno/tv-automation-server-core/commit/f1aae5e)) -
refactor updateExternalMessageQueueStatus to avoid fatal startup bug ([b54b09d](https://github.com/nrkno/tv-automation-server-core/commit/b54b09d)) -
remove 'computation stopped' notifications ([bf4d8d8](https://github.com/nrkno/tv-automation-server-core/commit/bf4d8d8)) -
Remove empty translations ([d2f1bd0](https://github.com/nrkno/tv-automation-server-core/commit/d2f1bd0)) -
remove expectedMediaItems when ro is removed ([5230695](https://github.com/nrkno/tv-automation-server-core/commit/5230695)) -
remove leftover debug info ([d475b76](https://github.com/nrkno/tv-automation-server-core/commit/d475b76)) -
remove unneccessary margin in some headers ([32874a1](https://github.com/nrkno/tv-automation-server-core/commit/32874a1)) -
remove unneccessary margin in some headers ([b47ea11](https://github.com/nrkno/tv-automation-server-core/commit/b47ea11)) -
Removed the hard-coded link in the header that set the translation to Norwegian Bokmål. ([4515066](https://github.com/nrkno/tv-automation-server-core/commit/4515066)) -
removed wrongful error throw ([852c495](https://github.com/nrkno/tv-automation-server-core/commit/852c495)) -
removed wrongful error throw ([b3deed1](https://github.com/nrkno/tv-automation-server-core/commit/b3deed1)) -
rename method getShowStyleRef => getShowStyleConfigRef ([c8bbe95](https://github.com/nrkno/tv-automation-server-core/commit/c8bbe95)) -
rename version 0.20.0 => 0.21.0 (release 6) ([7b1ee3a](https://github.com/nrkno/tv-automation-server-core/commit/7b1ee3a)) -
resolve a typo in rabbitMQ.ts ([3b36ae3](https://github.com/nrkno/tv-automation-server-core/commit/3b36ae3)) -
resolve issue with ContextMenus in RO view ([8d9ba96](https://github.com/nrkno/tv-automation-server-core/commit/8d9ba96)) -
resolve issue with lowPriority cron jobs ([f7c3c83](https://github.com/nrkno/tv-automation-server-core/commit/f7c3c83)) -
RO notification action ([36cf900](https://github.com/nrkno/tv-automation-server-core/commit/36cf900)) -
RO Notifications fixes attempt no. 3 ([f0eee1f](https://github.com/nrkno/tv-automation-server-core/commit/f0eee1f)) -
Running Order Notifications in activeRo view ([63658b1](https://github.com/nrkno/tv-automation-server-core/commit/63658b1)) -
separate warnings for black frames & freeze frames ([e2acad5](https://github.com/nrkno/tv-automation-server-core/commit/e2acad5)) -
set tsr multithreading from UI instead of CLI ([c8be25b](https://github.com/nrkno/tv-automation-server-core/commit/c8be25b)) -
show connected devices in RO view ([e804d1e](https://github.com/nrkno/tv-automation-server-core/commit/e804d1e)) -
some minor react errors in the settings ([d7bb849](https://github.com/nrkno/tv-automation-server-core/commit/d7bb849)) -
some more margin touch-ups ([71a291a](https://github.com/nrkno/tv-automation-server-core/commit/71a291a)) -
some more margin touch-ups ([c8b6f1e](https://github.com/nrkno/tv-automation-server-core/commit/c8b6f1e)) -
temporary fix for the "UnhandledPromiseRejectionWarning" bug, supressing the error when used ([7aa7cf8](https://github.com/nrkno/tv-automation-server-core/commit/7aa7cf8)) -
test-tools decklink input format dropdown has no options ([b02f447](https://github.com/nrkno/tv-automation-server-core/commit/b02f447)) -
timelineObj _id missing ([0f8e0da](https://github.com/nrkno/tv-automation-server-core/commit/0f8e0da)) -
timelineObj _id missing ([1dcedbf](https://github.com/nrkno/tv-automation-server-core/commit/1dcedbf)) -
Typographic tweaks for prompter. ([068d535](https://github.com/nrkno/tv-automation-server-core/commit/068d535)) -
ui manualPlayback key ([5d4e49f](https://github.com/nrkno/tv-automation-server-core/commit/5d4e49f)) -
ui manualPlayback key ([ca1a943](https://github.com/nrkno/tv-automation-server-core/commit/ca1a943)) -
update asRunLog typings ([5d18c66](https://github.com/nrkno/tv-automation-server-core/commit/5d18c66)) -
Update some playout timelineobj types ([fe883a8](https://github.com/nrkno/tv-automation-server-core/commit/fe883a8)) -
updateExpectedMediaItems failing was causing the post-process blueprint to not be run. Errors f ([2fe22bb](https://github.com/nrkno/tv-automation-server-core/commit/2fe22bb)) -
use admin as parameter instead of all ([20751b4](https://github.com/nrkno/tv-automation-server-core/commit/20751b4)) -
useractions: proper handling of the this keyword ([49a44a7](https://github.com/nrkno/tv-automation-server-core/commit/49a44a7)) -
useractions: proper handling of the this keyword ([a2686db](https://github.com/nrkno/tv-automation-server-core/commit/a2686db)) -
Wrong icon for split in presenter view ([08c8df8](https://github.com/nrkno/tv-automation-server-core/commit/08c8df8)) -
Wrong icon for split in presenter view ([1ec1c56](https://github.com/nrkno/tv-automation-server-core/commit/1ec1c56)) -
*Adlib*: Allow for overlap of adlib sli to give preload time ([d2f0dcd](https://github.com/nrkno/tv-automation-server-core/commit/d2f0dcd)) -
*Adlib*: An adlib replacing the main sli of a sl would not adjust the length of the original. F5/ ([fca6f05](https://github.com/nrkno/tv-automation-server-core/commit/fca6f05)) -
*Adlib*: Set as next on SL after using F5/F6 would not restore correctly ([3829293](https://github.com/nrkno/tv-automation-server-core/commit/3829293)) -
*Clip metadata*: timebase info ([5c39ea8](https://github.com/nrkno/tv-automation-server-core/commit/5c39ea8)) -
*Expected media items*: use a function instead of fat arrow ([fa23c05](https://github.com/nrkno/tv-automation-server-core/commit/fa23c05)) -
*L3rd pop-up*: filter out properties starting with @ ([19977e7](https://github.com/nrkno/tv-automation-server-core/commit/19977e7)) -
*L3rd pop-up*: filter out properties starting with @ ([c85ebeb](https://github.com/nrkno/tv-automation-server-core/commit/c85ebeb)) -
*Lookahead*: RETAIN mode now follows the WHEN_CLEAR behaviour instead of PRELOAD ([f0df41c](https://github.com/nrkno/tv-automation-server-core/commit/f0df41c)) -
*Media manager ui*: display work step labels correctly ([05cce78](https://github.com/nrkno/tv-automation-server-core/commit/05cce78)) -
*Media manager ui*: fix task list layout issue ([9902dc1](https://github.com/nrkno/tv-automation-server-core/commit/9902dc1)) -
*Media manager ui*: media manager flow order ([1eb1c48](https://github.com/nrkno/tv-automation-server-core/commit/1eb1c48)) -
*Media manager*: label on MM workFlow ([fc2e8d5](https://github.com/nrkno/tv-automation-server-core/commit/fc2e8d5)) -
*Migrations*: Broken StudioContext.updateDevice method ([7311d10](https://github.com/nrkno/tv-automation-server-core/commit/7311d10)) -
*Migrations*: DependOnResultFrom id was not being prefixed causing it to never work ([602740c](https://github.com/nrkno/tv-automation-server-core/commit/602740c)) -
*Notifications*: change unknown to any ([7ac8008](https://github.com/nrkno/tv-automation-server-core/commit/7ac8008)) -
*Playout*: bad timing during autonext ([5524e3b](https://github.com/nrkno/tv-automation-server-core/commit/5524e3b)) -
*Playout*: Ensure that infinite segmentLineItems are reset correctly after being removed by some ([045c9b1](https://github.com/nrkno/tv-automation-server-core/commit/045c9b1)) -
*Playout*: Ensure that infinite segmentLineItems are reset correctly after being removed by some ([e4f8a83](https://github.com/nrkno/tv-automation-server-core/commit/e4f8a83)) -
*Playout*: Fix overlap tests ([15628a2](https://github.com/nrkno/tv-automation-server-core/commit/15628a2)) -
*Playout*: ID prefixing did not handle logical object id references ([44f2883](https://github.com/nrkno/tv-automation-server-core/commit/44f2883)) -
*Playout*: Infinite item continuations were not always updated correctly ([7a7aed6](https://github.com/nrkno/tv-automation-server-core/commit/7a7aed6)) -
*Playout*: Objects being written out without an id ([b05a851](https://github.com/nrkno/tv-automation-server-core/commit/b05a851)) -
*Playout*: Optimise layers of promises in infinite generation logic, and reorder function paramet ([e400c7c](https://github.com/nrkno/tv-automation-server-core/commit/e400c7c)) -
*Playout*: Typo in ID prefixing ([249b35d](https://github.com/nrkno/tv-automation-server-core/commit/249b35d)) -
*Playout*: Use original sli id when adding infinite to the timeline, to ensure that any triggers ([c0382ec](https://github.com/nrkno/tv-automation-server-core/commit/c0382ec)) -
*Playout*: Use original sli id when adding infinite to the timeline, to ensure that any triggers ([e7eb871](https://github.com/nrkno/tv-automation-server-core/commit/e7eb871)) -
*Ro list*: translatify & hide 'Unsynced from MOS' label when no unsynced items ([11b0f29](https://github.com/nrkno/tv-automation-server-core/commit/11b0f29)) -
*Ro list*: translatify & hide 'Unsynced from MOS' label when no unsynced items ([fa56ecd](https://github.com/nrkno/tv-automation-server-core/commit/fa56ecd)) +
add missing translation json-file ([6059965](https://github.com/nrkno/tv-automation-server-core/commit/6059965)) +
add missing \_id ([970fbf8](https://github.com/nrkno/tv-automation-server-core/commit/970fbf8)) +
add missing \_id ([c948d09](https://github.com/nrkno/tv-automation-server-core/commit/c948d09)) +
add missing core version ([8ad3a9e](https://github.com/nrkno/tv-automation-server-core/commit/8ad3a9e)) +
add nn translation to whitelist ([c4d859a](https://github.com/nrkno/tv-automation-server-core/commit/c4d859a)) +
add nn translation to whitelist ([4663e3b](https://github.com/nrkno/tv-automation-server-core/commit/4663e3b)) +
added a place to run updateExpectedMediaItems ([c70704d](https://github.com/nrkno/tv-automation-server-core/commit/c70704d)) +
allow esc & enter in modalDialog ([cd511b6](https://github.com/nrkno/tv-automation-server-core/commit/cd511b6)) +
allow re-sync of unsynced RO while it is active ([b824d72](https://github.com/nrkno/tv-automation-server-core/commit/b824d72)) +
allow removing peripheralDevices from Settings page ([b14e56a](https://github.com/nrkno/tv-automation-server-core/commit/b14e56a)) +
anomaly timings as numbers ([d0c0d36](https://github.com/nrkno/tv-automation-server-core/commit/d0c0d36)) +
another bugfix ([c7ed208](https://github.com/nrkno/tv-automation-server-core/commit/c7ed208)) +
asRunLog: defer handleEvent, to make sure all events have been reported before running. ([6c56ec7](https://github.com/nrkno/tv-automation-server-core/commit/6c56ec7)) +
break long script better in hoverscrub ([2d2f26d](https://github.com/nrkno/tv-automation-server-core/commit/2d2f26d)) +
break long script better in hoverscrub ([5697493](https://github.com/nrkno/tv-automation-server-core/commit/5697493)) +
bugfix ([943ff72](https://github.com/nrkno/tv-automation-server-core/commit/943ff72)) +
bugfix, some keys didn't work in text inputs ([36e99cb](https://github.com/nrkno/tv-automation-server-core/commit/36e99cb)) +
bugfix: updateExpectedMediaItems used all segmentLineItems in RO, not just in segmmentLine ([406829b](https://github.com/nrkno/tv-automation-server-core/commit/406829b)) +
bumps expected version ([bd06edc](https://github.com/nrkno/tv-automation-server-core/commit/bd06edc)) +
changed how i18n is initialized & exported ([cc674aa](https://github.com/nrkno/tv-automation-server-core/commit/cc674aa)) +
check content.path before creating an ExpectedMediaItem ([0914e98](https://github.com/nrkno/tv-automation-server-core/commit/0914e98)) +
ConfigRef fix ([f557052](https://github.com/nrkno/tv-automation-server-core/commit/f557052)) +
enforce workflow data structure ([d01245f](https://github.com/nrkno/tv-automation-server-core/commit/d01245f)) +
ensure that the connection notification is always on top ([662cd7a](https://github.com/nrkno/tv-automation-server-core/commit/662cd7a)) +
Ensure typeVariant on SegmentLine is preserved when a roList is received ([98b224c](https://github.com/nrkno/tv-automation-server-core/commit/98b224c)) +
expectedMediaItems: make ids uniquer ([e16594a](https://github.com/nrkno/tv-automation-server-core/commit/e16594a)) +
fix notifications toggle button cursor ([b0d8dcb](https://github.com/nrkno/tv-automation-server-core/commit/b0d8dcb)) +
freeze/black in begin/end of mediafile gets special warning ([ea950e2](https://github.com/nrkno/tv-automation-server-core/commit/ea950e2)) +
GUI externalMessages json formatting ([0b7cd2c](https://github.com/nrkno/tv-automation-server-core/commit/0b7cd2c)) +
handle promises correctly.. ([2e57296](https://github.com/nrkno/tv-automation-server-core/commit/2e57296)) +
handle promises correctly.. ([b952e1d](https://github.com/nrkno/tv-automation-server-core/commit/b952e1d)) +
improve notifications highlighting animation ([abda2c3](https://github.com/nrkno/tv-automation-server-core/commit/abda2c3)) +
increase upload limit for backup files ([e658f12](https://github.com/nrkno/tv-automation-server-core/commit/e658f12)) +
initial optimization of updateSourceLayerInfinitesAfterLine ([5cd8235](https://github.com/nrkno/tv-automation-server-core/commit/5cd8235)) +
initial optimization of updateSourceLayerInfinitesAfterLine ([871bdd2](https://github.com/nrkno/tv-automation-server-core/commit/871bdd2)) +
issue with source layers marked as used even though they were used in the following segmentLine ([71acfb3](https://github.com/nrkno/tv-automation-server-core/commit/71acfb3)) +
logics bugfix after optimization ([2b8fa3c](https://github.com/nrkno/tv-automation-server-core/commit/2b8fa3c)) +
logics bugfix after optimization ([fe85cd3](https://github.com/nrkno/tv-automation-server-core/commit/fe85cd3)) +
make sure that the adlib shelf isn't obstructed by the right-hand bar ([8783819](https://github.com/nrkno/tv-automation-server-core/commit/8783819)) +
media-manager: rename keyStep => criticalStep ([77f4d6a](https://github.com/nrkno/tv-automation-server-core/commit/77f4d6a)) +
mediainfo typings & timebase ([67f16be](https://github.com/nrkno/tv-automation-server-core/commit/67f16be)) +
move all segment notes away from header, show only summary, clickable summary ([aee3d01](https://github.com/nrkno/tv-automation-server-core/commit/aee3d01)) +
move notifications pop-ups when NC is open ([6f7759f](https://github.com/nrkno/tv-automation-server-core/commit/6f7759f)) +
non-persistent pop-ups should be prioritized over persistent ones ([99f147a](https://github.com/nrkno/tv-automation-server-core/commit/99f147a)) +
NotificationCenter visual fix for other pages ([2c5da97](https://github.com/nrkno/tv-automation-server-core/commit/2c5da97)) +
optimizations during adlibs (thanks to @baltedewit) ([daa135b](https://github.com/nrkno/tv-automation-server-core/commit/daa135b)) +
optimizations during adlibs (thanks to @baltedewit) ([f50b60e](https://github.com/nrkno/tv-automation-server-core/commit/f50b60e)) +
peripheralDevices subscription for RO data ([90b4e13](https://github.com/nrkno/tv-automation-server-core/commit/90b4e13)) +
rabbitMQ sending messages ([df72c4c](https://github.com/nrkno/tv-automation-server-core/commit/df72c4c)) +
RecordedFiles index ([f1aae5e](https://github.com/nrkno/tv-automation-server-core/commit/f1aae5e)) +
refactor updateExternalMessageQueueStatus to avoid fatal startup bug ([b54b09d](https://github.com/nrkno/tv-automation-server-core/commit/b54b09d)) +
remove 'computation stopped' notifications ([bf4d8d8](https://github.com/nrkno/tv-automation-server-core/commit/bf4d8d8)) +
Remove empty translations ([d2f1bd0](https://github.com/nrkno/tv-automation-server-core/commit/d2f1bd0)) +
remove expectedMediaItems when ro is removed ([5230695](https://github.com/nrkno/tv-automation-server-core/commit/5230695)) +
remove leftover debug info ([d475b76](https://github.com/nrkno/tv-automation-server-core/commit/d475b76)) +
remove unneccessary margin in some headers ([32874a1](https://github.com/nrkno/tv-automation-server-core/commit/32874a1)) +
remove unneccessary margin in some headers ([b47ea11](https://github.com/nrkno/tv-automation-server-core/commit/b47ea11)) +
Removed the hard-coded link in the header that set the translation to Norwegian Bokmål. ([4515066](https://github.com/nrkno/tv-automation-server-core/commit/4515066)) +
removed wrongful error throw ([852c495](https://github.com/nrkno/tv-automation-server-core/commit/852c495)) +
removed wrongful error throw ([b3deed1](https://github.com/nrkno/tv-automation-server-core/commit/b3deed1)) +
rename method getShowStyleRef => getShowStyleConfigRef ([c8bbe95](https://github.com/nrkno/tv-automation-server-core/commit/c8bbe95)) +
rename version 0.20.0 => 0.21.0 (release 6) ([7b1ee3a](https://github.com/nrkno/tv-automation-server-core/commit/7b1ee3a)) +
resolve a typo in rabbitMQ.ts ([3b36ae3](https://github.com/nrkno/tv-automation-server-core/commit/3b36ae3)) +
resolve issue with ContextMenus in RO view ([8d9ba96](https://github.com/nrkno/tv-automation-server-core/commit/8d9ba96)) +
resolve issue with lowPriority cron jobs ([f7c3c83](https://github.com/nrkno/tv-automation-server-core/commit/f7c3c83)) +
RO notification action ([36cf900](https://github.com/nrkno/tv-automation-server-core/commit/36cf900)) +
RO Notifications fixes attempt no. 3 ([f0eee1f](https://github.com/nrkno/tv-automation-server-core/commit/f0eee1f)) +
Running Order Notifications in activeRo view ([63658b1](https://github.com/nrkno/tv-automation-server-core/commit/63658b1)) +
separate warnings for black frames & freeze frames ([e2acad5](https://github.com/nrkno/tv-automation-server-core/commit/e2acad5)) +
set tsr multithreading from UI instead of CLI ([c8be25b](https://github.com/nrkno/tv-automation-server-core/commit/c8be25b)) +
show connected devices in RO view ([e804d1e](https://github.com/nrkno/tv-automation-server-core/commit/e804d1e)) +
some minor react errors in the settings ([d7bb849](https://github.com/nrkno/tv-automation-server-core/commit/d7bb849)) +
some more margin touch-ups ([71a291a](https://github.com/nrkno/tv-automation-server-core/commit/71a291a)) +
some more margin touch-ups ([c8b6f1e](https://github.com/nrkno/tv-automation-server-core/commit/c8b6f1e)) +
temporary fix for the "UnhandledPromiseRejectionWarning" bug, supressing the error when used ([7aa7cf8](https://github.com/nrkno/tv-automation-server-core/commit/7aa7cf8)) +
test-tools decklink input format dropdown has no options ([b02f447](https://github.com/nrkno/tv-automation-server-core/commit/b02f447)) +
timelineObj \_id missing ([0f8e0da](https://github.com/nrkno/tv-automation-server-core/commit/0f8e0da)) +
timelineObj \_id missing ([1dcedbf](https://github.com/nrkno/tv-automation-server-core/commit/1dcedbf)) +
Typographic tweaks for prompter. ([068d535](https://github.com/nrkno/tv-automation-server-core/commit/068d535)) +
ui manualPlayback key ([5d4e49f](https://github.com/nrkno/tv-automation-server-core/commit/5d4e49f)) +
ui manualPlayback key ([ca1a943](https://github.com/nrkno/tv-automation-server-core/commit/ca1a943)) +
update asRunLog typings ([5d18c66](https://github.com/nrkno/tv-automation-server-core/commit/5d18c66)) +
Update some playout timelineobj types ([fe883a8](https://github.com/nrkno/tv-automation-server-core/commit/fe883a8)) +
updateExpectedMediaItems failing was causing the post-process blueprint to not be run. Errors f ([2fe22bb](https://github.com/nrkno/tv-automation-server-core/commit/2fe22bb)) +
use admin as parameter instead of all ([20751b4](https://github.com/nrkno/tv-automation-server-core/commit/20751b4)) +
useractions: proper handling of the this keyword ([49a44a7](https://github.com/nrkno/tv-automation-server-core/commit/49a44a7)) +
useractions: proper handling of the this keyword ([a2686db](https://github.com/nrkno/tv-automation-server-core/commit/a2686db)) +
Wrong icon for split in presenter view ([08c8df8](https://github.com/nrkno/tv-automation-server-core/commit/08c8df8)) +
Wrong icon for split in presenter view ([1ec1c56](https://github.com/nrkno/tv-automation-server-core/commit/1ec1c56)) +
_Adlib_: Allow for overlap of adlib sli to give preload time ([d2f0dcd](https://github.com/nrkno/tv-automation-server-core/commit/d2f0dcd)) +
_Adlib_: An adlib replacing the main sli of a sl would not adjust the length of the original. F5/ ([fca6f05](https://github.com/nrkno/tv-automation-server-core/commit/fca6f05)) +
_Adlib_: Set as next on SL after using F5/F6 would not restore correctly ([3829293](https://github.com/nrkno/tv-automation-server-core/commit/3829293)) +
_Clip metadata_: timebase info ([5c39ea8](https://github.com/nrkno/tv-automation-server-core/commit/5c39ea8)) +
_Expected media items_: use a function instead of fat arrow ([fa23c05](https://github.com/nrkno/tv-automation-server-core/commit/fa23c05)) +
_L3rd pop-up_: filter out properties starting with @ ([19977e7](https://github.com/nrkno/tv-automation-server-core/commit/19977e7)) +
_L3rd pop-up_: filter out properties starting with @ ([c85ebeb](https://github.com/nrkno/tv-automation-server-core/commit/c85ebeb)) +
_Lookahead_: RETAIN mode now follows the WHEN*CLEAR behaviour instead of PRELOAD ([f0df41c](https://github.com/nrkno/tv-automation-server-core/commit/f0df41c)) +
\_Media manager ui*: display work step labels correctly ([05cce78](https://github.com/nrkno/tv-automation-server-core/commit/05cce78)) +
_Media manager ui_: fix task list layout issue ([9902dc1](https://github.com/nrkno/tv-automation-server-core/commit/9902dc1)) +
_Media manager ui_: media manager flow order ([1eb1c48](https://github.com/nrkno/tv-automation-server-core/commit/1eb1c48)) +
_Media manager_: label on MM workFlow ([fc2e8d5](https://github.com/nrkno/tv-automation-server-core/commit/fc2e8d5)) +
_Migrations_: Broken StudioContext.updateDevice method ([7311d10](https://github.com/nrkno/tv-automation-server-core/commit/7311d10)) +
_Migrations_: DependOnResultFrom id was not being prefixed causing it to never work ([602740c](https://github.com/nrkno/tv-automation-server-core/commit/602740c)) +
_Notifications_: change unknown to any ([7ac8008](https://github.com/nrkno/tv-automation-server-core/commit/7ac8008)) +
_Playout_: bad timing during autonext ([5524e3b](https://github.com/nrkno/tv-automation-server-core/commit/5524e3b)) +
_Playout_: Ensure that infinite segmentLineItems are reset correctly after being removed by some ([045c9b1](https://github.com/nrkno/tv-automation-server-core/commit/045c9b1)) +
_Playout_: Ensure that infinite segmentLineItems are reset correctly after being removed by some ([e4f8a83](https://github.com/nrkno/tv-automation-server-core/commit/e4f8a83)) +
_Playout_: Fix overlap tests ([15628a2](https://github.com/nrkno/tv-automation-server-core/commit/15628a2)) +
_Playout_: ID prefixing did not handle logical object id references ([44f2883](https://github.com/nrkno/tv-automation-server-core/commit/44f2883)) +
_Playout_: Infinite item continuations were not always updated correctly ([7a7aed6](https://github.com/nrkno/tv-automation-server-core/commit/7a7aed6)) +
_Playout_: Objects being written out without an id ([b05a851](https://github.com/nrkno/tv-automation-server-core/commit/b05a851)) +
_Playout_: Optimise layers of promises in infinite generation logic, and reorder function paramet ([e400c7c](https://github.com/nrkno/tv-automation-server-core/commit/e400c7c)) +
_Playout_: Typo in ID prefixing ([249b35d](https://github.com/nrkno/tv-automation-server-core/commit/249b35d)) +
_Playout_: Use original sli id when adding infinite to the timeline, to ensure that any triggers ([c0382ec](https://github.com/nrkno/tv-automation-server-core/commit/c0382ec)) +
_Playout_: Use original sli id when adding infinite to the timeline, to ensure that any triggers ([e7eb871](https://github.com/nrkno/tv-automation-server-core/commit/e7eb871)) +
_Ro list_: translatify & hide 'Unsynced from MOS' label when no unsynced items ([11b0f29](https://github.com/nrkno/tv-automation-server-core/commit/11b0f29)) +
_Ro list_: translatify & hide 'Unsynced from MOS' label when no unsynced items ([fa56ecd](https://github.com/nrkno/tv-automation-server-core/commit/fa56ecd)) ### Other / Chores -
add lint script ([a598142](https://github.com/nrkno/tv-automation-server-core/commit/a598142)) -
add missing packages to version ignore list ([667c6a4](https://github.com/nrkno/tv-automation-server-core/commit/667c6a4)) -
add missing userAction names ([915a36e](https://github.com/nrkno/tv-automation-server-core/commit/915a36e)) -
Add some debug helpers to reevaluate a restored snapshot ([4f2b53c](https://github.com/nrkno/tv-automation-server-core/commit/4f2b53c)) -
Add tests for playout infinite generation logic ([a6a8fcd](https://github.com/nrkno/tv-automation-server-core/commit/a6a8fcd)) -
adds react-circular-progressbar dependency ([8409bc8](https://github.com/nrkno/tv-automation-server-core/commit/8409bc8)) -
Debug helpers should ensure infinite items are generated after blueprint evaluation ([6b50698](https://github.com/nrkno/tv-automation-server-core/commit/6b50698)) -
dev: access jquery $ from console ([045115b](https://github.com/nrkno/tv-automation-server-core/commit/045115b)) -
document migration ([42649e4](https://github.com/nrkno/tv-automation-server-core/commit/42649e4)) -
ExecuteFunction: improved timeout error message ([2398b6a](https://github.com/nrkno/tv-automation-server-core/commit/2398b6a)) -
fix another issue with using the wrong enum ([5a1b30e](https://github.com/nrkno/tv-automation-server-core/commit/5a1b30e)) -
housekeeping, remove old files ([0b839cc](https://github.com/nrkno/tv-automation-server-core/commit/0b839cc)) -
improved extendMandatory, so it properly requires extend-properties when original type has op ([b308d36](https://github.com/nrkno/tv-automation-server-core/commit/b308d36)) -
increased granularity of translation fallbacks ([013f45f](https://github.com/nrkno/tv-automation-server-core/commit/013f45f)) -
linting ([4f612fa](https://github.com/nrkno/tv-automation-server-core/commit/4f612fa)) -
linting & housekeeping ([2bed3ff](https://github.com/nrkno/tv-automation-server-core/commit/2bed3ff)) -
making changelog a bit more human-readable ([a27289c](https://github.com/nrkno/tv-automation-server-core/commit/a27289c)) -
merge develop changes ([5d981e3](https://github.com/nrkno/tv-automation-server-core/commit/5d981e3)) -
merge expectedMediaItems into develop ([fee158c](https://github.com/nrkno/tv-automation-server-core/commit/fee158c)) -
merge hotfix to develop ([6e133ce](https://github.com/nrkno/tv-automation-server-core/commit/6e133ce)) -
merge release5 fixes ([4c7760f](https://github.com/nrkno/tv-automation-server-core/commit/4c7760f)) -
move saveEvaluations out of userActions (no real actions should be performed there) ([9d26277](https://github.com/nrkno/tv-automation-server-core/commit/9d26277)) -
omit some more libraries on startup ([96b96e3](https://github.com/nrkno/tv-automation-server-core/commit/96b96e3)) -
prepare databaseMigrations ([5db28e6](https://github.com/nrkno/tv-automation-server-core/commit/5db28e6)) -
Remove accidental console.log ([d421308](https://github.com/nrkno/tv-automation-server-core/commit/d421308)) -
rename hello.test.js to ts ([3b75dd2](https://github.com/nrkno/tv-automation-server-core/commit/3b75dd2)) -
rename hello.test.js to ts ([70a9c22](https://github.com/nrkno/tv-automation-server-core/commit/70a9c22)) -
rename methods ([2de2fc8](https://github.com/nrkno/tv-automation-server-core/commit/2de2fc8)) -
rename methods ([af69dae](https://github.com/nrkno/tv-automation-server-core/commit/af69dae)) -
Reorder studio settings page ([e1ed6f0](https://github.com/nrkno/tv-automation-server-core/commit/e1ed6f0)) -
stronger typings (preparations for noImplicitAny) ([33a5bcc](https://github.com/nrkno/tv-automation-server-core/commit/33a5bcc)) -
timelineObjs ([35d6ed3](https://github.com/nrkno/tv-automation-server-core/commit/35d6ed3)) -
timelineObjs ([c6bd813](https://github.com/nrkno/tv-automation-server-core/commit/c6bd813)) -
type fix ([70971d4](https://github.com/nrkno/tv-automation-server-core/commit/70971d4)) -
type up subscriptions & publications ([3fe8e01](https://github.com/nrkno/tv-automation-server-core/commit/3fe8e01)) -
typing fix ([79269e7](https://github.com/nrkno/tv-automation-server-core/commit/79269e7)) -
update deps ([e01922b](https://github.com/nrkno/tv-automation-server-core/commit/e01922b)) -
update nn translation support ([dc9d611](https://github.com/nrkno/tv-automation-server-core/commit/dc9d611)) -
update publication ([956318f](https://github.com/nrkno/tv-automation-server-core/commit/956318f)) -
update translation template ([f31353b](https://github.com/nrkno/tv-automation-server-core/commit/f31353b)) -
update typings ([56c5620](https://github.com/nrkno/tv-automation-server-core/commit/56c5620)) -
Updated case on a headline. ([eca2bdf](https://github.com/nrkno/tv-automation-server-core/commit/eca2bdf)) -
Updated NB and NN translations. ([4d09503](https://github.com/nrkno/tv-automation-server-core/commit/4d09503)) -
Updated Norwegian translations. Fixed spelling error of "bluerpints" and capitalizations in S ([5c3a617](https://github.com/nrkno/tv-automation-server-core/commit/5c3a617)) -
Updated NB translations and fixed a few case-errors in headlines. ([a7c6365](https://github.com/nrkno/tv-automation-server-core/commit/a7c6365)) -
*Blueprint*: Move interface fields from blueprint-integration ([d77d4fc](https://github.com/nrkno/tv-automation-server-core/commit/d77d4fc)) -
*Media manager UI*: drop unnecessary checks after getPeripheralDevice ([33fde80](https://github.com/nrkno/tv-automation-server-core/commit/33fde80)) -
*Release*: 0.21.0-0 ([3fd5334](https://github.com/nrkno/tv-automation-server-core/commit/3fd5334)) -
*Release*: cherry-pick package version from release 6 ([c1b0961](https://github.com/nrkno/tv-automation-server-core/commit/c1b0961)) -
*Release*: copy version from master ([a6884d9](https://github.com/nrkno/tv-automation-server-core/commit/a6884d9)) - -
Merge branch 'develop' into feature/mediaManagerUI ([175c4da](https://github.com/nrkno/tv-automation-server-core/commit/175c4da)) -
Merge branch 'develop' into feature/mediaManagerUI ([2f03785](https://github.com/nrkno/tv-automation-server-core/commit/2f03785)) -
Merge branch 'develop' into feature/mediaManagerUI ([db867d3](https://github.com/nrkno/tv-automation-server-core/commit/db867d3)) -
Merge branch 'develop' into feature/stoppedPlayback ([2af1a72](https://github.com/nrkno/tv-automation-server-core/commit/2af1a72)) -
Merge branch 'develop' into feature/userActions ([b6a1dc7](https://github.com/nrkno/tv-automation-server-core/commit/b6a1dc7)) -
Merge branch 'develop' of github.com:nrkno/tv-automation-server-core into develop ([004af77](https://github.com/nrkno/tv-automation-server-core/commit/004af77)) -
Merge branch 'develop' of github.com:nrkno/tv-automation-server-core into develop ([1657eeb](https://github.com/nrkno/tv-automation-server-core/commit/1657eeb)) -
Merge branch 'develop' of github.com:nrkno/tv-automation-server-core into develop ([ab75977](https://github.com/nrkno/tv-automation-server-core/commit/ab75977)) -
Merge branch 'feature/freeze-black-detection' into develop ([3c998f5](https://github.com/nrkno/tv-automation-server-core/commit/3c998f5)) -
Merge branch 'feature/mediamanageractions' into develop ([6ea21b1](https://github.com/nrkno/tv-automation-server-core/commit/6ea21b1)) -
Merge branch 'feature/multithreaded-tsr' into develop ([e51a42b](https://github.com/nrkno/tv-automation-server-core/commit/e51a42b)) -
Merge branch 'feature/noimplicitAny' into develop ([68d76af](https://github.com/nrkno/tv-automation-server-core/commit/68d76af)) -
Merge branch 'feature/stoppedPlayback' into develop ([4b0ba8d](https://github.com/nrkno/tv-automation-server-core/commit/4b0ba8d)) -
Merge branch 'feature/support-message' into develop ([591a6c8](https://github.com/nrkno/tv-automation-server-core/commit/591a6c8)) -
Merge branch 'feature/userActions' into develop ([2a50e6f](https://github.com/nrkno/tv-automation-server-core/commit/2a50e6f)) -
Merge branch 'master' into release5 ([6ee463e](https://github.com/nrkno/tv-automation-server-core/commit/6ee463e)) -
Merge branch 'release5' into develop ([7d34ce3](https://github.com/nrkno/tv-automation-server-core/commit/7d34ce3)) -
Merge branch 'release5' into develop ([9c2acf5](https://github.com/nrkno/tv-automation-server-core/commit/9c2acf5)) -
Merge branch 'release5' into develop ([a1e704d](https://github.com/nrkno/tv-automation-server-core/commit/a1e704d)) -
Merge branch 'release5' into develop ([eca12b8](https://github.com/nrkno/tv-automation-server-core/commit/eca12b8)) -
Merge branch 'release6' into develop ([6afe42b](https://github.com/nrkno/tv-automation-server-core/commit/6afe42b)) -
Merge pull request #58 from nrkno/fix/ui-settings ([a76813f](https://github.com/nrkno/tv-automation-server-core/commit/a76813f)), closes [#58](https://github.com/nrkno/tv-automation-server-core/issues/58) -
Merge pull request #65 from nrkno/feature/lookahead-rewrite-retain-mode ([6f78d00](https://github.com/nrkno/tv-automation-server-core/commit/6f78d00)), closes [#65](https://github.com/nrkno/tv-automation-server-core/issues/65) -
Merge pull request #66 from nrkno/feature/fix-f5-f6-adlib-bug ([4de0acd](https://github.com/nrkno/tv-automation-server-core/commit/4de0acd)), closes [#66](https://github.com/nrkno/tv-automation-server-core/issues/66) -
Merge pull request #70 from nrkno/feature/mediaManagerUI ([6763fe5](https://github.com/nrkno/tv-automation-server-core/commit/6763fe5)), closes [#70](https://github.com/nrkno/tv-automation-server-core/issues/70) -
Merge remote-tracking branch 'origin/develop' into develop ([a676817](https://github.com/nrkno/tv-automation-server-core/commit/a676817)) -
Merge remote-tracking branch 'origin/fix/optimizeInfinitesAfterLine' into develop ([bbb28ee](https://github.com/nrkno/tv-automation-server-core/commit/bbb28ee)) -
types ([f5fe277](https://github.com/nrkno/tv-automation-server-core/commit/f5fe277)) - +
add lint script ([a598142](https://github.com/nrkno/tv-automation-server-core/commit/a598142)) +
add missing packages to version ignore list ([667c6a4](https://github.com/nrkno/tv-automation-server-core/commit/667c6a4)) +
add missing userAction names ([915a36e](https://github.com/nrkno/tv-automation-server-core/commit/915a36e)) +
Add some debug helpers to reevaluate a restored snapshot ([4f2b53c](https://github.com/nrkno/tv-automation-server-core/commit/4f2b53c)) +
Add tests for playout infinite generation logic ([a6a8fcd](https://github.com/nrkno/tv-automation-server-core/commit/a6a8fcd)) +
adds react-circular-progressbar dependency ([8409bc8](https://github.com/nrkno/tv-automation-server-core/commit/8409bc8)) +
Debug helpers should ensure infinite items are generated after blueprint evaluation ([6b50698](https://github.com/nrkno/tv-automation-server-core/commit/6b50698)) +
dev: access jquery $ from console ([045115b](https://github.com/nrkno/tv-automation-server-core/commit/045115b)) +
document migration ([42649e4](https://github.com/nrkno/tv-automation-server-core/commit/42649e4)) +
ExecuteFunction: improved timeout error message ([2398b6a](https://github.com/nrkno/tv-automation-server-core/commit/2398b6a)) +
fix another issue with using the wrong enum ([5a1b30e](https://github.com/nrkno/tv-automation-server-core/commit/5a1b30e)) +
housekeeping, remove old files ([0b839cc](https://github.com/nrkno/tv-automation-server-core/commit/0b839cc)) +
improved extendMandatory, so it properly requires extend-properties when original type has op ([b308d36](https://github.com/nrkno/tv-automation-server-core/commit/b308d36)) +
increased granularity of translation fallbacks ([013f45f](https://github.com/nrkno/tv-automation-server-core/commit/013f45f)) +
linting ([4f612fa](https://github.com/nrkno/tv-automation-server-core/commit/4f612fa)) +
linting & housekeeping ([2bed3ff](https://github.com/nrkno/tv-automation-server-core/commit/2bed3ff)) +
making changelog a bit more human-readable ([a27289c](https://github.com/nrkno/tv-automation-server-core/commit/a27289c)) +
merge develop changes ([5d981e3](https://github.com/nrkno/tv-automation-server-core/commit/5d981e3)) +
merge expectedMediaItems into develop ([fee158c](https://github.com/nrkno/tv-automation-server-core/commit/fee158c)) +
merge hotfix to develop ([6e133ce](https://github.com/nrkno/tv-automation-server-core/commit/6e133ce)) +
merge release5 fixes ([4c7760f](https://github.com/nrkno/tv-automation-server-core/commit/4c7760f)) +
move saveEvaluations out of userActions (no real actions should be performed there) ([9d26277](https://github.com/nrkno/tv-automation-server-core/commit/9d26277)) +
omit some more libraries on startup ([96b96e3](https://github.com/nrkno/tv-automation-server-core/commit/96b96e3)) +
prepare databaseMigrations ([5db28e6](https://github.com/nrkno/tv-automation-server-core/commit/5db28e6)) +
Remove accidental console.log ([d421308](https://github.com/nrkno/tv-automation-server-core/commit/d421308)) +
rename hello.test.js to ts ([3b75dd2](https://github.com/nrkno/tv-automation-server-core/commit/3b75dd2)) +
rename hello.test.js to ts ([70a9c22](https://github.com/nrkno/tv-automation-server-core/commit/70a9c22)) +
rename methods ([2de2fc8](https://github.com/nrkno/tv-automation-server-core/commit/2de2fc8)) +
rename methods ([af69dae](https://github.com/nrkno/tv-automation-server-core/commit/af69dae)) +
Reorder studio settings page ([e1ed6f0](https://github.com/nrkno/tv-automation-server-core/commit/e1ed6f0)) +
stronger typings (preparations for noImplicitAny) ([33a5bcc](https://github.com/nrkno/tv-automation-server-core/commit/33a5bcc)) +
timelineObjs ([35d6ed3](https://github.com/nrkno/tv-automation-server-core/commit/35d6ed3)) +
timelineObjs ([c6bd813](https://github.com/nrkno/tv-automation-server-core/commit/c6bd813)) +
type fix ([70971d4](https://github.com/nrkno/tv-automation-server-core/commit/70971d4)) +
type up subscriptions & publications ([3fe8e01](https://github.com/nrkno/tv-automation-server-core/commit/3fe8e01)) +
typing fix ([79269e7](https://github.com/nrkno/tv-automation-server-core/commit/79269e7)) +
update deps ([e01922b](https://github.com/nrkno/tv-automation-server-core/commit/e01922b)) +
update nn translation support ([dc9d611](https://github.com/nrkno/tv-automation-server-core/commit/dc9d611)) +
update publication ([956318f](https://github.com/nrkno/tv-automation-server-core/commit/956318f)) +
update translation template ([f31353b](https://github.com/nrkno/tv-automation-server-core/commit/f31353b)) +
update typings ([56c5620](https://github.com/nrkno/tv-automation-server-core/commit/56c5620)) +
Updated case on a headline. ([eca2bdf](https://github.com/nrkno/tv-automation-server-core/commit/eca2bdf)) +
Updated NB and NN translations. ([4d09503](https://github.com/nrkno/tv-automation-server-core/commit/4d09503)) +
Updated Norwegian translations. Fixed spelling error of "bluerpints" and capitalizations in S ([5c3a617](https://github.com/nrkno/tv-automation-server-core/commit/5c3a617)) +
Updated NB translations and fixed a few case-errors in headlines. ([a7c6365](https://github.com/nrkno/tv-automation-server-core/commit/a7c6365)) +
_Blueprint_: Move interface fields from blueprint-integration ([d77d4fc](https://github.com/nrkno/tv-automation-server-core/commit/d77d4fc)) +
_Media manager UI_: drop unnecessary checks after getPeripheralDevice ([33fde80](https://github.com/nrkno/tv-automation-server-core/commit/33fde80)) +
_Release_: 0.21.0-0 ([3fd5334](https://github.com/nrkno/tv-automation-server-core/commit/3fd5334)) +
_Release_: cherry-pick package version from release 6 ([c1b0961](https://github.com/nrkno/tv-automation-server-core/commit/c1b0961)) +
_Release_: copy version from master ([a6884d9](https://github.com/nrkno/tv-automation-server-core/commit/a6884d9)) + +
Merge branch 'develop' into feature/mediaManagerUI ([175c4da](https://github.com/nrkno/tv-automation-server-core/commit/175c4da)) +
Merge branch 'develop' into feature/mediaManagerUI ([2f03785](https://github.com/nrkno/tv-automation-server-core/commit/2f03785)) +
Merge branch 'develop' into feature/mediaManagerUI ([db867d3](https://github.com/nrkno/tv-automation-server-core/commit/db867d3)) +
Merge branch 'develop' into feature/stoppedPlayback ([2af1a72](https://github.com/nrkno/tv-automation-server-core/commit/2af1a72)) +
Merge branch 'develop' into feature/userActions ([b6a1dc7](https://github.com/nrkno/tv-automation-server-core/commit/b6a1dc7)) +
Merge branch 'develop' of github.com:nrkno/tv-automation-server-core into develop ([004af77](https://github.com/nrkno/tv-automation-server-core/commit/004af77)) +
Merge branch 'develop' of github.com:nrkno/tv-automation-server-core into develop ([1657eeb](https://github.com/nrkno/tv-automation-server-core/commit/1657eeb)) +
Merge branch 'develop' of github.com:nrkno/tv-automation-server-core into develop ([ab75977](https://github.com/nrkno/tv-automation-server-core/commit/ab75977)) +
Merge branch 'feature/freeze-black-detection' into develop ([3c998f5](https://github.com/nrkno/tv-automation-server-core/commit/3c998f5)) +
Merge branch 'feature/mediamanageractions' into develop ([6ea21b1](https://github.com/nrkno/tv-automation-server-core/commit/6ea21b1)) +
Merge branch 'feature/multithreaded-tsr' into develop ([e51a42b](https://github.com/nrkno/tv-automation-server-core/commit/e51a42b)) +
Merge branch 'feature/noimplicitAny' into develop ([68d76af](https://github.com/nrkno/tv-automation-server-core/commit/68d76af)) +
Merge branch 'feature/stoppedPlayback' into develop ([4b0ba8d](https://github.com/nrkno/tv-automation-server-core/commit/4b0ba8d)) +
Merge branch 'feature/support-message' into develop ([591a6c8](https://github.com/nrkno/tv-automation-server-core/commit/591a6c8)) +
Merge branch 'feature/userActions' into develop ([2a50e6f](https://github.com/nrkno/tv-automation-server-core/commit/2a50e6f)) +
Merge branch 'master' into release5 ([6ee463e](https://github.com/nrkno/tv-automation-server-core/commit/6ee463e)) +
Merge branch 'release5' into develop ([7d34ce3](https://github.com/nrkno/tv-automation-server-core/commit/7d34ce3)) +
Merge branch 'release5' into develop ([9c2acf5](https://github.com/nrkno/tv-automation-server-core/commit/9c2acf5)) +
Merge branch 'release5' into develop ([a1e704d](https://github.com/nrkno/tv-automation-server-core/commit/a1e704d)) +
Merge branch 'release5' into develop ([eca12b8](https://github.com/nrkno/tv-automation-server-core/commit/eca12b8)) +
Merge branch 'release6' into develop ([6afe42b](https://github.com/nrkno/tv-automation-server-core/commit/6afe42b)) +
Merge pull request #58 from nrkno/fix/ui-settings ([a76813f](https://github.com/nrkno/tv-automation-server-core/commit/a76813f)), closes [#58](https://github.com/nrkno/tv-automation-server-core/issues/58) +
Merge pull request #65 from nrkno/feature/lookahead-rewrite-retain-mode ([6f78d00](https://github.com/nrkno/tv-automation-server-core/commit/6f78d00)), closes [#65](https://github.com/nrkno/tv-automation-server-core/issues/65) +
Merge pull request #66 from nrkno/feature/fix-f5-f6-adlib-bug ([4de0acd](https://github.com/nrkno/tv-automation-server-core/commit/4de0acd)), closes [#66](https://github.com/nrkno/tv-automation-server-core/issues/66) +
Merge pull request #70 from nrkno/feature/mediaManagerUI ([6763fe5](https://github.com/nrkno/tv-automation-server-core/commit/6763fe5)), closes [#70](https://github.com/nrkno/tv-automation-server-core/issues/70) +
Merge remote-tracking branch 'origin/develop' into develop ([a676817](https://github.com/nrkno/tv-automation-server-core/commit/a676817)) +
Merge remote-tracking branch 'origin/fix/optimizeInfinitesAfterLine' into develop ([bbb28ee](https://github.com/nrkno/tv-automation-server-core/commit/bbb28ee)) +
types ([f5fe277](https://github.com/nrkno/tv-automation-server-core/commit/f5fe277)) + ## 0.21.0-0 (2019-02-05) ### Features -* **Media-management** -
*The Media Management in this release is preliminary, and is a preparation for the [Media-manager Gateway](https://github.com/nrkno/tv-automation-media-management)*, full support is planned for the next release.
+- **Media-management** +
_The Media Management in this release is preliminary, and is a preparation for the [Media-manager Gateway](https://github.com/nrkno/tv-automation-media-management)_, full support is planned for the next release.

Configuration UI for media manager ([b1883ec](https://github.com/nrkno/tv-automation-server-core/commit/b1883ec))
Add expected media items collection ([931536e](https://github.com/nrkno/tv-automation-server-core/commit/931536e))
Allow a string array as mediaFlowIds in SLI content ([7ac6fb5](https://github.com/nrkno/tv-automation-server-core/commit/7ac6fb5)) @@ -4422,7 +4427,7 @@ All notable changes to this project will be documented in this file. See [standa
Use segmentLineId as key ([3803e87](https://github.com/nrkno/tv-automation-server-core/commit/3803e87))
Media manager settings: add 'mediaPath' property to storages ([50185b2](https://github.com/nrkno/tv-automation-server-core/commit/50185b2)) -* **GUI** +- **GUI**
"this did not look right"- button ([1e01a10](https://github.com/nrkno/tv-automation-server-core/commit/1e01a10))
Separate RO list into synced and unsynced lists ([6b92f40](https://github.com/nrkno/tv-automation-server-core/commit/6b92f40))
Add support panel in Running Order View ([e3cee77](https://github.com/nrkno/tv-automation-server-core/commit/e3cee77)) @@ -4437,9 +4442,9 @@ All notable changes to this project will be documented in this file. See [standa
Support panel WIP ([6955fdc](https://github.com/nrkno/tv-automation-server-core/commit/6955fdc))
System-wide message ([d7305df](https://github.com/nrkno/tv-automation-server-core/commit/d7305df))
Optional cool down ([c9c2743](https://github.com/nrkno/tv-automation-server-core/commit/c9c2743)) -
Add classes to sl-firstobject from the current and prev sl. This will allow for some ([632326f](https://github.com/nrkno/tv-automation-server-core/commit/632326f)) +
Add classes to sl-firstobject from the current and prev sl. This will allow for some ([632326f](https://github.com/nrkno/tv-automation-server-core/commit/632326f)) -* **As-run logs** +- **As-run logs**
Add stoppedPlayback tracking ([7345856](https://github.com/nrkno/tv-automation-server-core/commit/7345856))
Add stoppedPlayback tracking ([ddbdd66](https://github.com/nrkno/tv-automation-server-core/commit/ddbdd66))
Add support for refs in rabbitMQ-messages (for username & password) ([5b3ea33](https://github.com/nrkno/tv-automation-server-core/commit/5b3ea33)) @@ -4447,7 +4452,7 @@ All notable changes to this project will be documented in this file. See [standa
RabbitMQ: add support for headers ([e3e3d48](https://github.com/nrkno/tv-automation-server-core/commit/e3e3d48))
RabbitMQ: headers ([087bb2e](https://github.com/nrkno/tv-automation-server-core/commit/087bb2e)) -* **Various backend** +- **Various backend**
Add support for RuntimeArguments in blueprint migrations ([82e5286](https://github.com/nrkno/tv-automation-server-core/commit/82e5286))
Add support for Config References (to be used for referencing usernames & passwords) ([6df8c6e](https://github.com/nrkno/tv-automation-server-core/commit/6df8c6e))
Add versions to /health endpoint ([a324213](https://github.com/nrkno/tv-automation-server-core/commit/a324213)) @@ -4459,348 +4464,345 @@ All notable changes to this project will be documented in this file. See [standa
Implement userActions (wip) ([c0345e0](https://github.com/nrkno/tv-automation-server-core/commit/c0345e0)) ### Bug Fixes -* **adlib**: An adlib replacing the main sli of a sl would not adjust the length of the original. F5/ ([fca6f05](https://github.com/nrkno/tv-automation-server-core/commit/fca6f05)) -* **expected media items**: use a function instead of fat arrow ([fa23c05](https://github.com/nrkno/tv-automation-server-core/commit/fa23c05)) -* **lookahead**: RETAIN mode now follows the WHEN_CLEAR behaviour instead of PRELOAD ([f0df41c](https://github.com/nrkno/tv-automation-server-core/commit/f0df41c)) -* **migrations**: Broken StudioContext.updateDevice method ([7311d10](https://github.com/nrkno/tv-automation-server-core/commit/7311d10)) -* **migrations**: DependOnResultFrom id was not being prefixed causing it to never work ([602740c](https://github.com/nrkno/tv-automation-server-core/commit/602740c)) -* **notifications**: change unknown to any ([7ac8008](https://github.com/nrkno/tv-automation-server-core/commit/7ac8008)) -* **playout**: ID prefixing did not handle logical object id references ([44f2883](https://github.com/nrkno/tv-automation-server-core/commit/44f2883)) -* **playout**: Objects being written out without an id ([b05a851](https://github.com/nrkno/tv-automation-server-core/commit/b05a851)) -* **playout**: Typo in ID prefixing ([249b35d](https://github.com/nrkno/tv-automation-server-core/commit/249b35d)) -* add missing _id ([970fbf8](https://github.com/nrkno/tv-automation-server-core/commit/970fbf8)) -* add missing _id ([c948d09](https://github.com/nrkno/tv-automation-server-core/commit/c948d09)) -* add missing core version ([8ad3a9e](https://github.com/nrkno/tv-automation-server-core/commit/8ad3a9e)) -* allow removing peripheralDevices from Settings page ([b14e56a](https://github.com/nrkno/tv-automation-server-core/commit/b14e56a)) -* anomaly timings as numbers ([d0c0d36](https://github.com/nrkno/tv-automation-server-core/commit/d0c0d36)) -* asRunLog: defer handleEvent, to make sure all events have been reported before running. ([6c56ec7](https://github.com/nrkno/tv-automation-server-core/commit/6c56ec7)) -* ConfigRef fix ([f557052](https://github.com/nrkno/tv-automation-server-core/commit/f557052)) -* ensure that the connection notification is always on top ([662cd7a](https://github.com/nrkno/tv-automation-server-core/commit/662cd7a)) -* Ensure typeVariant on SegmentLine is preserved when a roList is received ([98b224c](https://github.com/nrkno/tv-automation-server-core/commit/98b224c)) -* expectedMediaItems: make ids uniquer ([e16594a](https://github.com/nrkno/tv-automation-server-core/commit/e16594a)) -* fix notifications toggle button cursor ([b0d8dcb](https://github.com/nrkno/tv-automation-server-core/commit/b0d8dcb)) -* freeze/black in begin/end of mediafile gets special warning ([ea950e2](https://github.com/nrkno/tv-automation-server-core/commit/ea950e2)) -* improve notifications highlighting animation ([abda2c3](https://github.com/nrkno/tv-automation-server-core/commit/abda2c3)) -* increase upload limit for backup files ([e658f12](https://github.com/nrkno/tv-automation-server-core/commit/e658f12)) -* issue with source layers marked as used even though they were used in the following segmentLine ([71acfb3](https://github.com/nrkno/tv-automation-server-core/commit/71acfb3)) -* make sure that the adlib shelf isn't obstructed by the right-hand bar ([8783819](https://github.com/nrkno/tv-automation-server-core/commit/8783819)) -* move all segment notes away from header, show only summary, clickable summary ([aee3d01](https://github.com/nrkno/tv-automation-server-core/commit/aee3d01)) -* move notifications pop-ups when NC is open ([6f7759f](https://github.com/nrkno/tv-automation-server-core/commit/6f7759f)) -* non-persistent pop-ups should be prioritized over persistent ones ([99f147a](https://github.com/nrkno/tv-automation-server-core/commit/99f147a)) -* NotificationCenter visual fix for other pages ([2c5da97](https://github.com/nrkno/tv-automation-server-core/commit/2c5da97)) -* peripheralDevices subscription for RO data ([90b4e13](https://github.com/nrkno/tv-automation-server-core/commit/90b4e13)) -* rabbitMQ sending messages ([df72c4c](https://github.com/nrkno/tv-automation-server-core/commit/df72c4c)) -* RecordedFiles index ([f1aae5e](https://github.com/nrkno/tv-automation-server-core/commit/f1aae5e)) -* refactor updateExternalMessageQueueStatus to avoid fatal startup bug ([b54b09d](https://github.com/nrkno/tv-automation-server-core/commit/b54b09d)) -* remove 'computation stopped' notifications ([bf4d8d8](https://github.com/nrkno/tv-automation-server-core/commit/bf4d8d8)) -* remove leftover debug info ([d475b76](https://github.com/nrkno/tv-automation-server-core/commit/d475b76)) -* removed wrongful error throw ([852c495](https://github.com/nrkno/tv-automation-server-core/commit/852c495)) -* removed wrongful error throw ([b3deed1](https://github.com/nrkno/tv-automation-server-core/commit/b3deed1)) -* rename method getShowStyleRef => getShowStyleConfigRef ([c8bbe95](https://github.com/nrkno/tv-automation-server-core/commit/c8bbe95)) -* rename version 0.20.0 => 0.21.0 (release 6) ([7b1ee3a](https://github.com/nrkno/tv-automation-server-core/commit/7b1ee3a)) -* resolve a typo in rabbitMQ.ts ([3b36ae3](https://github.com/nrkno/tv-automation-server-core/commit/3b36ae3)) -* resolve issue with ContextMenus in RO view ([8d9ba96](https://github.com/nrkno/tv-automation-server-core/commit/8d9ba96)) -* resolve issue with lowPriority cron jobs ([f7c3c83](https://github.com/nrkno/tv-automation-server-core/commit/f7c3c83)) -* RO notification action ([36cf900](https://github.com/nrkno/tv-automation-server-core/commit/36cf900)) -* RO Notifications fixes attempt no. 3 ([f0eee1f](https://github.com/nrkno/tv-automation-server-core/commit/f0eee1f)) -* Running Order Notifications in activeRo view ([63658b1](https://github.com/nrkno/tv-automation-server-core/commit/63658b1)) -* separate warnings for black frames & freeze frames ([e2acad5](https://github.com/nrkno/tv-automation-server-core/commit/e2acad5)) -* set tsr multithreading from UI instead of CLI ([c8be25b](https://github.com/nrkno/tv-automation-server-core/commit/c8be25b)) -* show connected devices in RO view ([e804d1e](https://github.com/nrkno/tv-automation-server-core/commit/e804d1e)) -* some minor react errors in the settings ([d7bb849](https://github.com/nrkno/tv-automation-server-core/commit/d7bb849)) -* test-tools decklink input format dropdown has no options ([b02f447](https://github.com/nrkno/tv-automation-server-core/commit/b02f447)) -* timelineObj _id missing ([0f8e0da](https://github.com/nrkno/tv-automation-server-core/commit/0f8e0da)) -* timelineObj _id missing ([1dcedbf](https://github.com/nrkno/tv-automation-server-core/commit/1dcedbf)) -* Typographic tweaks for prompter. ([068d535](https://github.com/nrkno/tv-automation-server-core/commit/068d535)) -* ui manualPlayback key ([5d4e49f](https://github.com/nrkno/tv-automation-server-core/commit/5d4e49f)) -* ui manualPlayback key ([ca1a943](https://github.com/nrkno/tv-automation-server-core/commit/ca1a943)) -* update asRunLog typings ([5d18c66](https://github.com/nrkno/tv-automation-server-core/commit/5d18c66)) -* Update some playout timelineobj types ([fe883a8](https://github.com/nrkno/tv-automation-server-core/commit/fe883a8)) -* updateExpectedMediaItems failing was causing the post-process blueprint to not be run. Errors f ([2fe22bb](https://github.com/nrkno/tv-automation-server-core/commit/2fe22bb)) - -### Other / Chores -* chore: ([52f983c](https://github.com/nrkno/tv-automation-server-core/commit/52f983c)) -* chore: add lint script ([a598142](https://github.com/nrkno/tv-automation-server-core/commit/a598142)) -* chore: Add some debug helpers to reevaluate a restored snapshot ([4f2b53c](https://github.com/nrkno/tv-automation-server-core/commit/4f2b53c)) -* chore: Debug helpers should ensure infinite items are generated after blueprint evaluation ([6b50698](https://github.com/nrkno/tv-automation-server-core/commit/6b50698)) -* chore: dev: access jquery $ from console ([045115b](https://github.com/nrkno/tv-automation-server-core/commit/045115b)) -* chore: ExecuteFunction: improved timeout error message ([2398b6a](https://github.com/nrkno/tv-automation-server-core/commit/2398b6a)) -* chore: fix another issue with using the wrong enum ([5a1b30e](https://github.com/nrkno/tv-automation-server-core/commit/5a1b30e)) -* chore: housekeeping, remove old files ([0b839cc](https://github.com/nrkno/tv-automation-server-core/commit/0b839cc)) -* chore: improved extendMandatory, so it properly requires extend-properties when original type has op ([b308d36](https://github.com/nrkno/tv-automation-server-core/commit/b308d36)) -* chore: linting & housekeeping ([2bed3ff](https://github.com/nrkno/tv-automation-server-core/commit/2bed3ff)) -* chore: merge expectedMediaItems into develop ([fee158c](https://github.com/nrkno/tv-automation-server-core/commit/fee158c)) -* chore: merge hotfix to develop ([6e133ce](https://github.com/nrkno/tv-automation-server-core/commit/6e133ce)) -* chore: merge release5 fixes ([4c7760f](https://github.com/nrkno/tv-automation-server-core/commit/4c7760f)) -* chore: omit some more libraries on startup ([96b96e3](https://github.com/nrkno/tv-automation-server-core/commit/96b96e3)) -* chore: Remove accidental console.log ([d421308](https://github.com/nrkno/tv-automation-server-core/commit/d421308)) -* chore: rename hello.test.js to ts ([3b75dd2](https://github.com/nrkno/tv-automation-server-core/commit/3b75dd2)) -* chore: rename hello.test.js to ts ([70a9c22](https://github.com/nrkno/tv-automation-server-core/commit/70a9c22)) -* chore: rename methods ([2de2fc8](https://github.com/nrkno/tv-automation-server-core/commit/2de2fc8)) -* chore: rename methods ([af69dae](https://github.com/nrkno/tv-automation-server-core/commit/af69dae)) -* chore: Reorder studio settings page ([e1ed6f0](https://github.com/nrkno/tv-automation-server-core/commit/e1ed6f0)) -* chore: stronger typings (preparations for noImplicitAny) ([33a5bcc](https://github.com/nrkno/tv-automation-server-core/commit/33a5bcc)) -* chore: timelineObjs ([35d6ed3](https://github.com/nrkno/tv-automation-server-core/commit/35d6ed3)) -* chore: timelineObjs ([c6bd813](https://github.com/nrkno/tv-automation-server-core/commit/c6bd813)) -* chore: type fix ([70971d4](https://github.com/nrkno/tv-automation-server-core/commit/70971d4)) -* chore: type up subscriptions & publications ([3fe8e01](https://github.com/nrkno/tv-automation-server-core/commit/3fe8e01)) -* chore: typing fix ([79269e7](https://github.com/nrkno/tv-automation-server-core/commit/79269e7)) -* chore: update deps ([e01922b](https://github.com/nrkno/tv-automation-server-core/commit/e01922b)) -* chore: update publication ([956318f](https://github.com/nrkno/tv-automation-server-core/commit/956318f)) -* chore: update translation template ([f31353b](https://github.com/nrkno/tv-automation-server-core/commit/f31353b)) -* chore: update typings ([56c5620](https://github.com/nrkno/tv-automation-server-core/commit/56c5620)) -* chore: Updated Norwegian translations. Fixed spelling error of "bluerpints" and capitalizations in S ([5c3a617](https://github.com/nrkno/tv-automation-server-core/commit/5c3a617)) -* chore(blueprint): Move interface fields from blueprint-integration ([d77d4fc](https://github.com/nrkno/tv-automation-server-core/commit/d77d4fc)) -* chore(release): copy version from master ([a6884d9](https://github.com/nrkno/tv-automation-server-core/commit/a6884d9)) - -* Merge branch 'develop' into feature/stoppedPlayback ([2af1a72](https://github.com/nrkno/tv-automation-server-core/commit/2af1a72)) -* Merge branch 'develop' into feature/userActions ([b6a1dc7](https://github.com/nrkno/tv-automation-server-core/commit/b6a1dc7)) -* Merge branch 'develop' of github.com:nrkno/tv-automation-server-core into develop ([004af77](https://github.com/nrkno/tv-automation-server-core/commit/004af77)) -* Merge branch 'develop' of github.com:nrkno/tv-automation-server-core into develop ([ab75977](https://github.com/nrkno/tv-automation-server-core/commit/ab75977)) -* Merge branch 'feature/freeze-black-detection' into develop ([3c998f5](https://github.com/nrkno/tv-automation-server-core/commit/3c998f5)) -* Merge branch 'feature/multithreaded-tsr' into develop ([e51a42b](https://github.com/nrkno/tv-automation-server-core/commit/e51a42b)) -* Merge branch 'feature/noimplicitAny' into develop ([68d76af](https://github.com/nrkno/tv-automation-server-core/commit/68d76af)) -* Merge branch 'feature/stoppedPlayback' into develop ([4b0ba8d](https://github.com/nrkno/tv-automation-server-core/commit/4b0ba8d)) -* Merge branch 'feature/support-message' into develop ([591a6c8](https://github.com/nrkno/tv-automation-server-core/commit/591a6c8)) -* Merge branch 'feature/userActions' into develop ([2a50e6f](https://github.com/nrkno/tv-automation-server-core/commit/2a50e6f)) -* Merge branch 'master' into release5 ([6ee463e](https://github.com/nrkno/tv-automation-server-core/commit/6ee463e)) -* Merge branch 'release5' into develop ([7d34ce3](https://github.com/nrkno/tv-automation-server-core/commit/7d34ce3)) -* Merge branch 'release5' into develop ([9c2acf5](https://github.com/nrkno/tv-automation-server-core/commit/9c2acf5)) -* Merge branch 'release5' into develop ([a1e704d](https://github.com/nrkno/tv-automation-server-core/commit/a1e704d)) -* Merge branch 'release5' into develop ([eca12b8](https://github.com/nrkno/tv-automation-server-core/commit/eca12b8)) -* Merge pull request #58 from nrkno/fix/ui-settings ([a76813f](https://github.com/nrkno/tv-automation-server-core/commit/a76813f)), closes [#58](https://github.com/nrkno/tv-automation-server-core/issues/58) -* Merge pull request #65 from nrkno/feature/lookahead-rewrite-retain-mode ([6f78d00](https://github.com/nrkno/tv-automation-server-core/commit/6f78d00)), closes [#65](https://github.com/nrkno/tv-automation-server-core/issues/65) -* Merge pull request #66 from nrkno/feature/fix-f5-f6-adlib-bug ([4de0acd](https://github.com/nrkno/tv-automation-server-core/commit/4de0acd)), closes [#66](https://github.com/nrkno/tv-automation-server-core/issues/66) -* Merge remote-tracking branch 'origin/develop' into develop ([a676817](https://github.com/nrkno/tv-automation-server-core/commit/a676817)) +- **adlib**: An adlib replacing the main sli of a sl would not adjust the length of the original. F5/ ([fca6f05](https://github.com/nrkno/tv-automation-server-core/commit/fca6f05)) +- **expected media items**: use a function instead of fat arrow ([fa23c05](https://github.com/nrkno/tv-automation-server-core/commit/fa23c05)) +- **lookahead**: RETAIN mode now follows the WHEN_CLEAR behaviour instead of PRELOAD ([f0df41c](https://github.com/nrkno/tv-automation-server-core/commit/f0df41c)) +- **migrations**: Broken StudioContext.updateDevice method ([7311d10](https://github.com/nrkno/tv-automation-server-core/commit/7311d10)) +- **migrations**: DependOnResultFrom id was not being prefixed causing it to never work ([602740c](https://github.com/nrkno/tv-automation-server-core/commit/602740c)) +- **notifications**: change unknown to any ([7ac8008](https://github.com/nrkno/tv-automation-server-core/commit/7ac8008)) +- **playout**: ID prefixing did not handle logical object id references ([44f2883](https://github.com/nrkno/tv-automation-server-core/commit/44f2883)) +- **playout**: Objects being written out without an id ([b05a851](https://github.com/nrkno/tv-automation-server-core/commit/b05a851)) +- **playout**: Typo in ID prefixing ([249b35d](https://github.com/nrkno/tv-automation-server-core/commit/249b35d)) +- add missing \_id ([970fbf8](https://github.com/nrkno/tv-automation-server-core/commit/970fbf8)) +- add missing \_id ([c948d09](https://github.com/nrkno/tv-automation-server-core/commit/c948d09)) +- add missing core version ([8ad3a9e](https://github.com/nrkno/tv-automation-server-core/commit/8ad3a9e)) +- allow removing peripheralDevices from Settings page ([b14e56a](https://github.com/nrkno/tv-automation-server-core/commit/b14e56a)) +- anomaly timings as numbers ([d0c0d36](https://github.com/nrkno/tv-automation-server-core/commit/d0c0d36)) +- asRunLog: defer handleEvent, to make sure all events have been reported before running. ([6c56ec7](https://github.com/nrkno/tv-automation-server-core/commit/6c56ec7)) +- ConfigRef fix ([f557052](https://github.com/nrkno/tv-automation-server-core/commit/f557052)) +- ensure that the connection notification is always on top ([662cd7a](https://github.com/nrkno/tv-automation-server-core/commit/662cd7a)) +- Ensure typeVariant on SegmentLine is preserved when a roList is received ([98b224c](https://github.com/nrkno/tv-automation-server-core/commit/98b224c)) +- expectedMediaItems: make ids uniquer ([e16594a](https://github.com/nrkno/tv-automation-server-core/commit/e16594a)) +- fix notifications toggle button cursor ([b0d8dcb](https://github.com/nrkno/tv-automation-server-core/commit/b0d8dcb)) +- freeze/black in begin/end of mediafile gets special warning ([ea950e2](https://github.com/nrkno/tv-automation-server-core/commit/ea950e2)) +- improve notifications highlighting animation ([abda2c3](https://github.com/nrkno/tv-automation-server-core/commit/abda2c3)) +- increase upload limit for backup files ([e658f12](https://github.com/nrkno/tv-automation-server-core/commit/e658f12)) +- issue with source layers marked as used even though they were used in the following segmentLine ([71acfb3](https://github.com/nrkno/tv-automation-server-core/commit/71acfb3)) +- make sure that the adlib shelf isn't obstructed by the right-hand bar ([8783819](https://github.com/nrkno/tv-automation-server-core/commit/8783819)) +- move all segment notes away from header, show only summary, clickable summary ([aee3d01](https://github.com/nrkno/tv-automation-server-core/commit/aee3d01)) +- move notifications pop-ups when NC is open ([6f7759f](https://github.com/nrkno/tv-automation-server-core/commit/6f7759f)) +- non-persistent pop-ups should be prioritized over persistent ones ([99f147a](https://github.com/nrkno/tv-automation-server-core/commit/99f147a)) +- NotificationCenter visual fix for other pages ([2c5da97](https://github.com/nrkno/tv-automation-server-core/commit/2c5da97)) +- peripheralDevices subscription for RO data ([90b4e13](https://github.com/nrkno/tv-automation-server-core/commit/90b4e13)) +- rabbitMQ sending messages ([df72c4c](https://github.com/nrkno/tv-automation-server-core/commit/df72c4c)) +- RecordedFiles index ([f1aae5e](https://github.com/nrkno/tv-automation-server-core/commit/f1aae5e)) +- refactor updateExternalMessageQueueStatus to avoid fatal startup bug ([b54b09d](https://github.com/nrkno/tv-automation-server-core/commit/b54b09d)) +- remove 'computation stopped' notifications ([bf4d8d8](https://github.com/nrkno/tv-automation-server-core/commit/bf4d8d8)) +- remove leftover debug info ([d475b76](https://github.com/nrkno/tv-automation-server-core/commit/d475b76)) +- removed wrongful error throw ([852c495](https://github.com/nrkno/tv-automation-server-core/commit/852c495)) +- removed wrongful error throw ([b3deed1](https://github.com/nrkno/tv-automation-server-core/commit/b3deed1)) +- rename method getShowStyleRef => getShowStyleConfigRef ([c8bbe95](https://github.com/nrkno/tv-automation-server-core/commit/c8bbe95)) +- rename version 0.20.0 => 0.21.0 (release 6) ([7b1ee3a](https://github.com/nrkno/tv-automation-server-core/commit/7b1ee3a)) +- resolve a typo in rabbitMQ.ts ([3b36ae3](https://github.com/nrkno/tv-automation-server-core/commit/3b36ae3)) +- resolve issue with ContextMenus in RO view ([8d9ba96](https://github.com/nrkno/tv-automation-server-core/commit/8d9ba96)) +- resolve issue with lowPriority cron jobs ([f7c3c83](https://github.com/nrkno/tv-automation-server-core/commit/f7c3c83)) +- RO notification action ([36cf900](https://github.com/nrkno/tv-automation-server-core/commit/36cf900)) +- RO Notifications fixes attempt no. 3 ([f0eee1f](https://github.com/nrkno/tv-automation-server-core/commit/f0eee1f)) +- Running Order Notifications in activeRo view ([63658b1](https://github.com/nrkno/tv-automation-server-core/commit/63658b1)) +- separate warnings for black frames & freeze frames ([e2acad5](https://github.com/nrkno/tv-automation-server-core/commit/e2acad5)) +- set tsr multithreading from UI instead of CLI ([c8be25b](https://github.com/nrkno/tv-automation-server-core/commit/c8be25b)) +- show connected devices in RO view ([e804d1e](https://github.com/nrkno/tv-automation-server-core/commit/e804d1e)) +- some minor react errors in the settings ([d7bb849](https://github.com/nrkno/tv-automation-server-core/commit/d7bb849)) +- test-tools decklink input format dropdown has no options ([b02f447](https://github.com/nrkno/tv-automation-server-core/commit/b02f447)) +- timelineObj \_id missing ([0f8e0da](https://github.com/nrkno/tv-automation-server-core/commit/0f8e0da)) +- timelineObj \_id missing ([1dcedbf](https://github.com/nrkno/tv-automation-server-core/commit/1dcedbf)) +- Typographic tweaks for prompter. ([068d535](https://github.com/nrkno/tv-automation-server-core/commit/068d535)) +- ui manualPlayback key ([5d4e49f](https://github.com/nrkno/tv-automation-server-core/commit/5d4e49f)) +- ui manualPlayback key ([ca1a943](https://github.com/nrkno/tv-automation-server-core/commit/ca1a943)) +- update asRunLog typings ([5d18c66](https://github.com/nrkno/tv-automation-server-core/commit/5d18c66)) +- Update some playout timelineobj types ([fe883a8](https://github.com/nrkno/tv-automation-server-core/commit/fe883a8)) +- updateExpectedMediaItems failing was causing the post-process blueprint to not be run. Errors f ([2fe22bb](https://github.com/nrkno/tv-automation-server-core/commit/2fe22bb)) +### Other / Chores +- chore: ([52f983c](https://github.com/nrkno/tv-automation-server-core/commit/52f983c)) +- chore: add lint script ([a598142](https://github.com/nrkno/tv-automation-server-core/commit/a598142)) +- chore: Add some debug helpers to reevaluate a restored snapshot ([4f2b53c](https://github.com/nrkno/tv-automation-server-core/commit/4f2b53c)) +- chore: Debug helpers should ensure infinite items are generated after blueprint evaluation ([6b50698](https://github.com/nrkno/tv-automation-server-core/commit/6b50698)) +- chore: dev: access jquery $ from console ([045115b](https://github.com/nrkno/tv-automation-server-core/commit/045115b)) +- chore: ExecuteFunction: improved timeout error message ([2398b6a](https://github.com/nrkno/tv-automation-server-core/commit/2398b6a)) +- chore: fix another issue with using the wrong enum ([5a1b30e](https://github.com/nrkno/tv-automation-server-core/commit/5a1b30e)) +- chore: housekeeping, remove old files ([0b839cc](https://github.com/nrkno/tv-automation-server-core/commit/0b839cc)) +- chore: improved extendMandatory, so it properly requires extend-properties when original type has op ([b308d36](https://github.com/nrkno/tv-automation-server-core/commit/b308d36)) +- chore: linting & housekeeping ([2bed3ff](https://github.com/nrkno/tv-automation-server-core/commit/2bed3ff)) +- chore: merge expectedMediaItems into develop ([fee158c](https://github.com/nrkno/tv-automation-server-core/commit/fee158c)) +- chore: merge hotfix to develop ([6e133ce](https://github.com/nrkno/tv-automation-server-core/commit/6e133ce)) +- chore: merge release5 fixes ([4c7760f](https://github.com/nrkno/tv-automation-server-core/commit/4c7760f)) +- chore: omit some more libraries on startup ([96b96e3](https://github.com/nrkno/tv-automation-server-core/commit/96b96e3)) +- chore: Remove accidental console.log ([d421308](https://github.com/nrkno/tv-automation-server-core/commit/d421308)) +- chore: rename hello.test.js to ts ([3b75dd2](https://github.com/nrkno/tv-automation-server-core/commit/3b75dd2)) +- chore: rename hello.test.js to ts ([70a9c22](https://github.com/nrkno/tv-automation-server-core/commit/70a9c22)) +- chore: rename methods ([2de2fc8](https://github.com/nrkno/tv-automation-server-core/commit/2de2fc8)) +- chore: rename methods ([af69dae](https://github.com/nrkno/tv-automation-server-core/commit/af69dae)) +- chore: Reorder studio settings page ([e1ed6f0](https://github.com/nrkno/tv-automation-server-core/commit/e1ed6f0)) +- chore: stronger typings (preparations for noImplicitAny) ([33a5bcc](https://github.com/nrkno/tv-automation-server-core/commit/33a5bcc)) +- chore: timelineObjs ([35d6ed3](https://github.com/nrkno/tv-automation-server-core/commit/35d6ed3)) +- chore: timelineObjs ([c6bd813](https://github.com/nrkno/tv-automation-server-core/commit/c6bd813)) +- chore: type fix ([70971d4](https://github.com/nrkno/tv-automation-server-core/commit/70971d4)) +- chore: type up subscriptions & publications ([3fe8e01](https://github.com/nrkno/tv-automation-server-core/commit/3fe8e01)) +- chore: typing fix ([79269e7](https://github.com/nrkno/tv-automation-server-core/commit/79269e7)) +- chore: update deps ([e01922b](https://github.com/nrkno/tv-automation-server-core/commit/e01922b)) +- chore: update publication ([956318f](https://github.com/nrkno/tv-automation-server-core/commit/956318f)) +- chore: update translation template ([f31353b](https://github.com/nrkno/tv-automation-server-core/commit/f31353b)) +- chore: update typings ([56c5620](https://github.com/nrkno/tv-automation-server-core/commit/56c5620)) +- chore: Updated Norwegian translations. Fixed spelling error of "bluerpints" and capitalizations in S ([5c3a617](https://github.com/nrkno/tv-automation-server-core/commit/5c3a617)) +- chore(blueprint): Move interface fields from blueprint-integration ([d77d4fc](https://github.com/nrkno/tv-automation-server-core/commit/d77d4fc)) +- chore(release): copy version from master ([a6884d9](https://github.com/nrkno/tv-automation-server-core/commit/a6884d9)) + +- Merge branch 'develop' into feature/stoppedPlayback ([2af1a72](https://github.com/nrkno/tv-automation-server-core/commit/2af1a72)) +- Merge branch 'develop' into feature/userActions ([b6a1dc7](https://github.com/nrkno/tv-automation-server-core/commit/b6a1dc7)) +- Merge branch 'develop' of github.com:nrkno/tv-automation-server-core into develop ([004af77](https://github.com/nrkno/tv-automation-server-core/commit/004af77)) +- Merge branch 'develop' of github.com:nrkno/tv-automation-server-core into develop ([ab75977](https://github.com/nrkno/tv-automation-server-core/commit/ab75977)) +- Merge branch 'feature/freeze-black-detection' into develop ([3c998f5](https://github.com/nrkno/tv-automation-server-core/commit/3c998f5)) +- Merge branch 'feature/multithreaded-tsr' into develop ([e51a42b](https://github.com/nrkno/tv-automation-server-core/commit/e51a42b)) +- Merge branch 'feature/noimplicitAny' into develop ([68d76af](https://github.com/nrkno/tv-automation-server-core/commit/68d76af)) +- Merge branch 'feature/stoppedPlayback' into develop ([4b0ba8d](https://github.com/nrkno/tv-automation-server-core/commit/4b0ba8d)) +- Merge branch 'feature/support-message' into develop ([591a6c8](https://github.com/nrkno/tv-automation-server-core/commit/591a6c8)) +- Merge branch 'feature/userActions' into develop ([2a50e6f](https://github.com/nrkno/tv-automation-server-core/commit/2a50e6f)) +- Merge branch 'master' into release5 ([6ee463e](https://github.com/nrkno/tv-automation-server-core/commit/6ee463e)) +- Merge branch 'release5' into develop ([7d34ce3](https://github.com/nrkno/tv-automation-server-core/commit/7d34ce3)) +- Merge branch 'release5' into develop ([9c2acf5](https://github.com/nrkno/tv-automation-server-core/commit/9c2acf5)) +- Merge branch 'release5' into develop ([a1e704d](https://github.com/nrkno/tv-automation-server-core/commit/a1e704d)) +- Merge branch 'release5' into develop ([eca12b8](https://github.com/nrkno/tv-automation-server-core/commit/eca12b8)) +- Merge pull request #58 from nrkno/fix/ui-settings ([a76813f](https://github.com/nrkno/tv-automation-server-core/commit/a76813f)), closes [#58](https://github.com/nrkno/tv-automation-server-core/issues/58) +- Merge pull request #65 from nrkno/feature/lookahead-rewrite-retain-mode ([6f78d00](https://github.com/nrkno/tv-automation-server-core/commit/6f78d00)), closes [#65](https://github.com/nrkno/tv-automation-server-core/issues/65) +- Merge pull request #66 from nrkno/feature/fix-f5-f6-adlib-bug ([4de0acd](https://github.com/nrkno/tv-automation-server-core/commit/4de0acd)), closes [#66](https://github.com/nrkno/tv-automation-server-core/issues/66) +- Merge remote-tracking branch 'origin/develop' into develop ([a676817](https://github.com/nrkno/tv-automation-server-core/commit/a676817)) -# [0.20.0](https://github.com/nrkno/tv-automation-server-core/compare/v0.19.0...v0.20.0) (2019-02-05) +# [0.20.0](https://github.com/nrkno/tv-automation-server-core/compare/v0.19.0...v0.20.0) (2019-02-05) ### Bug Fixes -* **asRunLog:** wrong id, typo ([636fc41](https://github.com/nrkno/tv-automation-server-core/commit/636fc41)) -* **blueprint:** Fill in missing TimelineObj fields ([0ed7663](https://github.com/nrkno/tv-automation-server-core/commit/0ed7663)) -* **blueprint:** fix manifest config add item showing an 'undefined' option ([fa6182a](https://github.com/nrkno/tv-automation-server-core/commit/fa6182a)) -* **blueprint:** Remove invalid backup restore code ([2e00eca](https://github.com/nrkno/tv-automation-server-core/commit/2e00eca)) -* **blueprints:** Ensure ids are not duplicated ([fbd0a04](https://github.com/nrkno/tv-automation-server-core/commit/fbd0a04)) -* **Devices:** Better strings and device list layouts (less details) ([be26a18](https://github.com/nrkno/tv-automation-server-core/commit/be26a18)) -* **hold:** Disable transition when leaving HOLD ([809dd34](https://github.com/nrkno/tv-automation-server-core/commit/809dd34)) -* **hold:** Disable transition when leaving or leaving HOLD ([ef5cbcb](https://github.com/nrkno/tv-automation-server-core/commit/ef5cbcb)) -* **hold:** Ensure the original stk does not get picked up as a dynamic object when setting the sl as next ([225304d](https://github.com/nrkno/tv-automation-server-core/commit/225304d)) -* **hold:** When extending a sli during hold, use the original id to make any triggers on the sli work ([669a4b2](https://github.com/nrkno/tv-automation-server-core/commit/669a4b2)) -* **migrations:** Broken StudioContext.updateDevice method ([d882e8b](https://github.com/nrkno/tv-automation-server-core/commit/d882e8b)) -* **migrations:** Check migrate function exists before trying to run it ([cf076f5](https://github.com/nrkno/tv-automation-server-core/commit/cf076f5)) -* **migrations:** Create ShowStyleVariant with ShowStyleBase in the migrations and setup studio to use it as its default ([75073d4](https://github.com/nrkno/tv-automation-server-core/commit/75073d4)) -* **migrations:** DependOnResultFrom id was not being prefixed causing it to never work ([5830754](https://github.com/nrkno/tv-automation-server-core/commit/5830754)) -* **rabbitmq:** send persistant messages ([ff8d375](https://github.com/nrkno/tv-automation-server-core/commit/ff8d375)) -* accepted resolutions should not be separated by space. ([1b80a2c](https://github.com/nrkno/tv-automation-server-core/commit/1b80a2c)) -* **migrations:** Uncomment mos check migration ([c262fff](https://github.com/nrkno/tv-automation-server-core/commit/c262fff)) -* **migrations:** Various problems when running from empty ([11d1d0b](https://github.com/nrkno/tv-automation-server-core/commit/11d1d0b)) -* **notification center:** fix notification center toggle button in RO view ([894c1e2](https://github.com/nrkno/tv-automation-server-core/commit/894c1e2)) -* **notification center:** fix running order overview to line up with the Segments column ([0906cab](https://github.com/nrkno/tv-automation-server-core/commit/0906cab)) -* **notification center:** notification count position ([1d8d2cb](https://github.com/nrkno/tv-automation-server-core/commit/1d8d2cb)) -* **notification center:** reintroduce RunningOrderNotifier into RunningOrderView ([e70e5c9](https://github.com/nrkno/tv-automation-server-core/commit/e70e5c9)) -* **pharos:** add missing settingsType and migration step ([be618d2](https://github.com/nrkno/tv-automation-server-core/commit/be618d2)) -* **playout:** Better account for duration and overlaps with transitions etc. ([dc249a3](https://github.com/nrkno/tv-automation-server-core/commit/dc249a3)) -* **playout:** Double head2 headline out animation ([165e2c0](https://github.com/nrkno/tv-automation-server-core/commit/165e2c0)) -* **playout:** Refactor setting object siId ([48de044](https://github.com/nrkno/tv-automation-server-core/commit/48de044)) -* **refactor:** existing runningOrders were not migrated to the new data structure ([b20bc2d](https://github.com/nrkno/tv-automation-server-core/commit/b20bc2d)) -* **refactor:** remove stray debugger calls ([3be5c22](https://github.com/nrkno/tv-automation-server-core/commit/3be5c22)) -* **runtimeArgs:** Removing infinite items from changed sl and anything following ([28ffd5d](https://github.com/nrkno/tv-automation-server-core/commit/28ffd5d)) -* **snapshot:** SegmentLines were not being included in the snapshot ([224f806](https://github.com/nrkno/tv-automation-server-core/commit/224f806)) -* **UI:** Improves device settings and status page by removing information ([267c10c](https://github.com/nrkno/tv-automation-server-core/commit/267c10c)) -* updated health endpoint according to spec ([900728b](https://github.com/nrkno/tv-automation-server-core/commit/900728b)) -* **unsync:** refactor, add method to unsync runningOrder ([d54c147](https://github.com/nrkno/tv-automation-server-core/commit/d54c147)) -* add (preliminary) security rules for all collections ([6fd60e2](https://github.com/nrkno/tv-automation-server-core/commit/6fd60e2)) -* add dependency: timeline-state-resolver-types ([cd2db55](https://github.com/nrkno/tv-automation-server-core/commit/cd2db55)) -* add missing asRunEvent in AsRunEventContext ([b8def27](https://github.com/nrkno/tv-automation-server-core/commit/b8def27)) -* add missing function ([de2b81f](https://github.com/nrkno/tv-automation-server-core/commit/de2b81f)) -* allow removing peripheralDevices from Settings page ([948675f](https://github.com/nrkno/tv-automation-server-core/commit/948675f)) -* Basic rundown playback ([3b88d2a](https://github.com/nrkno/tv-automation-server-core/commit/3b88d2a)) -* blueprint config from manifest is reenabled and used for show style base and variant ([59b2f2f](https://github.com/nrkno/tv-automation-server-core/commit/59b2f2f)) -* blueprint settings page ([5697afe](https://github.com/nrkno/tv-automation-server-core/commit/5697afe)) -* build errors ([81382f7](https://github.com/nrkno/tv-automation-server-core/commit/81382f7)) -* build errors ([34889b9](https://github.com/nrkno/tv-automation-server-core/commit/34889b9)) -* clean up imports in ROV ([58067a6](https://github.com/nrkno/tv-automation-server-core/commit/58067a6)) -* clear queued adlibs when resetting running order ([83ed11a](https://github.com/nrkno/tv-automation-server-core/commit/83ed11a)) -* Correct some TimelineObj typings ([eb36ef9](https://github.com/nrkno/tv-automation-server-core/commit/eb36ef9)) -* device status notifications ([7ab4a4c](https://github.com/nrkno/tv-automation-server-core/commit/7ab4a4c)) -* Do not allow queue ad lib during hold mode ([c378fc8](https://github.com/nrkno/tv-automation-server-core/commit/c378fc8)) -* do not allow toggling sl arguments during hold mode ([3311f0a](https://github.com/nrkno/tv-automation-server-core/commit/3311f0a)) -* do not display notification count if = 0 ([1fe9a39](https://github.com/nrkno/tv-automation-server-core/commit/1fe9a39)) -* don't update device name if already got one ([833196a](https://github.com/nrkno/tv-automation-server-core/commit/833196a)) -* Dont show unset optional config in the config list ([5689865](https://github.com/nrkno/tv-automation-server-core/commit/5689865)) -* externalMessageQueue id ([5c8c39d](https://github.com/nrkno/tv-automation-server-core/commit/5c8c39d)) -* failing on startup if dp property missing ([041fc3e](https://github.com/nrkno/tv-automation-server-core/commit/041fc3e)) -* Fix device status notifications ([b9f274e](https://github.com/nrkno/tv-automation-server-core/commit/b9f274e)) -* fix more typings and add some null checks in unusual places ([d0c53c3](https://github.com/nrkno/tv-automation-server-core/commit/d0c53c3)) -* fix notifications toggle button cursor ([402486b](https://github.com/nrkno/tv-automation-server-core/commit/402486b)) -* fix Segment Line notifications ([3753250](https://github.com/nrkno/tv-automation-server-core/commit/3753250)) -* fix typings to match with the stronger typings ([ae1bd4f](https://github.com/nrkno/tv-automation-server-core/commit/ae1bd4f)) -* fix zoom area height ([24d2e38](https://github.com/nrkno/tv-automation-server-core/commit/24d2e38)) -* GUI: new try on rewinding the viewport on RO reset ([b0edaf4](https://github.com/nrkno/tv-automation-server-core/commit/b0edaf4)) -* GUI: unexpected behaviour in blueprint configuration ([f5bed4e](https://github.com/nrkno/tv-automation-server-core/commit/f5bed4e)) -* header context menu z-order fix ([c68244b](https://github.com/nrkno/tv-automation-server-core/commit/c68244b)) -* Hide child devices from being added to the studio ([852ec9b](https://github.com/nrkno/tv-automation-server-core/commit/852ec9b)) -* hold-copy of the SLI should provide seek information to offset markers on the SLI ([3967d03](https://github.com/nrkno/tv-automation-server-core/commit/3967d03)) -* houskeeping: remove uneccessary logs ([0c054f9](https://github.com/nrkno/tv-automation-server-core/commit/0c054f9)) -* Importing of some mock running orders ([eadf225](https://github.com/nrkno/tv-automation-server-core/commit/eadf225)) -* improve evaluation form visuals ([30af081](https://github.com/nrkno/tv-automation-server-core/commit/30af081)) -* Improve group label visuals ([39b43e1](https://github.com/nrkno/tv-automation-server-core/commit/39b43e1)) -* improve notification center button ([0b4d082](https://github.com/nrkno/tv-automation-server-core/commit/0b4d082)) -* improve notifications highlighting animation ([afeb568](https://github.com/nrkno/tv-automation-server-core/commit/afeb568)) -* improve some error logging ([60af59b](https://github.com/nrkno/tv-automation-server-core/commit/60af59b)) -* increase upload limit for backup files ([5effaa9](https://github.com/nrkno/tv-automation-server-core/commit/5effaa9)) -* JSX props typings fix in Header ([7596557](https://github.com/nrkno/tv-automation-server-core/commit/7596557)) -* keep device header in Mos parent properties settings ([4ff9b91](https://github.com/nrkno/tv-automation-server-core/commit/4ff9b91)) -* keep device header in Mos parent properties settings ([2f2529d](https://github.com/nrkno/tv-automation-server-core/commit/2f2529d)) -* Keep the devices header visible when editing device ([90dbe05](https://github.com/nrkno/tv-automation-server-core/commit/90dbe05)) -* Keep the devices header visible when editing device ([cb2d7d9](https://github.com/nrkno/tv-automation-server-core/commit/cb2d7d9)) -* make 'Lights' source layer type translatable in the Settings ([65d5b76](https://github.com/nrkno/tv-automation-server-core/commit/65d5b76)) -* make the FullScreen detection more lenient ([28b689a](https://github.com/nrkno/tv-automation-server-core/commit/28b689a)) -* migration helpers ([40228e8](https://github.com/nrkno/tv-automation-server-core/commit/40228e8)) -* Migrations internal server error ([45d0238](https://github.com/nrkno/tv-automation-server-core/commit/45d0238)) -* move all segment notes away from header, show only summary, clickable summary ([d0a4801](https://github.com/nrkno/tv-automation-server-core/commit/d0a4801)) -* move notifications pop-ups when NC is open ([d6ce260](https://github.com/nrkno/tv-automation-server-core/commit/d6ce260)) -* note type got lost ([863e49d](https://github.com/nrkno/tv-automation-server-core/commit/863e49d)) -* notification center panel shadow ([1010dda](https://github.com/nrkno/tv-automation-server-core/commit/1010dda)) -* Notification Center width calculations ([fa31d65](https://github.com/nrkno/tv-automation-server-core/commit/fa31d65)) -* notification equality check, resolves 'republished' RO notifications ([27b6102](https://github.com/nrkno/tv-automation-server-core/commit/27b6102)) -* NotificationCenter visual fix for other pages ([10b1afa](https://github.com/nrkno/tv-automation-server-core/commit/10b1afa)) -* Notifications panel styling fix ([7f7f5cb](https://github.com/nrkno/tv-automation-server-core/commit/7f7f5cb)) -* Pass SofieHostURL to blueprints config ([8c18821](https://github.com/nrkno/tv-automation-server-core/commit/8c18821)) -* playout ([969e316](https://github.com/nrkno/tv-automation-server-core/commit/969e316)) -* prevent resetting rundown when on-air ([d842922](https://github.com/nrkno/tv-automation-server-core/commit/d842922)) -* queued adlib should have infinite sli's ([75452dc](https://github.com/nrkno/tv-automation-server-core/commit/75452dc)) -* remove check that didn't work ([fdc917f](https://github.com/nrkno/tv-automation-server-core/commit/fdc917f)) -* remove config didn't work ([893717e](https://github.com/nrkno/tv-automation-server-core/commit/893717e)) -* rename restoreBackups page to Snapshots ([0c5103f](https://github.com/nrkno/tv-automation-server-core/commit/0c5103f)) -* resolve issue with hit-area of Notification Center ([1618619](https://github.com/nrkno/tv-automation-server-core/commit/1618619)) -* resolve Media Object Status notifications bug ([367dcce](https://github.com/nrkno/tv-automation-server-core/commit/367dcce)) -* restore blueprint settings page ([faa7fdd](https://github.com/nrkno/tv-automation-server-core/commit/faa7fdd)) -* restore running order 'backup' fails if doesnt already exist ([87b3300](https://github.com/nrkno/tv-automation-server-core/commit/87b3300)) -* reversed logic during refactoring by mistake ([694191e](https://github.com/nrkno/tv-automation-server-core/commit/694191e)) -* rewind UI even if reset returns error ([3bd5417](https://github.com/nrkno/tv-automation-server-core/commit/3bd5417)) -* running blueprint migrations ([fe1e7fd](https://github.com/nrkno/tv-automation-server-core/commit/fe1e7fd)) -* Running blueprints and migrations ([3b29df3](https://github.com/nrkno/tv-automation-server-core/commit/3b29df3)) -* running order closing prompt ([3024543](https://github.com/nrkno/tv-automation-server-core/commit/3024543)) -* running order view notifications in production build ([b593323](https://github.com/nrkno/tv-automation-server-core/commit/b593323)) -* show ShowStyleBase name as a part of the ShowStyleVariant name in Studios ([ba67011](https://github.com/nrkno/tv-automation-server-core/commit/ba67011)) -* systemStatus _internal messages ([05fd6c8](https://github.com/nrkno/tv-automation-server-core/commit/05fd6c8)) -* systemStatus messages ([17420cc](https://github.com/nrkno/tv-automation-server-core/commit/17420cc)) -* Tooltip import ([cd2b65a](https://github.com/nrkno/tv-automation-server-core/commit/cd2b65a)) -* tooltips after import change ([a82140f](https://github.com/nrkno/tv-automation-server-core/commit/a82140f)) -* type error, ensure string ([76da25d](https://github.com/nrkno/tv-automation-server-core/commit/76da25d)) -* typings error, ensuring string ([1e25345](https://github.com/nrkno/tv-automation-server-core/commit/1e25345)) -* typo MediaResolutions vs mediaResolutions ([6a72e09](https://github.com/nrkno/tv-automation-server-core/commit/6a72e09)) -* UI crash when outputLayer is undefined ([e6dd558](https://github.com/nrkno/tv-automation-server-core/commit/e6dd558)) -* UI: improve shapshot comment edit field ([093e6cb](https://github.com/nrkno/tv-automation-server-core/commit/093e6cb)) -* update blueprints-integration ([28d17c2](https://github.com/nrkno/tv-automation-server-core/commit/28d17c2)) -* update typings to match blueprints-integration ([f97f177](https://github.com/nrkno/tv-automation-server-core/commit/f97f177)) -* Use more consistent inputs in Blueprints page ([d223d11](https://github.com/nrkno/tv-automation-server-core/commit/d223d11)) -* Use new mediaPreviewsUrl setting ([1bd0ba4](https://github.com/nrkno/tv-automation-server-core/commit/1bd0ba4)) -* use studioInstallationId of parent peripheralDevice ([7dedf9b](https://github.com/nrkno/tv-automation-server-core/commit/7dedf9b)) -* various fixes after refactoring ([1a17414](https://github.com/nrkno/tv-automation-server-core/commit/1a17414)) - +- **asRunLog:** wrong id, typo ([636fc41](https://github.com/nrkno/tv-automation-server-core/commit/636fc41)) +- **blueprint:** Fill in missing TimelineObj fields ([0ed7663](https://github.com/nrkno/tv-automation-server-core/commit/0ed7663)) +- **blueprint:** fix manifest config add item showing an 'undefined' option ([fa6182a](https://github.com/nrkno/tv-automation-server-core/commit/fa6182a)) +- **blueprint:** Remove invalid backup restore code ([2e00eca](https://github.com/nrkno/tv-automation-server-core/commit/2e00eca)) +- **blueprints:** Ensure ids are not duplicated ([fbd0a04](https://github.com/nrkno/tv-automation-server-core/commit/fbd0a04)) +- **Devices:** Better strings and device list layouts (less details) ([be26a18](https://github.com/nrkno/tv-automation-server-core/commit/be26a18)) +- **hold:** Disable transition when leaving HOLD ([809dd34](https://github.com/nrkno/tv-automation-server-core/commit/809dd34)) +- **hold:** Disable transition when leaving or leaving HOLD ([ef5cbcb](https://github.com/nrkno/tv-automation-server-core/commit/ef5cbcb)) +- **hold:** Ensure the original stk does not get picked up as a dynamic object when setting the sl as next ([225304d](https://github.com/nrkno/tv-automation-server-core/commit/225304d)) +- **hold:** When extending a sli during hold, use the original id to make any triggers on the sli work ([669a4b2](https://github.com/nrkno/tv-automation-server-core/commit/669a4b2)) +- **migrations:** Broken StudioContext.updateDevice method ([d882e8b](https://github.com/nrkno/tv-automation-server-core/commit/d882e8b)) +- **migrations:** Check migrate function exists before trying to run it ([cf076f5](https://github.com/nrkno/tv-automation-server-core/commit/cf076f5)) +- **migrations:** Create ShowStyleVariant with ShowStyleBase in the migrations and setup studio to use it as its default ([75073d4](https://github.com/nrkno/tv-automation-server-core/commit/75073d4)) +- **migrations:** DependOnResultFrom id was not being prefixed causing it to never work ([5830754](https://github.com/nrkno/tv-automation-server-core/commit/5830754)) +- **rabbitmq:** send persistant messages ([ff8d375](https://github.com/nrkno/tv-automation-server-core/commit/ff8d375)) +- accepted resolutions should not be separated by space. ([1b80a2c](https://github.com/nrkno/tv-automation-server-core/commit/1b80a2c)) +- **migrations:** Uncomment mos check migration ([c262fff](https://github.com/nrkno/tv-automation-server-core/commit/c262fff)) +- **migrations:** Various problems when running from empty ([11d1d0b](https://github.com/nrkno/tv-automation-server-core/commit/11d1d0b)) +- **notification center:** fix notification center toggle button in RO view ([894c1e2](https://github.com/nrkno/tv-automation-server-core/commit/894c1e2)) +- **notification center:** fix running order overview to line up with the Segments column ([0906cab](https://github.com/nrkno/tv-automation-server-core/commit/0906cab)) +- **notification center:** notification count position ([1d8d2cb](https://github.com/nrkno/tv-automation-server-core/commit/1d8d2cb)) +- **notification center:** reintroduce RunningOrderNotifier into RunningOrderView ([e70e5c9](https://github.com/nrkno/tv-automation-server-core/commit/e70e5c9)) +- **pharos:** add missing settingsType and migration step ([be618d2](https://github.com/nrkno/tv-automation-server-core/commit/be618d2)) +- **playout:** Better account for duration and overlaps with transitions etc. ([dc249a3](https://github.com/nrkno/tv-automation-server-core/commit/dc249a3)) +- **playout:** Double head2 headline out animation ([165e2c0](https://github.com/nrkno/tv-automation-server-core/commit/165e2c0)) +- **playout:** Refactor setting object siId ([48de044](https://github.com/nrkno/tv-automation-server-core/commit/48de044)) +- **refactor:** existing runningOrders were not migrated to the new data structure ([b20bc2d](https://github.com/nrkno/tv-automation-server-core/commit/b20bc2d)) +- **refactor:** remove stray debugger calls ([3be5c22](https://github.com/nrkno/tv-automation-server-core/commit/3be5c22)) +- **runtimeArgs:** Removing infinite items from changed sl and anything following ([28ffd5d](https://github.com/nrkno/tv-automation-server-core/commit/28ffd5d)) +- **snapshot:** SegmentLines were not being included in the snapshot ([224f806](https://github.com/nrkno/tv-automation-server-core/commit/224f806)) +- **UI:** Improves device settings and status page by removing information ([267c10c](https://github.com/nrkno/tv-automation-server-core/commit/267c10c)) +- updated health endpoint according to spec ([900728b](https://github.com/nrkno/tv-automation-server-core/commit/900728b)) +- **unsync:** refactor, add method to unsync runningOrder ([d54c147](https://github.com/nrkno/tv-automation-server-core/commit/d54c147)) +- add (preliminary) security rules for all collections ([6fd60e2](https://github.com/nrkno/tv-automation-server-core/commit/6fd60e2)) +- add dependency: timeline-state-resolver-types ([cd2db55](https://github.com/nrkno/tv-automation-server-core/commit/cd2db55)) +- add missing asRunEvent in AsRunEventContext ([b8def27](https://github.com/nrkno/tv-automation-server-core/commit/b8def27)) +- add missing function ([de2b81f](https://github.com/nrkno/tv-automation-server-core/commit/de2b81f)) +- allow removing peripheralDevices from Settings page ([948675f](https://github.com/nrkno/tv-automation-server-core/commit/948675f)) +- Basic rundown playback ([3b88d2a](https://github.com/nrkno/tv-automation-server-core/commit/3b88d2a)) +- blueprint config from manifest is reenabled and used for show style base and variant ([59b2f2f](https://github.com/nrkno/tv-automation-server-core/commit/59b2f2f)) +- blueprint settings page ([5697afe](https://github.com/nrkno/tv-automation-server-core/commit/5697afe)) +- build errors ([81382f7](https://github.com/nrkno/tv-automation-server-core/commit/81382f7)) +- build errors ([34889b9](https://github.com/nrkno/tv-automation-server-core/commit/34889b9)) +- clean up imports in ROV ([58067a6](https://github.com/nrkno/tv-automation-server-core/commit/58067a6)) +- clear queued adlibs when resetting running order ([83ed11a](https://github.com/nrkno/tv-automation-server-core/commit/83ed11a)) +- Correct some TimelineObj typings ([eb36ef9](https://github.com/nrkno/tv-automation-server-core/commit/eb36ef9)) +- device status notifications ([7ab4a4c](https://github.com/nrkno/tv-automation-server-core/commit/7ab4a4c)) +- Do not allow queue ad lib during hold mode ([c378fc8](https://github.com/nrkno/tv-automation-server-core/commit/c378fc8)) +- do not allow toggling sl arguments during hold mode ([3311f0a](https://github.com/nrkno/tv-automation-server-core/commit/3311f0a)) +- do not display notification count if = 0 ([1fe9a39](https://github.com/nrkno/tv-automation-server-core/commit/1fe9a39)) +- don't update device name if already got one ([833196a](https://github.com/nrkno/tv-automation-server-core/commit/833196a)) +- Dont show unset optional config in the config list ([5689865](https://github.com/nrkno/tv-automation-server-core/commit/5689865)) +- externalMessageQueue id ([5c8c39d](https://github.com/nrkno/tv-automation-server-core/commit/5c8c39d)) +- failing on startup if dp property missing ([041fc3e](https://github.com/nrkno/tv-automation-server-core/commit/041fc3e)) +- Fix device status notifications ([b9f274e](https://github.com/nrkno/tv-automation-server-core/commit/b9f274e)) +- fix more typings and add some null checks in unusual places ([d0c53c3](https://github.com/nrkno/tv-automation-server-core/commit/d0c53c3)) +- fix notifications toggle button cursor ([402486b](https://github.com/nrkno/tv-automation-server-core/commit/402486b)) +- fix Segment Line notifications ([3753250](https://github.com/nrkno/tv-automation-server-core/commit/3753250)) +- fix typings to match with the stronger typings ([ae1bd4f](https://github.com/nrkno/tv-automation-server-core/commit/ae1bd4f)) +- fix zoom area height ([24d2e38](https://github.com/nrkno/tv-automation-server-core/commit/24d2e38)) +- GUI: new try on rewinding the viewport on RO reset ([b0edaf4](https://github.com/nrkno/tv-automation-server-core/commit/b0edaf4)) +- GUI: unexpected behaviour in blueprint configuration ([f5bed4e](https://github.com/nrkno/tv-automation-server-core/commit/f5bed4e)) +- header context menu z-order fix ([c68244b](https://github.com/nrkno/tv-automation-server-core/commit/c68244b)) +- Hide child devices from being added to the studio ([852ec9b](https://github.com/nrkno/tv-automation-server-core/commit/852ec9b)) +- hold-copy of the SLI should provide seek information to offset markers on the SLI ([3967d03](https://github.com/nrkno/tv-automation-server-core/commit/3967d03)) +- houskeeping: remove uneccessary logs ([0c054f9](https://github.com/nrkno/tv-automation-server-core/commit/0c054f9)) +- Importing of some mock running orders ([eadf225](https://github.com/nrkno/tv-automation-server-core/commit/eadf225)) +- improve evaluation form visuals ([30af081](https://github.com/nrkno/tv-automation-server-core/commit/30af081)) +- Improve group label visuals ([39b43e1](https://github.com/nrkno/tv-automation-server-core/commit/39b43e1)) +- improve notification center button ([0b4d082](https://github.com/nrkno/tv-automation-server-core/commit/0b4d082)) +- improve notifications highlighting animation ([afeb568](https://github.com/nrkno/tv-automation-server-core/commit/afeb568)) +- improve some error logging ([60af59b](https://github.com/nrkno/tv-automation-server-core/commit/60af59b)) +- increase upload limit for backup files ([5effaa9](https://github.com/nrkno/tv-automation-server-core/commit/5effaa9)) +- JSX props typings fix in Header ([7596557](https://github.com/nrkno/tv-automation-server-core/commit/7596557)) +- keep device header in Mos parent properties settings ([4ff9b91](https://github.com/nrkno/tv-automation-server-core/commit/4ff9b91)) +- keep device header in Mos parent properties settings ([2f2529d](https://github.com/nrkno/tv-automation-server-core/commit/2f2529d)) +- Keep the devices header visible when editing device ([90dbe05](https://github.com/nrkno/tv-automation-server-core/commit/90dbe05)) +- Keep the devices header visible when editing device ([cb2d7d9](https://github.com/nrkno/tv-automation-server-core/commit/cb2d7d9)) +- make 'Lights' source layer type translatable in the Settings ([65d5b76](https://github.com/nrkno/tv-automation-server-core/commit/65d5b76)) +- make the FullScreen detection more lenient ([28b689a](https://github.com/nrkno/tv-automation-server-core/commit/28b689a)) +- migration helpers ([40228e8](https://github.com/nrkno/tv-automation-server-core/commit/40228e8)) +- Migrations internal server error ([45d0238](https://github.com/nrkno/tv-automation-server-core/commit/45d0238)) +- move all segment notes away from header, show only summary, clickable summary ([d0a4801](https://github.com/nrkno/tv-automation-server-core/commit/d0a4801)) +- move notifications pop-ups when NC is open ([d6ce260](https://github.com/nrkno/tv-automation-server-core/commit/d6ce260)) +- note type got lost ([863e49d](https://github.com/nrkno/tv-automation-server-core/commit/863e49d)) +- notification center panel shadow ([1010dda](https://github.com/nrkno/tv-automation-server-core/commit/1010dda)) +- Notification Center width calculations ([fa31d65](https://github.com/nrkno/tv-automation-server-core/commit/fa31d65)) +- notification equality check, resolves 'republished' RO notifications ([27b6102](https://github.com/nrkno/tv-automation-server-core/commit/27b6102)) +- NotificationCenter visual fix for other pages ([10b1afa](https://github.com/nrkno/tv-automation-server-core/commit/10b1afa)) +- Notifications panel styling fix ([7f7f5cb](https://github.com/nrkno/tv-automation-server-core/commit/7f7f5cb)) +- Pass SofieHostURL to blueprints config ([8c18821](https://github.com/nrkno/tv-automation-server-core/commit/8c18821)) +- playout ([969e316](https://github.com/nrkno/tv-automation-server-core/commit/969e316)) +- prevent resetting rundown when on-air ([d842922](https://github.com/nrkno/tv-automation-server-core/commit/d842922)) +- queued adlib should have infinite sli's ([75452dc](https://github.com/nrkno/tv-automation-server-core/commit/75452dc)) +- remove check that didn't work ([fdc917f](https://github.com/nrkno/tv-automation-server-core/commit/fdc917f)) +- remove config didn't work ([893717e](https://github.com/nrkno/tv-automation-server-core/commit/893717e)) +- rename restoreBackups page to Snapshots ([0c5103f](https://github.com/nrkno/tv-automation-server-core/commit/0c5103f)) +- resolve issue with hit-area of Notification Center ([1618619](https://github.com/nrkno/tv-automation-server-core/commit/1618619)) +- resolve Media Object Status notifications bug ([367dcce](https://github.com/nrkno/tv-automation-server-core/commit/367dcce)) +- restore blueprint settings page ([faa7fdd](https://github.com/nrkno/tv-automation-server-core/commit/faa7fdd)) +- restore running order 'backup' fails if doesnt already exist ([87b3300](https://github.com/nrkno/tv-automation-server-core/commit/87b3300)) +- reversed logic during refactoring by mistake ([694191e](https://github.com/nrkno/tv-automation-server-core/commit/694191e)) +- rewind UI even if reset returns error ([3bd5417](https://github.com/nrkno/tv-automation-server-core/commit/3bd5417)) +- running blueprint migrations ([fe1e7fd](https://github.com/nrkno/tv-automation-server-core/commit/fe1e7fd)) +- Running blueprints and migrations ([3b29df3](https://github.com/nrkno/tv-automation-server-core/commit/3b29df3)) +- running order closing prompt ([3024543](https://github.com/nrkno/tv-automation-server-core/commit/3024543)) +- running order view notifications in production build ([b593323](https://github.com/nrkno/tv-automation-server-core/commit/b593323)) +- show ShowStyleBase name as a part of the ShowStyleVariant name in Studios ([ba67011](https://github.com/nrkno/tv-automation-server-core/commit/ba67011)) +- systemStatus \_internal messages ([05fd6c8](https://github.com/nrkno/tv-automation-server-core/commit/05fd6c8)) +- systemStatus messages ([17420cc](https://github.com/nrkno/tv-automation-server-core/commit/17420cc)) +- Tooltip import ([cd2b65a](https://github.com/nrkno/tv-automation-server-core/commit/cd2b65a)) +- tooltips after import change ([a82140f](https://github.com/nrkno/tv-automation-server-core/commit/a82140f)) +- type error, ensure string ([76da25d](https://github.com/nrkno/tv-automation-server-core/commit/76da25d)) +- typings error, ensuring string ([1e25345](https://github.com/nrkno/tv-automation-server-core/commit/1e25345)) +- typo MediaResolutions vs mediaResolutions ([6a72e09](https://github.com/nrkno/tv-automation-server-core/commit/6a72e09)) +- UI crash when outputLayer is undefined ([e6dd558](https://github.com/nrkno/tv-automation-server-core/commit/e6dd558)) +- UI: improve shapshot comment edit field ([093e6cb](https://github.com/nrkno/tv-automation-server-core/commit/093e6cb)) +- update blueprints-integration ([28d17c2](https://github.com/nrkno/tv-automation-server-core/commit/28d17c2)) +- update typings to match blueprints-integration ([f97f177](https://github.com/nrkno/tv-automation-server-core/commit/f97f177)) +- Use more consistent inputs in Blueprints page ([d223d11](https://github.com/nrkno/tv-automation-server-core/commit/d223d11)) +- Use new mediaPreviewsUrl setting ([1bd0ba4](https://github.com/nrkno/tv-automation-server-core/commit/1bd0ba4)) +- use studioInstallationId of parent peripheralDevice ([7dedf9b](https://github.com/nrkno/tv-automation-server-core/commit/7dedf9b)) +- various fixes after refactoring ([1a17414](https://github.com/nrkno/tv-automation-server-core/commit/1a17414)) ### Features -* Add expected media items collection ([04c15a9](https://github.com/nrkno/tv-automation-server-core/commit/04c15a9)) -* add link to compatible studios from ShowStyle page ([4be495c](https://github.com/nrkno/tv-automation-server-core/commit/4be495c)) -* Add Media_Manager DeviceType ([2b612c7](https://github.com/nrkno/tv-automation-server-core/commit/2b612c7)) -* add methods for insert/remove blueprints ([8acb72b](https://github.com/nrkno/tv-automation-server-core/commit/8acb72b)) -* Add OSC Playout device type ([bf426b5](https://github.com/nrkno/tv-automation-server-core/commit/bf426b5)) -* add snapshot restore statistics to logging ([45115f3](https://github.com/nrkno/tv-automation-server-core/commit/45115f3)) -* add studioInstallation.settings, mediaPreviewsUrl and sofieUrl, to replace configs ([adc6cb5](https://github.com/nrkno/tv-automation-server-core/commit/adc6cb5)) -* Add version string field to blueprint collection ([869dd02](https://github.com/nrkno/tv-automation-server-core/commit/869dd02)) -* allow reconnection action on click ([3575f4f](https://github.com/nrkno/tv-automation-server-core/commit/3575f4f)) -* Allow to specify blueprint name in request query string ([e8c2dc9](https://github.com/nrkno/tv-automation-server-core/commit/e8c2dc9)) -* be able to remove stored snapshots ([849f906](https://github.com/nrkno/tv-automation-server-core/commit/849f906)) -* better return type from post-process ([a971b43](https://github.com/nrkno/tv-automation-server-core/commit/a971b43)) -* BIG refactoring of Core ([9d6ae9e](https://github.com/nrkno/tv-automation-server-core/commit/9d6ae9e)) -* blueprint migration implementation (it works now) ([15250b2](https://github.com/nrkno/tv-automation-server-core/commit/15250b2)) -* blueprint migration, continued implementation ([ff507ab](https://github.com/nrkno/tv-automation-server-core/commit/ff507ab)) -* blueprintMigrations ([9527cae](https://github.com/nrkno/tv-automation-server-core/commit/9527cae)) -* blueprints context: handle notes externally (to ro notes) or internally (to logger) ([63640f2](https://github.com/nrkno/tv-automation-server-core/commit/63640f2)) -* change heavy-light display style ([329e2c6](https://github.com/nrkno/tv-automation-server-core/commit/329e2c6)) -* Changes for blueprints-integration typings ([8d1f37d](https://github.com/nrkno/tv-automation-server-core/commit/8d1f37d)) -* Crude ui to visualise generated timeline ([6e55382](https://github.com/nrkno/tv-automation-server-core/commit/6e55382)) -* don't restore from old snapshots ([bab8bbb](https://github.com/nrkno/tv-automation-server-core/commit/bab8bbb)) -* First draft at uploading a blueprints blob into a new db collection, and running it instead of the existing baseline ([31c56d8](https://github.com/nrkno/tv-automation-server-core/commit/31c56d8)) -* implement (upcoming) blueprint API ([d86faa5](https://github.com/nrkno/tv-automation-server-core/commit/d86faa5)) -* implementation of blueprint migrations ([5fec7a2](https://github.com/nrkno/tv-automation-server-core/commit/5fec7a2)) -* implementation of new blueprint API ([34f905f](https://github.com/nrkno/tv-automation-server-core/commit/34f905f)) -* manipulator methods for inserting & removing showStyleBase & showStyleVariant ([6bb4e00](https://github.com/nrkno/tv-automation-server-core/commit/6bb4e00)) -* more work on notification center ([92196ca](https://github.com/nrkno/tv-automation-server-core/commit/92196ca)) -* more work on notification center ([a34ccd0](https://github.com/nrkno/tv-automation-server-core/commit/a34ccd0)) -* more work on peripheralDevices notifications ([36a0a4b](https://github.com/nrkno/tv-automation-server-core/commit/36a0a4b)) -* more work on peripheralDevices notifications ([692b1b2](https://github.com/nrkno/tv-automation-server-core/commit/692b1b2)) -* Move all device specific TimelineObj types to tsr-types ([55766a5](https://github.com/nrkno/tv-automation-server-core/commit/55766a5)) -* move delete button to peripheralDevice page ([46647c1](https://github.com/nrkno/tv-automation-server-core/commit/46647c1)) -* Move Mapping types to tsr-types package ([67bd838](https://github.com/nrkno/tv-automation-server-core/commit/67bd838)) -* Move types to blueprint-integration ([c305061](https://github.com/nrkno/tv-automation-server-core/commit/c305061)) -* multiSelect component for selecting compatible Show Styles ([e1a5c35](https://github.com/nrkno/tv-automation-server-core/commit/e1a5c35)) -* Refactor blueprint contexts so be different per type to limit exposed api ([f0d1c7c](https://github.com/nrkno/tv-automation-server-core/commit/f0d1c7c)) -* Refactor external message template code ([21ac50e](https://github.com/nrkno/tv-automation-server-core/commit/21ac50e)) -* Refactor story template code to use new blueprint structure ([104982b](https://github.com/nrkno/tv-automation-server-core/commit/104982b)) -* Reference blueprints-integration api file ([dc1cdb8](https://github.com/nrkno/tv-automation-server-core/commit/dc1cdb8)) -* Reference blueprints-integration utils file ([d94c97b](https://github.com/nrkno/tv-automation-server-core/commit/d94c97b)) -* Reference device options in tsr-types ([049b9bc](https://github.com/nrkno/tv-automation-server-core/commit/049b9bc)) -* Remove monaco ([e417548](https://github.com/nrkno/tv-automation-server-core/commit/e417548)) -* show blueprint id in select options in Show Styles, hyphenated show-styles doesn't seem right ([e19802f](https://github.com/nrkno/tv-automation-server-core/commit/e19802f)) -* Simplify RunningOrderBaseItem type ([2b8257b](https://github.com/nrkno/tv-automation-server-core/commit/2b8257b)) -* some work on notification center ([8e2c269](https://github.com/nrkno/tv-automation-server-core/commit/8e2c269)) -* some work on notification center ([58ad599](https://github.com/nrkno/tv-automation-server-core/commit/58ad599)) -* **blueprints:** Add minimum core version to blueprints. Move blueprint restore code to api/blueprints ([2453a16](https://github.com/nrkno/tv-automation-server-core/commit/2453a16)) -* **blueprints:** Add section of studio settings based off a manifest from the blueprints ([4866a79](https://github.com/nrkno/tv-automation-server-core/commit/4866a79)) -* **blueprints:** Expose version string and uploading in the ui ([00875a4](https://github.com/nrkno/tv-automation-server-core/commit/00875a4)) -* **externalMessages:** add hold property, to be able to pause sending of messages ([adc69d8](https://github.com/nrkno/tv-automation-server-core/commit/adc69d8)) -* **health check:** statusMessage implementation ([b01ac48](https://github.com/nrkno/tv-automation-server-core/commit/b01ac48)) -* **migration:** reafactor migrations and add new migration steps ([0966ef6](https://github.com/nrkno/tv-automation-server-core/commit/0966ef6)) -* **migrations:** automatically continue partialMigrations when possible ([f75e907](https://github.com/nrkno/tv-automation-server-core/commit/f75e907)) -* Strip out old runtime functions ([880a885](https://github.com/nrkno/tv-automation-server-core/commit/880a885)) -* **migrations:** Move playout-device migrations to blueprints ([04029d4](https://github.com/nrkno/tv-automation-server-core/commit/04029d4)) -* **notification center:** hot-links to RO note notifications ([f3e9f59](https://github.com/nrkno/tv-automation-server-core/commit/f3e9f59)) -* **notification center:** notification count ([b8fbcac](https://github.com/nrkno/tv-automation-server-core/commit/b8fbcac)) -* **notification center:** squish segments in RO view when NC is open ([36b514f](https://github.com/nrkno/tv-automation-server-core/commit/36b514f)) -* **notification-center:** connection status notifier et al. ([5aefd52](https://github.com/nrkno/tv-automation-server-core/commit/5aefd52)) -* **notification-center:** connection status notifier et al. ([e529e94](https://github.com/nrkno/tv-automation-server-core/commit/e529e94)) -* **notification-center:** move expand notification center to right-hand status bar ([2750fab](https://github.com/nrkno/tv-automation-server-core/commit/2750fab)) -* **notification-center:** move expand notification center to right-hand status bar ([635c09d](https://github.com/nrkno/tv-automation-server-core/commit/635c09d)) -* **notification-center:** NotificationCenterPanel et al. ([c4794c8](https://github.com/nrkno/tv-automation-server-core/commit/c4794c8)) -* **notification-center:** NotificationCenterPanel et al. ([9283909](https://github.com/nrkno/tv-automation-server-core/commit/9283909)) -* **notification-center:** segment warning tweak ([e956488](https://github.com/nrkno/tv-automation-server-core/commit/e956488)) -* **notification-center:** segment warning tweak ([d4fc5e7](https://github.com/nrkno/tv-automation-server-core/commit/d4fc5e7)) -* **notifications-center:** notification center in other pages than ROV ([5250aab](https://github.com/nrkno/tv-automation-server-core/commit/5250aab)) -* **notifications-center:** notification center in other pages than ROV ([0620115](https://github.com/nrkno/tv-automation-server-core/commit/0620115)) -* **playout:** Add object to timeline to indicate whether ro is active or in rehersal ([d0e850d](https://github.com/nrkno/tv-automation-server-core/commit/d0e850d)) -* **rabbit:** initial commit (wip) ([7ed3223](https://github.com/nrkno/tv-automation-server-core/commit/7ed3223)) -* **rabbitmq:** Implementation of RabbitMQ external message queue ([b31e15f](https://github.com/nrkno/tv-automation-server-core/commit/b31e15f)) -* **rabbitmq:** message id ([7ce9e5a](https://github.com/nrkno/tv-automation-server-core/commit/7ce9e5a)) -* **refactor:** move Runtime Arguments for Blueprints from StudioInstallation to ShowStyleBase ([9b2c2d8](https://github.com/nrkno/tv-automation-server-core/commit/9b2c2d8)) -* **snapshot:** implement support for taking snapshot of settings related to a single studio ([d177113](https://github.com/nrkno/tv-automation-server-core/commit/d177113)) -* **timeline:** Remove deviceId field from timeline objects ([85c4b89](https://github.com/nrkno/tv-automation-server-core/commit/85c4b89)) -* Start moving some migrations to blueprints ([9d4949e](https://github.com/nrkno/tv-automation-server-core/commit/9d4949e)) -* Start using types from sofie-blueprints-integration ([6106d99](https://github.com/nrkno/tv-automation-server-core/commit/6106d99)) -* take snapshot when saving evaluation form ([b98d68f](https://github.com/nrkno/tv-automation-server-core/commit/b98d68f)) -* trim config values (strings) ([d41e07e](https://github.com/nrkno/tv-automation-server-core/commit/d41e07e)) -* update blueprint contexts to match new API ([ab6fc5a](https://github.com/nrkno/tv-automation-server-core/commit/ab6fc5a)) -* update type dependencies and type references. Removed dependency of mos-connection and replaced it with references to the blueprints-integration. ([85bd795](https://github.com/nrkno/tv-automation-server-core/commit/85bd795)) -* update types deps & API methods ([7d1a49b](https://github.com/nrkno/tv-automation-server-core/commit/7d1a49b)) -* Update typings for blueprints to be more specific ([53f7281](https://github.com/nrkno/tv-automation-server-core/commit/53f7281)) -* Update typings for message blueprint ([cf13fc9](https://github.com/nrkno/tv-automation-server-core/commit/cf13fc9)) -* updated to match blueprints-integration /develop, started on new message-flow, WIP ([6b84b75](https://github.com/nrkno/tv-automation-server-core/commit/6b84b75)) -* WIP: VERY preliminary implementation of quick and dirty manual playback ([a9ec948](https://github.com/nrkno/tv-automation-server-core/commit/a9ec948)) -* wrap blueprint functions, to emit better errors ([14873f1](https://github.com/nrkno/tv-automation-server-core/commit/14873f1)) -* zoom control buttons ([41c1c92](https://github.com/nrkno/tv-automation-server-core/commit/41c1c92)) - - +- Add expected media items collection ([04c15a9](https://github.com/nrkno/tv-automation-server-core/commit/04c15a9)) +- add link to compatible studios from ShowStyle page ([4be495c](https://github.com/nrkno/tv-automation-server-core/commit/4be495c)) +- Add Media_Manager DeviceType ([2b612c7](https://github.com/nrkno/tv-automation-server-core/commit/2b612c7)) +- add methods for insert/remove blueprints ([8acb72b](https://github.com/nrkno/tv-automation-server-core/commit/8acb72b)) +- Add OSC Playout device type ([bf426b5](https://github.com/nrkno/tv-automation-server-core/commit/bf426b5)) +- add snapshot restore statistics to logging ([45115f3](https://github.com/nrkno/tv-automation-server-core/commit/45115f3)) +- add studioInstallation.settings, mediaPreviewsUrl and sofieUrl, to replace configs ([adc6cb5](https://github.com/nrkno/tv-automation-server-core/commit/adc6cb5)) +- Add version string field to blueprint collection ([869dd02](https://github.com/nrkno/tv-automation-server-core/commit/869dd02)) +- allow reconnection action on click ([3575f4f](https://github.com/nrkno/tv-automation-server-core/commit/3575f4f)) +- Allow to specify blueprint name in request query string ([e8c2dc9](https://github.com/nrkno/tv-automation-server-core/commit/e8c2dc9)) +- be able to remove stored snapshots ([849f906](https://github.com/nrkno/tv-automation-server-core/commit/849f906)) +- better return type from post-process ([a971b43](https://github.com/nrkno/tv-automation-server-core/commit/a971b43)) +- BIG refactoring of Core ([9d6ae9e](https://github.com/nrkno/tv-automation-server-core/commit/9d6ae9e)) +- blueprint migration implementation (it works now) ([15250b2](https://github.com/nrkno/tv-automation-server-core/commit/15250b2)) +- blueprint migration, continued implementation ([ff507ab](https://github.com/nrkno/tv-automation-server-core/commit/ff507ab)) +- blueprintMigrations ([9527cae](https://github.com/nrkno/tv-automation-server-core/commit/9527cae)) +- blueprints context: handle notes externally (to ro notes) or internally (to logger) ([63640f2](https://github.com/nrkno/tv-automation-server-core/commit/63640f2)) +- change heavy-light display style ([329e2c6](https://github.com/nrkno/tv-automation-server-core/commit/329e2c6)) +- Changes for blueprints-integration typings ([8d1f37d](https://github.com/nrkno/tv-automation-server-core/commit/8d1f37d)) +- Crude ui to visualise generated timeline ([6e55382](https://github.com/nrkno/tv-automation-server-core/commit/6e55382)) +- don't restore from old snapshots ([bab8bbb](https://github.com/nrkno/tv-automation-server-core/commit/bab8bbb)) +- First draft at uploading a blueprints blob into a new db collection, and running it instead of the existing baseline ([31c56d8](https://github.com/nrkno/tv-automation-server-core/commit/31c56d8)) +- implement (upcoming) blueprint API ([d86faa5](https://github.com/nrkno/tv-automation-server-core/commit/d86faa5)) +- implementation of blueprint migrations ([5fec7a2](https://github.com/nrkno/tv-automation-server-core/commit/5fec7a2)) +- implementation of new blueprint API ([34f905f](https://github.com/nrkno/tv-automation-server-core/commit/34f905f)) +- manipulator methods for inserting & removing showStyleBase & showStyleVariant ([6bb4e00](https://github.com/nrkno/tv-automation-server-core/commit/6bb4e00)) +- more work on notification center ([92196ca](https://github.com/nrkno/tv-automation-server-core/commit/92196ca)) +- more work on notification center ([a34ccd0](https://github.com/nrkno/tv-automation-server-core/commit/a34ccd0)) +- more work on peripheralDevices notifications ([36a0a4b](https://github.com/nrkno/tv-automation-server-core/commit/36a0a4b)) +- more work on peripheralDevices notifications ([692b1b2](https://github.com/nrkno/tv-automation-server-core/commit/692b1b2)) +- Move all device specific TimelineObj types to tsr-types ([55766a5](https://github.com/nrkno/tv-automation-server-core/commit/55766a5)) +- move delete button to peripheralDevice page ([46647c1](https://github.com/nrkno/tv-automation-server-core/commit/46647c1)) +- Move Mapping types to tsr-types package ([67bd838](https://github.com/nrkno/tv-automation-server-core/commit/67bd838)) +- Move types to blueprint-integration ([c305061](https://github.com/nrkno/tv-automation-server-core/commit/c305061)) +- multiSelect component for selecting compatible Show Styles ([e1a5c35](https://github.com/nrkno/tv-automation-server-core/commit/e1a5c35)) +- Refactor blueprint contexts so be different per type to limit exposed api ([f0d1c7c](https://github.com/nrkno/tv-automation-server-core/commit/f0d1c7c)) +- Refactor external message template code ([21ac50e](https://github.com/nrkno/tv-automation-server-core/commit/21ac50e)) +- Refactor story template code to use new blueprint structure ([104982b](https://github.com/nrkno/tv-automation-server-core/commit/104982b)) +- Reference blueprints-integration api file ([dc1cdb8](https://github.com/nrkno/tv-automation-server-core/commit/dc1cdb8)) +- Reference blueprints-integration utils file ([d94c97b](https://github.com/nrkno/tv-automation-server-core/commit/d94c97b)) +- Reference device options in tsr-types ([049b9bc](https://github.com/nrkno/tv-automation-server-core/commit/049b9bc)) +- Remove monaco ([e417548](https://github.com/nrkno/tv-automation-server-core/commit/e417548)) +- show blueprint id in select options in Show Styles, hyphenated show-styles doesn't seem right ([e19802f](https://github.com/nrkno/tv-automation-server-core/commit/e19802f)) +- Simplify RunningOrderBaseItem type ([2b8257b](https://github.com/nrkno/tv-automation-server-core/commit/2b8257b)) +- some work on notification center ([8e2c269](https://github.com/nrkno/tv-automation-server-core/commit/8e2c269)) +- some work on notification center ([58ad599](https://github.com/nrkno/tv-automation-server-core/commit/58ad599)) +- **blueprints:** Add minimum core version to blueprints. Move blueprint restore code to api/blueprints ([2453a16](https://github.com/nrkno/tv-automation-server-core/commit/2453a16)) +- **blueprints:** Add section of studio settings based off a manifest from the blueprints ([4866a79](https://github.com/nrkno/tv-automation-server-core/commit/4866a79)) +- **blueprints:** Expose version string and uploading in the ui ([00875a4](https://github.com/nrkno/tv-automation-server-core/commit/00875a4)) +- **externalMessages:** add hold property, to be able to pause sending of messages ([adc69d8](https://github.com/nrkno/tv-automation-server-core/commit/adc69d8)) +- **health check:** statusMessage implementation ([b01ac48](https://github.com/nrkno/tv-automation-server-core/commit/b01ac48)) +- **migration:** reafactor migrations and add new migration steps ([0966ef6](https://github.com/nrkno/tv-automation-server-core/commit/0966ef6)) +- **migrations:** automatically continue partialMigrations when possible ([f75e907](https://github.com/nrkno/tv-automation-server-core/commit/f75e907)) +- Strip out old runtime functions ([880a885](https://github.com/nrkno/tv-automation-server-core/commit/880a885)) +- **migrations:** Move playout-device migrations to blueprints ([04029d4](https://github.com/nrkno/tv-automation-server-core/commit/04029d4)) +- **notification center:** hot-links to RO note notifications ([f3e9f59](https://github.com/nrkno/tv-automation-server-core/commit/f3e9f59)) +- **notification center:** notification count ([b8fbcac](https://github.com/nrkno/tv-automation-server-core/commit/b8fbcac)) +- **notification center:** squish segments in RO view when NC is open ([36b514f](https://github.com/nrkno/tv-automation-server-core/commit/36b514f)) +- **notification-center:** connection status notifier et al. ([5aefd52](https://github.com/nrkno/tv-automation-server-core/commit/5aefd52)) +- **notification-center:** connection status notifier et al. ([e529e94](https://github.com/nrkno/tv-automation-server-core/commit/e529e94)) +- **notification-center:** move expand notification center to right-hand status bar ([2750fab](https://github.com/nrkno/tv-automation-server-core/commit/2750fab)) +- **notification-center:** move expand notification center to right-hand status bar ([635c09d](https://github.com/nrkno/tv-automation-server-core/commit/635c09d)) +- **notification-center:** NotificationCenterPanel et al. ([c4794c8](https://github.com/nrkno/tv-automation-server-core/commit/c4794c8)) +- **notification-center:** NotificationCenterPanel et al. ([9283909](https://github.com/nrkno/tv-automation-server-core/commit/9283909)) +- **notification-center:** segment warning tweak ([e956488](https://github.com/nrkno/tv-automation-server-core/commit/e956488)) +- **notification-center:** segment warning tweak ([d4fc5e7](https://github.com/nrkno/tv-automation-server-core/commit/d4fc5e7)) +- **notifications-center:** notification center in other pages than ROV ([5250aab](https://github.com/nrkno/tv-automation-server-core/commit/5250aab)) +- **notifications-center:** notification center in other pages than ROV ([0620115](https://github.com/nrkno/tv-automation-server-core/commit/0620115)) +- **playout:** Add object to timeline to indicate whether ro is active or in rehersal ([d0e850d](https://github.com/nrkno/tv-automation-server-core/commit/d0e850d)) +- **rabbit:** initial commit (wip) ([7ed3223](https://github.com/nrkno/tv-automation-server-core/commit/7ed3223)) +- **rabbitmq:** Implementation of RabbitMQ external message queue ([b31e15f](https://github.com/nrkno/tv-automation-server-core/commit/b31e15f)) +- **rabbitmq:** message id ([7ce9e5a](https://github.com/nrkno/tv-automation-server-core/commit/7ce9e5a)) +- **refactor:** move Runtime Arguments for Blueprints from StudioInstallation to ShowStyleBase ([9b2c2d8](https://github.com/nrkno/tv-automation-server-core/commit/9b2c2d8)) +- **snapshot:** implement support for taking snapshot of settings related to a single studio ([d177113](https://github.com/nrkno/tv-automation-server-core/commit/d177113)) +- **timeline:** Remove deviceId field from timeline objects ([85c4b89](https://github.com/nrkno/tv-automation-server-core/commit/85c4b89)) +- Start moving some migrations to blueprints ([9d4949e](https://github.com/nrkno/tv-automation-server-core/commit/9d4949e)) +- Start using types from sofie-blueprints-integration ([6106d99](https://github.com/nrkno/tv-automation-server-core/commit/6106d99)) +- take snapshot when saving evaluation form ([b98d68f](https://github.com/nrkno/tv-automation-server-core/commit/b98d68f)) +- trim config values (strings) ([d41e07e](https://github.com/nrkno/tv-automation-server-core/commit/d41e07e)) +- update blueprint contexts to match new API ([ab6fc5a](https://github.com/nrkno/tv-automation-server-core/commit/ab6fc5a)) +- update type dependencies and type references. Removed dependency of mos-connection and replaced it with references to the blueprints-integration. ([85bd795](https://github.com/nrkno/tv-automation-server-core/commit/85bd795)) +- update types deps & API methods ([7d1a49b](https://github.com/nrkno/tv-automation-server-core/commit/7d1a49b)) +- Update typings for blueprints to be more specific ([53f7281](https://github.com/nrkno/tv-automation-server-core/commit/53f7281)) +- Update typings for message blueprint ([cf13fc9](https://github.com/nrkno/tv-automation-server-core/commit/cf13fc9)) +- updated to match blueprints-integration /develop, started on new message-flow, WIP ([6b84b75](https://github.com/nrkno/tv-automation-server-core/commit/6b84b75)) +- WIP: VERY preliminary implementation of quick and dirty manual playback ([a9ec948](https://github.com/nrkno/tv-automation-server-core/commit/a9ec948)) +- wrap blueprint functions, to emit better errors ([14873f1](https://github.com/nrkno/tv-automation-server-core/commit/14873f1)) +- zoom control buttons ([41c1c92](https://github.com/nrkno/tv-automation-server-core/commit/41c1c92)) + # 0.19.0 (2019-01-11) This version features a big rehaul of the internal data structures of Sofie, Core and the Blueprints. @@ -4816,882 +4818,890 @@ This is a major and Breaking release, extra care is recommended when upgrading f ### Features #### Playout -* Add OSC Playout device type ([bf426b5](https://github.com/nrkno/tv-automation-server-core/commit/bf426b5)) -* externalMessages: add hold property, to be able to pause sending of messages ([adc69d8](https://github.com/nrkno/tv-automation-server-core/commit/adc69d8)) -* playout: Add object to timeline to indicate whether ro is active or in rehersal ([d0e850d](https://github.com/nrkno/tv-automation-server-core/commit/d0e850d)) -* timeline: Remove deviceId field from timeline objects ([85c4b89](https://github.com/nrkno/tv-automation-server-core/commit/85c4b89)) + +- Add OSC Playout device type ([bf426b5](https://github.com/nrkno/tv-automation-server-core/commit/bf426b5)) +- externalMessages: add hold property, to be able to pause sending of messages ([adc69d8](https://github.com/nrkno/tv-automation-server-core/commit/adc69d8)) +- playout: Add object to timeline to indicate whether ro is active or in rehersal ([d0e850d](https://github.com/nrkno/tv-automation-server-core/commit/d0e850d)) +- timeline: Remove deviceId field from timeline objects ([85c4b89](https://github.com/nrkno/tv-automation-server-core/commit/85c4b89)) #### Media management -* Add expected media items collection ([04c15a9](https://github.com/nrkno/tv-automation-server-core/commit/04c15a9)) -* Add Media_Manager DeviceType ([2b612c7](https://github.com/nrkno/tv-automation-server-core/commit/2b612c7)) + +- Add expected media items collection ([04c15a9](https://github.com/nrkno/tv-automation-server-core/commit/04c15a9)) +- Add Media_Manager DeviceType ([2b612c7](https://github.com/nrkno/tv-automation-server-core/commit/2b612c7)) #### Snapshot Backup/Restore -* add snapshot restore statistics to logging ([45115f3](https://github.com/nrkno/tv-automation-server-core/commit/45115f3)) -* be able to remove stored snapshots ([849f906](https://github.com/nrkno/tv-automation-server-core/commit/849f906)) -* don't restore from old snapshots ([bab8bbb](https://github.com/nrkno/tv-automation-server-core/commit/bab8bbb)) -* take snapshot when saving evaluation form ([b98d68f](https://github.com/nrkno/tv-automation-server-core/commit/b98d68f)) -* snapshot: implement support for taking snapshot of settings related to a single studio ([d177113](https://github.com/nrkno/tv-automation-server-core/commit/d177113)) -* snapshot: SegmentLines were not being included in the snapshot ([224f806](https://github.com/nrkno/tv-automation-server-core/commit/224f806)) -* removed snapshots from status pages ([a54639a](https://github.com/nrkno/tv-automation-server-core/commit/a54639a)) + +- add snapshot restore statistics to logging ([45115f3](https://github.com/nrkno/tv-automation-server-core/commit/45115f3)) +- be able to remove stored snapshots ([849f906](https://github.com/nrkno/tv-automation-server-core/commit/849f906)) +- don't restore from old snapshots ([bab8bbb](https://github.com/nrkno/tv-automation-server-core/commit/bab8bbb)) +- take snapshot when saving evaluation form ([b98d68f](https://github.com/nrkno/tv-automation-server-core/commit/b98d68f)) +- snapshot: implement support for taking snapshot of settings related to a single studio ([d177113](https://github.com/nrkno/tv-automation-server-core/commit/d177113)) +- snapshot: SegmentLines were not being included in the snapshot ([224f806](https://github.com/nrkno/tv-automation-server-core/commit/224f806)) +- removed snapshots from status pages ([a54639a](https://github.com/nrkno/tv-automation-server-core/commit/a54639a)) #### GUI -* add link to compatible studios from ShowStyle page ([4be495c](https://github.com/nrkno/tv-automation-server-core/commit/4be495c)) -* change heavy-light display style ([329e2c6](https://github.com/nrkno/tv-automation-server-core/commit/329e2c6)) -* Crude ui to visualise generated timeline ([6e55382](https://github.com/nrkno/tv-automation-server-core/commit/6e55382)) -* zoom control buttons ([41c1c92](https://github.com/nrkno/tv-automation-server-core/commit/41c1c92)) + +- add link to compatible studios from ShowStyle page ([4be495c](https://github.com/nrkno/tv-automation-server-core/commit/4be495c)) +- change heavy-light display style ([329e2c6](https://github.com/nrkno/tv-automation-server-core/commit/329e2c6)) +- Crude ui to visualise generated timeline ([6e55382](https://github.com/nrkno/tv-automation-server-core/commit/6e55382)) +- zoom control buttons ([41c1c92](https://github.com/nrkno/tv-automation-server-core/commit/41c1c92)) + #### Notification Center -* more work on notification center ([92196ca](https://github.com/nrkno/tv-automation-server-core/commit/92196ca)) -* more work on notification center ([a34ccd0](https://github.com/nrkno/tv-automation-server-core/commit/a34ccd0)) -* more work on peripheralDevices notifications ([36a0a4b](https://github.com/nrkno/tv-automation-server-core/commit/36a0a4b)) -* more work on peripheralDevices notifications ([692b1b2](https://github.com/nrkno/tv-automation-server-core/commit/692b1b2)) -* some work on notification center ([58ad599](https://github.com/nrkno/tv-automation-server-core/commit/58ad599)) -* some work on notification center ([8e2c269](https://github.com/nrkno/tv-automation-server-core/commit/8e2c269)) -* hot-links to RO note notifications ([f3e9f59](https://github.com/nrkno/tv-automation-server-core/commit/f3e9f59)) -* notification count ([b8fbcac](https://github.com/nrkno/tv-automation-server-core/commit/b8fbcac)) -* squish segments in RO view when NC is open ([36b514f](https://github.com/nrkno/tv-automation-server-core/commit/36b514f)) -* connection status notifier et al. ([5aefd52](https://github.com/nrkno/tv-automation-server-core/commit/5aefd52)) -* connection status notifier et al. ([e529e94](https://github.com/nrkno/tv-automation-server-core/commit/e529e94)) -* move expand notification center to right-hand status bar ([2750fab](https://github.com/nrkno/tv-automation-server-core/commit/2750fab)) -* move expand notification center to right-hand status bar ([635c09d](https://github.com/nrkno/tv-automation-server-core/commit/635c09d)) -* NotificationCenterPanel et al. ([9283909](https://github.com/nrkno/tv-automation-server-core/commit/9283909)) -* NotificationCenterPanel et al. ([c4794c8](https://github.com/nrkno/tv-automation-server-core/commit/c4794c8)) -* segment warning tweak ([d4fc5e7](https://github.com/nrkno/tv-automation-server-core/commit/d4fc5e7)) -* segment warning tweak ([e956488](https://github.com/nrkno/tv-automation-server-core/commit/e956488)) -* notification center in other pages than ROV ([0620115](https://github.com/nrkno/tv-automation-server-core/commit/0620115)) -* notification center in other pages than ROV ([5250aab](https://github.com/nrkno/tv-automation-server-core/commit/5250aab)) -* do not display notification count if = 0 ([1fe9a39](https://github.com/nrkno/tv-automation-server-core/commit/1fe9a39)) -* fix notification center toggle button in RO view ([894c1e2](https://github.com/nrkno/tv-automation-server-core/commit/894c1e2)) -* fix running order overview to line up with the Segments column ([0906cab](https://github.com/nrkno/tv-automation-server-core/commit/0906cab)) -* notification count position ([1d8d2cb](https://github.com/nrkno/tv-automation-server-core/commit/1d8d2cb)) -* reintroduce RunningOrderNotifier into RunningOrderView ([e70e5c9](https://github.com/nrkno/tv-automation-server-core/commit/e70e5c9)) -* F11 label instead of a button-like marker ([048ed2b](https://github.com/nrkno/tv-automation-server-core/commit/048ed2b)) -* Merge branch 'feature/notifications-center' of github.com:nrkno/tv-automation-server-core into featu ([c14dda3](https://github.com/nrkno/tv-automation-server-core/commit/c14dda3)) + +- more work on notification center ([92196ca](https://github.com/nrkno/tv-automation-server-core/commit/92196ca)) +- more work on notification center ([a34ccd0](https://github.com/nrkno/tv-automation-server-core/commit/a34ccd0)) +- more work on peripheralDevices notifications ([36a0a4b](https://github.com/nrkno/tv-automation-server-core/commit/36a0a4b)) +- more work on peripheralDevices notifications ([692b1b2](https://github.com/nrkno/tv-automation-server-core/commit/692b1b2)) +- some work on notification center ([58ad599](https://github.com/nrkno/tv-automation-server-core/commit/58ad599)) +- some work on notification center ([8e2c269](https://github.com/nrkno/tv-automation-server-core/commit/8e2c269)) +- hot-links to RO note notifications ([f3e9f59](https://github.com/nrkno/tv-automation-server-core/commit/f3e9f59)) +- notification count ([b8fbcac](https://github.com/nrkno/tv-automation-server-core/commit/b8fbcac)) +- squish segments in RO view when NC is open ([36b514f](https://github.com/nrkno/tv-automation-server-core/commit/36b514f)) +- connection status notifier et al. ([5aefd52](https://github.com/nrkno/tv-automation-server-core/commit/5aefd52)) +- connection status notifier et al. ([e529e94](https://github.com/nrkno/tv-automation-server-core/commit/e529e94)) +- move expand notification center to right-hand status bar ([2750fab](https://github.com/nrkno/tv-automation-server-core/commit/2750fab)) +- move expand notification center to right-hand status bar ([635c09d](https://github.com/nrkno/tv-automation-server-core/commit/635c09d)) +- NotificationCenterPanel et al. ([9283909](https://github.com/nrkno/tv-automation-server-core/commit/9283909)) +- NotificationCenterPanel et al. ([c4794c8](https://github.com/nrkno/tv-automation-server-core/commit/c4794c8)) +- segment warning tweak ([d4fc5e7](https://github.com/nrkno/tv-automation-server-core/commit/d4fc5e7)) +- segment warning tweak ([e956488](https://github.com/nrkno/tv-automation-server-core/commit/e956488)) +- notification center in other pages than ROV ([0620115](https://github.com/nrkno/tv-automation-server-core/commit/0620115)) +- notification center in other pages than ROV ([5250aab](https://github.com/nrkno/tv-automation-server-core/commit/5250aab)) +- do not display notification count if = 0 ([1fe9a39](https://github.com/nrkno/tv-automation-server-core/commit/1fe9a39)) +- fix notification center toggle button in RO view ([894c1e2](https://github.com/nrkno/tv-automation-server-core/commit/894c1e2)) +- fix running order overview to line up with the Segments column ([0906cab](https://github.com/nrkno/tv-automation-server-core/commit/0906cab)) +- notification count position ([1d8d2cb](https://github.com/nrkno/tv-automation-server-core/commit/1d8d2cb)) +- reintroduce RunningOrderNotifier into RunningOrderView ([e70e5c9](https://github.com/nrkno/tv-automation-server-core/commit/e70e5c9)) +- F11 label instead of a button-like marker ([048ed2b](https://github.com/nrkno/tv-automation-server-core/commit/048ed2b)) +- Merge branch 'feature/notifications-center' of github.com:nrkno/tv-automation-server-core into featu ([c14dda3](https://github.com/nrkno/tv-automation-server-core/commit/c14dda3)) #### Changes in datastructures (The BIG refactoring) -* BIG refactoring of Core ([9d6ae9e](https://github.com/nrkno/tv-automation-server-core/commit/9d6ae9e)) -* add studioInstallation.settings, mediaPreviewsUrl and sofieUrl, to replace configs ([adc6cb5](https://github.com/nrkno/tv-automation-server-core/commit/adc6cb5)) -* manipulator methods for inserting & removing showStyleBase & showStyleVariant ([6bb4e00](https://github.com/nrkno/tv-automation-server-core/commit/6bb4e00)) -* Move all device specific TimelineObj types to tsr-types ([55766a5](https://github.com/nrkno/tv-automation-server-core/commit/55766a5)) -* Move Mapping types to tsr-types package ([67bd838](https://github.com/nrkno/tv-automation-server-core/commit/67bd838)) -* Reference device options in tsr-types ([049b9bc](https://github.com/nrkno/tv-automation-server-core/commit/049b9bc)) -* chore: update tsr-types and blueprints-integration ([e09bf75](https://github.com/nrkno/tv-automation-server-core/commit/e09bf75)) -* Refactor external message template code ([21ac50e](https://github.com/nrkno/tv-automation-server-core/commit/21ac50e)) -* Simplify RunningOrderBaseItem type ([2b8257b](https://github.com/nrkno/tv-automation-server-core/commit/2b8257b)) -* multiSelect component for selecting compatible Show Styles ([e1a5c35](https://github.com/nrkno/tv-automation-server-core/commit/e1a5c35)) -* update type dependencies and type references. Removed dependency of mos-connection and replace ([85bd795](https://github.com/nrkno/tv-automation-server-core/commit/85bd795)) -* update types deps & API methods ([7d1a49b](https://github.com/nrkno/tv-automation-server-core/commit/7d1a49b)) -* migration: refactor migrations and add new migration steps ([0966ef6](https://github.com/nrkno/tv-automation-server-core/commit/0966ef6)) -* refactor: move Runtime Arguments for Blueprints from StudioInstallation to ShowStyleBase ([9b2c2d8](https://github.com/nrkno/tv-automation-server-core/commit/9b2c2d8)) + +- BIG refactoring of Core ([9d6ae9e](https://github.com/nrkno/tv-automation-server-core/commit/9d6ae9e)) +- add studioInstallation.settings, mediaPreviewsUrl and sofieUrl, to replace configs ([adc6cb5](https://github.com/nrkno/tv-automation-server-core/commit/adc6cb5)) +- manipulator methods for inserting & removing showStyleBase & showStyleVariant ([6bb4e00](https://github.com/nrkno/tv-automation-server-core/commit/6bb4e00)) +- Move all device specific TimelineObj types to tsr-types ([55766a5](https://github.com/nrkno/tv-automation-server-core/commit/55766a5)) +- Move Mapping types to tsr-types package ([67bd838](https://github.com/nrkno/tv-automation-server-core/commit/67bd838)) +- Reference device options in tsr-types ([049b9bc](https://github.com/nrkno/tv-automation-server-core/commit/049b9bc)) +- chore: update tsr-types and blueprints-integration ([e09bf75](https://github.com/nrkno/tv-automation-server-core/commit/e09bf75)) +- Refactor external message template code ([21ac50e](https://github.com/nrkno/tv-automation-server-core/commit/21ac50e)) +- Simplify RunningOrderBaseItem type ([2b8257b](https://github.com/nrkno/tv-automation-server-core/commit/2b8257b)) +- multiSelect component for selecting compatible Show Styles ([e1a5c35](https://github.com/nrkno/tv-automation-server-core/commit/e1a5c35)) +- update type dependencies and type references. Removed dependency of mos-connection and replace ([85bd795](https://github.com/nrkno/tv-automation-server-core/commit/85bd795)) +- update types deps & API methods ([7d1a49b](https://github.com/nrkno/tv-automation-server-core/commit/7d1a49b)) +- migration: refactor migrations and add new migration steps ([0966ef6](https://github.com/nrkno/tv-automation-server-core/commit/0966ef6)) +- refactor: move Runtime Arguments for Blueprints from StudioInstallation to ShowStyleBase ([9b2c2d8](https://github.com/nrkno/tv-automation-server-core/commit/9b2c2d8)) #### RabbitMQ integration -* rabbit: initial commit (wip) ([7ed3223](https://github.com/nrkno/tv-automation-server-core/commit/7ed3223)) -* rabbitmq: Implementation of RabbitMQ external message queue ([b31e15f](https://github.com/nrkno/tv-automation-server-core/commit/b31e15f)) -* rabbitmq: message id ([7ce9e5a](https://github.com/nrkno/tv-automation-server-core/commit/7ce9e5a)) -* Merge remote-tracking branch 'origin/feature/rabbit' into feature/refactor-migrations-to-blueprints ([c64b465](https://github.com/nrkno/tv-automation-server-core/commit/c64b465)) -* Merge remote-tracking branch 'origin/feature/refactor-migrations-to-blueprints' into feature/rabbit ([6b17ca4](https://github.com/nrkno/tv-automation-server-core/commit/6b17ca4)) -* rabbitmq: send persistant messages ([ff8d375](https://github.com/nrkno/tv-automation-server-core/commit/ff8d375)) + +- rabbit: initial commit (wip) ([7ed3223](https://github.com/nrkno/tv-automation-server-core/commit/7ed3223)) +- rabbitmq: Implementation of RabbitMQ external message queue ([b31e15f](https://github.com/nrkno/tv-automation-server-core/commit/b31e15f)) +- rabbitmq: message id ([7ce9e5a](https://github.com/nrkno/tv-automation-server-core/commit/7ce9e5a)) +- Merge remote-tracking branch 'origin/feature/rabbit' into feature/refactor-migrations-to-blueprints ([c64b465](https://github.com/nrkno/tv-automation-server-core/commit/c64b465)) +- Merge remote-tracking branch 'origin/feature/refactor-migrations-to-blueprints' into feature/rabbit ([6b17ca4](https://github.com/nrkno/tv-automation-server-core/commit/6b17ca4)) +- rabbitmq: send persistant messages ([ff8d375](https://github.com/nrkno/tv-automation-server-core/commit/ff8d375)) #### Other -* trim config values (strings) ([d41e07e](https://github.com/nrkno/tv-automation-server-core/commit/d41e07e)) -* WIP: VERY preliminary implementation of quick and dirty manual playback ([a9ec948](https://github.com/nrkno/tv-automation-server-core/commit/a9ec948)) +- trim config values (strings) ([d41e07e](https://github.com/nrkno/tv-automation-server-core/commit/d41e07e)) +- WIP: VERY preliminary implementation of quick and dirty manual playback ([a9ec948](https://github.com/nrkno/tv-automation-server-core/commit/a9ec948)) #### Blueprints V2 -* Strip out old runtime functions ([880a885](https://github.com/nrkno/tv-automation-server-core/commit/880a885)) -* Remove monaco ([e417548](https://github.com/nrkno/tv-automation-server-core/commit/e417548)) -* add methods for insert/remove blueprints ([8acb72b](https://github.com/nrkno/tv-automation-server-core/commit/8acb72b)) -* Add version string field to blueprint collection ([869dd02](https://github.com/nrkno/tv-automation-server-core/commit/869dd02)) -* Allow to specify blueprint name in request query string ([e8c2dc9](https://github.com/nrkno/tv-automation-server-core/commit/e8c2dc9)) -* blueprint migration implementation (it works now) ([15250b2](https://github.com/nrkno/tv-automation-server-core/commit/15250b2)) -* blueprint migration, continued implementation ([ff507ab](https://github.com/nrkno/tv-automation-server-core/commit/ff507ab)) -* blueprintMigrations ([9527cae](https://github.com/nrkno/tv-automation-server-core/commit/9527cae)) -* blueprints context: handle notes externally (to ro notes) or internally (to logger) ([63640f2](https://github.com/nrkno/tv-automation-server-core/commit/63640f2)) -* Changes for blueprints-integration typings ([8d1f37d](https://github.com/nrkno/tv-automation-server-core/commit/8d1f37d)) -* First draft at uploading a blueprints blob into a new db collection, and running it instead of ([31c56d8](https://github.com/nrkno/tv-automation-server-core/commit/31c56d8)) -* implement (upcoming) blueprint API ([d86faa5](https://github.com/nrkno/tv-automation-server-core/commit/d86faa5)) -* implementation of blueprint migrations ([5fec7a2](https://github.com/nrkno/tv-automation-server-core/commit/5fec7a2)) -* implementation of new blueprint API ([34f905f](https://github.com/nrkno/tv-automation-server-core/commit/34f905f)) -* Move types to blueprint-integration ([c305061](https://github.com/nrkno/tv-automation-server-core/commit/c305061)) -* Refactor blueprint contexts so be different per type to limit exposed api ([f0d1c7c](https://github.com/nrkno/tv-automation-server-core/commit/f0d1c7c)) -* Refactor story template code to use new blueprint structure ([104982b](https://github.com/nrkno/tv-automation-server-core/commit/104982b)) -* Reference blueprints-integration api file ([dc1cdb8](https://github.com/nrkno/tv-automation-server-core/commit/dc1cdb8)) -* Reference blueprints-integration utils file ([d94c97b](https://github.com/nrkno/tv-automation-server-core/commit/d94c97b)) -* show blueprint id in select options in Show Styles, hyphenated show-styles doesn't seem right ([e19802f](https://github.com/nrkno/tv-automation-server-core/commit/e19802f)) -* Start moving some migrations to blueprints ([9d4949e](https://github.com/nrkno/tv-automation-server-core/commit/9d4949e)) -* Start using types from sofie-blueprints-integration ([6106d99](https://github.com/nrkno/tv-automation-server-core/commit/6106d99)) -* update blueprint contexts to match new API ([ab6fc5a](https://github.com/nrkno/tv-automation-server-core/commit/ab6fc5a)) -* Update typings for blueprints to be more specific ([53f7281](https://github.com/nrkno/tv-automation-server-core/commit/53f7281)) -* Update typings for message blueprint ([cf13fc9](https://github.com/nrkno/tv-automation-server-core/commit/cf13fc9)) -* updated to match blueprints-integration /develop, started on new message-flow, WIP ([6b84b75](https://github.com/nrkno/tv-automation-server-core/commit/6b84b75)) -* wrap blueprint functions, to emit better errors ([14873f1](https://github.com/nrkno/tv-automation-server-core/commit/14873f1)) -* blueprints: Add minimum core version to blueprints. Move blueprint restore code to api/bluepri ([2453a16](https://github.com/nrkno/tv-automation-server-core/commit/2453a16)) -* blueprints: Add section of studio settings based off a manifest from the blueprints ([4866a79](https://github.com/nrkno/tv-automation-server-core/commit/4866a79)) -* blueprints: Expose version string and uploading in the ui ([00875a4](https://github.com/nrkno/tv-automation-server-core/commit/00875a4)) -* migrations: Move playout-device migrations to blueprints ([04029d4](https://github.com/nrkno/tv-automation-server-core/commit/04029d4)) -* blueprint config from manifest is reenabled and used for show style base and variant ([59b2f2f](https://github.com/nrkno/tv-automation-server-core/commit/59b2f2f)) -* blueprint settings page ([5697afe](https://github.com/nrkno/tv-automation-server-core/commit/5697afe)) -* GUI: unexpected behaviour in blueprint configuration ([f5bed4e](https://github.com/nrkno/tv-automation-server-core/commit/f5bed4e)) -* Pass SofieHostURL to blueprints config ([8c18821](https://github.com/nrkno/tv-automation-server-core/commit/8c18821)) -* restore blueprint settings page ([faa7fdd](https://github.com/nrkno/tv-automation-server-core/commit/faa7fdd)) -* running blueprint migrations ([fe1e7fd](https://github.com/nrkno/tv-automation-server-core/commit/fe1e7fd)) -* Running blueprints and migrations ([3b29df3](https://github.com/nrkno/tv-automation-server-core/commit/3b29df3)) -* update blueprints-integration ([28d17c2](https://github.com/nrkno/tv-automation-server-core/commit/28d17c2)) -* update typings to match blueprints-integration ([f97f177](https://github.com/nrkno/tv-automation-server-core/commit/f97f177)) -* blueprint: Fill in missing TimelineObj fields ([0ed7663](https://github.com/nrkno/tv-automation-server-core/commit/0ed7663)) -* blueprint: fix manifest config add item showing an 'undefined' option ([fa6182a](https://github.com/nrkno/tv-automation-server-core/commit/fa6182a)) -* blueprint: Remove invalid backup restore code ([2e00eca](https://github.com/nrkno/tv-automation-server-core/commit/2e00eca)) -* blueprints: Ensure ids are not duplicated ([fbd0a04](https://github.com/nrkno/tv-automation-server-core/commit/fbd0a04)) -* add input checks in blueprint API ([95b1681](https://github.com/nrkno/tv-automation-server-core/commit/95b1681)) -* fix tv-automation-sofie-blueprints-integration imports ([587587e](https://github.com/nrkno/tv-automation-server-core/commit/587587e)) -* rename template to blueprint ([b082e08](https://github.com/nrkno/tv-automation-server-core/commit/b082e08)) -* rename templates file to blueprints ([edf5b1e](https://github.com/nrkno/tv-automation-server-core/commit/edf5b1e)) -* Tidying imports of blueprints-integration ([01e9794](https://github.com/nrkno/tv-automation-server-core/commit/01e9794)) -* Update blueprints-integration and supertimeline ([3943852](https://github.com/nrkno/tv-automation-server-core/commit/3943852)) -* update blueprints-integration dependency ([0cc76e8](https://github.com/nrkno/tv-automation-server-core/commit/0cc76e8)) -* update blueprints-integration dependency ([cb33762](https://github.com/nrkno/tv-automation-server-core/commit/cb33762)) -* better return type from post-process ([a971b43](https://github.com/nrkno/tv-automation-server-core/commit/a971b43)) -#### Build/CI -* added buildkit cache to docker build ([1de85b8](https://github.com/nrkno/tv-automation-server-core/commit/1de85b8)) -* fixing Jenkins naming bug ([c83b11a](https://github.com/nrkno/tv-automation-server-core/commit/c83b11a)) +- Strip out old runtime functions ([880a885](https://github.com/nrkno/tv-automation-server-core/commit/880a885)) +- Remove monaco ([e417548](https://github.com/nrkno/tv-automation-server-core/commit/e417548)) +- add methods for insert/remove blueprints ([8acb72b](https://github.com/nrkno/tv-automation-server-core/commit/8acb72b)) +- Add version string field to blueprint collection ([869dd02](https://github.com/nrkno/tv-automation-server-core/commit/869dd02)) +- Allow to specify blueprint name in request query string ([e8c2dc9](https://github.com/nrkno/tv-automation-server-core/commit/e8c2dc9)) +- blueprint migration implementation (it works now) ([15250b2](https://github.com/nrkno/tv-automation-server-core/commit/15250b2)) +- blueprint migration, continued implementation ([ff507ab](https://github.com/nrkno/tv-automation-server-core/commit/ff507ab)) +- blueprintMigrations ([9527cae](https://github.com/nrkno/tv-automation-server-core/commit/9527cae)) +- blueprints context: handle notes externally (to ro notes) or internally (to logger) ([63640f2](https://github.com/nrkno/tv-automation-server-core/commit/63640f2)) +- Changes for blueprints-integration typings ([8d1f37d](https://github.com/nrkno/tv-automation-server-core/commit/8d1f37d)) +- First draft at uploading a blueprints blob into a new db collection, and running it instead of ([31c56d8](https://github.com/nrkno/tv-automation-server-core/commit/31c56d8)) +- implement (upcoming) blueprint API ([d86faa5](https://github.com/nrkno/tv-automation-server-core/commit/d86faa5)) +- implementation of blueprint migrations ([5fec7a2](https://github.com/nrkno/tv-automation-server-core/commit/5fec7a2)) +- implementation of new blueprint API ([34f905f](https://github.com/nrkno/tv-automation-server-core/commit/34f905f)) +- Move types to blueprint-integration ([c305061](https://github.com/nrkno/tv-automation-server-core/commit/c305061)) +- Refactor blueprint contexts so be different per type to limit exposed api ([f0d1c7c](https://github.com/nrkno/tv-automation-server-core/commit/f0d1c7c)) +- Refactor story template code to use new blueprint structure ([104982b](https://github.com/nrkno/tv-automation-server-core/commit/104982b)) +- Reference blueprints-integration api file ([dc1cdb8](https://github.com/nrkno/tv-automation-server-core/commit/dc1cdb8)) +- Reference blueprints-integration utils file ([d94c97b](https://github.com/nrkno/tv-automation-server-core/commit/d94c97b)) +- show blueprint id in select options in Show Styles, hyphenated show-styles doesn't seem right ([e19802f](https://github.com/nrkno/tv-automation-server-core/commit/e19802f)) +- Start moving some migrations to blueprints ([9d4949e](https://github.com/nrkno/tv-automation-server-core/commit/9d4949e)) +- Start using types from sofie-blueprints-integration ([6106d99](https://github.com/nrkno/tv-automation-server-core/commit/6106d99)) +- update blueprint contexts to match new API ([ab6fc5a](https://github.com/nrkno/tv-automation-server-core/commit/ab6fc5a)) +- Update typings for blueprints to be more specific ([53f7281](https://github.com/nrkno/tv-automation-server-core/commit/53f7281)) +- Update typings for message blueprint ([cf13fc9](https://github.com/nrkno/tv-automation-server-core/commit/cf13fc9)) +- updated to match blueprints-integration /develop, started on new message-flow, WIP ([6b84b75](https://github.com/nrkno/tv-automation-server-core/commit/6b84b75)) +- wrap blueprint functions, to emit better errors ([14873f1](https://github.com/nrkno/tv-automation-server-core/commit/14873f1)) +- blueprints: Add minimum core version to blueprints. Move blueprint restore code to api/bluepri ([2453a16](https://github.com/nrkno/tv-automation-server-core/commit/2453a16)) +- blueprints: Add section of studio settings based off a manifest from the blueprints ([4866a79](https://github.com/nrkno/tv-automation-server-core/commit/4866a79)) +- blueprints: Expose version string and uploading in the ui ([00875a4](https://github.com/nrkno/tv-automation-server-core/commit/00875a4)) +- migrations: Move playout-device migrations to blueprints ([04029d4](https://github.com/nrkno/tv-automation-server-core/commit/04029d4)) +- blueprint config from manifest is reenabled and used for show style base and variant ([59b2f2f](https://github.com/nrkno/tv-automation-server-core/commit/59b2f2f)) +- blueprint settings page ([5697afe](https://github.com/nrkno/tv-automation-server-core/commit/5697afe)) +- GUI: unexpected behaviour in blueprint configuration ([f5bed4e](https://github.com/nrkno/tv-automation-server-core/commit/f5bed4e)) +- Pass SofieHostURL to blueprints config ([8c18821](https://github.com/nrkno/tv-automation-server-core/commit/8c18821)) +- restore blueprint settings page ([faa7fdd](https://github.com/nrkno/tv-automation-server-core/commit/faa7fdd)) +- running blueprint migrations ([fe1e7fd](https://github.com/nrkno/tv-automation-server-core/commit/fe1e7fd)) +- Running blueprints and migrations ([3b29df3](https://github.com/nrkno/tv-automation-server-core/commit/3b29df3)) +- update blueprints-integration ([28d17c2](https://github.com/nrkno/tv-automation-server-core/commit/28d17c2)) +- update typings to match blueprints-integration ([f97f177](https://github.com/nrkno/tv-automation-server-core/commit/f97f177)) +- blueprint: Fill in missing TimelineObj fields ([0ed7663](https://github.com/nrkno/tv-automation-server-core/commit/0ed7663)) +- blueprint: fix manifest config add item showing an 'undefined' option ([fa6182a](https://github.com/nrkno/tv-automation-server-core/commit/fa6182a)) +- blueprint: Remove invalid backup restore code ([2e00eca](https://github.com/nrkno/tv-automation-server-core/commit/2e00eca)) +- blueprints: Ensure ids are not duplicated ([fbd0a04](https://github.com/nrkno/tv-automation-server-core/commit/fbd0a04)) +- add input checks in blueprint API ([95b1681](https://github.com/nrkno/tv-automation-server-core/commit/95b1681)) +- fix tv-automation-sofie-blueprints-integration imports ([587587e](https://github.com/nrkno/tv-automation-server-core/commit/587587e)) +- rename template to blueprint ([b082e08](https://github.com/nrkno/tv-automation-server-core/commit/b082e08)) +- rename templates file to blueprints ([edf5b1e](https://github.com/nrkno/tv-automation-server-core/commit/edf5b1e)) +- Tidying imports of blueprints-integration ([01e9794](https://github.com/nrkno/tv-automation-server-core/commit/01e9794)) +- Update blueprints-integration and supertimeline ([3943852](https://github.com/nrkno/tv-automation-server-core/commit/3943852)) +- update blueprints-integration dependency ([0cc76e8](https://github.com/nrkno/tv-automation-server-core/commit/0cc76e8)) +- update blueprints-integration dependency ([cb33762](https://github.com/nrkno/tv-automation-server-core/commit/cb33762)) +- better return type from post-process ([a971b43](https://github.com/nrkno/tv-automation-server-core/commit/a971b43)) -### Bug Fixes +#### Build/CI -* accepted resolutions should not be separated by space. ([1b80a2c](https://github.com/nrkno/tv-automation-server-core/commit/1b80a2c)) -* add (preliminary) security rules for all collections ([6fd60e2](https://github.com/nrkno/tv-automation-server-core/commit/6fd60e2)) -* add dependency: timeline-state-resolver-types ([cd2db55](https://github.com/nrkno/tv-automation-server-core/commit/cd2db55)) -* add missing asRunEvent in AsRunEventContext ([b8def27](https://github.com/nrkno/tv-automation-server-core/commit/b8def27)) -* add missing function ([de2b81f](https://github.com/nrkno/tv-automation-server-core/commit/de2b81f)) -* Basic rundown playback ([3b88d2a](https://github.com/nrkno/tv-automation-server-core/commit/3b88d2a)) -* build errors ([34889b9](https://github.com/nrkno/tv-automation-server-core/commit/34889b9)) -* build errors ([81382f7](https://github.com/nrkno/tv-automation-server-core/commit/81382f7)) -* clean up imports in ROV ([58067a6](https://github.com/nrkno/tv-automation-server-core/commit/58067a6)) -* Correct some TimelineObj typings ([eb36ef9](https://github.com/nrkno/tv-automation-server-core/commit/eb36ef9)) - -* don't update device name if already got one ([833196a](https://github.com/nrkno/tv-automation-server-core/commit/833196a)) -* Dont show unset optional config in the config list ([5689865](https://github.com/nrkno/tv-automation-server-core/commit/5689865)) -* externalMessageQueue id ([5c8c39d](https://github.com/nrkno/tv-automation-server-core/commit/5c8c39d)) -* failing on startup if dp property missing ([041fc3e](https://github.com/nrkno/tv-automation-server-core/commit/041fc3e)) -* fix more typings and add some null checks in unusual places ([d0c53c3](https://github.com/nrkno/tv-automation-server-core/commit/d0c53c3)) -* fix typings to match with the stronger typings ([ae1bd4f](https://github.com/nrkno/tv-automation-server-core/commit/ae1bd4f)) -* GUI: new try on rewinding the viewport on RO reset ([b0edaf4](https://github.com/nrkno/tv-automation-server-core/commit/b0edaf4)) -* Hide child devices from being added to the studio ([852ec9b](https://github.com/nrkno/tv-automation-server-core/commit/852ec9b)) -* Importing of some mock running orders ([eadf225](https://github.com/nrkno/tv-automation-server-core/commit/eadf225)) -* improve some error logging ([60af59b](https://github.com/nrkno/tv-automation-server-core/commit/60af59b)) -* JSX props typings fix in Header ([7596557](https://github.com/nrkno/tv-automation-server-core/commit/7596557)) -* keep device header in Mos parent properties settings ([2f2529d](https://github.com/nrkno/tv-automation-server-core/commit/2f2529d)) -* keep device header in Mos parent properties settings ([4ff9b91](https://github.com/nrkno/tv-automation-server-core/commit/4ff9b91)) -* Keep the devices header visible when editing device ([90dbe05](https://github.com/nrkno/tv-automation-server-core/commit/90dbe05)) -* Keep the devices header visible when editing device ([cb2d7d9](https://github.com/nrkno/tv-automation-server-core/commit/cb2d7d9)) -* make 'Lights' source layer type translatable in the Settings ([65d5b76](https://github.com/nrkno/tv-automation-server-core/commit/65d5b76)) -* make the FullScreen detection more lenient ([28b689a](https://github.com/nrkno/tv-automation-server-core/commit/28b689a)) -* Migration for stk&full audio remapping ([2491f52](https://github.com/nrkno/tv-automation-server-core/commit/2491f52)) -* migration helpers ([40228e8](https://github.com/nrkno/tv-automation-server-core/commit/40228e8)) -* Migrations internal server error ([45d0238](https://github.com/nrkno/tv-automation-server-core/commit/45d0238)) -* note type got lost ([863e49d](https://github.com/nrkno/tv-automation-server-core/commit/863e49d)) -* playout ([969e316](https://github.com/nrkno/tv-automation-server-core/commit/969e316)) -* remove config didn't work ([893717e](https://github.com/nrkno/tv-automation-server-core/commit/893717e)) -* rename restoreBackups page to Snapshots ([0c5103f](https://github.com/nrkno/tv-automation-server-core/commit/0c5103f)) -* resolve issue with hit-area of Notification Center ([1618619](https://github.com/nrkno/tv-automation-server-core/commit/1618619)) -* restore running order 'backup' fails if doesnt already exist ([87b3300](https://github.com/nrkno/tv-automation-server-core/commit/87b3300)) -* reversed logic during refactoring by mistake ([694191e](https://github.com/nrkno/tv-automation-server-core/commit/694191e)) -* rewind UI even if reset returns error ([3bd5417](https://github.com/nrkno/tv-automation-server-core/commit/3bd5417)) -* running order closing prompt ([3024543](https://github.com/nrkno/tv-automation-server-core/commit/3024543)) -* show ShowStyleBase name as a part of the ShowStyleVariant name in Studios ([ba67011](https://github.com/nrkno/tv-automation-server-core/commit/ba67011)) -* systemStatus _internal messages ([05fd6c8](https://github.com/nrkno/tv-automation-server-core/commit/05fd6c8)) -* systemStatus messages ([17420cc](https://github.com/nrkno/tv-automation-server-core/commit/17420cc)) -* Tooltip import ([cd2b65a](https://github.com/nrkno/tv-automation-server-core/commit/cd2b65a)) -* type error, ensure string ([76da25d](https://github.com/nrkno/tv-automation-server-core/commit/76da25d)) -* typings error, ensuring string ([1e25345](https://github.com/nrkno/tv-automation-server-core/commit/1e25345)) -* UI crash when outputLayer is undefined ([e6dd558](https://github.com/nrkno/tv-automation-server-core/commit/e6dd558)) -* UI: improve shapshot comment edit field ([093e6cb](https://github.com/nrkno/tv-automation-server-core/commit/093e6cb)) -* updated health endpoint according to spec ([900728b](https://github.com/nrkno/tv-automation-server-core/commit/900728b)) -* Use more consistent inputs in Blueprints page ([d223d11](https://github.com/nrkno/tv-automation-server-core/commit/d223d11)) -* Use new mediaPreviewsUrl setting ([1bd0ba4](https://github.com/nrkno/tv-automation-server-core/commit/1bd0ba4)) -* use studioInstallationId of parent peripheralDevice ([7dedf9b](https://github.com/nrkno/tv-automation-server-core/commit/7dedf9b)) -* various fixes after refactoring ([1a17414](https://github.com/nrkno/tv-automation-server-core/commit/1a17414)) -* asRunLog: wrong id, typo ([636fc41](https://github.com/nrkno/tv-automation-server-core/commit/636fc41)) -* hold: Disable transition when leaving HOLD ([809dd34](https://github.com/nrkno/tv-automation-server-core/commit/809dd34)) -* hold: Disable transition when leaving or leaving HOLD ([ef5cbcb](https://github.com/nrkno/tv-automation-server-core/commit/ef5cbcb)) -* hold: Ensure the original stk does not get picked up as a dynamic object when setting the sl as ([225304d](https://github.com/nrkno/tv-automation-server-core/commit/225304d)) -* hold: When extending a sli during hold, use the original id to make any triggers on the sli wor ([669a4b2](https://github.com/nrkno/tv-automation-server-core/commit/669a4b2)) -* migrations: Check migrate function exists before trying to run it ([cf076f5](https://github.com/nrkno/tv-automation-server-core/commit/cf076f5)) -* migrations: Create ShowStyleVariant with ShowStyleBase in the migrations and setup studio to us ([75073d4](https://github.com/nrkno/tv-automation-server-core/commit/75073d4)) -* migrations: Uncomment mos check migration ([c262fff](https://github.com/nrkno/tv-automation-server-core/commit/c262fff)) -* migrations: Various problems when running from empty ([11d1d0b](https://github.com/nrkno/tv-automation-server-core/commit/11d1d0b)) - -* pharos: add missing settingsType and migration step ([be618d2](https://github.com/nrkno/tv-automation-server-core/commit/be618d2)) -* playout: Better account for duration and overlaps with transitions etc. ([dc249a3](https://github.com/nrkno/tv-automation-server-core/commit/dc249a3)) -* playout: Double head2 headline out animation ([165e2c0](https://github.com/nrkno/tv-automation-server-core/commit/165e2c0)) -* playout: Refactor setting object siId ([48de044](https://github.com/nrkno/tv-automation-server-core/commit/48de044)) -* refactor: existing runningOrders were not migrated to the new data structure ([b20bc2d](https://github.com/nrkno/tv-automation-server-core/commit/b20bc2d)) -* refactor: remove stray debugger calls ([3be5c22](https://github.com/nrkno/tv-automation-server-core/commit/3be5c22)) - -* unsync: refactor, add method to unsync runningOrder ([d54c147](https://github.com/nrkno/tv-automation-server-core/commit/d54c147)) +- added buildkit cache to docker build ([1de85b8](https://github.com/nrkno/tv-automation-server-core/commit/1de85b8)) +- fixing Jenkins naming bug ([c83b11a](https://github.com/nrkno/tv-automation-server-core/commit/c83b11a)) +### Bug Fixes +- accepted resolutions should not be separated by space. ([1b80a2c](https://github.com/nrkno/tv-automation-server-core/commit/1b80a2c)) +- add (preliminary) security rules for all collections ([6fd60e2](https://github.com/nrkno/tv-automation-server-core/commit/6fd60e2)) +- add dependency: timeline-state-resolver-types ([cd2db55](https://github.com/nrkno/tv-automation-server-core/commit/cd2db55)) +- add missing asRunEvent in AsRunEventContext ([b8def27](https://github.com/nrkno/tv-automation-server-core/commit/b8def27)) +- add missing function ([de2b81f](https://github.com/nrkno/tv-automation-server-core/commit/de2b81f)) +- Basic rundown playback ([3b88d2a](https://github.com/nrkno/tv-automation-server-core/commit/3b88d2a)) +- build errors ([34889b9](https://github.com/nrkno/tv-automation-server-core/commit/34889b9)) +- build errors ([81382f7](https://github.com/nrkno/tv-automation-server-core/commit/81382f7)) +- clean up imports in ROV ([58067a6](https://github.com/nrkno/tv-automation-server-core/commit/58067a6)) +- Correct some TimelineObj typings ([eb36ef9](https://github.com/nrkno/tv-automation-server-core/commit/eb36ef9)) + +- don't update device name if already got one ([833196a](https://github.com/nrkno/tv-automation-server-core/commit/833196a)) +- Dont show unset optional config in the config list ([5689865](https://github.com/nrkno/tv-automation-server-core/commit/5689865)) +- externalMessageQueue id ([5c8c39d](https://github.com/nrkno/tv-automation-server-core/commit/5c8c39d)) +- failing on startup if dp property missing ([041fc3e](https://github.com/nrkno/tv-automation-server-core/commit/041fc3e)) +- fix more typings and add some null checks in unusual places ([d0c53c3](https://github.com/nrkno/tv-automation-server-core/commit/d0c53c3)) +- fix typings to match with the stronger typings ([ae1bd4f](https://github.com/nrkno/tv-automation-server-core/commit/ae1bd4f)) +- GUI: new try on rewinding the viewport on RO reset ([b0edaf4](https://github.com/nrkno/tv-automation-server-core/commit/b0edaf4)) +- Hide child devices from being added to the studio ([852ec9b](https://github.com/nrkno/tv-automation-server-core/commit/852ec9b)) +- Importing of some mock running orders ([eadf225](https://github.com/nrkno/tv-automation-server-core/commit/eadf225)) +- improve some error logging ([60af59b](https://github.com/nrkno/tv-automation-server-core/commit/60af59b)) +- JSX props typings fix in Header ([7596557](https://github.com/nrkno/tv-automation-server-core/commit/7596557)) +- keep device header in Mos parent properties settings ([2f2529d](https://github.com/nrkno/tv-automation-server-core/commit/2f2529d)) +- keep device header in Mos parent properties settings ([4ff9b91](https://github.com/nrkno/tv-automation-server-core/commit/4ff9b91)) +- Keep the devices header visible when editing device ([90dbe05](https://github.com/nrkno/tv-automation-server-core/commit/90dbe05)) +- Keep the devices header visible when editing device ([cb2d7d9](https://github.com/nrkno/tv-automation-server-core/commit/cb2d7d9)) +- make 'Lights' source layer type translatable in the Settings ([65d5b76](https://github.com/nrkno/tv-automation-server-core/commit/65d5b76)) +- make the FullScreen detection more lenient ([28b689a](https://github.com/nrkno/tv-automation-server-core/commit/28b689a)) +- Migration for stk&full audio remapping ([2491f52](https://github.com/nrkno/tv-automation-server-core/commit/2491f52)) +- migration helpers ([40228e8](https://github.com/nrkno/tv-automation-server-core/commit/40228e8)) +- Migrations internal server error ([45d0238](https://github.com/nrkno/tv-automation-server-core/commit/45d0238)) +- note type got lost ([863e49d](https://github.com/nrkno/tv-automation-server-core/commit/863e49d)) +- playout ([969e316](https://github.com/nrkno/tv-automation-server-core/commit/969e316)) +- remove config didn't work ([893717e](https://github.com/nrkno/tv-automation-server-core/commit/893717e)) +- rename restoreBackups page to Snapshots ([0c5103f](https://github.com/nrkno/tv-automation-server-core/commit/0c5103f)) +- resolve issue with hit-area of Notification Center ([1618619](https://github.com/nrkno/tv-automation-server-core/commit/1618619)) +- restore running order 'backup' fails if doesnt already exist ([87b3300](https://github.com/nrkno/tv-automation-server-core/commit/87b3300)) +- reversed logic during refactoring by mistake ([694191e](https://github.com/nrkno/tv-automation-server-core/commit/694191e)) +- rewind UI even if reset returns error ([3bd5417](https://github.com/nrkno/tv-automation-server-core/commit/3bd5417)) +- running order closing prompt ([3024543](https://github.com/nrkno/tv-automation-server-core/commit/3024543)) +- show ShowStyleBase name as a part of the ShowStyleVariant name in Studios ([ba67011](https://github.com/nrkno/tv-automation-server-core/commit/ba67011)) +- systemStatus \_internal messages ([05fd6c8](https://github.com/nrkno/tv-automation-server-core/commit/05fd6c8)) +- systemStatus messages ([17420cc](https://github.com/nrkno/tv-automation-server-core/commit/17420cc)) +- Tooltip import ([cd2b65a](https://github.com/nrkno/tv-automation-server-core/commit/cd2b65a)) +- type error, ensure string ([76da25d](https://github.com/nrkno/tv-automation-server-core/commit/76da25d)) +- typings error, ensuring string ([1e25345](https://github.com/nrkno/tv-automation-server-core/commit/1e25345)) +- UI crash when outputLayer is undefined ([e6dd558](https://github.com/nrkno/tv-automation-server-core/commit/e6dd558)) +- UI: improve shapshot comment edit field ([093e6cb](https://github.com/nrkno/tv-automation-server-core/commit/093e6cb)) +- updated health endpoint according to spec ([900728b](https://github.com/nrkno/tv-automation-server-core/commit/900728b)) +- Use more consistent inputs in Blueprints page ([d223d11](https://github.com/nrkno/tv-automation-server-core/commit/d223d11)) +- Use new mediaPreviewsUrl setting ([1bd0ba4](https://github.com/nrkno/tv-automation-server-core/commit/1bd0ba4)) +- use studioInstallationId of parent peripheralDevice ([7dedf9b](https://github.com/nrkno/tv-automation-server-core/commit/7dedf9b)) +- various fixes after refactoring ([1a17414](https://github.com/nrkno/tv-automation-server-core/commit/1a17414)) +- asRunLog: wrong id, typo ([636fc41](https://github.com/nrkno/tv-automation-server-core/commit/636fc41)) +- hold: Disable transition when leaving HOLD ([809dd34](https://github.com/nrkno/tv-automation-server-core/commit/809dd34)) +- hold: Disable transition when leaving or leaving HOLD ([ef5cbcb](https://github.com/nrkno/tv-automation-server-core/commit/ef5cbcb)) +- hold: Ensure the original stk does not get picked up as a dynamic object when setting the sl as ([225304d](https://github.com/nrkno/tv-automation-server-core/commit/225304d)) +- hold: When extending a sli during hold, use the original id to make any triggers on the sli wor ([669a4b2](https://github.com/nrkno/tv-automation-server-core/commit/669a4b2)) +- migrations: Check migrate function exists before trying to run it ([cf076f5](https://github.com/nrkno/tv-automation-server-core/commit/cf076f5)) +- migrations: Create ShowStyleVariant with ShowStyleBase in the migrations and setup studio to us ([75073d4](https://github.com/nrkno/tv-automation-server-core/commit/75073d4)) +- migrations: Uncomment mos check migration ([c262fff](https://github.com/nrkno/tv-automation-server-core/commit/c262fff)) +- migrations: Various problems when running from empty ([11d1d0b](https://github.com/nrkno/tv-automation-server-core/commit/11d1d0b)) + +- pharos: add missing settingsType and migration step ([be618d2](https://github.com/nrkno/tv-automation-server-core/commit/be618d2)) +- playout: Better account for duration and overlaps with transitions etc. ([dc249a3](https://github.com/nrkno/tv-automation-server-core/commit/dc249a3)) +- playout: Double head2 headline out animation ([165e2c0](https://github.com/nrkno/tv-automation-server-core/commit/165e2c0)) +- playout: Refactor setting object siId ([48de044](https://github.com/nrkno/tv-automation-server-core/commit/48de044)) +- refactor: existing runningOrders were not migrated to the new data structure ([b20bc2d](https://github.com/nrkno/tv-automation-server-core/commit/b20bc2d)) +- refactor: remove stray debugger calls ([3be5c22](https://github.com/nrkno/tv-automation-server-core/commit/3be5c22)) + +- unsync: refactor, add method to unsync runningOrder ([d54c147](https://github.com/nrkno/tv-automation-server-core/commit/d54c147)) ### Other / Chores -* fonts: change how fonts are imported into SCSS ([c6ec568](https://github.com/nrkno/tv-automation-server-core/commit/c6ec568)) -* fonts: Moved Roboto into a general font folder in preparation for using WOFF2 and adding more ([de25e73](https://github.com/nrkno/tv-automation-server-core/commit/de25e73)) -* fonts: remove font import from main style file ([53ba074](https://github.com/nrkno/tv-automation-server-core/commit/53ba074)) - -* Add deprecated note to custom-config ([49be0aa](https://github.com/nrkno/tv-automation-server-core/commit/49be0aa)) -* Added a Sofie logo with a black background. ([afe4ddc](https://github.com/nrkno/tv-automation-server-core/commit/afe4ddc)) -* change description of storage to our specific one, as a post-it. ([d9d9855](https://github.com/nrkno/tv-automation-server-core/commit/d9d9855)) -* changelog link (test) ([64abe85](https://github.com/nrkno/tv-automation-server-core/commit/64abe85)) -* hide manual playout under ?develop=1 ([41fe422](https://github.com/nrkno/tv-automation-server-core/commit/41fe422)) -* move slack file ([b914cfa](https://github.com/nrkno/tv-automation-server-core/commit/b914cfa)) -* refactoring mode SOAP functions to its own file ([253b826](https://github.com/nrkno/tv-automation-server-core/commit/253b826)) -* refactoring: execMethod and callPeripheralDeviceFunction ([b1c8f6e](https://github.com/nrkno/tv-automation-server-core/commit/b1c8f6e)) -* remove all non-null assertsions ("!"), to build proper typings, going forward ([6704ffb](https://github.com/nrkno/tv-automation-server-core/commit/6704ffb)) -* Remove old code ([38743e3](https://github.com/nrkno/tv-automation-server-core/commit/38743e3)) -* Remove old debug code ([86f2eed](https://github.com/nrkno/tv-automation-server-core/commit/86f2eed)) -* Remove old mock running order data ([5d1b8ff](https://github.com/nrkno/tv-automation-server-core/commit/5d1b8ff)) -* Remove some debug logging ([0c62b13](https://github.com/nrkno/tv-automation-server-core/commit/0c62b13)) -* remove test file ([d1dcd8f](https://github.com/nrkno/tv-automation-server-core/commit/d1dcd8f)) -* Remove unnecessary migration settings group ([0b2be27](https://github.com/nrkno/tv-automation-server-core/commit/0b2be27)) -* Remove unused method ([ae2f416](https://github.com/nrkno/tv-automation-server-core/commit/ae2f416)) -* Small tidying ([7cfb696](https://github.com/nrkno/tv-automation-server-core/commit/7cfb696)) -* startup logging ([14c228f](https://github.com/nrkno/tv-automation-server-core/commit/14c228f)) -* typing fix ([bf443a4](https://github.com/nrkno/tv-automation-server-core/commit/bf443a4)) -* typings fix in mockdata ([beb63d3](https://github.com/nrkno/tv-automation-server-core/commit/beb63d3)) -* typo ([1dea991](https://github.com/nrkno/tv-automation-server-core/commit/1dea991)) -* unused import ([29d43cf](https://github.com/nrkno/tv-automation-server-core/commit/29d43cf)) -* update dependencies & added license validator ([ac3753c](https://github.com/nrkno/tv-automation-server-core/commit/ac3753c)) -* Update mos-connection ([fe646e8](https://github.com/nrkno/tv-automation-server-core/commit/fe646e8)) -* update types dep ([d08c10f](https://github.com/nrkno/tv-automation-server-core/commit/d08c10f)) -* update url for migrations ([b75f0ba](https://github.com/nrkno/tv-automation-server-core/commit/b75f0ba)) -* Updated Norwegian translations. ([7cc551a](https://github.com/nrkno/tv-automation-server-core/commit/7cc551a)) -* Updated prompter typography for better legibility. ([2eda3c0](https://github.com/nrkno/tv-automation-server-core/commit/2eda3c0)) -* Updated the Norwegian translations. ([88fbbc4](https://github.com/nrkno/tv-automation-server-core/commit/88fbbc4)) +- fonts: change how fonts are imported into SCSS ([c6ec568](https://github.com/nrkno/tv-automation-server-core/commit/c6ec568)) +- fonts: Moved Roboto into a general font folder in preparation for using WOFF2 and adding more ([de25e73](https://github.com/nrkno/tv-automation-server-core/commit/de25e73)) +- fonts: remove font import from main style file ([53ba074](https://github.com/nrkno/tv-automation-server-core/commit/53ba074)) + +- Add deprecated note to custom-config ([49be0aa](https://github.com/nrkno/tv-automation-server-core/commit/49be0aa)) +- Added a Sofie logo with a black background. ([afe4ddc](https://github.com/nrkno/tv-automation-server-core/commit/afe4ddc)) +- change description of storage to our specific one, as a post-it. ([d9d9855](https://github.com/nrkno/tv-automation-server-core/commit/d9d9855)) +- changelog link (test) ([64abe85](https://github.com/nrkno/tv-automation-server-core/commit/64abe85)) +- hide manual playout under ?develop=1 ([41fe422](https://github.com/nrkno/tv-automation-server-core/commit/41fe422)) +- move slack file ([b914cfa](https://github.com/nrkno/tv-automation-server-core/commit/b914cfa)) +- refactoring mode SOAP functions to its own file ([253b826](https://github.com/nrkno/tv-automation-server-core/commit/253b826)) +- refactoring: execMethod and callPeripheralDeviceFunction ([b1c8f6e](https://github.com/nrkno/tv-automation-server-core/commit/b1c8f6e)) +- remove all non-null assertsions ("!"), to build proper typings, going forward ([6704ffb](https://github.com/nrkno/tv-automation-server-core/commit/6704ffb)) +- Remove old code ([38743e3](https://github.com/nrkno/tv-automation-server-core/commit/38743e3)) +- Remove old debug code ([86f2eed](https://github.com/nrkno/tv-automation-server-core/commit/86f2eed)) +- Remove old mock running order data ([5d1b8ff](https://github.com/nrkno/tv-automation-server-core/commit/5d1b8ff)) +- Remove some debug logging ([0c62b13](https://github.com/nrkno/tv-automation-server-core/commit/0c62b13)) +- remove test file ([d1dcd8f](https://github.com/nrkno/tv-automation-server-core/commit/d1dcd8f)) +- Remove unnecessary migration settings group ([0b2be27](https://github.com/nrkno/tv-automation-server-core/commit/0b2be27)) +- Remove unused method ([ae2f416](https://github.com/nrkno/tv-automation-server-core/commit/ae2f416)) +- Small tidying ([7cfb696](https://github.com/nrkno/tv-automation-server-core/commit/7cfb696)) +- startup logging ([14c228f](https://github.com/nrkno/tv-automation-server-core/commit/14c228f)) +- typing fix ([bf443a4](https://github.com/nrkno/tv-automation-server-core/commit/bf443a4)) +- typings fix in mockdata ([beb63d3](https://github.com/nrkno/tv-automation-server-core/commit/beb63d3)) +- typo ([1dea991](https://github.com/nrkno/tv-automation-server-core/commit/1dea991)) +- unused import ([29d43cf](https://github.com/nrkno/tv-automation-server-core/commit/29d43cf)) +- update dependencies & added license validator ([ac3753c](https://github.com/nrkno/tv-automation-server-core/commit/ac3753c)) +- Update mos-connection ([fe646e8](https://github.com/nrkno/tv-automation-server-core/commit/fe646e8)) +- update types dep ([d08c10f](https://github.com/nrkno/tv-automation-server-core/commit/d08c10f)) +- update url for migrations ([b75f0ba](https://github.com/nrkno/tv-automation-server-core/commit/b75f0ba)) +- Updated Norwegian translations. ([7cc551a](https://github.com/nrkno/tv-automation-server-core/commit/7cc551a)) +- Updated prompter typography for better legibility. ([2eda3c0](https://github.com/nrkno/tv-automation-server-core/commit/2eda3c0)) +- Updated the Norwegian translations. ([88fbbc4](https://github.com/nrkno/tv-automation-server-core/commit/88fbbc4)) -## [0.18.1](https://github.com/nrkno/tv-automation-server-core/compare/v0.18.0...v0.18.1) (2018-12-11) +## [0.18.1](https://github.com/nrkno/tv-automation-server-core/compare/v0.18.0...v0.18.1) (2018-12-11) ### Bug Fixes -* after broadcast form failed to saveEvaluation ([f55546b](https://github.com/nrkno/tv-automation-server-core/commit/f55546b)) -* fix for strange (temporary?) error about method missing ([0db30ae](https://github.com/nrkno/tv-automation-server-core/commit/0db30ae)) -* make the FullScreen detection more lenient ([215d73c](https://github.com/nrkno/tv-automation-server-core/commit/215d73c)) -* rewind UI even if reset returns error ([08c5d6b](https://github.com/nrkno/tv-automation-server-core/commit/08c5d6b)) -* systemStatus _internal messages ([d150f54](https://github.com/nrkno/tv-automation-server-core/commit/d150f54)) -* updated health endpoint according to spec ([c196382](https://github.com/nrkno/tv-automation-server-core/commit/c196382)) -* **hold:** Disable transition when in HOLD ([cfcb141](https://github.com/nrkno/tv-automation-server-core/commit/cfcb141)) -* **hold:** Disable transition when leaving HOLD ([6b7184c](https://github.com/nrkno/tv-automation-server-core/commit/6b7184c)) -* **hold:** Ensure the original stk does not get picked up as a dynamic object when setting the sl as next ([22da4d8](https://github.com/nrkno/tv-automation-server-core/commit/22da4d8)) -* **hold:** When extending a sli during hold, use the original id to make any triggers on the sli work ([a3fd1a6](https://github.com/nrkno/tv-automation-server-core/commit/a3fd1a6)) +- after broadcast form failed to saveEvaluation ([f55546b](https://github.com/nrkno/tv-automation-server-core/commit/f55546b)) +- fix for strange (temporary?) error about method missing ([0db30ae](https://github.com/nrkno/tv-automation-server-core/commit/0db30ae)) +- make the FullScreen detection more lenient ([215d73c](https://github.com/nrkno/tv-automation-server-core/commit/215d73c)) +- rewind UI even if reset returns error ([08c5d6b](https://github.com/nrkno/tv-automation-server-core/commit/08c5d6b)) +- systemStatus \_internal messages ([d150f54](https://github.com/nrkno/tv-automation-server-core/commit/d150f54)) +- updated health endpoint according to spec ([c196382](https://github.com/nrkno/tv-automation-server-core/commit/c196382)) +- **hold:** Disable transition when in HOLD ([cfcb141](https://github.com/nrkno/tv-automation-server-core/commit/cfcb141)) +- **hold:** Disable transition when leaving HOLD ([6b7184c](https://github.com/nrkno/tv-automation-server-core/commit/6b7184c)) +- **hold:** Ensure the original stk does not get picked up as a dynamic object when setting the sl as next ([22da4d8](https://github.com/nrkno/tv-automation-server-core/commit/22da4d8)) +- **hold:** When extending a sli during hold, use the original id to make any triggers on the sli work ([a3fd1a6](https://github.com/nrkno/tv-automation-server-core/commit/a3fd1a6)) ### Bug Fixes -* &nbps; in a string instead of A0 ([299ba28](https://github.com/nrkno/tv-automation-server-core/commit/299ba28)) -* activate past ROs ([4b128a5](https://github.com/nrkno/tv-automation-server-core/commit/4b128a5)) -* activate past ROs ([c20af5d](https://github.com/nrkno/tv-automation-server-core/commit/c20af5d)) -* Add default exclusivity groups to InitDB ([dfd1782](https://github.com/nrkno/tv-automation-server-core/commit/dfd1782)) -* Add missing _rank field to SegmentLineAdLibItem ([9cd15fa](https://github.com/nrkno/tv-automation-server-core/commit/9cd15fa)) -* Add missing layers to initdb. Use readtime as possible duration of segmentline when calculating story length ([e388d63](https://github.com/nrkno/tv-automation-server-core/commit/e388d63)) -* add parseDateTime code hints to template editor ([c38b2f7](https://github.com/nrkno/tv-automation-server-core/commit/c38b2f7)) -* added _valid: true to mock-data ([6c2775b](https://github.com/nrkno/tv-automation-server-core/commit/6c2775b)) -* added missing "force" parameter ([7b50a97](https://github.com/nrkno/tv-automation-server-core/commit/7b50a97)) -* added missing debug-logging setting ([8f616ca](https://github.com/nrkno/tv-automation-server-core/commit/8f616ca)) -* added missing getRank import ([9d37eb8](https://github.com/nrkno/tv-automation-server-core/commit/9d37eb8)) -* added MomentFromNow, to use instead of ([aefea31](https://github.com/nrkno/tv-automation-server-core/commit/aefea31)) -* added peripheralDevices subscription, used by status display ([ccb309d](https://github.com/nrkno/tv-automation-server-core/commit/ccb309d)) -* added sorting of runtimeFunctions when generating backup, so diffing works ([b3ba3f6](https://github.com/nrkno/tv-automation-server-core/commit/b3ba3f6)) -* added sorting of runtimeFunctions when generating backup, so diffing works ([17639a0](https://github.com/nrkno/tv-automation-server-core/commit/17639a0)) -* added virtual lines to the generated function, so that line numbers add up in error messages ([df2366a](https://github.com/nrkno/tv-automation-server-core/commit/df2366a)) -* adlib items conflict with programmed content ([a304238](https://github.com/nrkno/tv-automation-server-core/commit/a304238)) -* after broadcast form failed to saveEvaluation ([f55546b](https://github.com/nrkno/tv-automation-server-core/commit/f55546b)) -* allow duration 0 of segmentLines ([11a18ae](https://github.com/nrkno/tv-automation-server-core/commit/11a18ae)) -* allow timelineobjs to be declared as abstract, and always route those with the core_abstract layer ([9bfa6c4](https://github.com/nrkno/tv-automation-server-core/commit/9bfa6c4)) -* also defer sendStoryStatus, as that's not critical for playback ([9417862](https://github.com/nrkno/tv-automation-server-core/commit/9417862)) -* always rewind GUI on roReset, roResetAndActivate ([11744c9](https://github.com/nrkno/tv-automation-server-core/commit/11744c9)) -* always rewind GUI on roReset, roResetAndActivate ([4502d90](https://github.com/nrkno/tv-automation-server-core/commit/4502d90)) -* apning with no heads ([dfb1976](https://github.com/nrkno/tv-automation-server-core/commit/dfb1976)) -* apparently componentwillmount is running in a reactive context and causes issues ([a8e53b6](https://github.com/nrkno/tv-automation-server-core/commit/a8e53b6)) -* atem mappings ([8d4ea2d](https://github.com/nrkno/tv-automation-server-core/commit/8d4ea2d)) -* autoNext should update yellow line (it didn't) ([ff42a81](https://github.com/nrkno/tv-automation-server-core/commit/ff42a81)) -* baselineTemplates not being calculated correctly for showstyle ([e4799b4](https://github.com/nrkno/tv-automation-server-core/commit/e4799b4)) -* be able to reset & activate inactivated RO ([18e01f4](https://github.com/nrkno/tv-automation-server-core/commit/18e01f4)) -* be able to reset & activate inactivated RO ([e7d52da](https://github.com/nrkno/tv-automation-server-core/commit/e7d52da)) -* better debug message ([17e1b4e](https://github.com/nrkno/tv-automation-server-core/commit/17e1b4e)) -* better handling of template-errors ([9f98100](https://github.com/nrkno/tv-automation-server-core/commit/9f98100)) -* better implementation of push update to local objects ([d692c96](https://github.com/nrkno/tv-automation-server-core/commit/d692c96)) -* BIG optimization in roTake and affected functions, made database fetches async & parallel where possible. This should not affect the functionality, though testing is needed. ([aa6f4bd](https://github.com/nrkno/tv-automation-server-core/commit/aa6f4bd)) -* bind keydown for any keyup events to prevent their default behaviour ([83e42e4](https://github.com/nrkno/tv-automation-server-core/commit/83e42e4)) -* broken GUI SegmentLineItems resolution, when simulating timeline output ([60fb843](https://github.com/nrkno/tv-automation-server-core/commit/60fb843)) -* broken settings page ([1e99ff7](https://github.com/nrkno/tv-automation-server-core/commit/1e99ff7)) -* bug in popup: nora payload can be deep objects, causing ui crash ([30bfca9](https://github.com/nrkno/tv-automation-server-core/commit/30bfca9)) -* bug in storePath migration step ([b623973](https://github.com/nrkno/tv-automation-server-core/commit/b623973)) -* bug that caused unhandledPromiseRejection. Also added logging of result of user action ([e799277](https://github.com/nrkno/tv-automation-server-core/commit/e799277)) -* bug when moving story to last ([2b86f1a](https://github.com/nrkno/tv-automation-server-core/commit/2b86f1a)) -* bug when moving story to last ([83cef62](https://github.com/nrkno/tv-automation-server-core/commit/83cef62)) -* bugfix: didn't correctly find the right segmentLineItem in next segmentLine ([0f9313f](https://github.com/nrkno/tv-automation-server-core/commit/0f9313f)) -* bugfix: executeFunction didn't really time out ([acba08c](https://github.com/nrkno/tv-automation-server-core/commit/acba08c)) -* bugfix: undefined storePath ([cbfdde5](https://github.com/nrkno/tv-automation-server-core/commit/cbfdde5)) -* bugfix: update local object when updating database ([9d3b05b](https://github.com/nrkno/tv-automation-server-core/commit/9d3b05b)) -* bugfix: When updating collection, documents with removed properties didn't get their properties removed. ([237b8ff](https://github.com/nrkno/tv-automation-server-core/commit/237b8ff)) -* bugfix: When updating collection, documents with removed properties didn't get their properties removed. ([93dd81e](https://github.com/nrkno/tv-automation-server-core/commit/93dd81e)) -* change lawo enum & interface ([3959761](https://github.com/nrkno/tv-automation-server-core/commit/3959761)) -* changed backup sorting to use templateId instead of _id ([d7047a5](https://github.com/nrkno/tv-automation-server-core/commit/d7047a5)) -* changed default chortcuts ([ba33bb7](https://github.com/nrkno/tv-automation-server-core/commit/ba33bb7)) -* changed header colors ([b9efc61](https://github.com/nrkno/tv-automation-server-core/commit/b9efc61)) -* changes attr. paths in lawo source objs ([55f8c7b](https://github.com/nrkno/tv-automation-server-core/commit/55f8c7b)) -* changes lawo mapping with the effects change ([dbe58fe](https://github.com/nrkno/tv-automation-server-core/commit/dbe58fe)) -* clean up more collections when removing RO ([b84ed59](https://github.com/nrkno/tv-automation-server-core/commit/b84ed59)) -* clean up onBeforeUnload handler ([51adbba](https://github.com/nrkno/tv-automation-server-core/commit/51adbba)) -* clear runtimeArguments on resetRunningOrder ([350dd45](https://github.com/nrkno/tv-automation-server-core/commit/350dd45)) -* collection name ([e014558](https://github.com/nrkno/tv-automation-server-core/commit/e014558)) -* corrects the default baseline template ([bf4eb03](https://github.com/nrkno/tv-automation-server-core/commit/bf4eb03)) -* Ctrl-S in template editor triggers a save ([bacbc3e](https://github.com/nrkno/tv-automation-server-core/commit/bacbc3e)) -* defer triggerExternalMessage so as not to block timelineUpdate's ([ba7383f](https://github.com/nrkno/tv-automation-server-core/commit/ba7383f)) -* dev Collections bug, due to collections being filled in later ([43e8856](https://github.com/nrkno/tv-automation-server-core/commit/43e8856)) -* dev debug data function ([e4570e2](https://github.com/nrkno/tv-automation-server-core/commit/e4570e2)) -* device is first created as Abstract ([98dca79](https://github.com/nrkno/tv-automation-server-core/commit/98dca79)) -* disable client-side RO updates ([72ba831](https://github.com/nrkno/tv-automation-server-core/commit/72ba831)) -* disable fullscreen overlay in developer mode ([7cc2e43](https://github.com/nrkno/tv-automation-server-core/commit/7cc2e43)) -* disable runtimeFunction caching during code-test & save ([74d6d34](https://github.com/nrkno/tv-automation-server-core/commit/74d6d34)) -* disable runtimeFunction caching during code-test & save ([e21f8dd](https://github.com/nrkno/tv-automation-server-core/commit/e21f8dd)) -* do not error CountdownItemLabel when sourceLayer is not found ([9451d1c](https://github.com/nrkno/tv-automation-server-core/commit/9451d1c)) -* do not show empty string values in L3rd popup ([b0c6c8e](https://github.com/nrkno/tv-automation-server-core/commit/b0c6c8e)) -* don't send devicesMakeReady until verified no other runningOrders are active ([953a1a7](https://github.com/nrkno/tv-automation-server-core/commit/953a1a7)) -* don't wait for subscriptions before rendering ([2bbfa20](https://github.com/nrkno/tv-automation-server-core/commit/2bbfa20)) -* Dont generate ui outputlayers for sli which are virtual ([c0ad368](https://github.com/nrkno/tv-automation-server-core/commit/c0ad368)) -* dont set nora_* config values in initDB ([1330008](https://github.com/nrkno/tv-automation-server-core/commit/1330008)) -* duration settling ([0648f57](https://github.com/nrkno/tv-automation-server-core/commit/0648f57)) -* Editattribute type typing ([392f4aa](https://github.com/nrkno/tv-automation-server-core/commit/392f4aa)) -* Editattribute type typing ([1206d0c](https://github.com/nrkno/tv-automation-server-core/commit/1206d0c)) -* EditAttribute: dropdown options was always strings ([814cdf7](https://github.com/nrkno/tv-automation-server-core/commit/814cdf7)) -* End of Show marker line doesn't end where it should ([e188c97](https://github.com/nrkno/tv-automation-server-core/commit/e188c97)) -* Ensure lookahead ids are always unique ([26f6637](https://github.com/nrkno/tv-automation-server-core/commit/26f6637)) -* ensure the same overlap is used for autonext and the previous sl ([efb39e6](https://github.com/nrkno/tv-automation-server-core/commit/efb39e6)) -* Ensure the sl overlapDuration is respected on autonext. ([8c3bf3e](https://github.com/nrkno/tv-automation-server-core/commit/8c3bf3e)) -* error when content.boxSourceConfiguration is undefined ([81c896b](https://github.com/nrkno/tv-automation-server-core/commit/81c896b)) -* error when content.boxSourceConfiguration is undefined ([fc7ec40](https://github.com/nrkno/tv-automation-server-core/commit/fc7ec40)) -* externalMessage: priority of messages to send ([cffcd97](https://github.com/nrkno/tv-automation-server-core/commit/cffcd97)) -* externalMessages upd ([a803882](https://github.com/nrkno/tv-automation-server-core/commit/a803882)) -* filter on json files on restore backup file selector ([1a0b867](https://github.com/nrkno/tv-automation-server-core/commit/1a0b867)) -* Fix context.runHelper not working in templates. ([36ca5f3](https://github.com/nrkno/tv-automation-server-core/commit/36ca5f3)) -* fix for strange (temporary?) error about method missing ([0db30ae](https://github.com/nrkno/tv-automation-server-core/commit/0db30ae)) -* fix PTZ Testing harness ([97bccc7](https://github.com/nrkno/tv-automation-server-core/commit/97bccc7)) -* force lookahead inGroup field to be emptied. Fixes mismatched statobj ([c76209c](https://github.com/nrkno/tv-automation-server-core/commit/c76209c)) -* generate statObject per device ([82a0736](https://github.com/nrkno/tv-automation-server-core/commit/82a0736)) -* getSnapshot: don't ask devices of type OTHER ([ea874d4](https://github.com/nrkno/tv-automation-server-core/commit/ea874d4)) -* getting monaco to work runtime while still having typings ([5db8218](https://github.com/nrkno/tv-automation-server-core/commit/5db8218)) -* global ad-lib order was wrong, basline blueprint did not set _rank ([ffbacc8](https://github.com/nrkno/tv-automation-server-core/commit/ffbacc8)) -* Guard against there being no next segmentline ([849d97f](https://github.com/nrkno/tv-automation-server-core/commit/849d97f)) -* GUI: settings: only show parent-devices in left menu (only they have settings on them) ([ecb164e](https://github.com/nrkno/tv-automation-server-core/commit/ecb164e)) -* handle both update & insert of runningOrder ([3701bb3](https://github.com/nrkno/tv-automation-server-core/commit/3701bb3)) -* handle both update & insert of runningOrder ([84a6c53](https://github.com/nrkno/tv-automation-server-core/commit/84a6c53)) -* handle when nexting before start or after end ([506bb8a](https://github.com/nrkno/tv-automation-server-core/commit/506bb8a)) -* has played styling shouldn't be applied to Guest and Remote segments ([18bdc82](https://github.com/nrkno/tv-automation-server-core/commit/18bdc82)) -* lock down package.json & update package-lock, to get release2 to build ([472f8ab](https://github.com/nrkno/tv-automation-server-core/commit/472f8ab)) -* **init:** adds qwerty to bakskjerm ([a45de4d](https://github.com/nrkno/tv-automation-server-core/commit/a45de4d)) -* head mute audio and hold on last frame ([ceec7f6](https://github.com/nrkno/tv-automation-server-core/commit/ceec7f6)) -* Hide Keyboard focus marker when not in studio mode ([70dc6b0](https://github.com/nrkno/tv-automation-server-core/commit/70dc6b0)) -* HOLD add new llayer to initDB ([650b6e6](https://github.com/nrkno/tv-automation-server-core/commit/650b6e6)) -* holdState = 0 displayed a status ([49c7ead](https://github.com/nrkno/tv-automation-server-core/commit/49c7ead)) -* holdState = 0 displayed a status ([aacd140](https://github.com/nrkno/tv-automation-server-core/commit/aacd140)) -* hot fix for rehearsal activation when an RO is already active ([648c02d](https://github.com/nrkno/tv-automation-server-core/commit/648c02d)) -* if the next:ed segment is removed, instead next the one in its place ([22597b3](https://github.com/nrkno/tv-automation-server-core/commit/22597b3)) -* Improve missing mosId error message ([89695fb](https://github.com/nrkno/tv-automation-server-core/commit/89695fb)) -* improved queries & added index ([159f6d5](https://github.com/nrkno/tv-automation-server-core/commit/159f6d5)) -* incorrect typings for template editor ([9d021df](https://github.com/nrkno/tv-automation-server-core/commit/9d021df)) -* Increase size of template editor to make it better fill the screen ([3212d7b](https://github.com/nrkno/tv-automation-server-core/commit/3212d7b)) -* Infinite items dont stop against a absolute 0 item properly. ([78c1499](https://github.com/nrkno/tv-automation-server-core/commit/78c1499)) -* infinite segment line tidying and fixes ([8469ffb](https://github.com/nrkno/tv-automation-server-core/commit/8469ffb)) -* Infinite segmentline bad guard when calculating the current infinites that caused the process to stop early ([2f9abeb](https://github.com/nrkno/tv-automation-server-core/commit/2f9abeb)) -* infinite segmentlines crossing an autonext throwing a duplicate key exception ([93b2a30](https://github.com/nrkno/tv-automation-server-core/commit/93b2a30)) -* init state properly ([2572cdc](https://github.com/nrkno/tv-automation-server-core/commit/2572cdc)) -* initDB for pharos lights ([57fbc73](https://github.com/nrkno/tv-automation-server-core/commit/57fbc73)) -* initiateDB update for PTZ ([e529782](https://github.com/nrkno/tv-automation-server-core/commit/e529782)) -* issue with rehearsal double-activation warning ([17b4e95](https://github.com/nrkno/tv-automation-server-core/commit/17b4e95)) -* issue with roPrepareForBroadcast ([c3ad30c](https://github.com/nrkno/tv-automation-server-core/commit/c3ad30c)) -* keys should be handled at up, not down ([957f583](https://github.com/nrkno/tv-automation-server-core/commit/957f583)) -* labels in modal dialogs ([3af18fc](https://github.com/nrkno/tv-automation-server-core/commit/3af18fc)) -* limit db fetches to active running order ([f3aca8f](https://github.com/nrkno/tv-automation-server-core/commit/f3aca8f)) -* locked [@babel](https://github.com/babel)/runtime version & updated package-lock ([8e62d2f](https://github.com/nrkno/tv-automation-server-core/commit/8e62d2f)) -* lookahead object id not being set correctly ([594a1e7](https://github.com/nrkno/tv-automation-server-core/commit/594a1e7)) -* made editor height dynamic ([c68ac4f](https://github.com/nrkno/tv-automation-server-core/commit/c68ac4f)) -* made editor height dynamic ([7f5f40e](https://github.com/nrkno/tv-automation-server-core/commit/7f5f40e)) -* Major refactoring, splitting code into separate files depending on their areas: "rundown": General rundown manipulation, "media-scanner": Media-scanner, "mos": mos-specific functions ([db82375](https://github.com/nrkno/tv-automation-server-core/commit/db82375)) -* make the context menu available in the entire header ([0590f9d](https://github.com/nrkno/tv-automation-server-core/commit/0590f9d)) -* make the FullScreen detection more lenient ([215d73c](https://github.com/nrkno/tv-automation-server-core/commit/215d73c)) -* Make the head to kam wipe not use the mosartVariant field. Correct the head order checking ([6030755](https://github.com/nrkno/tv-automation-server-core/commit/6030755)) -* mediaobjects to use computed field ([dba858f](https://github.com/nrkno/tv-automation-server-core/commit/dba858f)) -* mediaobjects to use computed field ([39d13b5](https://github.com/nrkno/tv-automation-server-core/commit/39d13b5)) -* Migration for stk&full audio remapping ([2491f52](https://github.com/nrkno/tv-automation-server-core/commit/2491f52)) -* Migration UI fixes ([b141243](https://github.com/nrkno/tv-automation-server-core/commit/b141243)) -* minor ui fix on status page ([97fc3c2](https://github.com/nrkno/tv-automation-server-core/commit/97fc3c2)) -* miss in merge ([93106b1](https://github.com/nrkno/tv-automation-server-core/commit/93106b1)) -* missing argument for mediaStatusCheck ([658e82a](https://github.com/nrkno/tv-automation-server-core/commit/658e82a)) -* Missing typings on ShowStyle ([a0a4e14](https://github.com/nrkno/tv-automation-server-core/commit/a0a4e14)) -* Mix transitions ([5cf2314](https://github.com/nrkno/tv-automation-server-core/commit/5cf2314)) -* Mix transitions ([0ebf3e1](https://github.com/nrkno/tv-automation-server-core/commit/0ebf3e1)) -* modified timestamp on imported blueprints was not being set, causing the cache to not be cleared properly ([2f3fd17](https://github.com/nrkno/tv-automation-server-core/commit/2f3fd17)) -* monaco typing error fix ([e73467e](https://github.com/nrkno/tv-automation-server-core/commit/e73467e)) -* move back executeFunction to peripheralDeviceAPI ([226289f](https://github.com/nrkno/tv-automation-server-core/commit/226289f)) -* new implementation of runtime caching ([767fbb7](https://github.com/nrkno/tv-automation-server-core/commit/767fbb7)) -* new implementation of runtime caching ([92e09be](https://github.com/nrkno/tv-automation-server-core/commit/92e09be)) -* new lawo source mappings ([20f7d5a](https://github.com/nrkno/tv-automation-server-core/commit/20f7d5a)) -* normalize naming scheme to 'runtimeArguments', normalize hotkey labels ([528679d](https://github.com/nrkno/tv-automation-server-core/commit/528679d)) -* NymansPlayground caused issues in Timeline ([83e772d](https://github.com/nrkno/tv-automation-server-core/commit/83e772d)) -* on startup, clear old connection statuses ([e9d7cba](https://github.com/nrkno/tv-automation-server-core/commit/e9d7cba)) -* onAir line jumping around on takes ([8330112](https://github.com/nrkno/tv-automation-server-core/commit/8330112)) -* optimize saveIntoDB ([65c189e](https://github.com/nrkno/tv-automation-server-core/commit/65c189e)) -* Persist SegmentLine.updateStoryStatus ([427b24c](https://github.com/nrkno/tv-automation-server-core/commit/427b24c)) -* playout, lookahead: use the originalLayer instear of isAbstract ([30fe842](https://github.com/nrkno/tv-automation-server-core/commit/30fe842)) -* PR changes ([c877aad](https://github.com/nrkno/tv-automation-server-core/commit/c877aad)) -* prevent default action for f1 & f3 ([53b2f22](https://github.com/nrkno/tv-automation-server-core/commit/53b2f22)) -* prevent take + autotake bug ([b3d9a4d](https://github.com/nrkno/tv-automation-server-core/commit/b3d9a4d)) -* proper dispose of executeFunction checkReply after execution is done ([523ec99](https://github.com/nrkno/tv-automation-server-core/commit/523ec99)) -* R3 ONLY: bugfix: reload data from ENPS ([cc6ed44](https://github.com/nrkno/tv-automation-server-core/commit/cc6ed44)) -* re-add blueprint & mosdatacache restore (to be deprecated later) ([886c756](https://github.com/nrkno/tv-automation-server-core/commit/886c756)) -* re-added monaco typings and disabled import, so it works client-side ([1226763](https://github.com/nrkno/tv-automation-server-core/commit/1226763)) -* re-timing vignett ([17fbced](https://github.com/nrkno/tv-automation-server-core/commit/17fbced)) -* react errors while rendering nymansPlayground ([0c245d3](https://github.com/nrkno/tv-automation-server-core/commit/0c245d3)) -* React unique keys ([4f728d9](https://github.com/nrkno/tv-automation-server-core/commit/4f728d9)) -* refactor storeSnapshot methods ([6e66394](https://github.com/nrkno/tv-automation-server-core/commit/6e66394)) -* refactored execMethod, so it doesn't use promises and causes unhandled promise rejections ([24da71b](https://github.com/nrkno/tv-automation-server-core/commit/24da71b)) -* refactored reset-segmentLine further ([0523eb6](https://github.com/nrkno/tv-automation-server-core/commit/0523eb6)) -* refactored/DRYd adminMode & studioMode, disabled trashbin-button for externalMessages when not in adminMode ([b29dae1](https://github.com/nrkno/tv-automation-server-core/commit/b29dae1)) -* relative durations causing type warnings for ui code ([5249435](https://github.com/nrkno/tv-automation-server-core/commit/5249435)) -* Release 3 only: disable config missing warning ([921cc82](https://github.com/nrkno/tv-automation-server-core/commit/921cc82)) -* remount monaco ([4ce1566](https://github.com/nrkno/tv-automation-server-core/commit/4ce1566)) -* remove debug line in nightly cronjob ([dda3017](https://github.com/nrkno/tv-automation-server-core/commit/dda3017)) -* remove deprecated options ([ab7275b](https://github.com/nrkno/tv-automation-server-core/commit/ab7275b)) -* remove full-screen button, add label ([5e9826e](https://github.com/nrkno/tv-automation-server-core/commit/5e9826e)) -* remove full-screen button, add label ([5c9a3e5](https://github.com/nrkno/tv-automation-server-core/commit/5c9a3e5)) -* remove some console.logs ([a9f3f53](https://github.com/nrkno/tv-automation-server-core/commit/a9f3f53)) -* Remove timestamps from blueprint backups ([74fa1b3](https://github.com/nrkno/tv-automation-server-core/commit/74fa1b3)) -* remove unused imports ([5fe6ac3](https://github.com/nrkno/tv-automation-server-core/commit/5fe6ac3)) -* remove unused translation helper ([e545a9e](https://github.com/nrkno/tv-automation-server-core/commit/e545a9e)) -* removed autopublish and insecure packages, we'll implement publications and allow/deny rules from now on ([213998d](https://github.com/nrkno/tv-automation-server-core/commit/213998d)) -* **blueprints:** Ensure the object ids generated by the post-process blueprint are unique ([bdee540](https://github.com/nrkno/tv-automation-server-core/commit/bdee540)) -* **cam/dir:** clear hotkeys ([2545de8](https://github.com/nrkno/tv-automation-server-core/commit/2545de8)) -* **countdowns:** ignore sourceLayers that we don't have an icon for ([27b2ac0](https://github.com/nrkno/tv-automation-server-core/commit/27b2ac0)) -* **emberplus:** changes intiDB mapping to new .-delimited string format ([b6d8bc7](https://github.com/nrkno/tv-automation-server-core/commit/b6d8bc7)) -* **externalMessage:** encode proper html-entities in strings ([243995c](https://github.com/nrkno/tv-automation-server-core/commit/243995c)) -* **FirstObjects:** Reverts regression introduced by removing isAbstract from firstObject items ([8f1608b](https://github.com/nrkno/tv-automation-server-core/commit/8f1608b)) -* **hold:** Disable transition when in HOLD ([cfcb141](https://github.com/nrkno/tv-automation-server-core/commit/cfcb141)) -* **hold:** Disable transition when leaving HOLD ([6b7184c](https://github.com/nrkno/tv-automation-server-core/commit/6b7184c)) -* **hold:** Ensure the original stk does not get picked up as a dynamic object when setting the sl as next ([b10f48d](https://github.com/nrkno/tv-automation-server-core/commit/b10f48d)) -* **hold:** Ensure the original stk does not get picked up as a dynamic object when setting the sl as next ([22da4d8](https://github.com/nrkno/tv-automation-server-core/commit/22da4d8)) -* **hold:** Too many sli being extended for hold mode ([f644e32](https://github.com/nrkno/tv-automation-server-core/commit/f644e32)) -* update Next-line when inserting story just before it, also added property to track if the next point was set manually ([d82dbc6](https://github.com/nrkno/tv-automation-server-core/commit/d82dbc6)) -* **hold:** keep showing any infinite items that existed on the previous sl ([21a9973](https://github.com/nrkno/tv-automation-server-core/commit/21a9973)) -* **hold:** When extending a sli during hold, use the original id to make any triggers on the sli work ([a3fd1a6](https://github.com/nrkno/tv-automation-server-core/commit/a3fd1a6)) -* **infinite items:** removes infinite icon from outOnNextSegment ([4a75d7d](https://github.com/nrkno/tv-automation-server-core/commit/4a75d7d)) -* **init:** Adds default lawo device settings ([28759df](https://github.com/nrkno/tv-automation-server-core/commit/28759df)) -* **init:** adds qwerty to bakskjerm ([7329976](https://github.com/nrkno/tv-automation-server-core/commit/7329976)) -* **init:** adds qwerty to bakskjerm ([78198c9](https://github.com/nrkno/tv-automation-server-core/commit/78198c9)) -* **init:** hides klokke and logo layers by default ([1847ca4](https://github.com/nrkno/tv-automation-server-core/commit/1847ca4)) -* **init:** Layer names ([221b374](https://github.com/nrkno/tv-automation-server-core/commit/221b374)) -* **init:** Layer names ([16a504c](https://github.com/nrkno/tv-automation-server-core/commit/16a504c)) -* **init:** Splits init_layers and init_config. ([e056e5a](https://github.com/nrkno/tv-automation-server-core/commit/e056e5a)) -* **init:** swaps MP2 and MP1NXT layers ([b8a370c](https://github.com/nrkno/tv-automation-server-core/commit/b8a370c)) -* **init:** updated channel orders after 2-caspar setup ([3404b9b](https://github.com/nrkno/tv-automation-server-core/commit/3404b9b)) -* **Init:** Creat empty settings for Nora ([f8d0669](https://github.com/nrkno/tv-automation-server-core/commit/f8d0669)) -* **Init:** fixes wrong mapping of Lawo RMs ([ee68432](https://github.com/nrkno/tv-automation-server-core/commit/ee68432)) -* **Init:** Sets init defaults to xpro ([fd9c182](https://github.com/nrkno/tv-automation-server-core/commit/fd9c182)) -* **Initdb:** Preload vignett ([9470318](https://github.com/nrkno/tv-automation-server-core/commit/9470318)) -* **Initdb:** Preload vignett ([156a454](https://github.com/nrkno/tv-automation-server-core/commit/156a454)) -* setAsNext on previous ([4ffe665](https://github.com/nrkno/tv-automation-server-core/commit/4ffe665)) -* **iterateDeeply:** typos ([c9198f1](https://github.com/nrkno/tv-automation-server-core/commit/c9198f1)) -* **lawo:** changes tempaltes to new structure ([29bf666](https://github.com/nrkno/tv-automation-server-core/commit/29bf666)) -* **lawo:** more generic timeline object ([b0418ab](https://github.com/nrkno/tv-automation-server-core/commit/b0418ab)) -* **lookahead:** clear inGroup in a better fashion ([60541cc](https://github.com/nrkno/tv-automation-server-core/commit/60541cc)) -* **lookahead:** consider transitions properly in lookahead ([c78c6fa](https://github.com/nrkno/tv-automation-server-core/commit/c78c6fa)) -* **lookahead:** Dont run lookahead on abs0 sli if there is an active transition. ([bb4123a](https://github.com/nrkno/tv-automation-server-core/commit/bb4123a)) -* **lookahead:** Dont run lookahead on abs0 sli if there is an active transition. ([191df09](https://github.com/nrkno/tv-automation-server-core/commit/191df09)) -* **lookahead:** Fix lookahead when transition does not define clip. Fix duplicate key exception when using hold multiple times at the same point ([a1bb026](https://github.com/nrkno/tv-automation-server-core/commit/a1bb026)) -* **lookahead:** Fix lookahead when transition object starts at abs0 ([bd3edbd](https://github.com/nrkno/tv-automation-server-core/commit/bd3edbd)) -* **lookahead:** Fix lookahead when transition object starts at abs0 ([c88c830](https://github.com/nrkno/tv-automation-server-core/commit/c88c830)) -* **lookahead:** Ignore transition if this is the first sl and so no transition will be used ([3df2e1e](https://github.com/nrkno/tv-automation-server-core/commit/3df2e1e)) -* **lookahead:** Not using transition info when in a segmentline with no previous segmentline ([917b34e](https://github.com/nrkno/tv-automation-server-core/commit/917b34e)) -* **lookahead:** Resolving an object for both transition clip and main clip causing an extra loadbg ([739b5e4](https://github.com/nrkno/tv-automation-server-core/commit/739b5e4)) -* **lookahead:** Resolving an object for both transition clip and main clip causing an extra loadbg ([875bd1a](https://github.com/nrkno/tv-automation-server-core/commit/875bd1a)) -* **media formats:** do not 2x interlaced frame rates ([1639c32](https://github.com/nrkno/tv-automation-server-core/commit/1639c32)) -* **migration:** Missing studio0_audio_bed ([1c6edcc](https://github.com/nrkno/tv-automation-server-core/commit/1c6edcc)) -* **migration:** overrideSteps should be applied before .validate() is run, so overrideSteps works independent of the validation result. ([c9c1f25](https://github.com/nrkno/tv-automation-server-core/commit/c9c1f25)) -* **NRK Template:** Use LLayers Enum ([84ed5df](https://github.com/nrkno/tv-automation-server-core/commit/84ed5df)) -* **pharos:** add missing settingsType and migration step ([9f73a8e](https://github.com/nrkno/tv-automation-server-core/commit/9f73a8e)) -* **playout:** Double head2 headline out animation ([7ec91ff](https://github.com/nrkno/tv-automation-server-core/commit/7ec91ff)) -* **playout:** R4 only partial merge of dc249a31b342e8bdbeb7faac064dd97cec15c3e8. Fix sl duration with autonext and no transitions ([17175c3](https://github.com/nrkno/tv-automation-server-core/commit/17175c3)) -* **playout:** sl with autoNextOverlap not getting applied properly ([eb22967](https://github.com/nrkno/tv-automation-server-core/commit/eb22967)) -* **presenter screen:** display hours correctly ([e242a9e](https://github.com/nrkno/tv-automation-server-core/commit/e242a9e)) -* **record:** CR changes ([b3adbec](https://github.com/nrkno/tv-automation-server-core/commit/b3adbec)) -* **record:** Hide internal layer mappings ([24dfef1](https://github.com/nrkno/tv-automation-server-core/commit/24dfef1)) -* **RO view:** Always persist original event in user-action methods ([6ba7df8](https://github.com/nrkno/tv-automation-server-core/commit/6ba7df8)) -* **snapshot:** SegmentLines were not being included in the snapshot ([d9a427e](https://github.com/nrkno/tv-automation-server-core/commit/d9a427e)) -* removed ntp server debug code ([b9857e7](https://github.com/nrkno/tv-automation-server-core/commit/b9857e7)) -* removed old, deprecated attr ([bf0cdfd](https://github.com/nrkno/tv-automation-server-core/commit/bf0cdfd)) -* removed uploadFileToAtem function, this should be done in devicesMakeReady ([4e96bb3](https://github.com/nrkno/tv-automation-server-core/commit/4e96bb3)) -* Removing trailing slashes in url defaults ([f6fa32c](https://github.com/nrkno/tv-automation-server-core/commit/f6fa32c)) -* rename rundownAPI => runningOrderAPI ([89d48d0](https://github.com/nrkno/tv-automation-server-core/commit/89d48d0)) -* resetRunningOrder functionality in GUI ([4eb096a](https://github.com/nrkno/tv-automation-server-core/commit/4eb096a)) -* resetRunningorder should update timeline ([0d01e6a](https://github.com/nrkno/tv-automation-server-core/commit/0d01e6a)) -* resetRunningorder should update timeline ([35451b1](https://github.com/nrkno/tv-automation-server-core/commit/35451b1)) -* resetting running order rewind ([a122f2c](https://github.com/nrkno/tv-automation-server-core/commit/a122f2c)) -* resolve merge issue ([0cbc75a](https://github.com/nrkno/tv-automation-server-core/commit/0cbc75a)) -* Respect disableOutTransition on SegmentLine during manual takes (not just autonext) ([f19788d](https://github.com/nrkno/tv-automation-server-core/commit/f19788d)) -* retry strategy for restart casparcg cronjob ([b54f0f6](https://github.com/nrkno/tv-automation-server-core/commit/b54f0f6)) -* Revert 594a1e7 ([edeb166](https://github.com/nrkno/tv-automation-server-core/commit/edeb166)) -* rewind icon was not responsive in ROFullscreenControls ([2e7c1d2](https://github.com/nrkno/tv-automation-server-core/commit/2e7c1d2)) -* rewind icon was not responsive in ROFullscreenControls ([0e494df](https://github.com/nrkno/tv-automation-server-core/commit/0e494df)) -* rewind UI even if reset returns error ([08c5d6b](https://github.com/nrkno/tv-automation-server-core/commit/08c5d6b)) -* reworked systemStatus to use components instead ([cccfe3c](https://github.com/nrkno/tv-automation-server-core/commit/cccfe3c)) -* RO buttons z-order ([3c53254](https://github.com/nrkno/tv-automation-server-core/commit/3c53254)) -* RO buttons z-order ([15e9da8](https://github.com/nrkno/tv-automation-server-core/commit/15e9da8)) -* RO overview crashed during rebuild of RO ([d2c62a1](https://github.com/nrkno/tv-automation-server-core/commit/d2c62a1)) -* ro-reset does not reset properly ([6367658](https://github.com/nrkno/tv-automation-server-core/commit/6367658)) -* roReset should reset holdItems and infinites ([bdf8385](https://github.com/nrkno/tv-automation-server-core/commit/bdf8385)) -* run afterUpdateTimeline after timelineTriggerTime ([98ece60](https://github.com/nrkno/tv-automation-server-core/commit/98ece60)) -* Rundown name dissappearing from view ([91dcc21](https://github.com/nrkno/tv-automation-server-core/commit/91dcc21)) -* running order closing prompt ([7074cc3](https://github.com/nrkno/tv-automation-server-core/commit/7074cc3)) -* Set KAM source layer, and a probably incorrect duration (but its now non-zero) ([6e152f0](https://github.com/nrkno/tv-automation-server-core/commit/6e152f0)) -* setAsNext on previous ([6ced09b](https://github.com/nrkno/tv-automation-server-core/commit/6ced09b)) -* setAsNext on previous line no longer shows default state, but now instead stalls when attempting to take ([e441aaf](https://github.com/nrkno/tv-automation-server-core/commit/e441aaf)) -* show media errors in segment header ([3775d2e](https://github.com/nrkno/tv-automation-server-core/commit/3775d2e)) -* since afterUpdateTimeline is called in from a syncFunctionIgnore-function, we can remove the timeout ([e7f8f25](https://github.com/nrkno/tv-automation-server-core/commit/e7f8f25)) -* sl prod init ([2ff4a46](https://github.com/nrkno/tv-automation-server-core/commit/2ff4a46)) -* smoother handling when reloading ENPS data ([83be7cb](https://github.com/nrkno/tv-automation-server-core/commit/83be7cb)) -* snapshots ([182c221](https://github.com/nrkno/tv-automation-server-core/commit/182c221)) -* SOAP message encoding ([63d8634](https://github.com/nrkno/tv-automation-server-core/commit/63d8634)) -* SOAP message encoding ([b19ea77](https://github.com/nrkno/tv-automation-server-core/commit/b19ea77)) -* Start on template for KAM ÅPNING ([4cd682f](https://github.com/nrkno/tv-automation-server-core/commit/4cd682f)) -* status colors ([46fdaf1](https://github.com/nrkno/tv-automation-server-core/commit/46fdaf1)) -* StudioInstallation key-value config tidying ([4b0bc1a](https://github.com/nrkno/tv-automation-server-core/commit/4b0bc1a)) -* styling fix for z-order with menu and RO buttons ([1b0717e](https://github.com/nrkno/tv-automation-server-core/commit/1b0717e)) -* subscription handling ([8aaa3ec](https://github.com/nrkno/tv-automation-server-core/commit/8aaa3ec)) -* super.componentWillUnmount is required ([2342e48](https://github.com/nrkno/tv-automation-server-core/commit/2342e48)) -* syntax errors in test file ([a8f5d1e](https://github.com/nrkno/tv-automation-server-core/commit/a8f5d1e)) -* systemStatus _internal messages ([d150f54](https://github.com/nrkno/tv-automation-server-core/commit/d150f54)) -* systemStatus messages ([e595e5b](https://github.com/nrkno/tv-automation-server-core/commit/e595e5b)) -* take action should not throw as nasty errors when called by user. ([6791d50](https://github.com/nrkno/tv-automation-server-core/commit/6791d50)) -* templates with wipe. Readd seperate audio file ([5be2802](https://github.com/nrkno/tv-automation-server-core/commit/5be2802)) -* temporary fix of typing error ([73bf56d](https://github.com/nrkno/tv-automation-server-core/commit/73bf56d)) -* text shadow in SegmentLineLabels ([3a310b1](https://github.com/nrkno/tv-automation-server-core/commit/3a310b1)) -* tie snapshot to evaluation ([ec18370](https://github.com/nrkno/tv-automation-server-core/commit/ec18370)) -* Timeline always being built without previous segmentline ([a077805](https://github.com/nrkno/tv-automation-server-core/commit/a077805)) -* timeline dep ([b26eecb](https://github.com/nrkno/tv-automation-server-core/commit/b26eecb)) -* timeline resolution bug for non-infinite items ([35fc40a](https://github.com/nrkno/tv-automation-server-core/commit/35fc40a)) -* timeline statobj didn't update on inactivate (empty timeline) ([839b906](https://github.com/nrkno/tv-automation-server-core/commit/839b906)) -* timeline statObject: updated hashing function ([e00a01c](https://github.com/nrkno/tv-automation-server-core/commit/e00a01c)) -* timesync: better retry strategy on startup sync ([eda632a](https://github.com/nrkno/tv-automation-server-core/commit/eda632a)) -* toc trace message ([c53124f](https://github.com/nrkno/tv-automation-server-core/commit/c53124f)) -* too long script out-words could overlap with previous items ([8f8a9a2](https://github.com/nrkno/tv-automation-server-core/commit/8f8a9a2)) -* top RO overview labels clipped in wrong places ([5e5c228](https://github.com/nrkno/tv-automation-server-core/commit/5e5c228)) -* Tweaked styling of evaluation form, warning messages, color of the next lines, translations, capialized warning icon file name, and optimized png and svg icons. ([50d2753](https://github.com/nrkno/tv-automation-server-core/commit/50d2753)) -* tweaks on externalMessage send function, limiting the number of messages sent in one go ([046ae38](https://github.com/nrkno/tv-automation-server-core/commit/046ae38)) -* type bug ([de43835](https://github.com/nrkno/tv-automation-server-core/commit/de43835)) -* **sticky:** Fix sticky items with objects using relative triggers or durations ([0c47cff](https://github.com/nrkno/tv-automation-server-core/commit/0c47cff)) -* type error in SegmentTimelineContainer ([c4d6b4d](https://github.com/nrkno/tv-automation-server-core/commit/c4d6b4d)) -* typing ([7c21efe](https://github.com/nrkno/tv-automation-server-core/commit/7c21efe)) -* typing fix: cannot find name 'monaco' ([3ad88ce](https://github.com/nrkno/tv-automation-server-core/commit/3ad88ce)) -* typing fixes, to work with updated packages ([b4362f7](https://github.com/nrkno/tv-automation-server-core/commit/b4362f7)) -* typo bug in performanceMonitor ([6a5eeb4](https://github.com/nrkno/tv-automation-server-core/commit/6a5eeb4)) -* typo bug in performanceMonitor ([797c393](https://github.com/nrkno/tv-automation-server-core/commit/797c393)) -* UI tweaks for messages status view. so it doesn't break when having long error messages ([ca1e3ae](https://github.com/nrkno/tv-automation-server-core/commit/ca1e3ae)) -* upd meteor typings ([53f17d2](https://github.com/nrkno/tv-automation-server-core/commit/53f17d2)) -* update all data in roReplaceMetadata ([8a5a671](https://github.com/nrkno/tv-automation-server-core/commit/8a5a671)) -* **transition:** Delay sli not contents, to ensure relative triggers against the sli are correct (fixes sluttvignett with transition) ([856da4b](https://github.com/nrkno/tv-automation-server-core/commit/856da4b)) -* update design of presenter screen ([4f41195](https://github.com/nrkno/tv-automation-server-core/commit/4f41195)) -* Update names passed to SegmentLineItems ([ed0fc0d](https://github.com/nrkno/tv-automation-server-core/commit/ed0fc0d)) -* update ro data cache when getting new metadata ([d700783](https://github.com/nrkno/tv-automation-server-core/commit/d700783)) -* update supertimeline ([28bccfe](https://github.com/nrkno/tv-automation-server-core/commit/28bccfe)) -* update timeline dependency ([b83f6be](https://github.com/nrkno/tv-automation-server-core/commit/b83f6be)) -* Update timeline on removing a mos story ([fd3d443](https://github.com/nrkno/tv-automation-server-core/commit/fd3d443)) -* Update TimelineObjCCGRoute. ([203ef91](https://github.com/nrkno/tv-automation-server-core/commit/203ef91)) -* **template:** Caspar portion of in-transition for segmentline rerun whenever timeline was recalculated ([3373457](https://github.com/nrkno/tv-automation-server-core/commit/3373457)) -* updated health endpoint according to spec ([c196382](https://github.com/nrkno/tv-automation-server-core/commit/c196382)) -* **template:** graphic supers group using wrong trigger. ([e28d1ef](https://github.com/nrkno/tv-automation-server-core/commit/e28d1ef)) -* **template:** Reduce volume of head wipes ([b2092cc](https://github.com/nrkno/tv-automation-server-core/commit/b2092cc)) -* **template:** setup dsk properly ([2e8309c](https://github.com/nrkno/tv-automation-server-core/commit/2e8309c)) -* **templates:** Fix incorrect camera number used with head transition. Hook in sluttvignett. Fix segments not respecting overlapduration if no transition is used ([00b7cdd](https://github.com/nrkno/tv-automation-server-core/commit/00b7cdd)) -* **templates:** use enum for nora channels ([55c0cfc](https://github.com/nrkno/tv-automation-server-core/commit/55c0cfc)) -* **templates:** Various tweaks ([eb93c6a](https://github.com/nrkno/tv-automation-server-core/commit/eb93c6a)) -* **Test:** Verifying build and deploy script ([0b13e18](https://github.com/nrkno/tv-automation-server-core/commit/0b13e18)) -* **timeline:** don't round items in relative mode ([2938819](https://github.com/nrkno/tv-automation-server-core/commit/2938819)) -* updated package-lock.json ([bf0cfde](https://github.com/nrkno/tv-automation-server-core/commit/bf0cfde)) -* **timeline:** Infinite sli do not update properly on new mos data. Fix detection of the end of the chain, and ensure the last is set to not infinite ([61b2930](https://github.com/nrkno/tv-automation-server-core/commit/61b2930)) -* **timeline:** Infinite sli do not update properly on new mos data. Fix detection of the end of the chain, and ensure the last is set to not infinite ([16d9715](https://github.com/nrkno/tv-automation-server-core/commit/16d9715)) -* **Timeline:** Corrects the angle of the gradient indication mix-in-transition on a segmentLineItem ([151ecf9](https://github.com/nrkno/tv-automation-server-core/commit/151ecf9)) -* **transition:** reverses direction of wipe transitions ([9961a3f](https://github.com/nrkno/tv-automation-server-core/commit/9961a3f)) -* **transition:** Using wrong overlap when combined with autonext ([4c56102](https://github.com/nrkno/tv-automation-server-core/commit/4c56102)) -* **transitions:** Ensure they are run with the correct overlap on autonext ([bbc6ca2](https://github.com/nrkno/tv-automation-server-core/commit/bbc6ca2)) -* **transitions:** Timed graphics being run wrong ([8b39960](https://github.com/nrkno/tv-automation-server-core/commit/8b39960)) -* updated nightly cronjob: restart casparcg devices, to work with new restartCasparCG function implementation ([edbc186](https://github.com/nrkno/tv-automation-server-core/commit/edbc186)) -* **vignett:** do not preload vignett, as it is risky business preloading sluttvignett. Could be done better by separating vignett and sluttvignett ([b0da067](https://github.com/nrkno/tv-automation-server-core/commit/b0da067)) -* **vignett:** do not preload vignett, as it is risky business preloading sluttvignett. Could be done better by separating vignett and sluttvignett ([8bf7ff8](https://github.com/nrkno/tv-automation-server-core/commit/8bf7ff8)) -* updated mock data ([a7a4ae5](https://github.com/nrkno/tv-automation-server-core/commit/a7a4ae5)) -* updated mock data ([3e140c6](https://github.com/nrkno/tv-automation-server-core/commit/3e140c6)) -* updated nightly cronjob: restart casparcg devices, to work with new restartCasparCG function implementation ([3f9344d](https://github.com/nrkno/tv-automation-server-core/commit/3f9344d)) -* updated systemTime endpoint ([503d2c8](https://github.com/nrkno/tv-automation-server-core/commit/503d2c8)) -* updated timeline dep (bugfixes) ([ff29ce6](https://github.com/nrkno/tv-automation-server-core/commit/ff29ce6)) -* updated versions file ([f6c9869](https://github.com/nrkno/tv-automation-server-core/commit/f6c9869)) -* use DisplayName field for graphic elements ([e2e9014](https://github.com/nrkno/tv-automation-server-core/commit/e2e9014)) -* Use thin styling for a solo 'AUTO' label ([74b5f15](https://github.com/nrkno/tv-automation-server-core/commit/74b5f15)) -* Use thin styling for a solo 'AUTO' label ([0c26d38](https://github.com/nrkno/tv-automation-server-core/commit/0c26d38)) -* use unique id for baseline items cache entries ([cf89409](https://github.com/nrkno/tv-automation-server-core/commit/cf89409)) -* **zoom:** moved zoom modifier for scroll action to ctrl ([863d81e](https://github.com/nrkno/tv-automation-server-core/commit/863d81e)) -* **zoom:** moved zoom modifier for scroll action to ctrl ([80829f2](https://github.com/nrkno/tv-automation-server-core/commit/80829f2)) -* userActivity executionTime logging ([a3e763e](https://github.com/nrkno/tv-automation-server-core/commit/a3e763e)) -* when activating, set Next if not set ([c9f71a1](https://github.com/nrkno/tv-automation-server-core/commit/c9f71a1)) -* when overriding componentWillUnmount, we need to call this._cleanup() ([0f39cd4](https://github.com/nrkno/tv-automation-server-core/commit/0f39cd4)) -* wrap ntpClient.getNetworkTime() in try/catch, as an attempt to fix fatal error thrown ([cd44862](https://github.com/nrkno/tv-automation-server-core/commit/cd44862)) - +- &nbps; in a string instead of A0 ([299ba28](https://github.com/nrkno/tv-automation-server-core/commit/299ba28)) +- activate past ROs ([4b128a5](https://github.com/nrkno/tv-automation-server-core/commit/4b128a5)) +- activate past ROs ([c20af5d](https://github.com/nrkno/tv-automation-server-core/commit/c20af5d)) +- Add default exclusivity groups to InitDB ([dfd1782](https://github.com/nrkno/tv-automation-server-core/commit/dfd1782)) +- Add missing \_rank field to SegmentLineAdLibItem ([9cd15fa](https://github.com/nrkno/tv-automation-server-core/commit/9cd15fa)) +- Add missing layers to initdb. Use readtime as possible duration of segmentline when calculating story length ([e388d63](https://github.com/nrkno/tv-automation-server-core/commit/e388d63)) +- add parseDateTime code hints to template editor ([c38b2f7](https://github.com/nrkno/tv-automation-server-core/commit/c38b2f7)) +- added \_valid: true to mock-data ([6c2775b](https://github.com/nrkno/tv-automation-server-core/commit/6c2775b)) +- added missing "force" parameter ([7b50a97](https://github.com/nrkno/tv-automation-server-core/commit/7b50a97)) +- added missing debug-logging setting ([8f616ca](https://github.com/nrkno/tv-automation-server-core/commit/8f616ca)) +- added missing getRank import ([9d37eb8](https://github.com/nrkno/tv-automation-server-core/commit/9d37eb8)) +- added MomentFromNow, to use instead of ([aefea31](https://github.com/nrkno/tv-automation-server-core/commit/aefea31)) +- added peripheralDevices subscription, used by status display ([ccb309d](https://github.com/nrkno/tv-automation-server-core/commit/ccb309d)) +- added sorting of runtimeFunctions when generating backup, so diffing works ([b3ba3f6](https://github.com/nrkno/tv-automation-server-core/commit/b3ba3f6)) +- added sorting of runtimeFunctions when generating backup, so diffing works ([17639a0](https://github.com/nrkno/tv-automation-server-core/commit/17639a0)) +- added virtual lines to the generated function, so that line numbers add up in error messages ([df2366a](https://github.com/nrkno/tv-automation-server-core/commit/df2366a)) +- adlib items conflict with programmed content ([a304238](https://github.com/nrkno/tv-automation-server-core/commit/a304238)) +- after broadcast form failed to saveEvaluation ([f55546b](https://github.com/nrkno/tv-automation-server-core/commit/f55546b)) +- allow duration 0 of segmentLines ([11a18ae](https://github.com/nrkno/tv-automation-server-core/commit/11a18ae)) +- allow timelineobjs to be declared as abstract, and always route those with the core_abstract layer ([9bfa6c4](https://github.com/nrkno/tv-automation-server-core/commit/9bfa6c4)) +- also defer sendStoryStatus, as that's not critical for playback ([9417862](https://github.com/nrkno/tv-automation-server-core/commit/9417862)) +- always rewind GUI on roReset, roResetAndActivate ([11744c9](https://github.com/nrkno/tv-automation-server-core/commit/11744c9)) +- always rewind GUI on roReset, roResetAndActivate ([4502d90](https://github.com/nrkno/tv-automation-server-core/commit/4502d90)) +- apning with no heads ([dfb1976](https://github.com/nrkno/tv-automation-server-core/commit/dfb1976)) +- apparently componentwillmount is running in a reactive context and causes issues ([a8e53b6](https://github.com/nrkno/tv-automation-server-core/commit/a8e53b6)) +- atem mappings ([8d4ea2d](https://github.com/nrkno/tv-automation-server-core/commit/8d4ea2d)) +- autoNext should update yellow line (it didn't) ([ff42a81](https://github.com/nrkno/tv-automation-server-core/commit/ff42a81)) +- baselineTemplates not being calculated correctly for showstyle ([e4799b4](https://github.com/nrkno/tv-automation-server-core/commit/e4799b4)) +- be able to reset & activate inactivated RO ([18e01f4](https://github.com/nrkno/tv-automation-server-core/commit/18e01f4)) +- be able to reset & activate inactivated RO ([e7d52da](https://github.com/nrkno/tv-automation-server-core/commit/e7d52da)) +- better debug message ([17e1b4e](https://github.com/nrkno/tv-automation-server-core/commit/17e1b4e)) +- better handling of template-errors ([9f98100](https://github.com/nrkno/tv-automation-server-core/commit/9f98100)) +- better implementation of push update to local objects ([d692c96](https://github.com/nrkno/tv-automation-server-core/commit/d692c96)) +- BIG optimization in roTake and affected functions, made database fetches async & parallel where possible. This should not affect the functionality, though testing is needed. ([aa6f4bd](https://github.com/nrkno/tv-automation-server-core/commit/aa6f4bd)) +- bind keydown for any keyup events to prevent their default behaviour ([83e42e4](https://github.com/nrkno/tv-automation-server-core/commit/83e42e4)) +- broken GUI SegmentLineItems resolution, when simulating timeline output ([60fb843](https://github.com/nrkno/tv-automation-server-core/commit/60fb843)) +- broken settings page ([1e99ff7](https://github.com/nrkno/tv-automation-server-core/commit/1e99ff7)) +- bug in popup: nora payload can be deep objects, causing ui crash ([30bfca9](https://github.com/nrkno/tv-automation-server-core/commit/30bfca9)) +- bug in storePath migration step ([b623973](https://github.com/nrkno/tv-automation-server-core/commit/b623973)) +- bug that caused unhandledPromiseRejection. Also added logging of result of user action ([e799277](https://github.com/nrkno/tv-automation-server-core/commit/e799277)) +- bug when moving story to last ([2b86f1a](https://github.com/nrkno/tv-automation-server-core/commit/2b86f1a)) +- bug when moving story to last ([83cef62](https://github.com/nrkno/tv-automation-server-core/commit/83cef62)) +- bugfix: didn't correctly find the right segmentLineItem in next segmentLine ([0f9313f](https://github.com/nrkno/tv-automation-server-core/commit/0f9313f)) +- bugfix: executeFunction didn't really time out ([acba08c](https://github.com/nrkno/tv-automation-server-core/commit/acba08c)) +- bugfix: undefined storePath ([cbfdde5](https://github.com/nrkno/tv-automation-server-core/commit/cbfdde5)) +- bugfix: update local object when updating database ([9d3b05b](https://github.com/nrkno/tv-automation-server-core/commit/9d3b05b)) +- bugfix: When updating collection, documents with removed properties didn't get their properties removed. ([237b8ff](https://github.com/nrkno/tv-automation-server-core/commit/237b8ff)) +- bugfix: When updating collection, documents with removed properties didn't get their properties removed. ([93dd81e](https://github.com/nrkno/tv-automation-server-core/commit/93dd81e)) +- change lawo enum & interface ([3959761](https://github.com/nrkno/tv-automation-server-core/commit/3959761)) +- changed backup sorting to use templateId instead of \_id ([d7047a5](https://github.com/nrkno/tv-automation-server-core/commit/d7047a5)) +- changed default chortcuts ([ba33bb7](https://github.com/nrkno/tv-automation-server-core/commit/ba33bb7)) +- changed header colors ([b9efc61](https://github.com/nrkno/tv-automation-server-core/commit/b9efc61)) +- changes attr. paths in lawo source objs ([55f8c7b](https://github.com/nrkno/tv-automation-server-core/commit/55f8c7b)) +- changes lawo mapping with the effects change ([dbe58fe](https://github.com/nrkno/tv-automation-server-core/commit/dbe58fe)) +- clean up more collections when removing RO ([b84ed59](https://github.com/nrkno/tv-automation-server-core/commit/b84ed59)) +- clean up onBeforeUnload handler ([51adbba](https://github.com/nrkno/tv-automation-server-core/commit/51adbba)) +- clear runtimeArguments on resetRunningOrder ([350dd45](https://github.com/nrkno/tv-automation-server-core/commit/350dd45)) +- collection name ([e014558](https://github.com/nrkno/tv-automation-server-core/commit/e014558)) +- corrects the default baseline template ([bf4eb03](https://github.com/nrkno/tv-automation-server-core/commit/bf4eb03)) +- Ctrl-S in template editor triggers a save ([bacbc3e](https://github.com/nrkno/tv-automation-server-core/commit/bacbc3e)) +- defer triggerExternalMessage so as not to block timelineUpdate's ([ba7383f](https://github.com/nrkno/tv-automation-server-core/commit/ba7383f)) +- dev Collections bug, due to collections being filled in later ([43e8856](https://github.com/nrkno/tv-automation-server-core/commit/43e8856)) +- dev debug data function ([e4570e2](https://github.com/nrkno/tv-automation-server-core/commit/e4570e2)) +- device is first created as Abstract ([98dca79](https://github.com/nrkno/tv-automation-server-core/commit/98dca79)) +- disable client-side RO updates ([72ba831](https://github.com/nrkno/tv-automation-server-core/commit/72ba831)) +- disable fullscreen overlay in developer mode ([7cc2e43](https://github.com/nrkno/tv-automation-server-core/commit/7cc2e43)) +- disable runtimeFunction caching during code-test & save ([74d6d34](https://github.com/nrkno/tv-automation-server-core/commit/74d6d34)) +- disable runtimeFunction caching during code-test & save ([e21f8dd](https://github.com/nrkno/tv-automation-server-core/commit/e21f8dd)) +- do not error CountdownItemLabel when sourceLayer is not found ([9451d1c](https://github.com/nrkno/tv-automation-server-core/commit/9451d1c)) +- do not show empty string values in L3rd popup ([b0c6c8e](https://github.com/nrkno/tv-automation-server-core/commit/b0c6c8e)) +- don't send devicesMakeReady until verified no other runningOrders are active ([953a1a7](https://github.com/nrkno/tv-automation-server-core/commit/953a1a7)) +- don't wait for subscriptions before rendering ([2bbfa20](https://github.com/nrkno/tv-automation-server-core/commit/2bbfa20)) +- Dont generate ui outputlayers for sli which are virtual ([c0ad368](https://github.com/nrkno/tv-automation-server-core/commit/c0ad368)) +- dont set nora\_\* config values in initDB ([1330008](https://github.com/nrkno/tv-automation-server-core/commit/1330008)) +- duration settling ([0648f57](https://github.com/nrkno/tv-automation-server-core/commit/0648f57)) +- Editattribute type typing ([392f4aa](https://github.com/nrkno/tv-automation-server-core/commit/392f4aa)) +- Editattribute type typing ([1206d0c](https://github.com/nrkno/tv-automation-server-core/commit/1206d0c)) +- EditAttribute: dropdown options was always strings ([814cdf7](https://github.com/nrkno/tv-automation-server-core/commit/814cdf7)) +- End of Show marker line doesn't end where it should ([e188c97](https://github.com/nrkno/tv-automation-server-core/commit/e188c97)) +- Ensure lookahead ids are always unique ([26f6637](https://github.com/nrkno/tv-automation-server-core/commit/26f6637)) +- ensure the same overlap is used for autonext and the previous sl ([efb39e6](https://github.com/nrkno/tv-automation-server-core/commit/efb39e6)) +- Ensure the sl overlapDuration is respected on autonext. ([8c3bf3e](https://github.com/nrkno/tv-automation-server-core/commit/8c3bf3e)) +- error when content.boxSourceConfiguration is undefined ([81c896b](https://github.com/nrkno/tv-automation-server-core/commit/81c896b)) +- error when content.boxSourceConfiguration is undefined ([fc7ec40](https://github.com/nrkno/tv-automation-server-core/commit/fc7ec40)) +- externalMessage: priority of messages to send ([cffcd97](https://github.com/nrkno/tv-automation-server-core/commit/cffcd97)) +- externalMessages upd ([a803882](https://github.com/nrkno/tv-automation-server-core/commit/a803882)) +- filter on json files on restore backup file selector ([1a0b867](https://github.com/nrkno/tv-automation-server-core/commit/1a0b867)) +- Fix context.runHelper not working in templates. ([36ca5f3](https://github.com/nrkno/tv-automation-server-core/commit/36ca5f3)) +- fix for strange (temporary?) error about method missing ([0db30ae](https://github.com/nrkno/tv-automation-server-core/commit/0db30ae)) +- fix PTZ Testing harness ([97bccc7](https://github.com/nrkno/tv-automation-server-core/commit/97bccc7)) +- force lookahead inGroup field to be emptied. Fixes mismatched statobj ([c76209c](https://github.com/nrkno/tv-automation-server-core/commit/c76209c)) +- generate statObject per device ([82a0736](https://github.com/nrkno/tv-automation-server-core/commit/82a0736)) +- getSnapshot: don't ask devices of type OTHER ([ea874d4](https://github.com/nrkno/tv-automation-server-core/commit/ea874d4)) +- getting monaco to work runtime while still having typings ([5db8218](https://github.com/nrkno/tv-automation-server-core/commit/5db8218)) +- global ad-lib order was wrong, basline blueprint did not set \_rank ([ffbacc8](https://github.com/nrkno/tv-automation-server-core/commit/ffbacc8)) +- Guard against there being no next segmentline ([849d97f](https://github.com/nrkno/tv-automation-server-core/commit/849d97f)) +- GUI: settings: only show parent-devices in left menu (only they have settings on them) ([ecb164e](https://github.com/nrkno/tv-automation-server-core/commit/ecb164e)) +- handle both update & insert of runningOrder ([3701bb3](https://github.com/nrkno/tv-automation-server-core/commit/3701bb3)) +- handle both update & insert of runningOrder ([84a6c53](https://github.com/nrkno/tv-automation-server-core/commit/84a6c53)) +- handle when nexting before start or after end ([506bb8a](https://github.com/nrkno/tv-automation-server-core/commit/506bb8a)) +- has played styling shouldn't be applied to Guest and Remote segments ([18bdc82](https://github.com/nrkno/tv-automation-server-core/commit/18bdc82)) +- lock down package.json & update package-lock, to get release2 to build ([472f8ab](https://github.com/nrkno/tv-automation-server-core/commit/472f8ab)) +- **init:** adds qwerty to bakskjerm ([a45de4d](https://github.com/nrkno/tv-automation-server-core/commit/a45de4d)) +- head mute audio and hold on last frame ([ceec7f6](https://github.com/nrkno/tv-automation-server-core/commit/ceec7f6)) +- Hide Keyboard focus marker when not in studio mode ([70dc6b0](https://github.com/nrkno/tv-automation-server-core/commit/70dc6b0)) +- HOLD add new llayer to initDB ([650b6e6](https://github.com/nrkno/tv-automation-server-core/commit/650b6e6)) +- holdState = 0 displayed a status ([49c7ead](https://github.com/nrkno/tv-automation-server-core/commit/49c7ead)) +- holdState = 0 displayed a status ([aacd140](https://github.com/nrkno/tv-automation-server-core/commit/aacd140)) +- hot fix for rehearsal activation when an RO is already active ([648c02d](https://github.com/nrkno/tv-automation-server-core/commit/648c02d)) +- if the next:ed segment is removed, instead next the one in its place ([22597b3](https://github.com/nrkno/tv-automation-server-core/commit/22597b3)) +- Improve missing mosId error message ([89695fb](https://github.com/nrkno/tv-automation-server-core/commit/89695fb)) +- improved queries & added index ([159f6d5](https://github.com/nrkno/tv-automation-server-core/commit/159f6d5)) +- incorrect typings for template editor ([9d021df](https://github.com/nrkno/tv-automation-server-core/commit/9d021df)) +- Increase size of template editor to make it better fill the screen ([3212d7b](https://github.com/nrkno/tv-automation-server-core/commit/3212d7b)) +- Infinite items dont stop against a absolute 0 item properly. ([78c1499](https://github.com/nrkno/tv-automation-server-core/commit/78c1499)) +- infinite segment line tidying and fixes ([8469ffb](https://github.com/nrkno/tv-automation-server-core/commit/8469ffb)) +- Infinite segmentline bad guard when calculating the current infinites that caused the process to stop early ([2f9abeb](https://github.com/nrkno/tv-automation-server-core/commit/2f9abeb)) +- infinite segmentlines crossing an autonext throwing a duplicate key exception ([93b2a30](https://github.com/nrkno/tv-automation-server-core/commit/93b2a30)) +- init state properly ([2572cdc](https://github.com/nrkno/tv-automation-server-core/commit/2572cdc)) +- initDB for pharos lights ([57fbc73](https://github.com/nrkno/tv-automation-server-core/commit/57fbc73)) +- initiateDB update for PTZ ([e529782](https://github.com/nrkno/tv-automation-server-core/commit/e529782)) +- issue with rehearsal double-activation warning ([17b4e95](https://github.com/nrkno/tv-automation-server-core/commit/17b4e95)) +- issue with roPrepareForBroadcast ([c3ad30c](https://github.com/nrkno/tv-automation-server-core/commit/c3ad30c)) +- keys should be handled at up, not down ([957f583](https://github.com/nrkno/tv-automation-server-core/commit/957f583)) +- labels in modal dialogs ([3af18fc](https://github.com/nrkno/tv-automation-server-core/commit/3af18fc)) +- limit db fetches to active running order ([f3aca8f](https://github.com/nrkno/tv-automation-server-core/commit/f3aca8f)) +- locked [@babel](https://github.com/babel)/runtime version & updated package-lock ([8e62d2f](https://github.com/nrkno/tv-automation-server-core/commit/8e62d2f)) +- lookahead object id not being set correctly ([594a1e7](https://github.com/nrkno/tv-automation-server-core/commit/594a1e7)) +- made editor height dynamic ([c68ac4f](https://github.com/nrkno/tv-automation-server-core/commit/c68ac4f)) +- made editor height dynamic ([7f5f40e](https://github.com/nrkno/tv-automation-server-core/commit/7f5f40e)) +- Major refactoring, splitting code into separate files depending on their areas: "rundown": General rundown manipulation, "media-scanner": Media-scanner, "mos": mos-specific functions ([db82375](https://github.com/nrkno/tv-automation-server-core/commit/db82375)) +- make the context menu available in the entire header ([0590f9d](https://github.com/nrkno/tv-automation-server-core/commit/0590f9d)) +- make the FullScreen detection more lenient ([215d73c](https://github.com/nrkno/tv-automation-server-core/commit/215d73c)) +- Make the head to kam wipe not use the mosartVariant field. Correct the head order checking ([6030755](https://github.com/nrkno/tv-automation-server-core/commit/6030755)) +- mediaobjects to use computed field ([dba858f](https://github.com/nrkno/tv-automation-server-core/commit/dba858f)) +- mediaobjects to use computed field ([39d13b5](https://github.com/nrkno/tv-automation-server-core/commit/39d13b5)) +- Migration for stk&full audio remapping ([2491f52](https://github.com/nrkno/tv-automation-server-core/commit/2491f52)) +- Migration UI fixes ([b141243](https://github.com/nrkno/tv-automation-server-core/commit/b141243)) +- minor ui fix on status page ([97fc3c2](https://github.com/nrkno/tv-automation-server-core/commit/97fc3c2)) +- miss in merge ([93106b1](https://github.com/nrkno/tv-automation-server-core/commit/93106b1)) +- missing argument for mediaStatusCheck ([658e82a](https://github.com/nrkno/tv-automation-server-core/commit/658e82a)) +- Missing typings on ShowStyle ([a0a4e14](https://github.com/nrkno/tv-automation-server-core/commit/a0a4e14)) +- Mix transitions ([5cf2314](https://github.com/nrkno/tv-automation-server-core/commit/5cf2314)) +- Mix transitions ([0ebf3e1](https://github.com/nrkno/tv-automation-server-core/commit/0ebf3e1)) +- modified timestamp on imported blueprints was not being set, causing the cache to not be cleared properly ([2f3fd17](https://github.com/nrkno/tv-automation-server-core/commit/2f3fd17)) +- monaco typing error fix ([e73467e](https://github.com/nrkno/tv-automation-server-core/commit/e73467e)) +- move back executeFunction to peripheralDeviceAPI ([226289f](https://github.com/nrkno/tv-automation-server-core/commit/226289f)) +- new implementation of runtime caching ([767fbb7](https://github.com/nrkno/tv-automation-server-core/commit/767fbb7)) +- new implementation of runtime caching ([92e09be](https://github.com/nrkno/tv-automation-server-core/commit/92e09be)) +- new lawo source mappings ([20f7d5a](https://github.com/nrkno/tv-automation-server-core/commit/20f7d5a)) +- normalize naming scheme to 'runtimeArguments', normalize hotkey labels ([528679d](https://github.com/nrkno/tv-automation-server-core/commit/528679d)) +- NymansPlayground caused issues in Timeline ([83e772d](https://github.com/nrkno/tv-automation-server-core/commit/83e772d)) +- on startup, clear old connection statuses ([e9d7cba](https://github.com/nrkno/tv-automation-server-core/commit/e9d7cba)) +- onAir line jumping around on takes ([8330112](https://github.com/nrkno/tv-automation-server-core/commit/8330112)) +- optimize saveIntoDB ([65c189e](https://github.com/nrkno/tv-automation-server-core/commit/65c189e)) +- Persist SegmentLine.updateStoryStatus ([427b24c](https://github.com/nrkno/tv-automation-server-core/commit/427b24c)) +- playout, lookahead: use the originalLayer instear of isAbstract ([30fe842](https://github.com/nrkno/tv-automation-server-core/commit/30fe842)) +- PR changes ([c877aad](https://github.com/nrkno/tv-automation-server-core/commit/c877aad)) +- prevent default action for f1 & f3 ([53b2f22](https://github.com/nrkno/tv-automation-server-core/commit/53b2f22)) +- prevent take + autotake bug ([b3d9a4d](https://github.com/nrkno/tv-automation-server-core/commit/b3d9a4d)) +- proper dispose of executeFunction checkReply after execution is done ([523ec99](https://github.com/nrkno/tv-automation-server-core/commit/523ec99)) +- R3 ONLY: bugfix: reload data from ENPS ([cc6ed44](https://github.com/nrkno/tv-automation-server-core/commit/cc6ed44)) +- re-add blueprint & mosdatacache restore (to be deprecated later) ([886c756](https://github.com/nrkno/tv-automation-server-core/commit/886c756)) +- re-added monaco typings and disabled import, so it works client-side ([1226763](https://github.com/nrkno/tv-automation-server-core/commit/1226763)) +- re-timing vignett ([17fbced](https://github.com/nrkno/tv-automation-server-core/commit/17fbced)) +- react errors while rendering nymansPlayground ([0c245d3](https://github.com/nrkno/tv-automation-server-core/commit/0c245d3)) +- React unique keys ([4f728d9](https://github.com/nrkno/tv-automation-server-core/commit/4f728d9)) +- refactor storeSnapshot methods ([6e66394](https://github.com/nrkno/tv-automation-server-core/commit/6e66394)) +- refactored execMethod, so it doesn't use promises and causes unhandled promise rejections ([24da71b](https://github.com/nrkno/tv-automation-server-core/commit/24da71b)) +- refactored reset-segmentLine further ([0523eb6](https://github.com/nrkno/tv-automation-server-core/commit/0523eb6)) +- refactored/DRYd adminMode & studioMode, disabled trashbin-button for externalMessages when not in adminMode ([b29dae1](https://github.com/nrkno/tv-automation-server-core/commit/b29dae1)) +- relative durations causing type warnings for ui code ([5249435](https://github.com/nrkno/tv-automation-server-core/commit/5249435)) +- Release 3 only: disable config missing warning ([921cc82](https://github.com/nrkno/tv-automation-server-core/commit/921cc82)) +- remount monaco ([4ce1566](https://github.com/nrkno/tv-automation-server-core/commit/4ce1566)) +- remove debug line in nightly cronjob ([dda3017](https://github.com/nrkno/tv-automation-server-core/commit/dda3017)) +- remove deprecated options ([ab7275b](https://github.com/nrkno/tv-automation-server-core/commit/ab7275b)) +- remove full-screen button, add label ([5e9826e](https://github.com/nrkno/tv-automation-server-core/commit/5e9826e)) +- remove full-screen button, add label ([5c9a3e5](https://github.com/nrkno/tv-automation-server-core/commit/5c9a3e5)) +- remove some console.logs ([a9f3f53](https://github.com/nrkno/tv-automation-server-core/commit/a9f3f53)) +- Remove timestamps from blueprint backups ([74fa1b3](https://github.com/nrkno/tv-automation-server-core/commit/74fa1b3)) +- remove unused imports ([5fe6ac3](https://github.com/nrkno/tv-automation-server-core/commit/5fe6ac3)) +- remove unused translation helper ([e545a9e](https://github.com/nrkno/tv-automation-server-core/commit/e545a9e)) +- removed autopublish and insecure packages, we'll implement publications and allow/deny rules from now on ([213998d](https://github.com/nrkno/tv-automation-server-core/commit/213998d)) +- **blueprints:** Ensure the object ids generated by the post-process blueprint are unique ([bdee540](https://github.com/nrkno/tv-automation-server-core/commit/bdee540)) +- **cam/dir:** clear hotkeys ([2545de8](https://github.com/nrkno/tv-automation-server-core/commit/2545de8)) +- **countdowns:** ignore sourceLayers that we don't have an icon for ([27b2ac0](https://github.com/nrkno/tv-automation-server-core/commit/27b2ac0)) +- **emberplus:** changes intiDB mapping to new .-delimited string format ([b6d8bc7](https://github.com/nrkno/tv-automation-server-core/commit/b6d8bc7)) +- **externalMessage:** encode proper html-entities in strings ([243995c](https://github.com/nrkno/tv-automation-server-core/commit/243995c)) +- **FirstObjects:** Reverts regression introduced by removing isAbstract from firstObject items ([8f1608b](https://github.com/nrkno/tv-automation-server-core/commit/8f1608b)) +- **hold:** Disable transition when in HOLD ([cfcb141](https://github.com/nrkno/tv-automation-server-core/commit/cfcb141)) +- **hold:** Disable transition when leaving HOLD ([6b7184c](https://github.com/nrkno/tv-automation-server-core/commit/6b7184c)) +- **hold:** Ensure the original stk does not get picked up as a dynamic object when setting the sl as next ([b10f48d](https://github.com/nrkno/tv-automation-server-core/commit/b10f48d)) +- **hold:** Ensure the original stk does not get picked up as a dynamic object when setting the sl as next ([22da4d8](https://github.com/nrkno/tv-automation-server-core/commit/22da4d8)) +- **hold:** Too many sli being extended for hold mode ([f644e32](https://github.com/nrkno/tv-automation-server-core/commit/f644e32)) +- update Next-line when inserting story just before it, also added property to track if the next point was set manually ([d82dbc6](https://github.com/nrkno/tv-automation-server-core/commit/d82dbc6)) +- **hold:** keep showing any infinite items that existed on the previous sl ([21a9973](https://github.com/nrkno/tv-automation-server-core/commit/21a9973)) +- **hold:** When extending a sli during hold, use the original id to make any triggers on the sli work ([a3fd1a6](https://github.com/nrkno/tv-automation-server-core/commit/a3fd1a6)) +- **infinite items:** removes infinite icon from outOnNextSegment ([4a75d7d](https://github.com/nrkno/tv-automation-server-core/commit/4a75d7d)) +- **init:** Adds default lawo device settings ([28759df](https://github.com/nrkno/tv-automation-server-core/commit/28759df)) +- **init:** adds qwerty to bakskjerm ([7329976](https://github.com/nrkno/tv-automation-server-core/commit/7329976)) +- **init:** adds qwerty to bakskjerm ([78198c9](https://github.com/nrkno/tv-automation-server-core/commit/78198c9)) +- **init:** hides klokke and logo layers by default ([1847ca4](https://github.com/nrkno/tv-automation-server-core/commit/1847ca4)) +- **init:** Layer names ([221b374](https://github.com/nrkno/tv-automation-server-core/commit/221b374)) +- **init:** Layer names ([16a504c](https://github.com/nrkno/tv-automation-server-core/commit/16a504c)) +- **init:** Splits init_layers and init_config. ([e056e5a](https://github.com/nrkno/tv-automation-server-core/commit/e056e5a)) +- **init:** swaps MP2 and MP1NXT layers ([b8a370c](https://github.com/nrkno/tv-automation-server-core/commit/b8a370c)) +- **init:** updated channel orders after 2-caspar setup ([3404b9b](https://github.com/nrkno/tv-automation-server-core/commit/3404b9b)) +- **Init:** Creat empty settings for Nora ([f8d0669](https://github.com/nrkno/tv-automation-server-core/commit/f8d0669)) +- **Init:** fixes wrong mapping of Lawo RMs ([ee68432](https://github.com/nrkno/tv-automation-server-core/commit/ee68432)) +- **Init:** Sets init defaults to xpro ([fd9c182](https://github.com/nrkno/tv-automation-server-core/commit/fd9c182)) +- **Initdb:** Preload vignett ([9470318](https://github.com/nrkno/tv-automation-server-core/commit/9470318)) +- **Initdb:** Preload vignett ([156a454](https://github.com/nrkno/tv-automation-server-core/commit/156a454)) +- setAsNext on previous ([4ffe665](https://github.com/nrkno/tv-automation-server-core/commit/4ffe665)) +- **iterateDeeply:** typos ([c9198f1](https://github.com/nrkno/tv-automation-server-core/commit/c9198f1)) +- **lawo:** changes tempaltes to new structure ([29bf666](https://github.com/nrkno/tv-automation-server-core/commit/29bf666)) +- **lawo:** more generic timeline object ([b0418ab](https://github.com/nrkno/tv-automation-server-core/commit/b0418ab)) +- **lookahead:** clear inGroup in a better fashion ([60541cc](https://github.com/nrkno/tv-automation-server-core/commit/60541cc)) +- **lookahead:** consider transitions properly in lookahead ([c78c6fa](https://github.com/nrkno/tv-automation-server-core/commit/c78c6fa)) +- **lookahead:** Dont run lookahead on abs0 sli if there is an active transition. ([bb4123a](https://github.com/nrkno/tv-automation-server-core/commit/bb4123a)) +- **lookahead:** Dont run lookahead on abs0 sli if there is an active transition. ([191df09](https://github.com/nrkno/tv-automation-server-core/commit/191df09)) +- **lookahead:** Fix lookahead when transition does not define clip. Fix duplicate key exception when using hold multiple times at the same point ([a1bb026](https://github.com/nrkno/tv-automation-server-core/commit/a1bb026)) +- **lookahead:** Fix lookahead when transition object starts at abs0 ([bd3edbd](https://github.com/nrkno/tv-automation-server-core/commit/bd3edbd)) +- **lookahead:** Fix lookahead when transition object starts at abs0 ([c88c830](https://github.com/nrkno/tv-automation-server-core/commit/c88c830)) +- **lookahead:** Ignore transition if this is the first sl and so no transition will be used ([3df2e1e](https://github.com/nrkno/tv-automation-server-core/commit/3df2e1e)) +- **lookahead:** Not using transition info when in a segmentline with no previous segmentline ([917b34e](https://github.com/nrkno/tv-automation-server-core/commit/917b34e)) +- **lookahead:** Resolving an object for both transition clip and main clip causing an extra loadbg ([739b5e4](https://github.com/nrkno/tv-automation-server-core/commit/739b5e4)) +- **lookahead:** Resolving an object for both transition clip and main clip causing an extra loadbg ([875bd1a](https://github.com/nrkno/tv-automation-server-core/commit/875bd1a)) +- **media formats:** do not 2x interlaced frame rates ([1639c32](https://github.com/nrkno/tv-automation-server-core/commit/1639c32)) +- **migration:** Missing studio0_audio_bed ([1c6edcc](https://github.com/nrkno/tv-automation-server-core/commit/1c6edcc)) +- **migration:** overrideSteps should be applied before .validate() is run, so overrideSteps works independent of the validation result. ([c9c1f25](https://github.com/nrkno/tv-automation-server-core/commit/c9c1f25)) +- **NRK Template:** Use LLayers Enum ([84ed5df](https://github.com/nrkno/tv-automation-server-core/commit/84ed5df)) +- **pharos:** add missing settingsType and migration step ([9f73a8e](https://github.com/nrkno/tv-automation-server-core/commit/9f73a8e)) +- **playout:** Double head2 headline out animation ([7ec91ff](https://github.com/nrkno/tv-automation-server-core/commit/7ec91ff)) +- **playout:** R4 only partial merge of dc249a31b342e8bdbeb7faac064dd97cec15c3e8. Fix sl duration with autonext and no transitions ([17175c3](https://github.com/nrkno/tv-automation-server-core/commit/17175c3)) +- **playout:** sl with autoNextOverlap not getting applied properly ([eb22967](https://github.com/nrkno/tv-automation-server-core/commit/eb22967)) +- **presenter screen:** display hours correctly ([e242a9e](https://github.com/nrkno/tv-automation-server-core/commit/e242a9e)) +- **record:** CR changes ([b3adbec](https://github.com/nrkno/tv-automation-server-core/commit/b3adbec)) +- **record:** Hide internal layer mappings ([24dfef1](https://github.com/nrkno/tv-automation-server-core/commit/24dfef1)) +- **RO view:** Always persist original event in user-action methods ([6ba7df8](https://github.com/nrkno/tv-automation-server-core/commit/6ba7df8)) +- **snapshot:** SegmentLines were not being included in the snapshot ([d9a427e](https://github.com/nrkno/tv-automation-server-core/commit/d9a427e)) +- removed ntp server debug code ([b9857e7](https://github.com/nrkno/tv-automation-server-core/commit/b9857e7)) +- removed old, deprecated attr ([bf0cdfd](https://github.com/nrkno/tv-automation-server-core/commit/bf0cdfd)) +- removed uploadFileToAtem function, this should be done in devicesMakeReady ([4e96bb3](https://github.com/nrkno/tv-automation-server-core/commit/4e96bb3)) +- Removing trailing slashes in url defaults ([f6fa32c](https://github.com/nrkno/tv-automation-server-core/commit/f6fa32c)) +- rename rundownAPI => runningOrderAPI ([89d48d0](https://github.com/nrkno/tv-automation-server-core/commit/89d48d0)) +- resetRunningOrder functionality in GUI ([4eb096a](https://github.com/nrkno/tv-automation-server-core/commit/4eb096a)) +- resetRunningorder should update timeline ([0d01e6a](https://github.com/nrkno/tv-automation-server-core/commit/0d01e6a)) +- resetRunningorder should update timeline ([35451b1](https://github.com/nrkno/tv-automation-server-core/commit/35451b1)) +- resetting running order rewind ([a122f2c](https://github.com/nrkno/tv-automation-server-core/commit/a122f2c)) +- resolve merge issue ([0cbc75a](https://github.com/nrkno/tv-automation-server-core/commit/0cbc75a)) +- Respect disableOutTransition on SegmentLine during manual takes (not just autonext) ([f19788d](https://github.com/nrkno/tv-automation-server-core/commit/f19788d)) +- retry strategy for restart casparcg cronjob ([b54f0f6](https://github.com/nrkno/tv-automation-server-core/commit/b54f0f6)) +- Revert 594a1e7 ([edeb166](https://github.com/nrkno/tv-automation-server-core/commit/edeb166)) +- rewind icon was not responsive in ROFullscreenControls ([2e7c1d2](https://github.com/nrkno/tv-automation-server-core/commit/2e7c1d2)) +- rewind icon was not responsive in ROFullscreenControls ([0e494df](https://github.com/nrkno/tv-automation-server-core/commit/0e494df)) +- rewind UI even if reset returns error ([08c5d6b](https://github.com/nrkno/tv-automation-server-core/commit/08c5d6b)) +- reworked systemStatus to use components instead ([cccfe3c](https://github.com/nrkno/tv-automation-server-core/commit/cccfe3c)) +- RO buttons z-order ([3c53254](https://github.com/nrkno/tv-automation-server-core/commit/3c53254)) +- RO buttons z-order ([15e9da8](https://github.com/nrkno/tv-automation-server-core/commit/15e9da8)) +- RO overview crashed during rebuild of RO ([d2c62a1](https://github.com/nrkno/tv-automation-server-core/commit/d2c62a1)) +- ro-reset does not reset properly ([6367658](https://github.com/nrkno/tv-automation-server-core/commit/6367658)) +- roReset should reset holdItems and infinites ([bdf8385](https://github.com/nrkno/tv-automation-server-core/commit/bdf8385)) +- run afterUpdateTimeline after timelineTriggerTime ([98ece60](https://github.com/nrkno/tv-automation-server-core/commit/98ece60)) +- Rundown name dissappearing from view ([91dcc21](https://github.com/nrkno/tv-automation-server-core/commit/91dcc21)) +- running order closing prompt ([7074cc3](https://github.com/nrkno/tv-automation-server-core/commit/7074cc3)) +- Set KAM source layer, and a probably incorrect duration (but its now non-zero) ([6e152f0](https://github.com/nrkno/tv-automation-server-core/commit/6e152f0)) +- setAsNext on previous ([6ced09b](https://github.com/nrkno/tv-automation-server-core/commit/6ced09b)) +- setAsNext on previous line no longer shows default state, but now instead stalls when attempting to take ([e441aaf](https://github.com/nrkno/tv-automation-server-core/commit/e441aaf)) +- show media errors in segment header ([3775d2e](https://github.com/nrkno/tv-automation-server-core/commit/3775d2e)) +- since afterUpdateTimeline is called in from a syncFunctionIgnore-function, we can remove the timeout ([e7f8f25](https://github.com/nrkno/tv-automation-server-core/commit/e7f8f25)) +- sl prod init ([2ff4a46](https://github.com/nrkno/tv-automation-server-core/commit/2ff4a46)) +- smoother handling when reloading ENPS data ([83be7cb](https://github.com/nrkno/tv-automation-server-core/commit/83be7cb)) +- snapshots ([182c221](https://github.com/nrkno/tv-automation-server-core/commit/182c221)) +- SOAP message encoding ([63d8634](https://github.com/nrkno/tv-automation-server-core/commit/63d8634)) +- SOAP message encoding ([b19ea77](https://github.com/nrkno/tv-automation-server-core/commit/b19ea77)) +- Start on template for KAM ÅPNING ([4cd682f](https://github.com/nrkno/tv-automation-server-core/commit/4cd682f)) +- status colors ([46fdaf1](https://github.com/nrkno/tv-automation-server-core/commit/46fdaf1)) +- StudioInstallation key-value config tidying ([4b0bc1a](https://github.com/nrkno/tv-automation-server-core/commit/4b0bc1a)) +- styling fix for z-order with menu and RO buttons ([1b0717e](https://github.com/nrkno/tv-automation-server-core/commit/1b0717e)) +- subscription handling ([8aaa3ec](https://github.com/nrkno/tv-automation-server-core/commit/8aaa3ec)) +- super.componentWillUnmount is required ([2342e48](https://github.com/nrkno/tv-automation-server-core/commit/2342e48)) +- syntax errors in test file ([a8f5d1e](https://github.com/nrkno/tv-automation-server-core/commit/a8f5d1e)) +- systemStatus \_internal messages ([d150f54](https://github.com/nrkno/tv-automation-server-core/commit/d150f54)) +- systemStatus messages ([e595e5b](https://github.com/nrkno/tv-automation-server-core/commit/e595e5b)) +- take action should not throw as nasty errors when called by user. ([6791d50](https://github.com/nrkno/tv-automation-server-core/commit/6791d50)) +- templates with wipe. Readd seperate audio file ([5be2802](https://github.com/nrkno/tv-automation-server-core/commit/5be2802)) +- temporary fix of typing error ([73bf56d](https://github.com/nrkno/tv-automation-server-core/commit/73bf56d)) +- text shadow in SegmentLineLabels ([3a310b1](https://github.com/nrkno/tv-automation-server-core/commit/3a310b1)) +- tie snapshot to evaluation ([ec18370](https://github.com/nrkno/tv-automation-server-core/commit/ec18370)) +- Timeline always being built without previous segmentline ([a077805](https://github.com/nrkno/tv-automation-server-core/commit/a077805)) +- timeline dep ([b26eecb](https://github.com/nrkno/tv-automation-server-core/commit/b26eecb)) +- timeline resolution bug for non-infinite items ([35fc40a](https://github.com/nrkno/tv-automation-server-core/commit/35fc40a)) +- timeline statobj didn't update on inactivate (empty timeline) ([839b906](https://github.com/nrkno/tv-automation-server-core/commit/839b906)) +- timeline statObject: updated hashing function ([e00a01c](https://github.com/nrkno/tv-automation-server-core/commit/e00a01c)) +- timesync: better retry strategy on startup sync ([eda632a](https://github.com/nrkno/tv-automation-server-core/commit/eda632a)) +- toc trace message ([c53124f](https://github.com/nrkno/tv-automation-server-core/commit/c53124f)) +- too long script out-words could overlap with previous items ([8f8a9a2](https://github.com/nrkno/tv-automation-server-core/commit/8f8a9a2)) +- top RO overview labels clipped in wrong places ([5e5c228](https://github.com/nrkno/tv-automation-server-core/commit/5e5c228)) +- Tweaked styling of evaluation form, warning messages, color of the next lines, translations, capialized warning icon file name, and optimized png and svg icons. ([50d2753](https://github.com/nrkno/tv-automation-server-core/commit/50d2753)) +- tweaks on externalMessage send function, limiting the number of messages sent in one go ([046ae38](https://github.com/nrkno/tv-automation-server-core/commit/046ae38)) +- type bug ([de43835](https://github.com/nrkno/tv-automation-server-core/commit/de43835)) +- **sticky:** Fix sticky items with objects using relative triggers or durations ([0c47cff](https://github.com/nrkno/tv-automation-server-core/commit/0c47cff)) +- type error in SegmentTimelineContainer ([c4d6b4d](https://github.com/nrkno/tv-automation-server-core/commit/c4d6b4d)) +- typing ([7c21efe](https://github.com/nrkno/tv-automation-server-core/commit/7c21efe)) +- typing fix: cannot find name 'monaco' ([3ad88ce](https://github.com/nrkno/tv-automation-server-core/commit/3ad88ce)) +- typing fixes, to work with updated packages ([b4362f7](https://github.com/nrkno/tv-automation-server-core/commit/b4362f7)) +- typo bug in performanceMonitor ([6a5eeb4](https://github.com/nrkno/tv-automation-server-core/commit/6a5eeb4)) +- typo bug in performanceMonitor ([797c393](https://github.com/nrkno/tv-automation-server-core/commit/797c393)) +- UI tweaks for messages status view. so it doesn't break when having long error messages ([ca1e3ae](https://github.com/nrkno/tv-automation-server-core/commit/ca1e3ae)) +- upd meteor typings ([53f17d2](https://github.com/nrkno/tv-automation-server-core/commit/53f17d2)) +- update all data in roReplaceMetadata ([8a5a671](https://github.com/nrkno/tv-automation-server-core/commit/8a5a671)) +- **transition:** Delay sli not contents, to ensure relative triggers against the sli are correct (fixes sluttvignett with transition) ([856da4b](https://github.com/nrkno/tv-automation-server-core/commit/856da4b)) +- update design of presenter screen ([4f41195](https://github.com/nrkno/tv-automation-server-core/commit/4f41195)) +- Update names passed to SegmentLineItems ([ed0fc0d](https://github.com/nrkno/tv-automation-server-core/commit/ed0fc0d)) +- update ro data cache when getting new metadata ([d700783](https://github.com/nrkno/tv-automation-server-core/commit/d700783)) +- update supertimeline ([28bccfe](https://github.com/nrkno/tv-automation-server-core/commit/28bccfe)) +- update timeline dependency ([b83f6be](https://github.com/nrkno/tv-automation-server-core/commit/b83f6be)) +- Update timeline on removing a mos story ([fd3d443](https://github.com/nrkno/tv-automation-server-core/commit/fd3d443)) +- Update TimelineObjCCGRoute. ([203ef91](https://github.com/nrkno/tv-automation-server-core/commit/203ef91)) +- **template:** Caspar portion of in-transition for segmentline rerun whenever timeline was recalculated ([3373457](https://github.com/nrkno/tv-automation-server-core/commit/3373457)) +- updated health endpoint according to spec ([c196382](https://github.com/nrkno/tv-automation-server-core/commit/c196382)) +- **template:** graphic supers group using wrong trigger. ([e28d1ef](https://github.com/nrkno/tv-automation-server-core/commit/e28d1ef)) +- **template:** Reduce volume of head wipes ([b2092cc](https://github.com/nrkno/tv-automation-server-core/commit/b2092cc)) +- **template:** setup dsk properly ([2e8309c](https://github.com/nrkno/tv-automation-server-core/commit/2e8309c)) +- **templates:** Fix incorrect camera number used with head transition. Hook in sluttvignett. Fix segments not respecting overlapduration if no transition is used ([00b7cdd](https://github.com/nrkno/tv-automation-server-core/commit/00b7cdd)) +- **templates:** use enum for nora channels ([55c0cfc](https://github.com/nrkno/tv-automation-server-core/commit/55c0cfc)) +- **templates:** Various tweaks ([eb93c6a](https://github.com/nrkno/tv-automation-server-core/commit/eb93c6a)) +- **Test:** Verifying build and deploy script ([0b13e18](https://github.com/nrkno/tv-automation-server-core/commit/0b13e18)) +- **timeline:** don't round items in relative mode ([2938819](https://github.com/nrkno/tv-automation-server-core/commit/2938819)) +- updated package-lock.json ([bf0cfde](https://github.com/nrkno/tv-automation-server-core/commit/bf0cfde)) +- **timeline:** Infinite sli do not update properly on new mos data. Fix detection of the end of the chain, and ensure the last is set to not infinite ([61b2930](https://github.com/nrkno/tv-automation-server-core/commit/61b2930)) +- **timeline:** Infinite sli do not update properly on new mos data. Fix detection of the end of the chain, and ensure the last is set to not infinite ([16d9715](https://github.com/nrkno/tv-automation-server-core/commit/16d9715)) +- **Timeline:** Corrects the angle of the gradient indication mix-in-transition on a segmentLineItem ([151ecf9](https://github.com/nrkno/tv-automation-server-core/commit/151ecf9)) +- **transition:** reverses direction of wipe transitions ([9961a3f](https://github.com/nrkno/tv-automation-server-core/commit/9961a3f)) +- **transition:** Using wrong overlap when combined with autonext ([4c56102](https://github.com/nrkno/tv-automation-server-core/commit/4c56102)) +- **transitions:** Ensure they are run with the correct overlap on autonext ([bbc6ca2](https://github.com/nrkno/tv-automation-server-core/commit/bbc6ca2)) +- **transitions:** Timed graphics being run wrong ([8b39960](https://github.com/nrkno/tv-automation-server-core/commit/8b39960)) +- updated nightly cronjob: restart casparcg devices, to work with new restartCasparCG function implementation ([edbc186](https://github.com/nrkno/tv-automation-server-core/commit/edbc186)) +- **vignett:** do not preload vignett, as it is risky business preloading sluttvignett. Could be done better by separating vignett and sluttvignett ([b0da067](https://github.com/nrkno/tv-automation-server-core/commit/b0da067)) +- **vignett:** do not preload vignett, as it is risky business preloading sluttvignett. Could be done better by separating vignett and sluttvignett ([8bf7ff8](https://github.com/nrkno/tv-automation-server-core/commit/8bf7ff8)) +- updated mock data ([a7a4ae5](https://github.com/nrkno/tv-automation-server-core/commit/a7a4ae5)) +- updated mock data ([3e140c6](https://github.com/nrkno/tv-automation-server-core/commit/3e140c6)) +- updated nightly cronjob: restart casparcg devices, to work with new restartCasparCG function implementation ([3f9344d](https://github.com/nrkno/tv-automation-server-core/commit/3f9344d)) +- updated systemTime endpoint ([503d2c8](https://github.com/nrkno/tv-automation-server-core/commit/503d2c8)) +- updated timeline dep (bugfixes) ([ff29ce6](https://github.com/nrkno/tv-automation-server-core/commit/ff29ce6)) +- updated versions file ([f6c9869](https://github.com/nrkno/tv-automation-server-core/commit/f6c9869)) +- use DisplayName field for graphic elements ([e2e9014](https://github.com/nrkno/tv-automation-server-core/commit/e2e9014)) +- Use thin styling for a solo 'AUTO' label ([74b5f15](https://github.com/nrkno/tv-automation-server-core/commit/74b5f15)) +- Use thin styling for a solo 'AUTO' label ([0c26d38](https://github.com/nrkno/tv-automation-server-core/commit/0c26d38)) +- use unique id for baseline items cache entries ([cf89409](https://github.com/nrkno/tv-automation-server-core/commit/cf89409)) +- **zoom:** moved zoom modifier for scroll action to ctrl ([863d81e](https://github.com/nrkno/tv-automation-server-core/commit/863d81e)) +- **zoom:** moved zoom modifier for scroll action to ctrl ([80829f2](https://github.com/nrkno/tv-automation-server-core/commit/80829f2)) +- userActivity executionTime logging ([a3e763e](https://github.com/nrkno/tv-automation-server-core/commit/a3e763e)) +- when activating, set Next if not set ([c9f71a1](https://github.com/nrkno/tv-automation-server-core/commit/c9f71a1)) +- when overriding componentWillUnmount, we need to call this.\_cleanup() ([0f39cd4](https://github.com/nrkno/tv-automation-server-core/commit/0f39cd4)) +- wrap ntpClient.getNetworkTime() in try/catch, as an attempt to fix fatal error thrown ([cd44862](https://github.com/nrkno/tv-automation-server-core/commit/cd44862)) ### Features -* add a subtle line underneath segment title when has-remote-items and has-guest-items ([4b1d582](https://github.com/nrkno/tv-automation-server-core/commit/4b1d582)) -* add a subtle line underneath segment title when has-remote-items and has-guest-items ([a02b50d](https://github.com/nrkno/tv-automation-server-core/commit/a02b50d)) -* Add backup link to backup only active template data ([cdfffdf](https://github.com/nrkno/tv-automation-server-core/commit/cdfffdf)) -* Add backup restore method to import mock rundowns similar to the embedded mocks ([251555b](https://github.com/nrkno/tv-automation-server-core/commit/251555b)) -* Add backup restore method to import mock rundowns similar to the embedded mocks ([d71d9c7](https://github.com/nrkno/tv-automation-server-core/commit/d71d9c7)) -* Add http put request timeline object ([14f391c](https://github.com/nrkno/tv-automation-server-core/commit/14f391c)) -* add migration steps, logging ([96aae63](https://github.com/nrkno/tv-automation-server-core/commit/96aae63)) -* add performance monitor and track all server-side methods ([385f703](https://github.com/nrkno/tv-automation-server-core/commit/385f703)) -* add performance monitor and track all server-side methods ([2733d74](https://github.com/nrkno/tv-automation-server-core/commit/2733d74)) -* add peripheralDevice expectedVersions, to throw error if device version is too low. Refactor /health endpoint. ([51ed4c3](https://github.com/nrkno/tv-automation-server-core/commit/51ed4c3)) -* add rewind button ([9fd61b5](https://github.com/nrkno/tv-automation-server-core/commit/9fd61b5)) -* add rewind button ([f235a25](https://github.com/nrkno/tv-automation-server-core/commit/f235a25)) -* Add runHelper method to template context ([ebc477a](https://github.com/nrkno/tv-automation-server-core/commit/ebc477a)) -* Add running order name to top of run page ([674c392](https://github.com/nrkno/tv-automation-server-core/commit/674c392)) -* Add SegmentLineItem.infiniteMode value for items which are infinite within the SegmentLine ([e99c661](https://github.com/nrkno/tv-automation-server-core/commit/e99c661)) -* Add some new template config data for sources information ([3e48508](https://github.com/nrkno/tv-automation-server-core/commit/3e48508)) -* add sourceLayerType.LIGHTS ([0554251](https://github.com/nrkno/tv-automation-server-core/commit/0554251)) -* Add typeSubVariant field to SegmentLine. ([#46](https://github.com/nrkno/tv-automation-server-core/issues/46)) ([82bd4bd](https://github.com/nrkno/tv-automation-server-core/commit/82bd4bd)) -* Add typeSubVariant field to SegmentLine. ([#46](https://github.com/nrkno/tv-automation-server-core/issues/46)) ([4af88d3](https://github.com/nrkno/tv-automation-server-core/commit/4af88d3)) -* add warnings for wrong field order ([c4d23d8](https://github.com/nrkno/tv-automation-server-core/commit/c4d23d8)) -* added .timings object to SegmentLine, to track take/playout times during playout ([5d860b3](https://github.com/nrkno/tv-automation-server-core/commit/5d860b3)) -* added "develop=1" to url, which re-enables right-click, for dev ([b73522c](https://github.com/nrkno/tv-automation-server-core/commit/b73522c)) -* added afterBroadcast form ([e98b59e](https://github.com/nrkno/tv-automation-server-core/commit/e98b59e)) -* added async database functions ([a754a24](https://github.com/nrkno/tv-automation-server-core/commit/a754a24)) -* added client-side logging wrapper ([06597be](https://github.com/nrkno/tv-automation-server-core/commit/06597be)) -* added connection status of peripheralDevices ([c0e0a94](https://github.com/nrkno/tv-automation-server-core/commit/c0e0a94)) -* added context.runningOrder, for blueprints to use ([855f6d4](https://github.com/nrkno/tv-automation-server-core/commit/855f6d4)) -* added device version to status page ([ed0acda](https://github.com/nrkno/tv-automation-server-core/commit/ed0acda)) -* added SegmentLine.timings.stoppedPlayback property ([2121245](https://github.com/nrkno/tv-automation-server-core/commit/2121245)) -* **init:** bakskjerm type ([8ffe776](https://github.com/nrkno/tv-automation-server-core/commit/8ffe776)) -* Added dynamic template context ([0ea4849](https://github.com/nrkno/tv-automation-server-core/commit/0ea4849)) -* added executionTime to userAction ([1ca92c1](https://github.com/nrkno/tv-automation-server-core/commit/1ca92c1)) -* added getAllSegments, to use in metadata-template ([f8a5514](https://github.com/nrkno/tv-automation-server-core/commit/f8a5514)) -* added indexes for all collections ([6ef324c](https://github.com/nrkno/tv-automation-server-core/commit/6ef324c)) -* added kill process buttons to device status UI ([6fdab68](https://github.com/nrkno/tv-automation-server-core/commit/6fdab68)) -* added killProcess method, to be used by integration tests of gateways in closed environments ([7f2b42c](https://github.com/nrkno/tv-automation-server-core/commit/7f2b42c)) -* added MeteorReactComponent, which exposes subscribe & autorun, which will stop automatically on component unmount ([cf11808](https://github.com/nrkno/tv-automation-server-core/commit/cf11808)) -* added name and type to peripheralDevice ([915c518](https://github.com/nrkno/tv-automation-server-core/commit/915c518)) -* added packages: mocha and typescript ([8b19269](https://github.com/nrkno/tv-automation-server-core/commit/8b19269)) -* added peripheralDevice.lastConnected, to be used for sorting so they wont jump around in the UI ([08e97f7](https://github.com/nrkno/tv-automation-server-core/commit/08e97f7)) -* added pingWithCommand method, used by watchdog ([6f6427b](https://github.com/nrkno/tv-automation-server-core/commit/6f6427b)) -* Added publications for all running order data, and changed some interfaces ([2365fd2](https://github.com/nrkno/tv-automation-server-core/commit/2365fd2)) -* added SegmentLine.timings.takeDone property ([d18d539](https://github.com/nrkno/tv-automation-server-core/commit/d18d539)) -* added some shadow to the status dots ([04df33c](https://github.com/nrkno/tv-automation-server-core/commit/04df33c)) -* added support for typescript ([d3471b3](https://github.com/nrkno/tv-automation-server-core/commit/d3471b3)) -* added temporary deploy script ([244fb5b](https://github.com/nrkno/tv-automation-server-core/commit/244fb5b)) -* added test-data for testing and mocking ([b277c3c](https://github.com/nrkno/tv-automation-server-core/commit/b277c3c)) -* added tests stub ([edd4b6e](https://github.com/nrkno/tv-automation-server-core/commit/edd4b6e)) -* added tictac for troubleshooting timings ([df91cea](https://github.com/nrkno/tv-automation-server-core/commit/df91cea)) -* added Timeline data structure ([35ce6db](https://github.com/nrkno/tv-automation-server-core/commit/35ce6db)) -* added timestamp to externalMessage error ([e13d1d8](https://github.com/nrkno/tv-automation-server-core/commit/e13d1d8)) -* added timings property to adlig segmentLineItems ([b333bf1](https://github.com/nrkno/tv-automation-server-core/commit/b333bf1)) -* added unsyncedTime ([8fcffb5](https://github.com/nrkno/tv-automation-server-core/commit/8fcffb5)) -* added updateStoryStatus. The yellow line will only be driven when this is set to true ([c7ec8da](https://github.com/nrkno/tv-automation-server-core/commit/c7ec8da)) -* Adjust split box values ([680eb11](https://github.com/nrkno/tv-automation-server-core/commit/680eb11)) -* allow ? as 'any' field/frame type ([c950fba](https://github.com/nrkno/tv-automation-server-core/commit/c950fba)) -* Allow StudioInstallation to define entries in the hotkey legend ([74c1c1c](https://github.com/nrkno/tv-automation-server-core/commit/74c1c1c)) -* ask before closing an active RO (if allowed by browser) ([16ee66b](https://github.com/nrkno/tv-automation-server-core/commit/16ee66b)) -* Atem SuperSource properties support ([2688142](https://github.com/nrkno/tv-automation-server-core/commit/2688142)) -* autonext property is defined on the current SegmentLine rather than the next ([09441db](https://github.com/nrkno/tv-automation-server-core/commit/09441db)) -* backend implementation of migration (wip) ([8762ca3](https://github.com/nrkno/tv-automation-server-core/commit/8762ca3)) -* backup and restore show styles (including templates) through ui ([9758b2c](https://github.com/nrkno/tv-automation-server-core/commit/9758b2c)) -* block take if duration since startedPlayback/take less than X ([99d41b9](https://github.com/nrkno/tv-automation-server-core/commit/99d41b9)) -* Break nrk templates into seperate files. Parse KAM templates better ([2ec0433](https://github.com/nrkno/tv-automation-server-core/commit/2ec0433)) -* change heavy-light display style ([91a1931](https://github.com/nrkno/tv-automation-server-core/commit/91a1931)) -* changed keyboard shortcuts ([ef02f7c](https://github.com/nrkno/tv-automation-server-core/commit/ef02f7c)) -* changed restart CasparCG functionality ([dd567c2](https://github.com/nrkno/tv-automation-server-core/commit/dd567c2)) -* clean up: show style, blueprint, blueprint logic names in UI ([e1ae6a7](https://github.com/nrkno/tv-automation-server-core/commit/e1ae6a7)) -* codeControl: create syncFunctions which finer grained execution control based on arguments ([f53607f](https://github.com/nrkno/tv-automation-server-core/commit/f53607f)) -* continued implementation of Migration (wip) ([72fbcb5](https://github.com/nrkno/tv-automation-server-core/commit/72fbcb5)) -* converted app.js to typescript and added an example subscription-implementation ([da439af](https://github.com/nrkno/tv-automation-server-core/commit/da439af)) -* converted more subscriptions (WIP) ([e047fef](https://github.com/nrkno/tv-automation-server-core/commit/e047fef)) -* converted StudioInstallation into a class, adding getConfigValue as member method, a step towards DRY ([4af278e](https://github.com/nrkno/tv-automation-server-core/commit/4af278e)) -* CoreSystem initial implementation ([06369b2](https://github.com/nrkno/tv-automation-server-core/commit/06369b2)) -* countdown to running order expectedStart ([7b505c5](https://github.com/nrkno/tv-automation-server-core/commit/7b505c5)) -* cron job for restarting casparcg ([19898d1](https://github.com/nrkno/tv-automation-server-core/commit/19898d1)) -* Define all special blueprints as options in the showstyle ([7e1da16](https://github.com/nrkno/tv-automation-server-core/commit/7e1da16)) -* disable in next segmentLine & refactoring ([669166c](https://github.com/nrkno/tv-automation-server-core/commit/669166c)) -* display ms in user activity log ([7fc2744](https://github.com/nrkno/tv-automation-server-core/commit/7fc2744)) -* display ms in user activity log ([5172f2e](https://github.com/nrkno/tv-automation-server-core/commit/5172f2e)) -* do not block click-to-take when trigger is absolute 0 ([cec86ca](https://github.com/nrkno/tv-automation-server-core/commit/cec86ca)) -* ensure each sli has a mosId set ([57c977d](https://github.com/nrkno/tv-automation-server-core/commit/57c977d)) -* expose moment to templates ([c2a1cc5](https://github.com/nrkno/tv-automation-server-core/commit/c2a1cc5)) -* externalMessage: allow for multiple messages to be generated at the same time ([284efbe](https://github.com/nrkno/tv-automation-server-core/commit/284efbe)) -* externalMessages implementation (it works now) ([3b8e88a](https://github.com/nrkno/tv-automation-server-core/commit/3b8e88a)) -* f9, f10 buttons step next forward & down (shift reverses direction) ([a3be0cf](https://github.com/nrkno/tv-automation-server-core/commit/a3be0cf)) -* force some function to run synchronously. experimental, WIP! ([55a064c](https://github.com/nrkno/tv-automation-server-core/commit/55a064c)) -* force some function to run synchronously. experimental, WIP! ([54d83dd](https://github.com/nrkno/tv-automation-server-core/commit/54d83dd)) -* full implementation of mos-functions, profile 0 & 2 ([4bafeeb](https://github.com/nrkno/tv-automation-server-core/commit/4bafeeb)) -* Grafikk lookahead/preload ([78828fe](https://github.com/nrkno/tv-automation-server-core/commit/78828fe)) -* Grafikk lookahead/preload ([30a6b03](https://github.com/nrkno/tv-automation-server-core/commit/30a6b03)) -* implement Panasonic PTZ device ([42d8534](https://github.com/nrkno/tv-automation-server-core/commit/42d8534)) -* **record:** Create timelineobjects to control recording to the timeline. Add config to the db, and ui to edit it ([b5e4ebf](https://github.com/nrkno/tv-automation-server-core/commit/b5e4ebf)) -* handle mos updates with dynamicallyInserted segmentLines ([1d292c0](https://github.com/nrkno/tv-automation-server-core/commit/1d292c0)) -* handle roList reply on reload RunningOrder data, also more refactoring & cleanup ([cee70c5](https://github.com/nrkno/tv-automation-server-core/commit/cee70c5)) -* HOLD mode ([ae1dacf](https://github.com/nrkno/tv-automation-server-core/commit/ae1dacf)) -* HOLD mode ([e41c5a4](https://github.com/nrkno/tv-automation-server-core/commit/e41c5a4)) -* Hold state UI ([d835efc](https://github.com/nrkno/tv-automation-server-core/commit/d835efc)) -* Hold state UI ([c7a17c7](https://github.com/nrkno/tv-automation-server-core/commit/c7a17c7)) -* hyperdeck device ([#49](https://github.com/nrkno/tv-automation-server-core/issues/49)) ([c706628](https://github.com/nrkno/tv-automation-server-core/commit/c706628)) -* if template 'getId' returns null, don't throw an error. Also when templateId is not found, send warning instead of an error ([d98f09d](https://github.com/nrkno/tv-automation-server-core/commit/d98f09d)) -* implement camera number-device mapping for PTZ ([374568d](https://github.com/nrkno/tv-automation-server-core/commit/374568d)) -* implement click-to-adlib completely ([577dcac](https://github.com/nrkno/tv-automation-server-core/commit/577dcac)) -* implement Panasonic PTZ settings ([f7840da](https://github.com/nrkno/tv-automation-server-core/commit/f7840da)) -* implement spliting long scripts into beginning and end in popup ([9fa8006](https://github.com/nrkno/tv-automation-server-core/commit/9fa8006)) -* implementation of disable-next-segmentLineItem ([a06d196](https://github.com/nrkno/tv-automation-server-core/commit/a06d196)) -* implemented mos profiles 0-2 ([d803da1](https://github.com/nrkno/tv-automation-server-core/commit/d803da1)) -* Implemented Notes into data structure & GUI ([735b8c5](https://github.com/nrkno/tv-automation-server-core/commit/735b8c5)) -* implemented partial timeline fix ([c8b56e4](https://github.com/nrkno/tv-automation-server-core/commit/c8b56e4)) -* implemented stricter typing & changed classes to ReactMeteorComponent where applicable ([9d2166e](https://github.com/nrkno/tv-automation-server-core/commit/9d2166e)) -* improved layout for presenter countdowns ([2bd61cc](https://github.com/nrkno/tv-automation-server-core/commit/2bd61cc)) -* Infinite segmentlineitem ([c02a641](https://github.com/nrkno/tv-automation-server-core/commit/c02a641)) -* initial implementation of externalMessages, (not working yet) ([ace91f1](https://github.com/nrkno/tv-automation-server-core/commit/ace91f1)) -* Initial timings for opening templates ([a9bfb66](https://github.com/nrkno/tv-automation-server-core/commit/a9bfb66)) -* Interfaces for describing the timeline, segments (titles), layers ([ea96dfb](https://github.com/nrkno/tv-automation-server-core/commit/ea96dfb)) -* KAM SLUTT variant ([e819269](https://github.com/nrkno/tv-automation-server-core/commit/e819269)) -* List, start and stop test recordings ([df552ab](https://github.com/nrkno/tv-automation-server-core/commit/df552ab)) -* load atem ssrc background when activating RO ([0eda9b4](https://github.com/nrkno/tv-automation-server-core/commit/0eda9b4)) -* log warning message when trying to access a studio.config value that hasn't been set. ([7e706c6](https://github.com/nrkno/tv-automation-server-core/commit/7e706c6)) -* lookahead ([5ed0f13](https://github.com/nrkno/tv-automation-server-core/commit/5ed0f13)) -* media scanner & casparcg launcher hostnames ([02ec8be](https://github.com/nrkno/tv-automation-server-core/commit/02ec8be)) -* MeteorReactComponent: return subscription & computation handle ([e20e6de](https://github.com/nrkno/tv-automation-server-core/commit/e20e6de)) -* method "ping" to be called by devices every now and then, to update lastSeen ([41a996c](https://github.com/nrkno/tv-automation-server-core/commit/41a996c)) -* Migration UI & started adding migration steps ([2a117ad](https://github.com/nrkno/tv-automation-server-core/commit/2a117ad)) -* Migration: added more migration steps for 0.16.0 ([2ac06ea](https://github.com/nrkno/tv-automation-server-core/commit/2ac06ea)) -* Migration: continued impl. ([8982701](https://github.com/nrkno/tv-automation-server-core/commit/8982701)) -* Move SegmentLine duration calculation into templates ([315eb42](https://github.com/nrkno/tv-automation-server-core/commit/315eb42)) -* Move sofie and metadata urls from templates to config ([af8e388](https://github.com/nrkno/tv-automation-server-core/commit/af8e388)) -* moved nightly cronjob to run after 4am ([8eb4e12](https://github.com/nrkno/tv-automation-server-core/commit/8eb4e12)) -* only log logger.debug() when in developer mode ([8ed8e71](https://github.com/nrkno/tv-automation-server-core/commit/8ed8e71)) -* optimization: add cache of blueprints, to avoid having to parse text-functions all the time ([1e469d9](https://github.com/nrkno/tv-automation-server-core/commit/1e469d9)) -* place all collections in Collections object, for debugging purposes ([9682a89](https://github.com/nrkno/tv-automation-server-core/commit/9682a89)) -* playout device debugLogging (wip) ([7ab4ec6](https://github.com/nrkno/tv-automation-server-core/commit/7ab4ec6)) -* prevent next:ing of currently playing segmentLine ([b9c9ea1](https://github.com/nrkno/tv-automation-server-core/commit/b9c9ea1)) -* prompter-view ([f45a923](https://github.com/nrkno/tv-automation-server-core/commit/f45a923)) -* Read all templates from database ([3287f63](https://github.com/nrkno/tv-automation-server-core/commit/3287f63)) -* refactor of subscriptions (WIP) ([2b6f994](https://github.com/nrkno/tv-automation-server-core/commit/2b6f994)) -* refactor systemStatus & add status messages on front page ([14da61a](https://github.com/nrkno/tv-automation-server-core/commit/14da61a)) -* refactor to use relative durations. affects infinite segmentlineitems, autonext, segmentline overlapduration property ([67c5444](https://github.com/nrkno/tv-automation-server-core/commit/67c5444)) -* refactored initDB into 2 separate methods, so we can easilly update just the layers and not the infrastructure ([d4fcc3f](https://github.com/nrkno/tv-automation-server-core/commit/d4fcc3f)) -* reimplement fullscreen/on air button ([4b8658d](https://github.com/nrkno/tv-automation-server-core/commit/4b8658d)) -* rename /clock into /countdowns/presenter ([96c3136](https://github.com/nrkno/tv-automation-server-core/commit/96c3136)) -* reset 'dirty' segment lines by re-running blueprints on them ([064a84d](https://github.com/nrkno/tv-automation-server-core/commit/064a84d)) -* restart CasparCG from UI ([64509c3](https://github.com/nrkno/tv-automation-server-core/commit/64509c3)) -* reworked externalMessages page ([3b87242](https://github.com/nrkno/tv-automation-server-core/commit/3b87242)) -* reworked the whole activate/deacticate/reset/reload logic ([1fea56e](https://github.com/nrkno/tv-automation-server-core/commit/1fea56e)) -* Rewrite templateContext.getConfigValue to get default values from defaultConfig 'blueprint' and to cache values ([6ce0f97](https://github.com/nrkno/tv-automation-server-core/commit/6ce0f97)) -* running order full-screen marker ([03010ec](https://github.com/nrkno/tv-automation-server-core/commit/03010ec)) -* second upload to atem ([6697a80](https://github.com/nrkno/tv-automation-server-core/commit/6697a80)) -* segment line arguments ([3c5313a](https://github.com/nrkno/tv-automation-server-core/commit/3c5313a)) -* send evaluation message to slack. WIP ([3dcbe3a](https://github.com/nrkno/tv-automation-server-core/commit/3dcbe3a)) -* send evaluation message to slack. WIP ([96e8b81](https://github.com/nrkno/tv-automation-server-core/commit/96e8b81)) -* server side implementation of queueabilified adlibs ([0527b3b](https://github.com/nrkno/tv-automation-server-core/commit/0527b3b)) -* set triggerValue to lawo-TimelineObjs, so it triggers upon Nexting ([e3df655](https://github.com/nrkno/tv-automation-server-core/commit/e3df655)) -* show changed timestamp on script items ([f2955e1](https://github.com/nrkno/tv-automation-server-core/commit/f2955e1)) -* show user name in evaluations ([c59d7ee](https://github.com/nrkno/tv-automation-server-core/commit/c59d7ee)) -* ShowStyle templates can be marked as helpers and accessed from other templates ([a20ffa7](https://github.com/nrkno/tv-automation-server-core/commit/a20ffa7)) -* Split (DVE 2LIKE) template ([8ccf23e](https://github.com/nrkno/tv-automation-server-core/commit/8ccf23e)) -* Start of stk and grafikk templates ([0458e3e](https://github.com/nrkno/tv-automation-server-core/commit/0458e3e)) -* started on mos device data implementation ([1d3b19a](https://github.com/nrkno/tv-automation-server-core/commit/1d3b19a)) -* started working on integration tests, added a client-side stub ([c4cbadc](https://github.com/nrkno/tv-automation-server-core/commit/c4cbadc)) -* status endpoint /health updated to use device statuses ([2c4b7fa](https://github.com/nrkno/tv-automation-server-core/commit/2c4b7fa)) -* StudioInstallation key-value config store for template settings ([b37ea17](https://github.com/nrkno/tv-automation-server-core/commit/b37ea17)) -* StudioInstallation key-value config store for template settings ([812c313](https://github.com/nrkno/tv-automation-server-core/commit/812c313)) -* support for Pharos device ([4a99fb3](https://github.com/nrkno/tv-automation-server-core/commit/4a99fb3)) -* support preload lookahead mode for nora, which swaps out take commands for cue ([4cfd4fe](https://github.com/nrkno/tv-automation-server-core/commit/4cfd4fe)) -* Switch to single-device design ([a268c40](https://github.com/nrkno/tv-automation-server-core/commit/a268c40)) -* System snapshot ([006027b](https://github.com/nrkno/tv-automation-server-core/commit/006027b)) -* system version status monitoring ([1c96263](https://github.com/nrkno/tv-automation-server-core/commit/1c96263)) -* take snapshot before running migration ([3ae4e92](https://github.com/nrkno/tv-automation-server-core/commit/3ae4e92)) -* take snapshot when saving evaluation form ([df318bb](https://github.com/nrkno/tv-automation-server-core/commit/df318bb)) -* templates: added format functions for timecode ([ea38081](https://github.com/nrkno/tv-automation-server-core/commit/ea38081)) -* timings page ([6bc325a](https://github.com/nrkno/tv-automation-server-core/commit/6bc325a)) -* toggle running order argument on an SL with a hotkey ([258c3b3](https://github.com/nrkno/tv-automation-server-core/commit/258c3b3)) -* Transition as a seperate SegmentLineItem, which is not run if the first SegmentLine in the show, or the previous SegmentLine instructs it to not ([e676a43](https://github.com/nrkno/tv-automation-server-core/commit/e676a43)) -* translation improvements ([d3a535d](https://github.com/nrkno/tv-automation-server-core/commit/d3a535d)) -* Treat sli marked as virtual solely as markers for the timeline. They are hidden from the ui and are not allowed to place any contents on the timeline ([25e0f42](https://github.com/nrkno/tv-automation-server-core/commit/25e0f42)) -* unsynced mode ([#51](https://github.com/nrkno/tv-automation-server-core/issues/51)) ([7e0a263](https://github.com/nrkno/tv-automation-server-core/commit/7e0a263)) -* update meteor typings ([49b6969](https://github.com/nrkno/tv-automation-server-core/commit/49b6969)) -* Update template to use correct media files and durations. Adjust transitions from head to kam ([18f6c44](https://github.com/nrkno/tv-automation-server-core/commit/18f6c44)) -* Update timeline and infinite items on enps update ([db0c041](https://github.com/nrkno/tv-automation-server-core/commit/db0c041)) -* updated timeline dependency ([6ef9eb7](https://github.com/nrkno/tv-automation-server-core/commit/6ef9eb7)) -* use date-picker for user-activity-log ([5e2c218](https://github.com/nrkno/tv-automation-server-core/commit/5e2c218)) -* use default renderer for MIC sourceLayerType ([ce845d4](https://github.com/nrkno/tv-automation-server-core/commit/ce845d4)) -* use default renderer for MIC sourceLayerType ([6ab97b7](https://github.com/nrkno/tv-automation-server-core/commit/6ab97b7)) -* use generated svg as icons in countdown ([843ad10](https://github.com/nrkno/tv-automation-server-core/commit/843ad10)) -* warn media status for interlacing and fps ([fc3ac4b](https://github.com/nrkno/tv-automation-server-core/commit/fc3ac4b)) -* **asRunLog:** collection implementation ([0e63c36](https://github.com/nrkno/tv-automation-server-core/commit/0e63c36)) -* **asRunLog:** implementation of asRunLog ([62f5b8c](https://github.com/nrkno/tv-automation-server-core/commit/62f5b8c)) -* **aux:** Adds tecnical error aux 2 ([34ce710](https://github.com/nrkno/tv-automation-server-core/commit/34ce710)) -* **AUX:** adds clock aux ([45479da](https://github.com/nrkno/tv-automation-server-core/commit/45479da)) -* **AUXes:** New AUX-mapping introducing more previews and moves the cleanfeed ([548bd8c](https://github.com/nrkno/tv-automation-server-core/commit/548bd8c)) -* **blueprint:** refactor getConfigValue into the blueprints, with context exposing the raw array as getConfig instead ([5b0ac39](https://github.com/nrkno/tv-automation-server-core/commit/5b0ac39)) -* **Capabilities:** Added basic Lawo and ATEM capabilities ([90d6edd](https://github.com/nrkno/tv-automation-server-core/commit/90d6edd)) -* **click-to-take:** initial WIP ([8e63808](https://github.com/nrkno/tv-automation-server-core/commit/8e63808)) -* **click-to-take:** more work in progress ([e3549e0](https://github.com/nrkno/tv-automation-server-core/commit/e3549e0)) -* **device:** Custom make-ready commands for httpsend device ([410a2ef](https://github.com/nrkno/tv-automation-server-core/commit/410a2ef)) -* **ENV:** adds ENV vars for default devices - casparcg, atem and lawo ([9bf8eee](https://github.com/nrkno/tv-automation-server-core/commit/9bf8eee)) -* **Guest input:** use isGuestInput like isRemoteInput ([2d40e87](https://github.com/nrkno/tv-automation-server-core/commit/2d40e87)) -* **init:** adds clear shortcuts + skippabloe ([f824ae5](https://github.com/nrkno/tv-automation-server-core/commit/f824ae5)) -* **init:** adds multiple bak source layers ([c812510](https://github.com/nrkno/tv-automation-server-core/commit/c812510)) -* **init:** Adds RM 4,5,6 ([0021d7b](https://github.com/nrkno/tv-automation-server-core/commit/0021d7b)) -* **init:** Adds RM 4,5,6 ([dd59d47](https://github.com/nrkno/tv-automation-server-core/commit/dd59d47)) -* **init:** adds studio monitor html player to casparcg ([6533b0f](https://github.com/nrkno/tv-automation-server-core/commit/6533b0f)) -* **init:** moves countdown to casparcg machine 2, channel 1 ([6c93464](https://github.com/nrkno/tv-automation-server-core/commit/6c93464)) -* **init:** moves countdown to casparcg machine 2, channel 1 ([18c354b](https://github.com/nrkno/tv-automation-server-core/commit/18c354b)) -* **iterateDeeply:** exports iterateDeeply to template context ([42cc886](https://github.com/nrkno/tv-automation-server-core/commit/42cc886)) -* **lawo:** New structure to lawo devices and mappings ([35d812b](https://github.com/nrkno/tv-automation-server-core/commit/35d812b)) -* **loggin:** uses logger for better kibana logs ([8d31691](https://github.com/nrkno/tv-automation-server-core/commit/8d31691)) -* **migration:** add previousVersion and buttons in GUI to revert database version ([61525a5](https://github.com/nrkno/tv-automation-server-core/commit/61525a5)) -* **migration:** display returned error message in GUI ([6169048](https://github.com/nrkno/tv-automation-server-core/commit/6169048)) -* **Next:** Adds warning/fallback of not loaded clips ([e20bc2f](https://github.com/nrkno/tv-automation-server-core/commit/e20bc2f)) -* **peripheralDevices:** added collection, publication, api, access control and tests ([794b5be](https://github.com/nrkno/tv-automation-server-core/commit/794b5be)) -* **playout:** Add class to sli first_object to indicate if sli is from the current or previous sl ([8de6004](https://github.com/nrkno/tv-automation-server-core/commit/8de6004)) -* **playout:** Add class to sli first_object when the sli is a continuation of another ([d53f06b](https://github.com/nrkno/tv-automation-server-core/commit/d53f06b)) -* **Prompter:** implement a simple mirror mode ([8d0be4e](https://github.com/nrkno/tv-automation-server-core/commit/8d0be4e)) -* **record:** basic video player page ([138b8b9](https://github.com/nrkno/tv-automation-server-core/commit/138b8b9)) -* **record:** Controls to delete files ([4236db2](https://github.com/nrkno/tv-automation-server-core/commit/4236db2)) -* **record:** Input field for user to give recording a name ([116ea9f](https://github.com/nrkno/tv-automation-server-core/commit/116ea9f)) -* **RO view:** Introduce a 'duration settling' state to delay the UI update until the actual playout duration is received from playout ([28823c3](https://github.com/nrkno/tv-automation-server-core/commit/28823c3)) -* **Setting:** adds lawo setting to studio and devices ([5ab1717](https://github.com/nrkno/tv-automation-server-core/commit/5ab1717)) -* **shortcuts:** adds shortcuts to remove various graphic layers ([0d1a83d](https://github.com/nrkno/tv-automation-server-core/commit/0d1a83d)) -* **shortcuts:** standarize shortcut label display, support numpad ([4c5ba74](https://github.com/nrkno/tv-automation-server-core/commit/4c5ba74)) -* **snapshot:** continued implementation ([009e9e5](https://github.com/nrkno/tv-automation-server-core/commit/009e9e5)) -* **snapshot:** edit snapshot comments ([264638a](https://github.com/nrkno/tv-automation-server-core/commit/264638a)) -* **snapshot:** Implement snapshots, API endpoints & restore ([72e1a83](https://github.com/nrkno/tv-automation-server-core/commit/72e1a83)) -* **snapshot:** snapshot restore/backup GUI ([c414f70](https://github.com/nrkno/tv-automation-server-core/commit/c414f70)) -* **snapshot:** take snapshot of runningOrder & restore ([fc34f73](https://github.com/nrkno/tv-automation-server-core/commit/fc34f73)) -* **template:** setup atem wipe transition ([f0c576c](https://github.com/nrkno/tv-automation-server-core/commit/f0c576c)) -* **template:** temporary env variable for nora group (MESOS_NORA_GROUP) ([8b00bc4](https://github.com/nrkno/tv-automation-server-core/commit/8b00bc4)) -* **template:** use upstream keyer for vignett playback. Adds some more layers for atem defaults, and overrides to stack changes better ([76b1e10](https://github.com/nrkno/tv-automation-server-core/commit/76b1e10)) -* **Template doc:** Added CasparCG resources ([80f98d5](https://github.com/nrkno/tv-automation-server-core/commit/80f98d5)) -* **templates:** Use ShowStyle to define default/fallback state. Play and stop head supers ([8375363](https://github.com/nrkno/tv-automation-server-core/commit/8375363)) -* **Templates:** Start parsing some new mos data. Process mesos based graphics. Set some lawo audio states ([df4b670](https://github.com/nrkno/tv-automation-server-core/commit/df4b670)) -* **timeline:** some initial work on labels taking account of liveline ([3086eec](https://github.com/nrkno/tv-automation-server-core/commit/3086eec)) -* **Timeline:** more work on new marker style ([570e408](https://github.com/nrkno/tv-automation-server-core/commit/570e408)) -* warnings for media in wrong resolution ([55135c1](https://github.com/nrkno/tv-automation-server-core/commit/55135c1)) +- add a subtle line underneath segment title when has-remote-items and has-guest-items ([4b1d582](https://github.com/nrkno/tv-automation-server-core/commit/4b1d582)) +- add a subtle line underneath segment title when has-remote-items and has-guest-items ([a02b50d](https://github.com/nrkno/tv-automation-server-core/commit/a02b50d)) +- Add backup link to backup only active template data ([cdfffdf](https://github.com/nrkno/tv-automation-server-core/commit/cdfffdf)) +- Add backup restore method to import mock rundowns similar to the embedded mocks ([251555b](https://github.com/nrkno/tv-automation-server-core/commit/251555b)) +- Add backup restore method to import mock rundowns similar to the embedded mocks ([d71d9c7](https://github.com/nrkno/tv-automation-server-core/commit/d71d9c7)) +- Add http put request timeline object ([14f391c](https://github.com/nrkno/tv-automation-server-core/commit/14f391c)) +- add migration steps, logging ([96aae63](https://github.com/nrkno/tv-automation-server-core/commit/96aae63)) +- add performance monitor and track all server-side methods ([385f703](https://github.com/nrkno/tv-automation-server-core/commit/385f703)) +- add performance monitor and track all server-side methods ([2733d74](https://github.com/nrkno/tv-automation-server-core/commit/2733d74)) +- add peripheralDevice expectedVersions, to throw error if device version is too low. Refactor /health endpoint. ([51ed4c3](https://github.com/nrkno/tv-automation-server-core/commit/51ed4c3)) +- add rewind button ([9fd61b5](https://github.com/nrkno/tv-automation-server-core/commit/9fd61b5)) +- add rewind button ([f235a25](https://github.com/nrkno/tv-automation-server-core/commit/f235a25)) +- Add runHelper method to template context ([ebc477a](https://github.com/nrkno/tv-automation-server-core/commit/ebc477a)) +- Add running order name to top of run page ([674c392](https://github.com/nrkno/tv-automation-server-core/commit/674c392)) +- Add SegmentLineItem.infiniteMode value for items which are infinite within the SegmentLine ([e99c661](https://github.com/nrkno/tv-automation-server-core/commit/e99c661)) +- Add some new template config data for sources information ([3e48508](https://github.com/nrkno/tv-automation-server-core/commit/3e48508)) +- add sourceLayerType.LIGHTS ([0554251](https://github.com/nrkno/tv-automation-server-core/commit/0554251)) +- Add typeSubVariant field to SegmentLine. ([#46](https://github.com/nrkno/tv-automation-server-core/issues/46)) ([82bd4bd](https://github.com/nrkno/tv-automation-server-core/commit/82bd4bd)) +- Add typeSubVariant field to SegmentLine. ([#46](https://github.com/nrkno/tv-automation-server-core/issues/46)) ([4af88d3](https://github.com/nrkno/tv-automation-server-core/commit/4af88d3)) +- add warnings for wrong field order ([c4d23d8](https://github.com/nrkno/tv-automation-server-core/commit/c4d23d8)) +- added .timings object to SegmentLine, to track take/playout times during playout ([5d860b3](https://github.com/nrkno/tv-automation-server-core/commit/5d860b3)) +- added "develop=1" to url, which re-enables right-click, for dev ([b73522c](https://github.com/nrkno/tv-automation-server-core/commit/b73522c)) +- added afterBroadcast form ([e98b59e](https://github.com/nrkno/tv-automation-server-core/commit/e98b59e)) +- added async database functions ([a754a24](https://github.com/nrkno/tv-automation-server-core/commit/a754a24)) +- added client-side logging wrapper ([06597be](https://github.com/nrkno/tv-automation-server-core/commit/06597be)) +- added connection status of peripheralDevices ([c0e0a94](https://github.com/nrkno/tv-automation-server-core/commit/c0e0a94)) +- added context.runningOrder, for blueprints to use ([855f6d4](https://github.com/nrkno/tv-automation-server-core/commit/855f6d4)) +- added device version to status page ([ed0acda](https://github.com/nrkno/tv-automation-server-core/commit/ed0acda)) +- added SegmentLine.timings.stoppedPlayback property ([2121245](https://github.com/nrkno/tv-automation-server-core/commit/2121245)) +- **init:** bakskjerm type ([8ffe776](https://github.com/nrkno/tv-automation-server-core/commit/8ffe776)) +- Added dynamic template context ([0ea4849](https://github.com/nrkno/tv-automation-server-core/commit/0ea4849)) +- added executionTime to userAction ([1ca92c1](https://github.com/nrkno/tv-automation-server-core/commit/1ca92c1)) +- added getAllSegments, to use in metadata-template ([f8a5514](https://github.com/nrkno/tv-automation-server-core/commit/f8a5514)) +- added indexes for all collections ([6ef324c](https://github.com/nrkno/tv-automation-server-core/commit/6ef324c)) +- added kill process buttons to device status UI ([6fdab68](https://github.com/nrkno/tv-automation-server-core/commit/6fdab68)) +- added killProcess method, to be used by integration tests of gateways in closed environments ([7f2b42c](https://github.com/nrkno/tv-automation-server-core/commit/7f2b42c)) +- added MeteorReactComponent, which exposes subscribe & autorun, which will stop automatically on component unmount ([cf11808](https://github.com/nrkno/tv-automation-server-core/commit/cf11808)) +- added name and type to peripheralDevice ([915c518](https://github.com/nrkno/tv-automation-server-core/commit/915c518)) +- added packages: mocha and typescript ([8b19269](https://github.com/nrkno/tv-automation-server-core/commit/8b19269)) +- added peripheralDevice.lastConnected, to be used for sorting so they wont jump around in the UI ([08e97f7](https://github.com/nrkno/tv-automation-server-core/commit/08e97f7)) +- added pingWithCommand method, used by watchdog ([6f6427b](https://github.com/nrkno/tv-automation-server-core/commit/6f6427b)) +- Added publications for all running order data, and changed some interfaces ([2365fd2](https://github.com/nrkno/tv-automation-server-core/commit/2365fd2)) +- added SegmentLine.timings.takeDone property ([d18d539](https://github.com/nrkno/tv-automation-server-core/commit/d18d539)) +- added some shadow to the status dots ([04df33c](https://github.com/nrkno/tv-automation-server-core/commit/04df33c)) +- added support for typescript ([d3471b3](https://github.com/nrkno/tv-automation-server-core/commit/d3471b3)) +- added temporary deploy script ([244fb5b](https://github.com/nrkno/tv-automation-server-core/commit/244fb5b)) +- added test-data for testing and mocking ([b277c3c](https://github.com/nrkno/tv-automation-server-core/commit/b277c3c)) +- added tests stub ([edd4b6e](https://github.com/nrkno/tv-automation-server-core/commit/edd4b6e)) +- added tictac for troubleshooting timings ([df91cea](https://github.com/nrkno/tv-automation-server-core/commit/df91cea)) +- added Timeline data structure ([35ce6db](https://github.com/nrkno/tv-automation-server-core/commit/35ce6db)) +- added timestamp to externalMessage error ([e13d1d8](https://github.com/nrkno/tv-automation-server-core/commit/e13d1d8)) +- added timings property to adlig segmentLineItems ([b333bf1](https://github.com/nrkno/tv-automation-server-core/commit/b333bf1)) +- added unsyncedTime ([8fcffb5](https://github.com/nrkno/tv-automation-server-core/commit/8fcffb5)) +- added updateStoryStatus. The yellow line will only be driven when this is set to true ([c7ec8da](https://github.com/nrkno/tv-automation-server-core/commit/c7ec8da)) +- Adjust split box values ([680eb11](https://github.com/nrkno/tv-automation-server-core/commit/680eb11)) +- allow ? as 'any' field/frame type ([c950fba](https://github.com/nrkno/tv-automation-server-core/commit/c950fba)) +- Allow StudioInstallation to define entries in the hotkey legend ([74c1c1c](https://github.com/nrkno/tv-automation-server-core/commit/74c1c1c)) +- ask before closing an active RO (if allowed by browser) ([16ee66b](https://github.com/nrkno/tv-automation-server-core/commit/16ee66b)) +- Atem SuperSource properties support ([2688142](https://github.com/nrkno/tv-automation-server-core/commit/2688142)) +- autonext property is defined on the current SegmentLine rather than the next ([09441db](https://github.com/nrkno/tv-automation-server-core/commit/09441db)) +- backend implementation of migration (wip) ([8762ca3](https://github.com/nrkno/tv-automation-server-core/commit/8762ca3)) +- backup and restore show styles (including templates) through ui ([9758b2c](https://github.com/nrkno/tv-automation-server-core/commit/9758b2c)) +- block take if duration since startedPlayback/take less than X ([99d41b9](https://github.com/nrkno/tv-automation-server-core/commit/99d41b9)) +- Break nrk templates into seperate files. Parse KAM templates better ([2ec0433](https://github.com/nrkno/tv-automation-server-core/commit/2ec0433)) +- change heavy-light display style ([91a1931](https://github.com/nrkno/tv-automation-server-core/commit/91a1931)) +- changed keyboard shortcuts ([ef02f7c](https://github.com/nrkno/tv-automation-server-core/commit/ef02f7c)) +- changed restart CasparCG functionality ([dd567c2](https://github.com/nrkno/tv-automation-server-core/commit/dd567c2)) +- clean up: show style, blueprint, blueprint logic names in UI ([e1ae6a7](https://github.com/nrkno/tv-automation-server-core/commit/e1ae6a7)) +- codeControl: create syncFunctions which finer grained execution control based on arguments ([f53607f](https://github.com/nrkno/tv-automation-server-core/commit/f53607f)) +- continued implementation of Migration (wip) ([72fbcb5](https://github.com/nrkno/tv-automation-server-core/commit/72fbcb5)) +- converted app.js to typescript and added an example subscription-implementation ([da439af](https://github.com/nrkno/tv-automation-server-core/commit/da439af)) +- converted more subscriptions (WIP) ([e047fef](https://github.com/nrkno/tv-automation-server-core/commit/e047fef)) +- converted StudioInstallation into a class, adding getConfigValue as member method, a step towards DRY ([4af278e](https://github.com/nrkno/tv-automation-server-core/commit/4af278e)) +- CoreSystem initial implementation ([06369b2](https://github.com/nrkno/tv-automation-server-core/commit/06369b2)) +- countdown to running order expectedStart ([7b505c5](https://github.com/nrkno/tv-automation-server-core/commit/7b505c5)) +- cron job for restarting casparcg ([19898d1](https://github.com/nrkno/tv-automation-server-core/commit/19898d1)) +- Define all special blueprints as options in the showstyle ([7e1da16](https://github.com/nrkno/tv-automation-server-core/commit/7e1da16)) +- disable in next segmentLine & refactoring ([669166c](https://github.com/nrkno/tv-automation-server-core/commit/669166c)) +- display ms in user activity log ([7fc2744](https://github.com/nrkno/tv-automation-server-core/commit/7fc2744)) +- display ms in user activity log ([5172f2e](https://github.com/nrkno/tv-automation-server-core/commit/5172f2e)) +- do not block click-to-take when trigger is absolute 0 ([cec86ca](https://github.com/nrkno/tv-automation-server-core/commit/cec86ca)) +- ensure each sli has a mosId set ([57c977d](https://github.com/nrkno/tv-automation-server-core/commit/57c977d)) +- expose moment to templates ([c2a1cc5](https://github.com/nrkno/tv-automation-server-core/commit/c2a1cc5)) +- externalMessage: allow for multiple messages to be generated at the same time ([284efbe](https://github.com/nrkno/tv-automation-server-core/commit/284efbe)) +- externalMessages implementation (it works now) ([3b8e88a](https://github.com/nrkno/tv-automation-server-core/commit/3b8e88a)) +- f9, f10 buttons step next forward & down (shift reverses direction) ([a3be0cf](https://github.com/nrkno/tv-automation-server-core/commit/a3be0cf)) +- force some function to run synchronously. experimental, WIP! ([55a064c](https://github.com/nrkno/tv-automation-server-core/commit/55a064c)) +- force some function to run synchronously. experimental, WIP! ([54d83dd](https://github.com/nrkno/tv-automation-server-core/commit/54d83dd)) +- full implementation of mos-functions, profile 0 & 2 ([4bafeeb](https://github.com/nrkno/tv-automation-server-core/commit/4bafeeb)) +- Grafikk lookahead/preload ([78828fe](https://github.com/nrkno/tv-automation-server-core/commit/78828fe)) +- Grafikk lookahead/preload ([30a6b03](https://github.com/nrkno/tv-automation-server-core/commit/30a6b03)) +- implement Panasonic PTZ device ([42d8534](https://github.com/nrkno/tv-automation-server-core/commit/42d8534)) +- **record:** Create timelineobjects to control recording to the timeline. Add config to the db, and ui to edit it ([b5e4ebf](https://github.com/nrkno/tv-automation-server-core/commit/b5e4ebf)) +- handle mos updates with dynamicallyInserted segmentLines ([1d292c0](https://github.com/nrkno/tv-automation-server-core/commit/1d292c0)) +- handle roList reply on reload RunningOrder data, also more refactoring & cleanup ([cee70c5](https://github.com/nrkno/tv-automation-server-core/commit/cee70c5)) +- HOLD mode ([ae1dacf](https://github.com/nrkno/tv-automation-server-core/commit/ae1dacf)) +- HOLD mode ([e41c5a4](https://github.com/nrkno/tv-automation-server-core/commit/e41c5a4)) +- Hold state UI ([d835efc](https://github.com/nrkno/tv-automation-server-core/commit/d835efc)) +- Hold state UI ([c7a17c7](https://github.com/nrkno/tv-automation-server-core/commit/c7a17c7)) +- hyperdeck device ([#49](https://github.com/nrkno/tv-automation-server-core/issues/49)) ([c706628](https://github.com/nrkno/tv-automation-server-core/commit/c706628)) +- if template 'getId' returns null, don't throw an error. Also when templateId is not found, send warning instead of an error ([d98f09d](https://github.com/nrkno/tv-automation-server-core/commit/d98f09d)) +- implement camera number-device mapping for PTZ ([374568d](https://github.com/nrkno/tv-automation-server-core/commit/374568d)) +- implement click-to-adlib completely ([577dcac](https://github.com/nrkno/tv-automation-server-core/commit/577dcac)) +- implement Panasonic PTZ settings ([f7840da](https://github.com/nrkno/tv-automation-server-core/commit/f7840da)) +- implement spliting long scripts into beginning and end in popup ([9fa8006](https://github.com/nrkno/tv-automation-server-core/commit/9fa8006)) +- implementation of disable-next-segmentLineItem ([a06d196](https://github.com/nrkno/tv-automation-server-core/commit/a06d196)) +- implemented mos profiles 0-2 ([d803da1](https://github.com/nrkno/tv-automation-server-core/commit/d803da1)) +- Implemented Notes into data structure & GUI ([735b8c5](https://github.com/nrkno/tv-automation-server-core/commit/735b8c5)) +- implemented partial timeline fix ([c8b56e4](https://github.com/nrkno/tv-automation-server-core/commit/c8b56e4)) +- implemented stricter typing & changed classes to ReactMeteorComponent where applicable ([9d2166e](https://github.com/nrkno/tv-automation-server-core/commit/9d2166e)) +- improved layout for presenter countdowns ([2bd61cc](https://github.com/nrkno/tv-automation-server-core/commit/2bd61cc)) +- Infinite segmentlineitem ([c02a641](https://github.com/nrkno/tv-automation-server-core/commit/c02a641)) +- initial implementation of externalMessages, (not working yet) ([ace91f1](https://github.com/nrkno/tv-automation-server-core/commit/ace91f1)) +- Initial timings for opening templates ([a9bfb66](https://github.com/nrkno/tv-automation-server-core/commit/a9bfb66)) +- Interfaces for describing the timeline, segments (titles), layers ([ea96dfb](https://github.com/nrkno/tv-automation-server-core/commit/ea96dfb)) +- KAM SLUTT variant ([e819269](https://github.com/nrkno/tv-automation-server-core/commit/e819269)) +- List, start and stop test recordings ([df552ab](https://github.com/nrkno/tv-automation-server-core/commit/df552ab)) +- load atem ssrc background when activating RO ([0eda9b4](https://github.com/nrkno/tv-automation-server-core/commit/0eda9b4)) +- log warning message when trying to access a studio.config value that hasn't been set. ([7e706c6](https://github.com/nrkno/tv-automation-server-core/commit/7e706c6)) +- lookahead ([5ed0f13](https://github.com/nrkno/tv-automation-server-core/commit/5ed0f13)) +- media scanner & casparcg launcher hostnames ([02ec8be](https://github.com/nrkno/tv-automation-server-core/commit/02ec8be)) +- MeteorReactComponent: return subscription & computation handle ([e20e6de](https://github.com/nrkno/tv-automation-server-core/commit/e20e6de)) +- method "ping" to be called by devices every now and then, to update lastSeen ([41a996c](https://github.com/nrkno/tv-automation-server-core/commit/41a996c)) +- Migration UI & started adding migration steps ([2a117ad](https://github.com/nrkno/tv-automation-server-core/commit/2a117ad)) +- Migration: added more migration steps for 0.16.0 ([2ac06ea](https://github.com/nrkno/tv-automation-server-core/commit/2ac06ea)) +- Migration: continued impl. ([8982701](https://github.com/nrkno/tv-automation-server-core/commit/8982701)) +- Move SegmentLine duration calculation into templates ([315eb42](https://github.com/nrkno/tv-automation-server-core/commit/315eb42)) +- Move sofie and metadata urls from templates to config ([af8e388](https://github.com/nrkno/tv-automation-server-core/commit/af8e388)) +- moved nightly cronjob to run after 4am ([8eb4e12](https://github.com/nrkno/tv-automation-server-core/commit/8eb4e12)) +- only log logger.debug() when in developer mode ([8ed8e71](https://github.com/nrkno/tv-automation-server-core/commit/8ed8e71)) +- optimization: add cache of blueprints, to avoid having to parse text-functions all the time ([1e469d9](https://github.com/nrkno/tv-automation-server-core/commit/1e469d9)) +- place all collections in Collections object, for debugging purposes ([9682a89](https://github.com/nrkno/tv-automation-server-core/commit/9682a89)) +- playout device debugLogging (wip) ([7ab4ec6](https://github.com/nrkno/tv-automation-server-core/commit/7ab4ec6)) +- prevent next:ing of currently playing segmentLine ([b9c9ea1](https://github.com/nrkno/tv-automation-server-core/commit/b9c9ea1)) +- prompter-view ([f45a923](https://github.com/nrkno/tv-automation-server-core/commit/f45a923)) +- Read all templates from database ([3287f63](https://github.com/nrkno/tv-automation-server-core/commit/3287f63)) +- refactor of subscriptions (WIP) ([2b6f994](https://github.com/nrkno/tv-automation-server-core/commit/2b6f994)) +- refactor systemStatus & add status messages on front page ([14da61a](https://github.com/nrkno/tv-automation-server-core/commit/14da61a)) +- refactor to use relative durations. affects infinite segmentlineitems, autonext, segmentline overlapduration property ([67c5444](https://github.com/nrkno/tv-automation-server-core/commit/67c5444)) +- refactored initDB into 2 separate methods, so we can easilly update just the layers and not the infrastructure ([d4fcc3f](https://github.com/nrkno/tv-automation-server-core/commit/d4fcc3f)) +- reimplement fullscreen/on air button ([4b8658d](https://github.com/nrkno/tv-automation-server-core/commit/4b8658d)) +- rename /clock into /countdowns/presenter ([96c3136](https://github.com/nrkno/tv-automation-server-core/commit/96c3136)) +- reset 'dirty' segment lines by re-running blueprints on them ([064a84d](https://github.com/nrkno/tv-automation-server-core/commit/064a84d)) +- restart CasparCG from UI ([64509c3](https://github.com/nrkno/tv-automation-server-core/commit/64509c3)) +- reworked externalMessages page ([3b87242](https://github.com/nrkno/tv-automation-server-core/commit/3b87242)) +- reworked the whole activate/deacticate/reset/reload logic ([1fea56e](https://github.com/nrkno/tv-automation-server-core/commit/1fea56e)) +- Rewrite templateContext.getConfigValue to get default values from defaultConfig 'blueprint' and to cache values ([6ce0f97](https://github.com/nrkno/tv-automation-server-core/commit/6ce0f97)) +- running order full-screen marker ([03010ec](https://github.com/nrkno/tv-automation-server-core/commit/03010ec)) +- second upload to atem ([6697a80](https://github.com/nrkno/tv-automation-server-core/commit/6697a80)) +- segment line arguments ([3c5313a](https://github.com/nrkno/tv-automation-server-core/commit/3c5313a)) +- send evaluation message to slack. WIP ([3dcbe3a](https://github.com/nrkno/tv-automation-server-core/commit/3dcbe3a)) +- send evaluation message to slack. WIP ([96e8b81](https://github.com/nrkno/tv-automation-server-core/commit/96e8b81)) +- server side implementation of queueabilified adlibs ([0527b3b](https://github.com/nrkno/tv-automation-server-core/commit/0527b3b)) +- set triggerValue to lawo-TimelineObjs, so it triggers upon Nexting ([e3df655](https://github.com/nrkno/tv-automation-server-core/commit/e3df655)) +- show changed timestamp on script items ([f2955e1](https://github.com/nrkno/tv-automation-server-core/commit/f2955e1)) +- show user name in evaluations ([c59d7ee](https://github.com/nrkno/tv-automation-server-core/commit/c59d7ee)) +- ShowStyle templates can be marked as helpers and accessed from other templates ([a20ffa7](https://github.com/nrkno/tv-automation-server-core/commit/a20ffa7)) +- Split (DVE 2LIKE) template ([8ccf23e](https://github.com/nrkno/tv-automation-server-core/commit/8ccf23e)) +- Start of stk and grafikk templates ([0458e3e](https://github.com/nrkno/tv-automation-server-core/commit/0458e3e)) +- started on mos device data implementation ([1d3b19a](https://github.com/nrkno/tv-automation-server-core/commit/1d3b19a)) +- started working on integration tests, added a client-side stub ([c4cbadc](https://github.com/nrkno/tv-automation-server-core/commit/c4cbadc)) +- status endpoint /health updated to use device statuses ([2c4b7fa](https://github.com/nrkno/tv-automation-server-core/commit/2c4b7fa)) +- StudioInstallation key-value config store for template settings ([b37ea17](https://github.com/nrkno/tv-automation-server-core/commit/b37ea17)) +- StudioInstallation key-value config store for template settings ([812c313](https://github.com/nrkno/tv-automation-server-core/commit/812c313)) +- support for Pharos device ([4a99fb3](https://github.com/nrkno/tv-automation-server-core/commit/4a99fb3)) +- support preload lookahead mode for nora, which swaps out take commands for cue ([4cfd4fe](https://github.com/nrkno/tv-automation-server-core/commit/4cfd4fe)) +- Switch to single-device design ([a268c40](https://github.com/nrkno/tv-automation-server-core/commit/a268c40)) +- System snapshot ([006027b](https://github.com/nrkno/tv-automation-server-core/commit/006027b)) +- system version status monitoring ([1c96263](https://github.com/nrkno/tv-automation-server-core/commit/1c96263)) +- take snapshot before running migration ([3ae4e92](https://github.com/nrkno/tv-automation-server-core/commit/3ae4e92)) +- take snapshot when saving evaluation form ([df318bb](https://github.com/nrkno/tv-automation-server-core/commit/df318bb)) +- templates: added format functions for timecode ([ea38081](https://github.com/nrkno/tv-automation-server-core/commit/ea38081)) +- timings page ([6bc325a](https://github.com/nrkno/tv-automation-server-core/commit/6bc325a)) +- toggle running order argument on an SL with a hotkey ([258c3b3](https://github.com/nrkno/tv-automation-server-core/commit/258c3b3)) +- Transition as a seperate SegmentLineItem, which is not run if the first SegmentLine in the show, or the previous SegmentLine instructs it to not ([e676a43](https://github.com/nrkno/tv-automation-server-core/commit/e676a43)) +- translation improvements ([d3a535d](https://github.com/nrkno/tv-automation-server-core/commit/d3a535d)) +- Treat sli marked as virtual solely as markers for the timeline. They are hidden from the ui and are not allowed to place any contents on the timeline ([25e0f42](https://github.com/nrkno/tv-automation-server-core/commit/25e0f42)) +- unsynced mode ([#51](https://github.com/nrkno/tv-automation-server-core/issues/51)) ([7e0a263](https://github.com/nrkno/tv-automation-server-core/commit/7e0a263)) +- update meteor typings ([49b6969](https://github.com/nrkno/tv-automation-server-core/commit/49b6969)) +- Update template to use correct media files and durations. Adjust transitions from head to kam ([18f6c44](https://github.com/nrkno/tv-automation-server-core/commit/18f6c44)) +- Update timeline and infinite items on enps update ([db0c041](https://github.com/nrkno/tv-automation-server-core/commit/db0c041)) +- updated timeline dependency ([6ef9eb7](https://github.com/nrkno/tv-automation-server-core/commit/6ef9eb7)) +- use date-picker for user-activity-log ([5e2c218](https://github.com/nrkno/tv-automation-server-core/commit/5e2c218)) +- use default renderer for MIC sourceLayerType ([ce845d4](https://github.com/nrkno/tv-automation-server-core/commit/ce845d4)) +- use default renderer for MIC sourceLayerType ([6ab97b7](https://github.com/nrkno/tv-automation-server-core/commit/6ab97b7)) +- use generated svg as icons in countdown ([843ad10](https://github.com/nrkno/tv-automation-server-core/commit/843ad10)) +- warn media status for interlacing and fps ([fc3ac4b](https://github.com/nrkno/tv-automation-server-core/commit/fc3ac4b)) +- **asRunLog:** collection implementation ([0e63c36](https://github.com/nrkno/tv-automation-server-core/commit/0e63c36)) +- **asRunLog:** implementation of asRunLog ([62f5b8c](https://github.com/nrkno/tv-automation-server-core/commit/62f5b8c)) +- **aux:** Adds tecnical error aux 2 ([34ce710](https://github.com/nrkno/tv-automation-server-core/commit/34ce710)) +- **AUX:** adds clock aux ([45479da](https://github.com/nrkno/tv-automation-server-core/commit/45479da)) +- **AUXes:** New AUX-mapping introducing more previews and moves the cleanfeed ([548bd8c](https://github.com/nrkno/tv-automation-server-core/commit/548bd8c)) +- **blueprint:** refactor getConfigValue into the blueprints, with context exposing the raw array as getConfig instead ([5b0ac39](https://github.com/nrkno/tv-automation-server-core/commit/5b0ac39)) +- **Capabilities:** Added basic Lawo and ATEM capabilities ([90d6edd](https://github.com/nrkno/tv-automation-server-core/commit/90d6edd)) +- **click-to-take:** initial WIP ([8e63808](https://github.com/nrkno/tv-automation-server-core/commit/8e63808)) +- **click-to-take:** more work in progress ([e3549e0](https://github.com/nrkno/tv-automation-server-core/commit/e3549e0)) +- **device:** Custom make-ready commands for httpsend device ([410a2ef](https://github.com/nrkno/tv-automation-server-core/commit/410a2ef)) +- **ENV:** adds ENV vars for default devices - casparcg, atem and lawo ([9bf8eee](https://github.com/nrkno/tv-automation-server-core/commit/9bf8eee)) +- **Guest input:** use isGuestInput like isRemoteInput ([2d40e87](https://github.com/nrkno/tv-automation-server-core/commit/2d40e87)) +- **init:** adds clear shortcuts + skippabloe ([f824ae5](https://github.com/nrkno/tv-automation-server-core/commit/f824ae5)) +- **init:** adds multiple bak source layers ([c812510](https://github.com/nrkno/tv-automation-server-core/commit/c812510)) +- **init:** Adds RM 4,5,6 ([0021d7b](https://github.com/nrkno/tv-automation-server-core/commit/0021d7b)) +- **init:** Adds RM 4,5,6 ([dd59d47](https://github.com/nrkno/tv-automation-server-core/commit/dd59d47)) +- **init:** adds studio monitor html player to casparcg ([6533b0f](https://github.com/nrkno/tv-automation-server-core/commit/6533b0f)) +- **init:** moves countdown to casparcg machine 2, channel 1 ([6c93464](https://github.com/nrkno/tv-automation-server-core/commit/6c93464)) +- **init:** moves countdown to casparcg machine 2, channel 1 ([18c354b](https://github.com/nrkno/tv-automation-server-core/commit/18c354b)) +- **iterateDeeply:** exports iterateDeeply to template context ([42cc886](https://github.com/nrkno/tv-automation-server-core/commit/42cc886)) +- **lawo:** New structure to lawo devices and mappings ([35d812b](https://github.com/nrkno/tv-automation-server-core/commit/35d812b)) +- **loggin:** uses logger for better kibana logs ([8d31691](https://github.com/nrkno/tv-automation-server-core/commit/8d31691)) +- **migration:** add previousVersion and buttons in GUI to revert database version ([61525a5](https://github.com/nrkno/tv-automation-server-core/commit/61525a5)) +- **migration:** display returned error message in GUI ([6169048](https://github.com/nrkno/tv-automation-server-core/commit/6169048)) +- **Next:** Adds warning/fallback of not loaded clips ([e20bc2f](https://github.com/nrkno/tv-automation-server-core/commit/e20bc2f)) +- **peripheralDevices:** added collection, publication, api, access control and tests ([794b5be](https://github.com/nrkno/tv-automation-server-core/commit/794b5be)) +- **playout:** Add class to sli first_object to indicate if sli is from the current or previous sl ([8de6004](https://github.com/nrkno/tv-automation-server-core/commit/8de6004)) +- **playout:** Add class to sli first_object when the sli is a continuation of another ([d53f06b](https://github.com/nrkno/tv-automation-server-core/commit/d53f06b)) +- **Prompter:** implement a simple mirror mode ([8d0be4e](https://github.com/nrkno/tv-automation-server-core/commit/8d0be4e)) +- **record:** basic video player page ([138b8b9](https://github.com/nrkno/tv-automation-server-core/commit/138b8b9)) +- **record:** Controls to delete files ([4236db2](https://github.com/nrkno/tv-automation-server-core/commit/4236db2)) +- **record:** Input field for user to give recording a name ([116ea9f](https://github.com/nrkno/tv-automation-server-core/commit/116ea9f)) +- **RO view:** Introduce a 'duration settling' state to delay the UI update until the actual playout duration is received from playout ([28823c3](https://github.com/nrkno/tv-automation-server-core/commit/28823c3)) +- **Setting:** adds lawo setting to studio and devices ([5ab1717](https://github.com/nrkno/tv-automation-server-core/commit/5ab1717)) +- **shortcuts:** adds shortcuts to remove various graphic layers ([0d1a83d](https://github.com/nrkno/tv-automation-server-core/commit/0d1a83d)) +- **shortcuts:** standarize shortcut label display, support numpad ([4c5ba74](https://github.com/nrkno/tv-automation-server-core/commit/4c5ba74)) +- **snapshot:** continued implementation ([009e9e5](https://github.com/nrkno/tv-automation-server-core/commit/009e9e5)) +- **snapshot:** edit snapshot comments ([264638a](https://github.com/nrkno/tv-automation-server-core/commit/264638a)) +- **snapshot:** Implement snapshots, API endpoints & restore ([72e1a83](https://github.com/nrkno/tv-automation-server-core/commit/72e1a83)) +- **snapshot:** snapshot restore/backup GUI ([c414f70](https://github.com/nrkno/tv-automation-server-core/commit/c414f70)) +- **snapshot:** take snapshot of runningOrder & restore ([fc34f73](https://github.com/nrkno/tv-automation-server-core/commit/fc34f73)) +- **template:** setup atem wipe transition ([f0c576c](https://github.com/nrkno/tv-automation-server-core/commit/f0c576c)) +- **template:** temporary env variable for nora group (MESOS_NORA_GROUP) ([8b00bc4](https://github.com/nrkno/tv-automation-server-core/commit/8b00bc4)) +- **template:** use upstream keyer for vignett playback. Adds some more layers for atem defaults, and overrides to stack changes better ([76b1e10](https://github.com/nrkno/tv-automation-server-core/commit/76b1e10)) +- **Template doc:** Added CasparCG resources ([80f98d5](https://github.com/nrkno/tv-automation-server-core/commit/80f98d5)) +- **templates:** Use ShowStyle to define default/fallback state. Play and stop head supers ([8375363](https://github.com/nrkno/tv-automation-server-core/commit/8375363)) +- **Templates:** Start parsing some new mos data. Process mesos based graphics. Set some lawo audio states ([df4b670](https://github.com/nrkno/tv-automation-server-core/commit/df4b670)) +- **timeline:** some initial work on labels taking account of liveline ([3086eec](https://github.com/nrkno/tv-automation-server-core/commit/3086eec)) +- **Timeline:** more work on new marker style ([570e408](https://github.com/nrkno/tv-automation-server-core/commit/570e408)) +- warnings for media in wrong resolution ([55135c1](https://github.com/nrkno/tv-automation-server-core/commit/55135c1)) -## 0.18.0 (2018-11-26) +## 0.18.0 (2018-11-26) ### Features -* **Header** + +- **Header**
-* **Version migration** +- **Version migration**
Merge pull request #56 from nrkno/feature/coreSystemAndMigration ([6d43e42](https://github.com/nrkno/tv-automation-server-core/commit/6d43e42)), closes [#56](https://github.com/nrkno/tv-automation-server-core/issues/56)
add migration steps, logging ([96aae63](https://github.com/nrkno/tv-automation-server-core/commit/96aae63))
backend implementation of migration (wip) ([8762ca3](https://github.com/nrkno/tv-automation-server-core/commit/8762ca3)) @@ -5705,12 +5715,12 @@ This is a major and Breaking release, extra care is recommended when upgrading f
CoreSystem initial implementation ([06369b2](https://github.com/nrkno/tv-automation-server-core/commit/06369b2))
migration: Missing studio0_audio_bed ([1c6edcc](https://github.com/nrkno/tv-automation-server-core/commit/1c6edcc))
migration: overrideSteps should be applied before .validate() is run, so overrideSteps works in ([c9c1f25](https://github.com/nrkno/tv-automation-server-core/commit/c9c1f25)) -* **Unsynced runningOrder** +- **Unsynced runningOrder**
added unsyncedTime ([8fcffb5](https://github.com/nrkno/tv-automation-server-core/commit/8fcffb5))
unsynced mode (#51) ([7e0a263](https://github.com/nrkno/tv-automation-server-core/commit/7e0a263)), closes [#51](https://github.com/nrkno/tv-automation-server-core/issues/51) -* **RunningOrder arguments** +- **RunningOrder arguments**
Merge pull request #55 from nrkno/feature/ro-arguments ([6d8653c](https://github.com/nrkno/tv-automation-server-core/commit/6d8653c)), closes [#55](https://github.com/nrkno/tv-automation-server-core/issues/55) -* **Manual record (for debugging / testing)** +- **Manual record (for debugging / testing)**
Merge pull request #52 from nrkno/feature/manual-casparcg-record ([1b7e852](https://github.com/nrkno/tv-automation-server-core/commit/1b7e852)), closes [#52](https://github.com/nrkno/tv-automation-server-core/issues/52)
List, start and stop test recordings ([df552ab](https://github.com/nrkno/tv-automation-server-core/commit/df552ab))
basic video player page ([138b8b9](https://github.com/nrkno/tv-automation-server-core/commit/138b8b9)) @@ -5720,7 +5730,7 @@ This is a major and Breaking release, extra care is recommended when upgrading f
CR changes ([b3adbec](https://github.com/nrkno/tv-automation-server-core/commit/b3adbec))
Hide internal layer mappings ([24dfef1](https://github.com/nrkno/tv-automation-server-core/commit/24dfef1)) -* **Snapshots** +- **Snapshots**
Merge branch 'feature/ro-snapshot' into develop ([6bed457](https://github.com/nrkno/tv-automation-server-core/commit/6bed457))
Add backup restore method to import mock rundowns similar to the embedded mocks ([d71d9c7](https://github.com/nrkno/tv-automation-server-core/commit/d71d9c7))
continued implementation ([009e9e5](https://github.com/nrkno/tv-automation-server-core/commit/009e9e5)) @@ -5729,292 +5739,290 @@ This is a major and Breaking release, extra care is recommended when upgrading f
snapshot restore/backup GUI ([c414f70](https://github.com/nrkno/tv-automation-server-core/commit/c414f70))
take snapshot of runningOrder & restore ([fc34f73](https://github.com/nrkno/tv-automation-server-core/commit/fc34f73))
wip: running order snaphots ([eb069da](https://github.com/nrkno/tv-automation-server-core/commit/eb069da)) -* **Pharos device (lights control) support** +- **Pharos device (lights control) support**
Merge branch 'feature/pharosDevice' into develop ([354c3ed](https://github.com/nrkno/tv-automation-server-core/commit/354c3ed))
add sourceLayerType.LIGHTS ([0554251](https://github.com/nrkno/tv-automation-server-core/commit/0554251)) -* **As-run log** +- **As-run log**
Merge branch 'feature/as-run-log' into develop ([c73ee23](https://github.com/nrkno/tv-automation-server-core/commit/c73ee23))
collection implementation ([0e63c36](https://github.com/nrkno/tv-automation-server-core/commit/0e63c36))
implementation of asRunLog ([62f5b8c](https://github.com/nrkno/tv-automation-server-core/commit/62f5b8c)) -* **Performance monitor** +- **Performance monitor**
add performance monitor and track all server-side methods ([2733d74](https://github.com/nrkno/tv-automation-server-core/commit/2733d74))
typo bug in performanceMonitor ([797c393](https://github.com/nrkno/tv-automation-server-core/commit/797c393)) -* **System status improvements** +- **System status improvements**
add peripheralDevice expectedVersions, to throw error if device version is too low. Refactor / ([51ed4c3](https://github.com/nrkno/tv-automation-server-core/commit/51ed4c3))
refactor systemStatus & add status messages on front page ([14da61a](https://github.com/nrkno/tv-automation-server-core/commit/14da61a)) -* **Media-object format check** +- **Media-object format check**
add warnings for wrong field order ([c4d23d8](https://github.com/nrkno/tv-automation-server-core/commit/c4d23d8))
allow ? as 'any' field/frame type ([c950fba](https://github.com/nrkno/tv-automation-server-core/commit/c950fba))
warn media status for interlacing and fps ([fc3ac4b](https://github.com/nrkno/tv-automation-server-core/commit/fc3ac4b))
warnings for media in wrong resolution ([55135c1](https://github.com/nrkno/tv-automation-server-core/commit/55135c1)) -* **Refactoring og mos data flow** +- **Refactoring og mos data flow**
Merge pull request #50 from nrkno/fix/refactorDataFlowFunctions ([1ae9f7b](https://github.com/nrkno/tv-automation-server-core/commit/1ae9f7b)), closes [#50](https://github.com/nrkno/tv-automation-server-core/issues/50)
handle roList reply on reload RunningOrder data, also more refactoring & cleanup ([cee70c5](https://github.com/nrkno/tv-automation-server-core/commit/cee70c5)) - #### GUI -* add a subtle line underneath segment title when has-remote-items and has-guest-items ([4b1d582](https://github.com/nrkno/tv-automation-server-core/commit/4b1d582)) -* add rewind button ([f235a25](https://github.com/nrkno/tv-automation-server-core/commit/f235a25)) -* ask before closing an active RO (if allowed by browser) ([16ee66b](https://github.com/nrkno/tv-automation-server-core/commit/16ee66b)) -* clean up: show style, blueprint, blueprint logic names in UI ([e1ae6a7](https://github.com/nrkno/tv-automation-server-core/commit/e1ae6a7)) -* countdown to running order expectedStart ([7b505c5](https://github.com/nrkno/tv-automation-server-core/commit/7b505c5)) -* display ms in user activity log ([5172f2e](https://github.com/nrkno/tv-automation-server-core/commit/5172f2e)) -* do not block click-to-take when trigger is absolute 0 ([cec86ca](https://github.com/nrkno/tv-automation-server-core/commit/cec86ca)) -* placeholder Service Worker to enable PWA detection ([0487c34](https://github.com/nrkno/tv-automation-server-core/commit/0487c34)) -* Updated Norwegian translation. Changed user-facing descriptions of "Backup" to "Snapshot". Spe ([3874c37](https://github.com/nrkno/tv-automation-server-core/commit/3874c37)) -* Updated Norwegian translations. ([b4957d5](https://github.com/nrkno/tv-automation-server-core/commit/b4957d5)) + +- add a subtle line underneath segment title when has-remote-items and has-guest-items ([4b1d582](https://github.com/nrkno/tv-automation-server-core/commit/4b1d582)) +- add rewind button ([f235a25](https://github.com/nrkno/tv-automation-server-core/commit/f235a25)) +- ask before closing an active RO (if allowed by browser) ([16ee66b](https://github.com/nrkno/tv-automation-server-core/commit/16ee66b)) +- clean up: show style, blueprint, blueprint logic names in UI ([e1ae6a7](https://github.com/nrkno/tv-automation-server-core/commit/e1ae6a7)) +- countdown to running order expectedStart ([7b505c5](https://github.com/nrkno/tv-automation-server-core/commit/7b505c5)) +- display ms in user activity log ([5172f2e](https://github.com/nrkno/tv-automation-server-core/commit/5172f2e)) +- do not block click-to-take when trigger is absolute 0 ([cec86ca](https://github.com/nrkno/tv-automation-server-core/commit/cec86ca)) +- placeholder Service Worker to enable PWA detection ([0487c34](https://github.com/nrkno/tv-automation-server-core/commit/0487c34)) +- Updated Norwegian translation. Changed user-facing descriptions of "Backup" to "Snapshot". Spe ([3874c37](https://github.com/nrkno/tv-automation-server-core/commit/3874c37)) +- Updated Norwegian translations. ([b4957d5](https://github.com/nrkno/tv-automation-server-core/commit/b4957d5)) + #### Other -* block take if duration since startedPlayback/take less than X ([99d41b9](https://github.com/nrkno/tv-automation-server-core/commit/99d41b9)) -* Define all special blueprints as options in the showstyle ([7e1da16](https://github.com/nrkno/tv-automation-server-core/commit/7e1da16)) -* reset 'dirty' segment lines by re-running blueprints on them ([064a84d](https://github.com/nrkno/tv-automation-server-core/commit/064a84d)) -* Rewrite templateContext.getConfigValue to get default values from defaultConfig 'blueprint' an ([6ce0f97](https://github.com/nrkno/tv-automation-server-core/commit/6ce0f97)) -* segment line arguments ([3c5313a](https://github.com/nrkno/tv-automation-server-core/commit/3c5313a)) -* show user name in evaluations ([c59d7ee](https://github.com/nrkno/tv-automation-server-core/commit/c59d7ee)) -* support for Pharos device ([4a99fb3](https://github.com/nrkno/tv-automation-server-core/commit/4a99fb3)) -* system version status monitoring ([1c96263](https://github.com/nrkno/tv-automation-server-core/commit/1c96263)) -* toggle running order argument on an SL with a hotkey ([258c3b3](https://github.com/nrkno/tv-automation-server-core/commit/258c3b3)) -* translation improvements ([d3a535d](https://github.com/nrkno/tv-automation-server-core/commit/d3a535d)) -* blueprint: refactor getConfigValue into the blueprints, with context exposing the raw array as ([5b0ac39](https://github.com/nrkno/tv-automation-server-core/commit/5b0ac39)) -* playout: Add class to sli first_object to indicate if sli is from the current or previous sl ([8de6004](https://github.com/nrkno/tv-automation-server-core/commit/8de6004)) -* playout: Add class to sli first_object when the sli is a continuation of another ([d53f06b](https://github.com/nrkno/tv-automation-server-core/commit/d53f06b)) + +- block take if duration since startedPlayback/take less than X ([99d41b9](https://github.com/nrkno/tv-automation-server-core/commit/99d41b9)) +- Define all special blueprints as options in the showstyle ([7e1da16](https://github.com/nrkno/tv-automation-server-core/commit/7e1da16)) +- reset 'dirty' segment lines by re-running blueprints on them ([064a84d](https://github.com/nrkno/tv-automation-server-core/commit/064a84d)) +- Rewrite templateContext.getConfigValue to get default values from defaultConfig 'blueprint' an ([6ce0f97](https://github.com/nrkno/tv-automation-server-core/commit/6ce0f97)) +- segment line arguments ([3c5313a](https://github.com/nrkno/tv-automation-server-core/commit/3c5313a)) +- show user name in evaluations ([c59d7ee](https://github.com/nrkno/tv-automation-server-core/commit/c59d7ee)) +- support for Pharos device ([4a99fb3](https://github.com/nrkno/tv-automation-server-core/commit/4a99fb3)) +- system version status monitoring ([1c96263](https://github.com/nrkno/tv-automation-server-core/commit/1c96263)) +- toggle running order argument on an SL with a hotkey ([258c3b3](https://github.com/nrkno/tv-automation-server-core/commit/258c3b3)) +- translation improvements ([d3a535d](https://github.com/nrkno/tv-automation-server-core/commit/d3a535d)) +- blueprint: refactor getConfigValue into the blueprints, with context exposing the raw array as ([5b0ac39](https://github.com/nrkno/tv-automation-server-core/commit/5b0ac39)) +- playout: Add class to sli first_object to indicate if sli is from the current or previous sl ([8de6004](https://github.com/nrkno/tv-automation-server-core/commit/8de6004)) +- playout: Add class to sli first_object when the sli is a continuation of another ([d53f06b](https://github.com/nrkno/tv-automation-server-core/commit/d53f06b)) #### GUI improvements ### Bug Fixes -* added missing "force" parameter ([7b50a97](https://github.com/nrkno/tv-automation-server-core/commit/7b50a97)) -* always rewind GUI on roReset, roResetAndActivate ([4502d90](https://github.com/nrkno/tv-automation-server-core/commit/4502d90)) -* bug in storePath migration step ([b623973](https://github.com/nrkno/tv-automation-server-core/commit/b623973)) -* bug when moving story to last ([83cef62](https://github.com/nrkno/tv-automation-server-core/commit/83cef62)) -* undefined storePath ([cbfdde5](https://github.com/nrkno/tv-automation-server-core/commit/cbfdde5)) -* When updating collection, documents with removed properties didn't get their properties ([237b8ff](https://github.com/nrkno/tv-automation-server-core/commit/237b8ff)) -* clean up more collections when removing RO ([b84ed59](https://github.com/nrkno/tv-automation-server-core/commit/b84ed59)) -* clean up onBeforeUnload handler ([51adbba](https://github.com/nrkno/tv-automation-server-core/commit/51adbba)) -* clear runtimeArguments on resetRunningOrder ([350dd45](https://github.com/nrkno/tv-automation-server-core/commit/350dd45)) -* collection name ([e014558](https://github.com/nrkno/tv-automation-server-core/commit/e014558)) -* disable runtimeFunction caching during code-test & save ([e21f8dd](https://github.com/nrkno/tv-automation-server-core/commit/e21f8dd)) -* do not show empty string values in L3rd popup ([b0c6c8e](https://github.com/nrkno/tv-automation-server-core/commit/b0c6c8e)) -* Dont generate ui outputlayers for sli which are virtual ([c0ad368](https://github.com/nrkno/tv-automation-server-core/commit/c0ad368)) -* End of Show marker line doesn't end where it should ([e188c97](https://github.com/nrkno/tv-automation-server-core/commit/e188c97)) -* force lookahead inGroup field to be emptied. Fixes mismatched statobj ([c76209c](https://github.com/nrkno/tv-automation-server-core/commit/c76209c)) -* GUI: settings: only show parent-devices in left menu (only they have settings on them) ([ecb164e](https://github.com/nrkno/tv-automation-server-core/commit/ecb164e)) -* handle both update & insert of runningOrder ([3701bb3](https://github.com/nrkno/tv-automation-server-core/commit/3701bb3)) -* Hide Keyboard focus marker when not in studio mode ([70dc6b0](https://github.com/nrkno/tv-automation-server-core/commit/70dc6b0)) -* holdState = 0 displayed a status ([49c7ead](https://github.com/nrkno/tv-automation-server-core/commit/49c7ead)) -* holdState = 0 displayed a status ([aacd140](https://github.com/nrkno/tv-automation-server-core/commit/aacd140)) -* initDB for pharos lights ([57fbc73](https://github.com/nrkno/tv-automation-server-core/commit/57fbc73)) -* labels in modal dialogs ([3af18fc](https://github.com/nrkno/tv-automation-server-core/commit/3af18fc)) -* Major refactoring, splitting code into separate files depending on their areas: "rundown": Gene ([db82375](https://github.com/nrkno/tv-automation-server-core/commit/db82375)) -* make the context menu available in the entire header ([0590f9d](https://github.com/nrkno/tv-automation-server-core/commit/0590f9d)) -* Migration UI fixes ([b141243](https://github.com/nrkno/tv-automation-server-core/commit/b141243)) -* missing argument for mediaStatusCheck ([658e82a](https://github.com/nrkno/tv-automation-server-core/commit/658e82a)) -* Missing typings on ShowStyle ([a0a4e14](https://github.com/nrkno/tv-automation-server-core/commit/a0a4e14)) -* modified timestamp on imported blueprints was not being set, causing the cache to not be cleare ([2f3fd17](https://github.com/nrkno/tv-automation-server-core/commit/2f3fd17)) -* monaco typing error fix ([e73467e](https://github.com/nrkno/tv-automation-server-core/commit/e73467e)) -* move back executeFunction to peripheralDeviceAPI ([226289f](https://github.com/nrkno/tv-automation-server-core/commit/226289f)) -* new implementation of runtime caching ([767fbb7](https://github.com/nrkno/tv-automation-server-core/commit/767fbb7)) -* normalize naming scheme to 'runtimeArguments', normalize hotkey labels ([528679d](https://github.com/nrkno/tv-automation-server-core/commit/528679d)) -* PR changes ([c877aad](https://github.com/nrkno/tv-automation-server-core/commit/c877aad)) -* re-add blueprint & mosdatacache restore (to be deprecated later) ([886c756](https://github.com/nrkno/tv-automation-server-core/commit/886c756)) -* refactor storeSnapshot methods ([6e66394](https://github.com/nrkno/tv-automation-server-core/commit/6e66394)) -* remove full-screen button, add label ([5c9a3e5](https://github.com/nrkno/tv-automation-server-core/commit/5c9a3e5)) -* remove unused imports ([5fe6ac3](https://github.com/nrkno/tv-automation-server-core/commit/5fe6ac3)) -* rename rundownAPI => runningOrderAPI ([89d48d0](https://github.com/nrkno/tv-automation-server-core/commit/89d48d0)) -* rewind icon was not responsive in ROFullscreenControls ([0e494df](https://github.com/nrkno/tv-automation-server-core/commit/0e494df)) -* RO buttons z-order ([15e9da8](https://github.com/nrkno/tv-automation-server-core/commit/15e9da8)) -* RO buttons z-order ([3c53254](https://github.com/nrkno/tv-automation-server-core/commit/3c53254)) -* show media errors in segment header ([3775d2e](https://github.com/nrkno/tv-automation-server-core/commit/3775d2e)) -* SOAP message encoding ([b19ea77](https://github.com/nrkno/tv-automation-server-core/commit/b19ea77)) -* styling fix for z-order with menu and RO buttons ([1b0717e](https://github.com/nrkno/tv-automation-server-core/commit/1b0717e)) -* syntax errors in test file ([a8f5d1e](https://github.com/nrkno/tv-automation-server-core/commit/a8f5d1e)) -* timeline resolution bug for non-infinite items ([35fc40a](https://github.com/nrkno/tv-automation-server-core/commit/35fc40a)) -* type error in SegmentTimelineContainer ([c4d6b4d](https://github.com/nrkno/tv-automation-server-core/commit/c4d6b4d)) - -* blueprints: Ensure the object ids generated by the post-process blueprint are unique ([bdee540](https://github.com/nrkno/tv-automation-server-core/commit/bdee540)) -* lookahead: clear inGroup in a better fashion ([60541cc](https://github.com/nrkno/tv-automation-server-core/commit/60541cc)) -* lookahead: Resolving an object for both transition clip and main clip causing an extra loadbg ([875bd1a](https://github.com/nrkno/tv-automation-server-core/commit/875bd1a)) -* media formats: do not 2x interlaced frame rates ([1639c32](https://github.com/nrkno/tv-automation-server-core/commit/1639c32)) -* playout: sl with autoNextOverlap not getting applied properly ([eb22967](https://github.com/nrkno/tv-automation-server-core/commit/eb22967)) +- added missing "force" parameter ([7b50a97](https://github.com/nrkno/tv-automation-server-core/commit/7b50a97)) +- always rewind GUI on roReset, roResetAndActivate ([4502d90](https://github.com/nrkno/tv-automation-server-core/commit/4502d90)) +- bug in storePath migration step ([b623973](https://github.com/nrkno/tv-automation-server-core/commit/b623973)) +- bug when moving story to last ([83cef62](https://github.com/nrkno/tv-automation-server-core/commit/83cef62)) +- undefined storePath ([cbfdde5](https://github.com/nrkno/tv-automation-server-core/commit/cbfdde5)) +- When updating collection, documents with removed properties didn't get their properties ([237b8ff](https://github.com/nrkno/tv-automation-server-core/commit/237b8ff)) +- clean up more collections when removing RO ([b84ed59](https://github.com/nrkno/tv-automation-server-core/commit/b84ed59)) +- clean up onBeforeUnload handler ([51adbba](https://github.com/nrkno/tv-automation-server-core/commit/51adbba)) +- clear runtimeArguments on resetRunningOrder ([350dd45](https://github.com/nrkno/tv-automation-server-core/commit/350dd45)) +- collection name ([e014558](https://github.com/nrkno/tv-automation-server-core/commit/e014558)) +- disable runtimeFunction caching during code-test & save ([e21f8dd](https://github.com/nrkno/tv-automation-server-core/commit/e21f8dd)) +- do not show empty string values in L3rd popup ([b0c6c8e](https://github.com/nrkno/tv-automation-server-core/commit/b0c6c8e)) +- Dont generate ui outputlayers for sli which are virtual ([c0ad368](https://github.com/nrkno/tv-automation-server-core/commit/c0ad368)) +- End of Show marker line doesn't end where it should ([e188c97](https://github.com/nrkno/tv-automation-server-core/commit/e188c97)) +- force lookahead inGroup field to be emptied. Fixes mismatched statobj ([c76209c](https://github.com/nrkno/tv-automation-server-core/commit/c76209c)) +- GUI: settings: only show parent-devices in left menu (only they have settings on them) ([ecb164e](https://github.com/nrkno/tv-automation-server-core/commit/ecb164e)) +- handle both update & insert of runningOrder ([3701bb3](https://github.com/nrkno/tv-automation-server-core/commit/3701bb3)) +- Hide Keyboard focus marker when not in studio mode ([70dc6b0](https://github.com/nrkno/tv-automation-server-core/commit/70dc6b0)) +- holdState = 0 displayed a status ([49c7ead](https://github.com/nrkno/tv-automation-server-core/commit/49c7ead)) +- holdState = 0 displayed a status ([aacd140](https://github.com/nrkno/tv-automation-server-core/commit/aacd140)) +- initDB for pharos lights ([57fbc73](https://github.com/nrkno/tv-automation-server-core/commit/57fbc73)) +- labels in modal dialogs ([3af18fc](https://github.com/nrkno/tv-automation-server-core/commit/3af18fc)) +- Major refactoring, splitting code into separate files depending on their areas: "rundown": Gene ([db82375](https://github.com/nrkno/tv-automation-server-core/commit/db82375)) +- make the context menu available in the entire header ([0590f9d](https://github.com/nrkno/tv-automation-server-core/commit/0590f9d)) +- Migration UI fixes ([b141243](https://github.com/nrkno/tv-automation-server-core/commit/b141243)) +- missing argument for mediaStatusCheck ([658e82a](https://github.com/nrkno/tv-automation-server-core/commit/658e82a)) +- Missing typings on ShowStyle ([a0a4e14](https://github.com/nrkno/tv-automation-server-core/commit/a0a4e14)) +- modified timestamp on imported blueprints was not being set, causing the cache to not be cleare ([2f3fd17](https://github.com/nrkno/tv-automation-server-core/commit/2f3fd17)) +- monaco typing error fix ([e73467e](https://github.com/nrkno/tv-automation-server-core/commit/e73467e)) +- move back executeFunction to peripheralDeviceAPI ([226289f](https://github.com/nrkno/tv-automation-server-core/commit/226289f)) +- new implementation of runtime caching ([767fbb7](https://github.com/nrkno/tv-automation-server-core/commit/767fbb7)) +- normalize naming scheme to 'runtimeArguments', normalize hotkey labels ([528679d](https://github.com/nrkno/tv-automation-server-core/commit/528679d)) +- PR changes ([c877aad](https://github.com/nrkno/tv-automation-server-core/commit/c877aad)) +- re-add blueprint & mosdatacache restore (to be deprecated later) ([886c756](https://github.com/nrkno/tv-automation-server-core/commit/886c756)) +- refactor storeSnapshot methods ([6e66394](https://github.com/nrkno/tv-automation-server-core/commit/6e66394)) +- remove full-screen button, add label ([5c9a3e5](https://github.com/nrkno/tv-automation-server-core/commit/5c9a3e5)) +- remove unused imports ([5fe6ac3](https://github.com/nrkno/tv-automation-server-core/commit/5fe6ac3)) +- rename rundownAPI => runningOrderAPI ([89d48d0](https://github.com/nrkno/tv-automation-server-core/commit/89d48d0)) +- rewind icon was not responsive in ROFullscreenControls ([0e494df](https://github.com/nrkno/tv-automation-server-core/commit/0e494df)) +- RO buttons z-order ([15e9da8](https://github.com/nrkno/tv-automation-server-core/commit/15e9da8)) +- RO buttons z-order ([3c53254](https://github.com/nrkno/tv-automation-server-core/commit/3c53254)) +- show media errors in segment header ([3775d2e](https://github.com/nrkno/tv-automation-server-core/commit/3775d2e)) +- SOAP message encoding ([b19ea77](https://github.com/nrkno/tv-automation-server-core/commit/b19ea77)) +- styling fix for z-order with menu and RO buttons ([1b0717e](https://github.com/nrkno/tv-automation-server-core/commit/1b0717e)) +- syntax errors in test file ([a8f5d1e](https://github.com/nrkno/tv-automation-server-core/commit/a8f5d1e)) +- timeline resolution bug for non-infinite items ([35fc40a](https://github.com/nrkno/tv-automation-server-core/commit/35fc40a)) +- type error in SegmentTimelineContainer ([c4d6b4d](https://github.com/nrkno/tv-automation-server-core/commit/c4d6b4d)) + +- blueprints: Ensure the object ids generated by the post-process blueprint are unique ([bdee540](https://github.com/nrkno/tv-automation-server-core/commit/bdee540)) +- lookahead: clear inGroup in a better fashion ([60541cc](https://github.com/nrkno/tv-automation-server-core/commit/60541cc)) +- lookahead: Resolving an object for both transition clip and main clip causing an extra loadbg ([875bd1a](https://github.com/nrkno/tv-automation-server-core/commit/875bd1a)) +- media formats: do not 2x interlaced frame rates ([1639c32](https://github.com/nrkno/tv-automation-server-core/commit/1639c32)) +- playout: sl with autoNextOverlap not getting applied properly ([eb22967](https://github.com/nrkno/tv-automation-server-core/commit/eb22967)) ### Other -* Add migrations for mappings changes ([5311056](https://github.com/nrkno/tv-automation-server-core/commit/5311056)) -* changelog typo ([fd4b420](https://github.com/nrkno/tv-automation-server-core/commit/fd4b420)) -* cleanup ([3122a48](https://github.com/nrkno/tv-automation-server-core/commit/3122a48)) -* correct error messages when template returns duplicate ids ([d783ca9](https://github.com/nrkno/tv-automation-server-core/commit/d783ca9)) -* edit & categorize changelog ([fbe999a](https://github.com/nrkno/tv-automation-server-core/commit/fbe999a)) -* ensure playout-gateway version ([fad6a01](https://github.com/nrkno/tv-automation-server-core/commit/fad6a01)) -* lint & trace fixes ([7639a5c](https://github.com/nrkno/tv-automation-server-core/commit/7639a5c)) -* merge Changelog from release3 ([29e8352](https://github.com/nrkno/tv-automation-server-core/commit/29e8352)) -* Merge with develop ([33bd23f](https://github.com/nrkno/tv-automation-server-core/commit/33bd23f)) -* merge with latest develop ([ea35a89](https://github.com/nrkno/tv-automation-server-core/commit/ea35a89)) -* migration steps for pharos ([b003dc7](https://github.com/nrkno/tv-automation-server-core/commit/b003dc7)) -* migration: ensure latest mos-device version ([da47723](https://github.com/nrkno/tv-automation-server-core/commit/da47723)) -* ptz crawl zoom migration ([6e4960c](https://github.com/nrkno/tv-automation-server-core/commit/6e4960c)) -* refactored SourceLayerType classNames (DRY) ([2dcfc32](https://github.com/nrkno/tv-automation-server-core/commit/2dcfc32)) -* remove unneccessary log tracing ([602f296](https://github.com/nrkno/tv-automation-server-core/commit/602f296)) -* remove unused function ([264b2a6](https://github.com/nrkno/tv-automation-server-core/commit/264b2a6)) -* removed mappings migration-steps, as blueprint can use .isAbstract instead ([de5aa30](https://github.com/nrkno/tv-automation-server-core/commit/de5aa30)) -* rename method ([b971af2](https://github.com/nrkno/tv-automation-server-core/commit/b971af2)) -* upd package-lock ([c3decd6](https://github.com/nrkno/tv-automation-server-core/commit/c3decd6)) -* upd SYSTEM_VERSION to release 4 ([f1b8dea](https://github.com/nrkno/tv-automation-server-core/commit/f1b8dea)) -* update changelog (from master) ([fd9d8fd](https://github.com/nrkno/tv-automation-server-core/commit/fd9d8fd)) -* update migration versions ([0a7d43e](https://github.com/nrkno/tv-automation-server-core/commit/0a7d43e)) -* updated changelog with commits during pre-release for 0.15.0 ([f005d1b](https://github.com/nrkno/tv-automation-server-core/commit/f005d1b)) -* init: add studio0_audio_bed source layer ([667b7e8](https://github.com/nrkno/tv-automation-server-core/commit/667b7e8)) -* initdb: Combine nora primary and permanent renderers ([772dda4](https://github.com/nrkno/tv-automation-server-core/commit/772dda4)) -* Panasonic PTZ: add support for zoom speed & zoom ([3a5babb](https://github.com/nrkno/tv-automation-server-core/commit/3a5babb)) -* release: 0.17.0 (from master) ([e390573](https://github.com/nrkno/tv-automation-server-core/commit/e390573)) -* docs: CD to correct folder for meteor project ([6591690](https://github.com/nrkno/tv-automation-server-core/commit/6591690)) +- Add migrations for mappings changes ([5311056](https://github.com/nrkno/tv-automation-server-core/commit/5311056)) +- changelog typo ([fd4b420](https://github.com/nrkno/tv-automation-server-core/commit/fd4b420)) +- cleanup ([3122a48](https://github.com/nrkno/tv-automation-server-core/commit/3122a48)) +- correct error messages when template returns duplicate ids ([d783ca9](https://github.com/nrkno/tv-automation-server-core/commit/d783ca9)) +- edit & categorize changelog ([fbe999a](https://github.com/nrkno/tv-automation-server-core/commit/fbe999a)) +- ensure playout-gateway version ([fad6a01](https://github.com/nrkno/tv-automation-server-core/commit/fad6a01)) +- lint & trace fixes ([7639a5c](https://github.com/nrkno/tv-automation-server-core/commit/7639a5c)) +- merge Changelog from release3 ([29e8352](https://github.com/nrkno/tv-automation-server-core/commit/29e8352)) +- Merge with develop ([33bd23f](https://github.com/nrkno/tv-automation-server-core/commit/33bd23f)) +- merge with latest develop ([ea35a89](https://github.com/nrkno/tv-automation-server-core/commit/ea35a89)) +- migration steps for pharos ([b003dc7](https://github.com/nrkno/tv-automation-server-core/commit/b003dc7)) +- migration: ensure latest mos-device version ([da47723](https://github.com/nrkno/tv-automation-server-core/commit/da47723)) +- ptz crawl zoom migration ([6e4960c](https://github.com/nrkno/tv-automation-server-core/commit/6e4960c)) +- refactored SourceLayerType classNames (DRY) ([2dcfc32](https://github.com/nrkno/tv-automation-server-core/commit/2dcfc32)) +- remove unneccessary log tracing ([602f296](https://github.com/nrkno/tv-automation-server-core/commit/602f296)) +- remove unused function ([264b2a6](https://github.com/nrkno/tv-automation-server-core/commit/264b2a6)) +- removed mappings migration-steps, as blueprint can use .isAbstract instead ([de5aa30](https://github.com/nrkno/tv-automation-server-core/commit/de5aa30)) +- rename method ([b971af2](https://github.com/nrkno/tv-automation-server-core/commit/b971af2)) +- upd package-lock ([c3decd6](https://github.com/nrkno/tv-automation-server-core/commit/c3decd6)) +- upd SYSTEM_VERSION to release 4 ([f1b8dea](https://github.com/nrkno/tv-automation-server-core/commit/f1b8dea)) +- update changelog (from master) ([fd9d8fd](https://github.com/nrkno/tv-automation-server-core/commit/fd9d8fd)) +- update migration versions ([0a7d43e](https://github.com/nrkno/tv-automation-server-core/commit/0a7d43e)) +- updated changelog with commits during pre-release for 0.15.0 ([f005d1b](https://github.com/nrkno/tv-automation-server-core/commit/f005d1b)) +- init: add studio0_audio_bed source layer ([667b7e8](https://github.com/nrkno/tv-automation-server-core/commit/667b7e8)) +- initdb: Combine nora primary and permanent renderers ([772dda4](https://github.com/nrkno/tv-automation-server-core/commit/772dda4)) +- Panasonic PTZ: add support for zoom speed & zoom ([3a5babb](https://github.com/nrkno/tv-automation-server-core/commit/3a5babb)) +- release: 0.17.0 (from master) ([e390573](https://github.com/nrkno/tv-automation-server-core/commit/e390573)) +- docs: CD to correct folder for meteor project ([6591690](https://github.com/nrkno/tv-automation-server-core/commit/6591690)) -# [0.17.0](https://github.com/nrkno/tv-automation-server-core/compare/v0.16.0...v0.17.0) (2018-11-15) +# [0.17.0](https://github.com/nrkno/tv-automation-server-core/compare/v0.16.0...v0.17.0) (2018-11-15) ### Bug Fixes -* bug when moving story to last ([2b86f1a](https://github.com/nrkno/tv-automation-server-core/commit/2b86f1a)) -* handle both update & insert of runningOrder ([84a6c53](https://github.com/nrkno/tv-automation-server-core/commit/84a6c53)) -* R3 ONLY: bugfix: reload data from ENPS ([cc6ed44](https://github.com/nrkno/tv-automation-server-core/commit/cc6ed44)) -* Release 3 only: disable config missing warning ([921cc82](https://github.com/nrkno/tv-automation-server-core/commit/921cc82)) -* remove full-screen button, add label ([5e9826e](https://github.com/nrkno/tv-automation-server-core/commit/5e9826e)) -* rewind icon was not responsive in ROFullscreenControls ([2e7c1d2](https://github.com/nrkno/tv-automation-server-core/commit/2e7c1d2)) -* smoother handling when reloading ENPS data ([83be7cb](https://github.com/nrkno/tv-automation-server-core/commit/83be7cb)) -* typo bug in performanceMonitor ([6a5eeb4](https://github.com/nrkno/tv-automation-server-core/commit/6a5eeb4)) - +- bug when moving story to last ([2b86f1a](https://github.com/nrkno/tv-automation-server-core/commit/2b86f1a)) +- handle both update & insert of runningOrder ([84a6c53](https://github.com/nrkno/tv-automation-server-core/commit/84a6c53)) +- R3 ONLY: bugfix: reload data from ENPS ([cc6ed44](https://github.com/nrkno/tv-automation-server-core/commit/cc6ed44)) +- Release 3 only: disable config missing warning ([921cc82](https://github.com/nrkno/tv-automation-server-core/commit/921cc82)) +- remove full-screen button, add label ([5e9826e](https://github.com/nrkno/tv-automation-server-core/commit/5e9826e)) +- rewind icon was not responsive in ROFullscreenControls ([2e7c1d2](https://github.com/nrkno/tv-automation-server-core/commit/2e7c1d2)) +- smoother handling when reloading ENPS data ([83be7cb](https://github.com/nrkno/tv-automation-server-core/commit/83be7cb)) +- typo bug in performanceMonitor ([6a5eeb4](https://github.com/nrkno/tv-automation-server-core/commit/6a5eeb4)) ### Features -* add performance monitor and track all server-side methods ([385f703](https://github.com/nrkno/tv-automation-server-core/commit/385f703)) -* add rewind button ([9fd61b5](https://github.com/nrkno/tv-automation-server-core/commit/9fd61b5)) -* display ms in user activity log ([7fc2744](https://github.com/nrkno/tv-automation-server-core/commit/7fc2744)) - - +- add performance monitor and track all server-side methods ([385f703](https://github.com/nrkno/tv-automation-server-core/commit/385f703)) +- add rewind button ([9fd61b5](https://github.com/nrkno/tv-automation-server-core/commit/9fd61b5)) +- display ms in user activity log ([7fc2744](https://github.com/nrkno/tv-automation-server-core/commit/7fc2744)) -# [0.16.0](https://github.com/nrkno/tv-automation-server-core/compare/v0.15.0...v0.16.0) (2018-10-26) +# [0.16.0](https://github.com/nrkno/tv-automation-server-core/compare/v0.15.0...v0.16.0) (2018-10-26) ### Bug Fixes -* &nbps; in a string instead of A0 ([299ba28](https://github.com/nrkno/tv-automation-server-core/commit/299ba28)) -* activate past ROs ([4b128a5](https://github.com/nrkno/tv-automation-server-core/commit/4b128a5)) -* add parseDateTime code hints to template editor ([c38b2f7](https://github.com/nrkno/tv-automation-server-core/commit/c38b2f7)) -* also defer sendStoryStatus, as that's not critical for playback ([9417862](https://github.com/nrkno/tv-automation-server-core/commit/9417862)) -* always rewind GUI on roReset, roResetAndActivate ([11744c9](https://github.com/nrkno/tv-automation-server-core/commit/11744c9)) -* be able to reset & activate inactivated RO ([18e01f4](https://github.com/nrkno/tv-automation-server-core/commit/18e01f4)) -* better implementation of push update to local objects ([d692c96](https://github.com/nrkno/tv-automation-server-core/commit/d692c96)) -* BIG optimization in roTake and affected functions, made database fetches async & parallel where possible. This should not affect the functionality, though testing is needed. ([aa6f4bd](https://github.com/nrkno/tv-automation-server-core/commit/aa6f4bd)) -* bugfix: update local object when updating database ([9d3b05b](https://github.com/nrkno/tv-automation-server-core/commit/9d3b05b)) -* bugfix: When updating collection, documents with removed properties didn't get their properties removed. ([93dd81e](https://github.com/nrkno/tv-automation-server-core/commit/93dd81e)) -* defer triggerExternalMessage so as not to block timelineUpdate's ([ba7383f](https://github.com/nrkno/tv-automation-server-core/commit/ba7383f)) -* disable fullscreen overlay in developer mode ([7cc2e43](https://github.com/nrkno/tv-automation-server-core/commit/7cc2e43)) -* disable runtimeFunction caching during code-test & save ([74d6d34](https://github.com/nrkno/tv-automation-server-core/commit/74d6d34)) -* duration settling ([0648f57](https://github.com/nrkno/tv-automation-server-core/commit/0648f57)) -* EditAttribute: dropdown options was always strings ([814cdf7](https://github.com/nrkno/tv-automation-server-core/commit/814cdf7)) -* fix PTZ Testing harness ([97bccc7](https://github.com/nrkno/tv-automation-server-core/commit/97bccc7)) -* force lookahead inGroup field to be emptied. Fixes mismatched statobj ([c76209c](https://github.com/nrkno/tv-automation-server-core/commit/c76209c)) -* getting monaco to work runtime while still having typings ([5db8218](https://github.com/nrkno/tv-automation-server-core/commit/5db8218)) -* handle when nexting before start or after end ([506bb8a](https://github.com/nrkno/tv-automation-server-core/commit/506bb8a)) -* has played styling shouldn't be applied to Guest and Remote segments ([18bdc82](https://github.com/nrkno/tv-automation-server-core/commit/18bdc82)) -* holdState = 0 displayed a status ([49c7ead](https://github.com/nrkno/tv-automation-server-core/commit/49c7ead)) -* improved queries & added index ([159f6d5](https://github.com/nrkno/tv-automation-server-core/commit/159f6d5)) -* initiateDB update for PTZ ([e529782](https://github.com/nrkno/tv-automation-server-core/commit/e529782)) -* locked [@babel](https://github.com/babel)/runtime version & updated package-lock ([8e62d2f](https://github.com/nrkno/tv-automation-server-core/commit/8e62d2f)) -* modified timestamp on imported blueprints was not being set, causing the cache to not be cleared properly ([2f3fd17](https://github.com/nrkno/tv-automation-server-core/commit/2f3fd17)) -* new implementation of runtime caching ([92e09be](https://github.com/nrkno/tv-automation-server-core/commit/92e09be)) -* onAir line jumping around on takes ([8330112](https://github.com/nrkno/tv-automation-server-core/commit/8330112)) -* optimize saveIntoDB ([65c189e](https://github.com/nrkno/tv-automation-server-core/commit/65c189e)) -* re-added monaco typings and disabled import, so it works client-side ([1226763](https://github.com/nrkno/tv-automation-server-core/commit/1226763)) -* remount monaco ([4ce1566](https://github.com/nrkno/tv-automation-server-core/commit/4ce1566)) -* remove debug line in nightly cronjob ([dda3017](https://github.com/nrkno/tv-automation-server-core/commit/dda3017)) -* remove unused translation helper ([e545a9e](https://github.com/nrkno/tv-automation-server-core/commit/e545a9e)) -* resetRunningorder should update timeline ([0d01e6a](https://github.com/nrkno/tv-automation-server-core/commit/0d01e6a)) -* resetting running order rewind ([a122f2c](https://github.com/nrkno/tv-automation-server-core/commit/a122f2c)) -* retry strategy for restart casparcg cronjob ([b54f0f6](https://github.com/nrkno/tv-automation-server-core/commit/b54f0f6)) -* RO overview crashed during rebuild of RO ([d2c62a1](https://github.com/nrkno/tv-automation-server-core/commit/d2c62a1)) -* setAsNext on previous ([4ffe665](https://github.com/nrkno/tv-automation-server-core/commit/4ffe665)) -* SOAP message encoding ([63d8634](https://github.com/nrkno/tv-automation-server-core/commit/63d8634)) -* take action should not throw as nasty errors when called by user. ([6791d50](https://github.com/nrkno/tv-automation-server-core/commit/6791d50)) -* Timeline always being built without previous segmentline ([a077805](https://github.com/nrkno/tv-automation-server-core/commit/a077805)) -* toc trace message ([c53124f](https://github.com/nrkno/tv-automation-server-core/commit/c53124f)) -* too long script out-words could overlap with previous items ([8f8a9a2](https://github.com/nrkno/tv-automation-server-core/commit/8f8a9a2)) -* top RO overview labels clipped in wrong places ([5e5c228](https://github.com/nrkno/tv-automation-server-core/commit/5e5c228)) -* typing fix: cannot find name 'monaco' ([3ad88ce](https://github.com/nrkno/tv-automation-server-core/commit/3ad88ce)) -* typing fixes, to work with updated packages ([b4362f7](https://github.com/nrkno/tv-automation-server-core/commit/b4362f7)) -* upd meteor typings ([53f17d2](https://github.com/nrkno/tv-automation-server-core/commit/53f17d2)) -* update Next-line when inserting story just before it, also added property to track if the next point was set manually ([d82dbc6](https://github.com/nrkno/tv-automation-server-core/commit/d82dbc6)) -* updated nightly cronjob: restart casparcg devices, to work with new restartCasparCG function implementation ([3f9344d](https://github.com/nrkno/tv-automation-server-core/commit/3f9344d)) -* updated package-lock.json ([bf0cfde](https://github.com/nrkno/tv-automation-server-core/commit/bf0cfde)) -* **hold:** Too many sli being extended for hold mode ([f644e32](https://github.com/nrkno/tv-automation-server-core/commit/f644e32)) -* Use thin styling for a solo 'AUTO' label ([74b5f15](https://github.com/nrkno/tv-automation-server-core/commit/74b5f15)) -* **hold:** Ensure the original stk does not get picked up as a dynamic object when setting the sl as next ([b10f48d](https://github.com/nrkno/tv-automation-server-core/commit/b10f48d)) -* **lookahead:** clear inGroup in a better fashion ([60541cc](https://github.com/nrkno/tv-automation-server-core/commit/60541cc)) -* **lookahead:** Dont run lookahead on abs0 sli if there is an active transition. ([191df09](https://github.com/nrkno/tv-automation-server-core/commit/191df09)) -* **lookahead:** Fix lookahead when transition does not define clip. Fix duplicate key exception when using hold multiple times at the same point ([a1bb026](https://github.com/nrkno/tv-automation-server-core/commit/a1bb026)) -* **lookahead:** Fix lookahead when transition object starts at abs0 ([bd3edbd](https://github.com/nrkno/tv-automation-server-core/commit/bd3edbd)) -* **lookahead:** Resolving an object for both transition clip and main clip causing an extra loadbg ([739b5e4](https://github.com/nrkno/tv-automation-server-core/commit/739b5e4)) -* **RO view:** Always persist original event in user-action methods ([6ba7df8](https://github.com/nrkno/tv-automation-server-core/commit/6ba7df8)) -* userActivity executionTime logging ([a3e763e](https://github.com/nrkno/tv-automation-server-core/commit/a3e763e)) - +- &nbps; in a string instead of A0 ([299ba28](https://github.com/nrkno/tv-automation-server-core/commit/299ba28)) +- activate past ROs ([4b128a5](https://github.com/nrkno/tv-automation-server-core/commit/4b128a5)) +- add parseDateTime code hints to template editor ([c38b2f7](https://github.com/nrkno/tv-automation-server-core/commit/c38b2f7)) +- also defer sendStoryStatus, as that's not critical for playback ([9417862](https://github.com/nrkno/tv-automation-server-core/commit/9417862)) +- always rewind GUI on roReset, roResetAndActivate ([11744c9](https://github.com/nrkno/tv-automation-server-core/commit/11744c9)) +- be able to reset & activate inactivated RO ([18e01f4](https://github.com/nrkno/tv-automation-server-core/commit/18e01f4)) +- better implementation of push update to local objects ([d692c96](https://github.com/nrkno/tv-automation-server-core/commit/d692c96)) +- BIG optimization in roTake and affected functions, made database fetches async & parallel where possible. This should not affect the functionality, though testing is needed. ([aa6f4bd](https://github.com/nrkno/tv-automation-server-core/commit/aa6f4bd)) +- bugfix: update local object when updating database ([9d3b05b](https://github.com/nrkno/tv-automation-server-core/commit/9d3b05b)) +- bugfix: When updating collection, documents with removed properties didn't get their properties removed. ([93dd81e](https://github.com/nrkno/tv-automation-server-core/commit/93dd81e)) +- defer triggerExternalMessage so as not to block timelineUpdate's ([ba7383f](https://github.com/nrkno/tv-automation-server-core/commit/ba7383f)) +- disable fullscreen overlay in developer mode ([7cc2e43](https://github.com/nrkno/tv-automation-server-core/commit/7cc2e43)) +- disable runtimeFunction caching during code-test & save ([74d6d34](https://github.com/nrkno/tv-automation-server-core/commit/74d6d34)) +- duration settling ([0648f57](https://github.com/nrkno/tv-automation-server-core/commit/0648f57)) +- EditAttribute: dropdown options was always strings ([814cdf7](https://github.com/nrkno/tv-automation-server-core/commit/814cdf7)) +- fix PTZ Testing harness ([97bccc7](https://github.com/nrkno/tv-automation-server-core/commit/97bccc7)) +- force lookahead inGroup field to be emptied. Fixes mismatched statobj ([c76209c](https://github.com/nrkno/tv-automation-server-core/commit/c76209c)) +- getting monaco to work runtime while still having typings ([5db8218](https://github.com/nrkno/tv-automation-server-core/commit/5db8218)) +- handle when nexting before start or after end ([506bb8a](https://github.com/nrkno/tv-automation-server-core/commit/506bb8a)) +- has played styling shouldn't be applied to Guest and Remote segments ([18bdc82](https://github.com/nrkno/tv-automation-server-core/commit/18bdc82)) +- holdState = 0 displayed a status ([49c7ead](https://github.com/nrkno/tv-automation-server-core/commit/49c7ead)) +- improved queries & added index ([159f6d5](https://github.com/nrkno/tv-automation-server-core/commit/159f6d5)) +- initiateDB update for PTZ ([e529782](https://github.com/nrkno/tv-automation-server-core/commit/e529782)) +- locked [@babel](https://github.com/babel)/runtime version & updated package-lock ([8e62d2f](https://github.com/nrkno/tv-automation-server-core/commit/8e62d2f)) +- modified timestamp on imported blueprints was not being set, causing the cache to not be cleared properly ([2f3fd17](https://github.com/nrkno/tv-automation-server-core/commit/2f3fd17)) +- new implementation of runtime caching ([92e09be](https://github.com/nrkno/tv-automation-server-core/commit/92e09be)) +- onAir line jumping around on takes ([8330112](https://github.com/nrkno/tv-automation-server-core/commit/8330112)) +- optimize saveIntoDB ([65c189e](https://github.com/nrkno/tv-automation-server-core/commit/65c189e)) +- re-added monaco typings and disabled import, so it works client-side ([1226763](https://github.com/nrkno/tv-automation-server-core/commit/1226763)) +- remount monaco ([4ce1566](https://github.com/nrkno/tv-automation-server-core/commit/4ce1566)) +- remove debug line in nightly cronjob ([dda3017](https://github.com/nrkno/tv-automation-server-core/commit/dda3017)) +- remove unused translation helper ([e545a9e](https://github.com/nrkno/tv-automation-server-core/commit/e545a9e)) +- resetRunningorder should update timeline ([0d01e6a](https://github.com/nrkno/tv-automation-server-core/commit/0d01e6a)) +- resetting running order rewind ([a122f2c](https://github.com/nrkno/tv-automation-server-core/commit/a122f2c)) +- retry strategy for restart casparcg cronjob ([b54f0f6](https://github.com/nrkno/tv-automation-server-core/commit/b54f0f6)) +- RO overview crashed during rebuild of RO ([d2c62a1](https://github.com/nrkno/tv-automation-server-core/commit/d2c62a1)) +- setAsNext on previous ([4ffe665](https://github.com/nrkno/tv-automation-server-core/commit/4ffe665)) +- SOAP message encoding ([63d8634](https://github.com/nrkno/tv-automation-server-core/commit/63d8634)) +- take action should not throw as nasty errors when called by user. ([6791d50](https://github.com/nrkno/tv-automation-server-core/commit/6791d50)) +- Timeline always being built without previous segmentline ([a077805](https://github.com/nrkno/tv-automation-server-core/commit/a077805)) +- toc trace message ([c53124f](https://github.com/nrkno/tv-automation-server-core/commit/c53124f)) +- too long script out-words could overlap with previous items ([8f8a9a2](https://github.com/nrkno/tv-automation-server-core/commit/8f8a9a2)) +- top RO overview labels clipped in wrong places ([5e5c228](https://github.com/nrkno/tv-automation-server-core/commit/5e5c228)) +- typing fix: cannot find name 'monaco' ([3ad88ce](https://github.com/nrkno/tv-automation-server-core/commit/3ad88ce)) +- typing fixes, to work with updated packages ([b4362f7](https://github.com/nrkno/tv-automation-server-core/commit/b4362f7)) +- upd meteor typings ([53f17d2](https://github.com/nrkno/tv-automation-server-core/commit/53f17d2)) +- update Next-line when inserting story just before it, also added property to track if the next point was set manually ([d82dbc6](https://github.com/nrkno/tv-automation-server-core/commit/d82dbc6)) +- updated nightly cronjob: restart casparcg devices, to work with new restartCasparCG function implementation ([3f9344d](https://github.com/nrkno/tv-automation-server-core/commit/3f9344d)) +- updated package-lock.json ([bf0cfde](https://github.com/nrkno/tv-automation-server-core/commit/bf0cfde)) +- **hold:** Too many sli being extended for hold mode ([f644e32](https://github.com/nrkno/tv-automation-server-core/commit/f644e32)) +- Use thin styling for a solo 'AUTO' label ([74b5f15](https://github.com/nrkno/tv-automation-server-core/commit/74b5f15)) +- **hold:** Ensure the original stk does not get picked up as a dynamic object when setting the sl as next ([b10f48d](https://github.com/nrkno/tv-automation-server-core/commit/b10f48d)) +- **lookahead:** clear inGroup in a better fashion ([60541cc](https://github.com/nrkno/tv-automation-server-core/commit/60541cc)) +- **lookahead:** Dont run lookahead on abs0 sli if there is an active transition. ([191df09](https://github.com/nrkno/tv-automation-server-core/commit/191df09)) +- **lookahead:** Fix lookahead when transition does not define clip. Fix duplicate key exception when using hold multiple times at the same point ([a1bb026](https://github.com/nrkno/tv-automation-server-core/commit/a1bb026)) +- **lookahead:** Fix lookahead when transition object starts at abs0 ([bd3edbd](https://github.com/nrkno/tv-automation-server-core/commit/bd3edbd)) +- **lookahead:** Resolving an object for both transition clip and main clip causing an extra loadbg ([739b5e4](https://github.com/nrkno/tv-automation-server-core/commit/739b5e4)) +- **RO view:** Always persist original event in user-action methods ([6ba7df8](https://github.com/nrkno/tv-automation-server-core/commit/6ba7df8)) +- userActivity executionTime logging ([a3e763e](https://github.com/nrkno/tv-automation-server-core/commit/a3e763e)) ### Features -* add a subtle line underneath segment title when has-remote-items and has-guest-items ([a02b50d](https://github.com/nrkno/tv-automation-server-core/commit/a02b50d)) -* **Guest input:** use isGuestInput like isRemoteInput ([2d40e87](https://github.com/nrkno/tv-automation-server-core/commit/2d40e87)) -* Add backup restore method to import mock rundowns similar to the embedded mocks ([251555b](https://github.com/nrkno/tv-automation-server-core/commit/251555b)) -* added async database functions ([a754a24](https://github.com/nrkno/tv-automation-server-core/commit/a754a24)) -* added context.runningOrder, for blueprints to use ([855f6d4](https://github.com/nrkno/tv-automation-server-core/commit/855f6d4)) -* added executionTime to userAction ([1ca92c1](https://github.com/nrkno/tv-automation-server-core/commit/1ca92c1)) -* added SegmentLine.timings.stoppedPlayback property ([2121245](https://github.com/nrkno/tv-automation-server-core/commit/2121245)) -* added SegmentLine.timings.takeDone property ([d18d539](https://github.com/nrkno/tv-automation-server-core/commit/d18d539)) -* added tictac for troubleshooting timings ([df91cea](https://github.com/nrkno/tv-automation-server-core/commit/df91cea)) -* Allow StudioInstallation to define entries in the hotkey legend ([74c1c1c](https://github.com/nrkno/tv-automation-server-core/commit/74c1c1c)) -* Hold state UI ([c7a17c7](https://github.com/nrkno/tv-automation-server-core/commit/c7a17c7)) -* hyperdeck device ([#49](https://github.com/nrkno/tv-automation-server-core/issues/49)) ([c706628](https://github.com/nrkno/tv-automation-server-core/commit/c706628)) -* implement camera number-device mapping for PTZ ([374568d](https://github.com/nrkno/tv-automation-server-core/commit/374568d)) -* implement click-to-adlib completely ([577dcac](https://github.com/nrkno/tv-automation-server-core/commit/577dcac)) -* implement Panasonic PTZ device ([42d8534](https://github.com/nrkno/tv-automation-server-core/commit/42d8534)) -* implement Panasonic PTZ settings ([f7840da](https://github.com/nrkno/tv-automation-server-core/commit/f7840da)) -* implement spliting long scripts into beginning and end in popup ([9fa8006](https://github.com/nrkno/tv-automation-server-core/commit/9fa8006)) -* log warning message when trying to access a studio.config value that hasn't been set. ([7e706c6](https://github.com/nrkno/tv-automation-server-core/commit/7e706c6)) -* only log logger.debug() when in developer mode ([8ed8e71](https://github.com/nrkno/tv-automation-server-core/commit/8ed8e71)) -* optimization: add cache of blueprints, to avoid having to parse text-functions all the time ([1e469d9](https://github.com/nrkno/tv-automation-server-core/commit/1e469d9)) -* playout device debugLogging (wip) ([7ab4ec6](https://github.com/nrkno/tv-automation-server-core/commit/7ab4ec6)) -* reimplement fullscreen/on air button ([4b8658d](https://github.com/nrkno/tv-automation-server-core/commit/4b8658d)) -* running order full-screen marker ([03010ec](https://github.com/nrkno/tv-automation-server-core/commit/03010ec)) -* send evaluation message to slack. WIP ([3dcbe3a](https://github.com/nrkno/tv-automation-server-core/commit/3dcbe3a)) -* send evaluation message to slack. WIP ([96e8b81](https://github.com/nrkno/tv-automation-server-core/commit/96e8b81)) -* **click-to-take:** initial WIP ([8e63808](https://github.com/nrkno/tv-automation-server-core/commit/8e63808)) -* **click-to-take:** more work in progress ([e3549e0](https://github.com/nrkno/tv-automation-server-core/commit/e3549e0)) -* **RO view:** Introduce a 'duration settling' state to delay the UI update until the actual playout duration is received from playout ([28823c3](https://github.com/nrkno/tv-automation-server-core/commit/28823c3)) -* show changed timestamp on script items ([f2955e1](https://github.com/nrkno/tv-automation-server-core/commit/f2955e1)) -* Switch to single-device design ([a268c40](https://github.com/nrkno/tv-automation-server-core/commit/a268c40)) -* Treat sli marked as virtual solely as markers for the timeline. They are hidden from the ui and are not allowed to place any contents on the timeline ([25e0f42](https://github.com/nrkno/tv-automation-server-core/commit/25e0f42)) -* update meteor typings ([49b6969](https://github.com/nrkno/tv-automation-server-core/commit/49b6969)) -* use default renderer for MIC sourceLayerType ([6ab97b7](https://github.com/nrkno/tv-automation-server-core/commit/6ab97b7)) - - +- add a subtle line underneath segment title when has-remote-items and has-guest-items ([a02b50d](https://github.com/nrkno/tv-automation-server-core/commit/a02b50d)) +- **Guest input:** use isGuestInput like isRemoteInput ([2d40e87](https://github.com/nrkno/tv-automation-server-core/commit/2d40e87)) +- Add backup restore method to import mock rundowns similar to the embedded mocks ([251555b](https://github.com/nrkno/tv-automation-server-core/commit/251555b)) +- added async database functions ([a754a24](https://github.com/nrkno/tv-automation-server-core/commit/a754a24)) +- added context.runningOrder, for blueprints to use ([855f6d4](https://github.com/nrkno/tv-automation-server-core/commit/855f6d4)) +- added executionTime to userAction ([1ca92c1](https://github.com/nrkno/tv-automation-server-core/commit/1ca92c1)) +- added SegmentLine.timings.stoppedPlayback property ([2121245](https://github.com/nrkno/tv-automation-server-core/commit/2121245)) +- added SegmentLine.timings.takeDone property ([d18d539](https://github.com/nrkno/tv-automation-server-core/commit/d18d539)) +- added tictac for troubleshooting timings ([df91cea](https://github.com/nrkno/tv-automation-server-core/commit/df91cea)) +- Allow StudioInstallation to define entries in the hotkey legend ([74c1c1c](https://github.com/nrkno/tv-automation-server-core/commit/74c1c1c)) +- Hold state UI ([c7a17c7](https://github.com/nrkno/tv-automation-server-core/commit/c7a17c7)) +- hyperdeck device ([#49](https://github.com/nrkno/tv-automation-server-core/issues/49)) ([c706628](https://github.com/nrkno/tv-automation-server-core/commit/c706628)) +- implement camera number-device mapping for PTZ ([374568d](https://github.com/nrkno/tv-automation-server-core/commit/374568d)) +- implement click-to-adlib completely ([577dcac](https://github.com/nrkno/tv-automation-server-core/commit/577dcac)) +- implement Panasonic PTZ device ([42d8534](https://github.com/nrkno/tv-automation-server-core/commit/42d8534)) +- implement Panasonic PTZ settings ([f7840da](https://github.com/nrkno/tv-automation-server-core/commit/f7840da)) +- implement spliting long scripts into beginning and end in popup ([9fa8006](https://github.com/nrkno/tv-automation-server-core/commit/9fa8006)) +- log warning message when trying to access a studio.config value that hasn't been set. ([7e706c6](https://github.com/nrkno/tv-automation-server-core/commit/7e706c6)) +- only log logger.debug() when in developer mode ([8ed8e71](https://github.com/nrkno/tv-automation-server-core/commit/8ed8e71)) +- optimization: add cache of blueprints, to avoid having to parse text-functions all the time ([1e469d9](https://github.com/nrkno/tv-automation-server-core/commit/1e469d9)) +- playout device debugLogging (wip) ([7ab4ec6](https://github.com/nrkno/tv-automation-server-core/commit/7ab4ec6)) +- reimplement fullscreen/on air button ([4b8658d](https://github.com/nrkno/tv-automation-server-core/commit/4b8658d)) +- running order full-screen marker ([03010ec](https://github.com/nrkno/tv-automation-server-core/commit/03010ec)) +- send evaluation message to slack. WIP ([3dcbe3a](https://github.com/nrkno/tv-automation-server-core/commit/3dcbe3a)) +- send evaluation message to slack. WIP ([96e8b81](https://github.com/nrkno/tv-automation-server-core/commit/96e8b81)) +- **click-to-take:** initial WIP ([8e63808](https://github.com/nrkno/tv-automation-server-core/commit/8e63808)) +- **click-to-take:** more work in progress ([e3549e0](https://github.com/nrkno/tv-automation-server-core/commit/e3549e0)) +- **RO view:** Introduce a 'duration settling' state to delay the UI update until the actual playout duration is received from playout ([28823c3](https://github.com/nrkno/tv-automation-server-core/commit/28823c3)) +- show changed timestamp on script items ([f2955e1](https://github.com/nrkno/tv-automation-server-core/commit/f2955e1)) +- Switch to single-device design ([a268c40](https://github.com/nrkno/tv-automation-server-core/commit/a268c40)) +- Treat sli marked as virtual solely as markers for the timeline. They are hidden from the ui and are not allowed to place any contents on the timeline ([25e0f42](https://github.com/nrkno/tv-automation-server-core/commit/25e0f42)) +- update meteor typings ([49b6969](https://github.com/nrkno/tv-automation-server-core/commit/49b6969)) +- use default renderer for MIC sourceLayerType ([6ab97b7](https://github.com/nrkno/tv-automation-server-core/commit/6ab97b7)) + ## 0.16.0-0 (2018-10-19) (pre-release) ### Features -* **Added support for Panasonic PTZ cameras** + +- **Added support for Panasonic PTZ cameras**
feat: implement Panasonic PTZ device ([42d8534](https://github.com/nrkno/tv-automation-server-core/commit/42d8534))
feat: implement Panasonic PTZ settings ([f7840da](https://github.com/nrkno/tv-automation-server-core/commit/f7840da))
feat: implement camera number-device mapping for PTZ ([374568d](https://github.com/nrkno/tv-automation-server-core/commit/374568d))
fix: fix PTZ Testing harness ([97bccc7](https://github.com/nrkno/tv-automation-server-core/commit/97bccc7))
fix: initiateDB update for PTZ ([e529782](https://github.com/nrkno/tv-automation-server-core/commit/e529782))
chore: Create a mock RO with PTZ items ([986c3f7](https://github.com/nrkno/tv-automation-server-core/commit/986c3f7)) -* **Added support for recording using a Hyperdeck device** +- **Added support for recording using a Hyperdeck device**
feat: hyperdeck device (#49) ([c706628](https://github.com/nrkno/tv-automation-server-core/commit/c706628)), closes [#49](https://github.com/nrkno/tv-automation-server-core/issues/49) -* **Send Slack messages after evaluation form** +- **Send Slack messages after evaluation form**
Merge remote-tracking branch 'origin/feature/sendSlack' into develop ([10c97a5](https://github.com/nrkno/tv-automation-server-core/commit/10c97a5))
feat: send evaluation message to slack. WIP ([3dcbe3a](https://github.com/nrkno/tv-automation-server-core/commit/3dcbe3a))
feat: send evaluation message to slack. WIP ([96e8b81](https://github.com/nrkno/tv-automation-server-core/commit/96e8b81))
chore: added link to slack messages ([c322d83](https://github.com/nrkno/tv-automation-server-core/commit/c322d83)) -* **Core optimizations: lowering latencies during playout** +- **Core optimizations: lowering latencies during playout**
Merge branch 'feature/optimize2' into develop ([d8e16c4](https://github.com/nrkno/tv-automation-server-core/commit/d8e16c4))
fix: BIG optimization in roTake and affected functions, made database fetches async & parallel where ([aa6f4bd](https://github.com/nrkno/tv-automation-server-core/commit/aa6f4bd))
feat: added async database functions ([a754a24](https://github.com/nrkno/tv-automation-server-core/commit/a754a24)) @@ -6026,1364 +6034,1318 @@ This is a major and Breaking release, extra care is recommended when upgrading f
Fix: fix issues with SegmentLine indexes ([0f5b30e](https://github.com/nrkno/tv-automation-server-core/commit/0f5b30e))
Chore: add more indexes in collections for quicker queries and sorts ([f64b161](https://github.com/nrkno/tv-automation-server-core/commit/f64b161)) -* **"Guest-feature", highlight the segment when a guest (or other live source) is somewhere within a segment** +- **"Guest-feature", highlight the segment when a guest (or other live source) is somewhere within a segment**
feat(Guest input): use isGuestInput like isRemoteInput ([2d40e87](https://github.com/nrkno/tv-automation-server-core/commit/2d40e87))
chore: Added guest segment item color. ([a105b90](https://github.com/nrkno/tv-automation-server-core/commit/a105b90)) -* **Added various internal timing logging** +- **Added various internal timing logging**
feat: added executionTime to userAction ([1ca92c1](https://github.com/nrkno/tv-automation-server-core/commit/1ca92c1))
feat: added SegmentLine.timings.stoppedPlayback property ([2121245](https://github.com/nrkno/tv-automation-server-core/commit/2121245))
feat: added SegmentLine.timings.takeDone property ([d18d539](https://github.com/nrkno/tv-automation-server-core/commit/d18d539))
feat: added tictac for troubleshooting timings ([df91cea](https://github.com/nrkno/tv-automation-server-core/commit/df91cea)) -* **Better handling of Next point, when story is update/inserted/removed** +- **Better handling of Next point, when story is update/inserted/removed**
fix: handle when nexting before start or after end ([506bb8a](https://github.com/nrkno/tv-automation-server-core/commit/506bb8a)) -
fix: update Next-line when inserting story just before it, also added property to track if the next ([d82dbc6](https://github.com/nrkno/tv-automation-server-core/commit/d82dbc6)) +
fix: update Next-line when inserting story just before it, also added property to track if the next ([d82dbc6](https://github.com/nrkno/tv-automation-server-core/commit/d82dbc6))
Merge branch 'fix/insertStoryBeforeNext' into develop ([5d1766e](https://github.com/nrkno/tv-automation-server-core/commit/5d1766e)) #### Other -* feat: added context.runningOrder, for blueprints to use ([855f6d4](https://github.com/nrkno/tv-automation-server-core/commit/855f6d4)) -* feat: log warning message when trying to access a studio.config value that hasn't been set. ([7e706c6](https://github.com/nrkno/tv-automation-server-core/commit/7e706c6)) -* feat: only log logger.debug() when in developer mode ([8ed8e71](https://github.com/nrkno/tv-automation-server-core/commit/8ed8e71)) -* feat: playout device debugLogging (wip) ([7ab4ec6](https://github.com/nrkno/tv-automation-server-core/commit/7ab4ec6)) -* feat: update meteor typings ([49b6969](https://github.com/nrkno/tv-automation-server-core/commit/49b6969)) + +- feat: added context.runningOrder, for blueprints to use ([855f6d4](https://github.com/nrkno/tv-automation-server-core/commit/855f6d4)) +- feat: log warning message when trying to access a studio.config value that hasn't been set. ([7e706c6](https://github.com/nrkno/tv-automation-server-core/commit/7e706c6)) +- feat: only log logger.debug() when in developer mode ([8ed8e71](https://github.com/nrkno/tv-automation-server-core/commit/8ed8e71)) +- feat: playout device debugLogging (wip) ([7ab4ec6](https://github.com/nrkno/tv-automation-server-core/commit/7ab4ec6)) +- feat: update meteor typings ([49b6969](https://github.com/nrkno/tv-automation-server-core/commit/49b6969)) #### GUI improvements -* **Button for making window fullscreen** + +- **Button for making window fullscreen**
feat: reimplement fullscreen/on air button ([4b8658d](https://github.com/nrkno/tv-automation-server-core/commit/4b8658d))
feat: running order full-screen marker ([03010ec](https://github.com/nrkno/tv-automation-server-core/commit/03010ec))
fix: disable fullscreen overlay in developer mode ([7cc2e43](https://github.com/nrkno/tv-automation-server-core/commit/7cc2e43))
fix: fix developer mode switch for fullscreen overlay ([88972a7](https://github.com/nrkno/tv-automation-server-core/commit/88972a7))
fix: full screen marker position ([3e0b973](https://github.com/nrkno/tv-automation-server-core/commit/3e0b973))
chore: Changed the wording for the Fullscreen Mode in both English and Norwegian. ([a69ee03](https://github.com/nrkno/tv-automation-server-core/commit/a69ee03)) -* **Click-to-take** +- **Click-to-take**
feat(click-to-take): initial WIP ([8e63808](https://github.com/nrkno/tv-automation-server-core/commit/8e63808))
feat(click-to-take): more work in progress ([e3549e0](https://github.com/nrkno/tv-automation-server-core/commit/e3549e0))
feat: implement click-to-adlib completely ([577dcac](https://github.com/nrkno/tv-automation-server-core/commit/577dcac)) -* feat: Allow StudioInstallation to define entries in the hotkey legend ([74c1c1c](https://github.com/nrkno/tv-automation-server-core/commit/74c1c1c)) -* feat: show changed timestamp on script items ([f2955e1](https://github.com/nrkno/tv-automation-server-core/commit/f2955e1)) -* feat: skip source layer labels if layer label is the same as output group label ([92f8bd1](https://github.com/nrkno/tv-automation-server-core/commit/92f8bd1)) -* feat: implement splitting long scripts into beginning and end in popup ([9fa8006](https://github.com/nrkno/tv-automation-server-core/commit/9fa8006)) -* feat: Switch to single-device design ([a268c40](https://github.com/nrkno/tv-automation-server-core/commit/a268c40)) -* feat: Treat sli marked as virtual solely as markers for the timeline. They are hidden from the ui an ([25e0f42](https://github.com/nrkno/tv-automation-server-core/commit/25e0f42)) -* chore: Tweaked camera segment item color to differentiate it more clearly when compared to the 'scrip ([1cbba0b](https://github.com/nrkno/tv-automation-server-core/commit/1cbba0b)) +- feat: Allow StudioInstallation to define entries in the hotkey legend ([74c1c1c](https://github.com/nrkno/tv-automation-server-core/commit/74c1c1c)) +- feat: show changed timestamp on script items ([f2955e1](https://github.com/nrkno/tv-automation-server-core/commit/f2955e1)) +- feat: skip source layer labels if layer label is the same as output group label ([92f8bd1](https://github.com/nrkno/tv-automation-server-core/commit/92f8bd1)) +- feat: implement splitting long scripts into beginning and end in popup ([9fa8006](https://github.com/nrkno/tv-automation-server-core/commit/9fa8006)) +- feat: Switch to single-device design ([a268c40](https://github.com/nrkno/tv-automation-server-core/commit/a268c40)) +- feat: Treat sli marked as virtual solely as markers for the timeline. They are hidden from the ui an ([25e0f42](https://github.com/nrkno/tv-automation-server-core/commit/25e0f42)) +- chore: Tweaked camera segment item color to differentiate it more clearly when compared to the 'scrip ([1cbba0b](https://github.com/nrkno/tv-automation-server-core/commit/1cbba0b)) ### Bug Fixes -* fix: &nbps; in a string instead of A0 ([299ba28](https://github.com/nrkno/tv-automation-server-core/commit/299ba28)) -* fix: add parseDateTime code hints to template editor ([c38b2f7](https://github.com/nrkno/tv-automation-server-core/commit/c38b2f7)) -* fix: better implementation of push update to local objects ([d692c96](https://github.com/nrkno/tv-automation-server-core/commit/d692c96)) -* fix: bugfix: update local object when updating database ([9d3b05b](https://github.com/nrkno/tv-automation-server-core/commit/9d3b05b)) -* fix: duration settling ([0648f57](https://github.com/nrkno/tv-automation-server-core/commit/0648f57)) -* fix: EditAttribute: dropdown options was always strings ([814cdf7](https://github.com/nrkno/tv-automation-server-core/commit/814cdf7)) -* fix: getting monaco to work runtime while still having typings ([5db8218](https://github.com/nrkno/tv-automation-server-core/commit/5db8218)) -* fix: remount monaco ([4ce1566](https://github.com/nrkno/tv-automation-server-core/commit/4ce1566)) -* fix: re-added monaco typings and disabled import, so it works client-side ([1226763](https://github.com/nrkno/tv-automation-server-core/commit/1226763)) -* chore: Updated monaco typings ([7950c9e](https://github.com/nrkno/tv-automation-server-core/commit/7950c9e)) -* fix: typing fix: cannot find name 'monaco' ([3ad88ce](https://github.com/nrkno/tv-automation-server-core/commit/3ad88ce)) -* fix: has played styling shouldn't be applied to Guest and Remote segments ([18bdc82](https://github.com/nrkno/tv-automation-server-core/commit/18bdc82)) -* fix: locked @babel/runtime version & updated package-lock ([8e62d2f](https://github.com/nrkno/tv-automation-server-core/commit/8e62d2f)) -* fix: onAir line jumping around on takes ([8330112](https://github.com/nrkno/tv-automation-server-core/commit/8330112)) -* fix: remove debug line in nightly cronjob ([dda3017](https://github.com/nrkno/tv-automation-server-core/commit/dda3017)) -* fix: remove unused translation helper ([e545a9e](https://github.com/nrkno/tv-automation-server-core/commit/e545a9e)) -* fix: resetting running order rewind ([a122f2c](https://github.com/nrkno/tv-automation-server-core/commit/a122f2c)) -* fix: retry strategy for restart casparcg cronjob ([b54f0f6](https://github.com/nrkno/tv-automation-server-core/commit/b54f0f6)) -* fix: RO overview crashed during rebuild of RO ([d2c62a1](https://github.com/nrkno/tv-automation-server-core/commit/d2c62a1)) -* fix: take action should not throw as nasty errors when called by user. ([6791d50](https://github.com/nrkno/tv-automation-server-core/commit/6791d50)) -* fix: Timeline always being built without previous segmentline ([a077805](https://github.com/nrkno/tv-automation-server-core/commit/a077805)) -* fix: toc trace message ([c53124f](https://github.com/nrkno/tv-automation-server-core/commit/c53124f)) -* fix: too long script out-words could overlap with previous items ([8f8a9a2](https://github.com/nrkno/tv-automation-server-core/commit/8f8a9a2)) -* fix: top RO overview labels clipped in wrong places ([5e5c228](https://github.com/nrkno/tv-automation-server-core/commit/5e5c228)) -* fix: typing fixes, to work with updated packages ([b4362f7](https://github.com/nrkno/tv-automation-server-core/commit/b4362f7)) -* fix: upd meteor typings ([53f17d2](https://github.com/nrkno/tv-automation-server-core/commit/53f17d2)) -* fix: updated nightly cronjob: restart casparcg devices, to work with new restartCasparCG function im ([3f9344d](https://github.com/nrkno/tv-automation-server-core/commit/3f9344d)) -* fix: updated package-lock.json ([bf0cfde](https://github.com/nrkno/tv-automation-server-core/commit/bf0cfde)) -* fix: userActivity executionTime logging ([a3e763e](https://github.com/nrkno/tv-automation-server-core/commit/a3e763e)) -* fix: bug with escape/enter key not working every time ([0a49c90](https://github.com/nrkno/tv-automation-server-core/commit/0a49c90)) -* fix: reset disabled flag on SL and RO reset ([8f69f67](https://github.com/nrkno/tv-automation-server-core/commit/8f69f67)) -* fix(hold): Too many sli being extended for hold mode ([f644e32](https://github.com/nrkno/tv-automation-server-core/commit/f644e32)) -* fix(lookahead): Fix lookahead when transition does not define clip. Fix duplicate key exception when ([a1bb026](https://github.com/nrkno/tv-automation-server-core/commit/a1bb026)) -* fix(RO view): Always persist original event in user-action methods ([6ba7df8](https://github.com/nrkno/tv-automation-server-core/commit/6ba7df8)) + +- fix: &nbps; in a string instead of A0 ([299ba28](https://github.com/nrkno/tv-automation-server-core/commit/299ba28)) +- fix: add parseDateTime code hints to template editor ([c38b2f7](https://github.com/nrkno/tv-automation-server-core/commit/c38b2f7)) +- fix: better implementation of push update to local objects ([d692c96](https://github.com/nrkno/tv-automation-server-core/commit/d692c96)) +- fix: bugfix: update local object when updating database ([9d3b05b](https://github.com/nrkno/tv-automation-server-core/commit/9d3b05b)) +- fix: duration settling ([0648f57](https://github.com/nrkno/tv-automation-server-core/commit/0648f57)) +- fix: EditAttribute: dropdown options was always strings ([814cdf7](https://github.com/nrkno/tv-automation-server-core/commit/814cdf7)) +- fix: getting monaco to work runtime while still having typings ([5db8218](https://github.com/nrkno/tv-automation-server-core/commit/5db8218)) +- fix: remount monaco ([4ce1566](https://github.com/nrkno/tv-automation-server-core/commit/4ce1566)) +- fix: re-added monaco typings and disabled import, so it works client-side ([1226763](https://github.com/nrkno/tv-automation-server-core/commit/1226763)) +- chore: Updated monaco typings ([7950c9e](https://github.com/nrkno/tv-automation-server-core/commit/7950c9e)) +- fix: typing fix: cannot find name 'monaco' ([3ad88ce](https://github.com/nrkno/tv-automation-server-core/commit/3ad88ce)) +- fix: has played styling shouldn't be applied to Guest and Remote segments ([18bdc82](https://github.com/nrkno/tv-automation-server-core/commit/18bdc82)) +- fix: locked @babel/runtime version & updated package-lock ([8e62d2f](https://github.com/nrkno/tv-automation-server-core/commit/8e62d2f)) +- fix: onAir line jumping around on takes ([8330112](https://github.com/nrkno/tv-automation-server-core/commit/8330112)) +- fix: remove debug line in nightly cronjob ([dda3017](https://github.com/nrkno/tv-automation-server-core/commit/dda3017)) +- fix: remove unused translation helper ([e545a9e](https://github.com/nrkno/tv-automation-server-core/commit/e545a9e)) +- fix: resetting running order rewind ([a122f2c](https://github.com/nrkno/tv-automation-server-core/commit/a122f2c)) +- fix: retry strategy for restart casparcg cronjob ([b54f0f6](https://github.com/nrkno/tv-automation-server-core/commit/b54f0f6)) +- fix: RO overview crashed during rebuild of RO ([d2c62a1](https://github.com/nrkno/tv-automation-server-core/commit/d2c62a1)) +- fix: take action should not throw as nasty errors when called by user. ([6791d50](https://github.com/nrkno/tv-automation-server-core/commit/6791d50)) +- fix: Timeline always being built without previous segmentline ([a077805](https://github.com/nrkno/tv-automation-server-core/commit/a077805)) +- fix: toc trace message ([c53124f](https://github.com/nrkno/tv-automation-server-core/commit/c53124f)) +- fix: too long script out-words could overlap with previous items ([8f8a9a2](https://github.com/nrkno/tv-automation-server-core/commit/8f8a9a2)) +- fix: top RO overview labels clipped in wrong places ([5e5c228](https://github.com/nrkno/tv-automation-server-core/commit/5e5c228)) +- fix: typing fixes, to work with updated packages ([b4362f7](https://github.com/nrkno/tv-automation-server-core/commit/b4362f7)) +- fix: upd meteor typings ([53f17d2](https://github.com/nrkno/tv-automation-server-core/commit/53f17d2)) +- fix: updated nightly cronjob: restart casparcg devices, to work with new restartCasparCG function im ([3f9344d](https://github.com/nrkno/tv-automation-server-core/commit/3f9344d)) +- fix: updated package-lock.json ([bf0cfde](https://github.com/nrkno/tv-automation-server-core/commit/bf0cfde)) +- fix: userActivity executionTime logging ([a3e763e](https://github.com/nrkno/tv-automation-server-core/commit/a3e763e)) +- fix: bug with escape/enter key not working every time ([0a49c90](https://github.com/nrkno/tv-automation-server-core/commit/0a49c90)) +- fix: reset disabled flag on SL and RO reset ([8f69f67](https://github.com/nrkno/tv-automation-server-core/commit/8f69f67)) +- fix(hold): Too many sli being extended for hold mode ([f644e32](https://github.com/nrkno/tv-automation-server-core/commit/f644e32)) +- fix(lookahead): Fix lookahead when transition does not define clip. Fix duplicate key exception when ([a1bb026](https://github.com/nrkno/tv-automation-server-core/commit/a1bb026)) +- fix(RO view): Always persist original event in user-action methods ([6ba7df8](https://github.com/nrkno/tv-automation-server-core/commit/6ba7df8)) + ### Other -* chore:Updated translations. ([63291f0](https://github.com/nrkno/tv-automation-server-core/commit/63291f0)) -* chore: add client log trace for when eventContextForLog is unable to return a context ([883012d](https://github.com/nrkno/tv-automation-server-core/commit/883012d)) -* chore: add getTimings().elapsed ([db96295](https://github.com/nrkno/tv-automation-server-core/commit/db96295)) -* chore: added "testMethod" method, to use in integration tests in core-connection lib ([acf7cdd](https://github.com/nrkno/tv-automation-server-core/commit/acf7cdd)) -* chore: added Meteor import ([dc9e5de](https://github.com/nrkno/tv-automation-server-core/commit/dc9e5de)) -* chore: added release script ([2af41a4](https://github.com/nrkno/tv-automation-server-core/commit/2af41a4)) -* chore: changelog formatting ([0d2fdd4](https://github.com/nrkno/tv-automation-server-core/commit/0d2fdd4)) -* chore: changelog formatting ([e208266](https://github.com/nrkno/tv-automation-server-core/commit/e208266)) -* chore: delete _delete this file.foo ([b1d9252](https://github.com/nrkno/tv-automation-server-core/commit/b1d9252)) -* chore: humanified the release notes ([aa83ba8](https://github.com/nrkno/tv-automation-server-core/commit/aa83ba8)) -* chore: lint ([c09ac39](https://github.com/nrkno/tv-automation-server-core/commit/c09ac39)) -* chore: mark develop branch as "develop"-version ([c00259a](https://github.com/nrkno/tv-automation-server-core/commit/c00259a)) -* chore: merge changes from release2 ([8b77267](https://github.com/nrkno/tv-automation-server-core/commit/8b77267)) -* chore: merge develop ([a822654](https://github.com/nrkno/tv-automation-server-core/commit/a822654)) -* chore: merge hotfixes from release2 ([fb74abe](https://github.com/nrkno/tv-automation-server-core/commit/fb74abe)) -* chore: merge latest develop ([1738871](https://github.com/nrkno/tv-automation-server-core/commit/1738871)) -* chore: minor tidying of logging ([31d59d2](https://github.com/nrkno/tv-automation-server-core/commit/31d59d2)) -* chore: removed unneccessary logging ([d6a4b07](https://github.com/nrkno/tv-automation-server-core/commit/d6a4b07)) -* chore: renamed Selector & Modifier to MongoSelector & MongoModifier due to naming collision ([081e365](https://github.com/nrkno/tv-automation-server-core/commit/081e365)) -* chore: standarize dispatching events ([f4d206a](https://github.com/nrkno/tv-automation-server-core/commit/f4d206a)) -* chore: clean up mousetrapHelper ([46221cc](https://github.com/nrkno/tv-automation-server-core/commit/46221cc)) -* chore: Fixed 'dvelop' typo in readme. ([43b0f89](https://github.com/nrkno/tv-automation-server-core/commit/43b0f89)) +- chore:Updated translations. ([63291f0](https://github.com/nrkno/tv-automation-server-core/commit/63291f0)) +- chore: add client log trace for when eventContextForLog is unable to return a context ([883012d](https://github.com/nrkno/tv-automation-server-core/commit/883012d)) +- chore: add getTimings().elapsed ([db96295](https://github.com/nrkno/tv-automation-server-core/commit/db96295)) +- chore: added "testMethod" method, to use in integration tests in core-connection lib ([acf7cdd](https://github.com/nrkno/tv-automation-server-core/commit/acf7cdd)) +- chore: added Meteor import ([dc9e5de](https://github.com/nrkno/tv-automation-server-core/commit/dc9e5de)) +- chore: added release script ([2af41a4](https://github.com/nrkno/tv-automation-server-core/commit/2af41a4)) +- chore: changelog formatting ([0d2fdd4](https://github.com/nrkno/tv-automation-server-core/commit/0d2fdd4)) +- chore: changelog formatting ([e208266](https://github.com/nrkno/tv-automation-server-core/commit/e208266)) +- chore: delete \_delete this file.foo ([b1d9252](https://github.com/nrkno/tv-automation-server-core/commit/b1d9252)) +- chore: humanified the release notes ([aa83ba8](https://github.com/nrkno/tv-automation-server-core/commit/aa83ba8)) +- chore: lint ([c09ac39](https://github.com/nrkno/tv-automation-server-core/commit/c09ac39)) +- chore: mark develop branch as "develop"-version ([c00259a](https://github.com/nrkno/tv-automation-server-core/commit/c00259a)) +- chore: merge changes from release2 ([8b77267](https://github.com/nrkno/tv-automation-server-core/commit/8b77267)) +- chore: merge develop ([a822654](https://github.com/nrkno/tv-automation-server-core/commit/a822654)) +- chore: merge hotfixes from release2 ([fb74abe](https://github.com/nrkno/tv-automation-server-core/commit/fb74abe)) +- chore: merge latest develop ([1738871](https://github.com/nrkno/tv-automation-server-core/commit/1738871)) +- chore: minor tidying of logging ([31d59d2](https://github.com/nrkno/tv-automation-server-core/commit/31d59d2)) +- chore: removed unneccessary logging ([d6a4b07](https://github.com/nrkno/tv-automation-server-core/commit/d6a4b07)) +- chore: renamed Selector & Modifier to MongoSelector & MongoModifier due to naming collision ([081e365](https://github.com/nrkno/tv-automation-server-core/commit/081e365)) +- chore: standarize dispatching events ([f4d206a](https://github.com/nrkno/tv-automation-server-core/commit/f4d206a)) +- chore: clean up mousetrapHelper ([46221cc](https://github.com/nrkno/tv-automation-server-core/commit/46221cc)) +- chore: Fixed 'dvelop' typo in readme. ([43b0f89](https://github.com/nrkno/tv-automation-server-core/commit/43b0f89)) + ## 0.15.0 (2018-10-16) ### Features -* **New implementation of how user actions are logged (now including the origin of the action (like key pressed, or button clicked))** +- **New implementation of how user actions are logged (now including the origin of the action (like key pressed, or button clicked))**
Peripheral Device user action logging ([2250798](https://github.com/nrkno/tv-automation-server-core/commit/2250798))
user log: add action context (trigger event summary) ([ad176f2](https://github.com/nrkno/tv-automation-server-core/commit/ad176f2)) -* **Add typeSubVariant field to SegmentLine. (#46) ([4af88d3](https://github.com/nrkno/tv-automation-server-core/commit/4af88d3)), closes [#46]** +- **Add typeSubVariant field to SegmentLine. (#46) ([4af88d3](https://github.com/nrkno/tv-automation-server-core/commit/4af88d3)), closes [#46]**
Add typeSubVariant field to SegmentLine. (#46) ([82bd4bd](https://github.com/nrkno/tv-automation-server-core/commit/82bd4bd)), closes [#46] -* **New implementation of how CasparCG-devices are restarted, now supporting multiple devices** +- **New implementation of how CasparCG-devices are restarted, now supporting multiple devices**
changed restart CasparCG functionality ([dd567c2](https://github.com/nrkno/tv-automation-server-core/commit/dd567c2)) -* **Added support for lookahead/preloadvmode "When Clear", used for graphics** +- **Added support for lookahead/preloadvmode "When Clear", used for graphics**
Grafikk lookahead/preload ([30a6b03](https://github.com/nrkno/tv-automation-server-core/commit/30a6b03)) -* **Handle received Running Order data when having added (adlibbed) segmentLines** +- **Handle received Running Order data when having added (adlibbed) segmentLines**
handle mos updates with dynamicallyInserted segmentLines ([1d292c0](https://github.com/nrkno/tv-automation-server-core/commit/1d292c0)) -* Move SegmentLine duration calculation into blueprints ([315eb42](https://github.com/nrkno/tv-automation-server-core/commit/315eb42)) -* **Added experimental prompter view (at "/prompter/studio0")** +- Move SegmentLine duration calculation into blueprints ([315eb42](https://github.com/nrkno/tv-automation-server-core/commit/315eb42)) +- **Added experimental prompter view (at "/prompter/studio0")**
prompter-view ([f45a923](https://github.com/nrkno/tv-automation-server-core/commit/f45a923))
implement a simple mirror mode ([8d0be4e](https://github.com/nrkno/tv-automation-server-core/commit/8d0be4e))
prompter background to black, update documentation ([387ad28](https://github.com/nrkno/tv-automation-server-core/commit/387ad28)) -* **Major rework of how Running Order Activation, Deactication, Reset, Reload etc, are done. Adding GUI prompts if user tries to do an action he/she might/should not.** +- **Major rework of how Running Order Activation, Deactication, Reset, Reload etc, are done. Adding GUI prompts if user tries to do an action he/she might/should not.**
reworked the whole activate/deacticate/reset/reload logic ([1fea56e](https://github.com/nrkno/tv-automation-server-core/commit/1fea56e)) -* **"Queueability", ie be able to add Adlibs as "next segmentLine" rather than insert into current segmentLine.** +- **"Queueability", ie be able to add Adlibs as "next segmentLine" rather than insert into current segmentLine.**
server side implementation of queueabilified adlibs ([0527b3b](https://github.com/nrkno/tv-automation-server-core/commit/0527b3b))
queueability feature - GUI ([dcfa4a0](https://github.com/nrkno/tv-automation-server-core/commit/dcfa4a0)) -* **Prevent infinite items on same layer to interfere with eachother** +- **Prevent infinite items on same layer to interfere with eachother**
source layer exclusivity groups (wip) ([7dedc85](https://github.com/nrkno/tv-automation-server-core/commit/7dedc85))
sourceLayer exclusivity groups ([c32f0e1](https://github.com/nrkno/tv-automation-server-core/commit/c32f0e1)) -* **Check status of SegmentLineItem content (for things like "Source missing" or "Source Broken")** +- **Check status of SegmentLineItem content (for things like "Source missing" or "Source Broken")**
mediaObjects.checkSLIContentStatus ([66d4427](https://github.com/nrkno/tv-automation-server-core/commit/66d4427)) -* **HTTPSend-device: Custom make-ready commands for httpsend device ([410a2ef](https://github.com/nrkno/tv-automation-server-core/commit/410a2ef))** - +- **HTTPSend-device: Custom make-ready commands for httpsend device ([410a2ef](https://github.com/nrkno/tv-automation-server-core/commit/410a2ef))** #### GUI -* Shortcuts: standarize shortcut label display, support numpad ([4c5ba74](https://github.com/nrkno/tv-automation-server-core/commit/4c5ba74)) -* RO view: Retain the special segment color even when On Air/Next ([2596a8e](https://github.com/nrkno/tv-automation-server-core/commit/2596a8e)) -* two-tone Split layers with more than one input of the same type ([60c238c](https://github.com/nrkno/tv-automation-server-core/commit/60c238c)) -* **UI: Show next take style icon next to timecode** + +- Shortcuts: standarize shortcut label display, support numpad ([4c5ba74](https://github.com/nrkno/tv-automation-server-core/commit/4c5ba74)) +- RO view: Retain the special segment color even when On Air/Next ([2596a8e](https://github.com/nrkno/tv-automation-server-core/commit/2596a8e)) +- two-tone Split layers with more than one input of the same type ([60c238c](https://github.com/nrkno/tv-automation-server-core/commit/60c238c)) +- **UI: Show next take style icon next to timecode**
show next take style icon next to timecode ([8d090e8](https://github.com/nrkno/tv-automation-server-core/commit/8d090e8)) -* new style of segmentLine markers (WIP) ([a3569ce](https://github.com/nrkno/tv-automation-server-core/commit/a3569ce)) -* add support for two-tone splits with the same source type ([ba70dfa](https://github.com/nrkno/tv-automation-server-core/commit/ba70dfa)) -* **GUI improvement of SourceLayerItemContainer** +- new style of segmentLine markers (WIP) ([a3569ce](https://github.com/nrkno/tv-automation-server-core/commit/a3569ce)) +- add support for two-tone splits with the same source type ([ba70dfa](https://github.com/nrkno/tv-automation-server-core/commit/ba70dfa)) +- **GUI improvement of SourceLayerItemContainer**
a better implementation of SourceLayerItemContainer ([38380e1](https://github.com/nrkno/tv-automation-server-core/commit/38380e1)) -* new style of segmentLine markers (WIP) ([a3569ce](https://github.com/nrkno/tv-automation-server-core/commit/a3569ce)) -* Timeline-display: Add next segment return arrow at end of segment ([54900a8](https://github.com/nrkno/tv-automation-server-core/commit/54900a8)) -* Timeline-display: end of segment overlay ([41e78ec](https://github.com/nrkno/tv-automation-server-core/commit/41e78ec)) -* Timeline-display: more work on new marker style ([570e408](https://github.com/nrkno/tv-automation-server-core/commit/570e408)) -* Timeline-display: End of Show marker ([01aefb5](https://github.com/nrkno/tv-automation-server-core/commit/01aefb5)) +- new style of segmentLine markers (WIP) ([a3569ce](https://github.com/nrkno/tv-automation-server-core/commit/a3569ce)) +- Timeline-display: Add next segment return arrow at end of segment ([54900a8](https://github.com/nrkno/tv-automation-server-core/commit/54900a8)) +- Timeline-display: end of segment overlay ([41e78ec](https://github.com/nrkno/tv-automation-server-core/commit/41e78ec)) +- Timeline-display: more work on new marker style ([570e408](https://github.com/nrkno/tv-automation-server-core/commit/570e408)) +- Timeline-display: End of Show marker ([01aefb5](https://github.com/nrkno/tv-automation-server-core/commit/01aefb5)) ### Bug Fixes -* don't throw in SettingsMenu if sourceLayers are undefined ([3afd7f6](https://github.com/nrkno/tv-automation-server-core/commit/3afd7f6)) -* imports in various places ([7d352a8](https://github.com/nrkno/tv-automation-server-core/commit/7d352a8)) -* origo-ize datePicker ([db0f4ff](https://github.com/nrkno/tv-automation-server-core/commit/db0f4ff)) -* Settings translation strings were broken in many dialog boxes ([b6ac1fc](https://github.com/nrkno/tv-automation-server-core/commit/b6ac1fc)) -* Settings translation strings were broken in many dialog boxesSettings are not translated yet, so ([7053f2c](https://github.com/nrkno/tv-automation-server-core/commit/7053f2c)) -* show end marker ([2bd874a](https://github.com/nrkno/tv-automation-server-core/commit/2bd874a)) -* Status page styling ([69c4697](https://github.com/nrkno/tv-automation-server-core/commit/69c4697)) -* translate datePicker ([ca00c04](https://github.com/nrkno/tv-automation-server-core/commit/ca00c04)) -* Add missing _rank field to SegmentLineAdLibItem ([9cd15fa](https://github.com/nrkno/tv-automation-server-core/commit/9cd15fa)) -* added missing getRank import ([9d37eb8](https://github.com/nrkno/tv-automation-server-core/commit/9d37eb8)) -* lock down package.json & update package-lock, to get release2 to build ([472f8ab](https://github.com/nrkno/tv-automation-server-core/commit/472f8ab)) -* proper dispose of executeFunction checkReply after execution is done ([523ec99](https://github.com/nrkno/tv-automation-server-core/commit/523ec99)) -* refactored reset-segmentLine further ([0523eb6](https://github.com/nrkno/tv-automation-server-core/commit/0523eb6)) -* Remove timestamps from blueprint backups ([74fa1b3](https://github.com/nrkno/tv-automation-server-core/commit/74fa1b3)) -* resetRunningOrder functionality in GUI ([4eb096a](https://github.com/nrkno/tv-automation-server-core/commit/4eb096a)) -* resolve merge issue ([0cbc75a](https://github.com/nrkno/tv-automation-server-core/commit/0cbc75a)) -* roReset should reset holdItems and infinites ([bdf8385](https://github.com/nrkno/tv-automation-server-core/commit/bdf8385)) -* Tweaked styling of evaluation form, warning messages, color of the next lines, translations, ca ([50d2753](https://github.com/nrkno/tv-automation-server-core/commit/50d2753)) -* updated nightly cronjob: restart casparcg devices, to work with new restartCasparCG function im ([edbc186](https://github.com/nrkno/tv-automation-server-core/commit/edbc186)) -* when activating, set Next if not set ([c9f71a1](https://github.com/nrkno/tv-automation-server-core/commit/c9f71a1)) -* a workaround for Monaco Ctrl+V shortcut issue. ([aead169](https://github.com/nrkno/tv-automation-server-core/commit/aead169)) -* a workaround for Monaco Ctrl+V shortcut issue. ([41389ee](https://github.com/nrkno/tv-automation-server-core/commit/41389ee)) -* Display OK status in RO View with nowrap ([0763c3a](https://github.com/nrkno/tv-automation-server-core/commit/0763c3a)) -* rewindsegments on resetRunningOrder ([57c1c53](https://github.com/nrkno/tv-automation-server-core/commit/57c1c53)) -* smarter reloadRunningOrder ([33c11ba](https://github.com/nrkno/tv-automation-server-core/commit/33c11ba)) -* styling fix in ShowStyleSettings ([681163a](https://github.com/nrkno/tv-automation-server-core/commit/681163a)) -* transition: Delay sli not contents, to ensure relative triggers against the sli are correct (fi ([856da4b](https://github.com/nrkno/tv-automation-server-core/commit/856da4b))(https://github.com/nrkno/tv-automation-server-core/issues/46)(https://github.com/nrkno/tv-automation-server-core/issues/46) -* Timeline-display: don't round items in relative mode ([2938819](https://github.com/nrkno/tv-automation-server-core/commit/2938819)) -* Timeline-display: Infinite sli do not update properly on new mos data. Fix detection of the end of the ([16d9715](https://github.com/nrkno/tv-automation-server-core/commit/16d9715)) -* RO overview:fix label lengths ([41dea0b](https://github.com/nrkno/tv-automation-server-core/commit/41dea0b)) -* ModalDialog: Don't wrap p elements in a p element ([fa4dcf9](https://github.com/nrkno/tv-automation-server-core/commit/fa4dcf9)) +- don't throw in SettingsMenu if sourceLayers are undefined ([3afd7f6](https://github.com/nrkno/tv-automation-server-core/commit/3afd7f6)) +- imports in various places ([7d352a8](https://github.com/nrkno/tv-automation-server-core/commit/7d352a8)) +- origo-ize datePicker ([db0f4ff](https://github.com/nrkno/tv-automation-server-core/commit/db0f4ff)) +- Settings translation strings were broken in many dialog boxes ([b6ac1fc](https://github.com/nrkno/tv-automation-server-core/commit/b6ac1fc)) +- Settings translation strings were broken in many dialog boxesSettings are not translated yet, so ([7053f2c](https://github.com/nrkno/tv-automation-server-core/commit/7053f2c)) +- show end marker ([2bd874a](https://github.com/nrkno/tv-automation-server-core/commit/2bd874a)) +- Status page styling ([69c4697](https://github.com/nrkno/tv-automation-server-core/commit/69c4697)) +- translate datePicker ([ca00c04](https://github.com/nrkno/tv-automation-server-core/commit/ca00c04)) +- Add missing \_rank field to SegmentLineAdLibItem ([9cd15fa](https://github.com/nrkno/tv-automation-server-core/commit/9cd15fa)) +- added missing getRank import ([9d37eb8](https://github.com/nrkno/tv-automation-server-core/commit/9d37eb8)) +- lock down package.json & update package-lock, to get release2 to build ([472f8ab](https://github.com/nrkno/tv-automation-server-core/commit/472f8ab)) +- proper dispose of executeFunction checkReply after execution is done ([523ec99](https://github.com/nrkno/tv-automation-server-core/commit/523ec99)) +- refactored reset-segmentLine further ([0523eb6](https://github.com/nrkno/tv-automation-server-core/commit/0523eb6)) +- Remove timestamps from blueprint backups ([74fa1b3](https://github.com/nrkno/tv-automation-server-core/commit/74fa1b3)) +- resetRunningOrder functionality in GUI ([4eb096a](https://github.com/nrkno/tv-automation-server-core/commit/4eb096a)) +- resolve merge issue ([0cbc75a](https://github.com/nrkno/tv-automation-server-core/commit/0cbc75a)) +- roReset should reset holdItems and infinites ([bdf8385](https://github.com/nrkno/tv-automation-server-core/commit/bdf8385)) +- Tweaked styling of evaluation form, warning messages, color of the next lines, translations, ca ([50d2753](https://github.com/nrkno/tv-automation-server-core/commit/50d2753)) +- updated nightly cronjob: restart casparcg devices, to work with new restartCasparCG function im ([edbc186](https://github.com/nrkno/tv-automation-server-core/commit/edbc186)) +- when activating, set Next if not set ([c9f71a1](https://github.com/nrkno/tv-automation-server-core/commit/c9f71a1)) +- a workaround for Monaco Ctrl+V shortcut issue. ([aead169](https://github.com/nrkno/tv-automation-server-core/commit/aead169)) +- a workaround for Monaco Ctrl+V shortcut issue. ([41389ee](https://github.com/nrkno/tv-automation-server-core/commit/41389ee)) +- Display OK status in RO View with nowrap ([0763c3a](https://github.com/nrkno/tv-automation-server-core/commit/0763c3a)) +- rewindsegments on resetRunningOrder ([57c1c53](https://github.com/nrkno/tv-automation-server-core/commit/57c1c53)) +- smarter reloadRunningOrder ([33c11ba](https://github.com/nrkno/tv-automation-server-core/commit/33c11ba)) +- styling fix in ShowStyleSettings ([681163a](https://github.com/nrkno/tv-automation-server-core/commit/681163a)) +- transition: Delay sli not contents, to ensure relative triggers against the sli are correct (fi ([856da4b](https://github.com/nrkno/tv-automation-server-core/commit/856da4b))(https://github.com/nrkno/tv-automation-server-core/issues/46)(https://github.com/nrkno/tv-automation-server-core/issues/46) +- Timeline-display: don't round items in relative mode ([2938819](https://github.com/nrkno/tv-automation-server-core/commit/2938819)) +- Timeline-display: Infinite sli do not update properly on new mos data. Fix detection of the end of the ([16d9715](https://github.com/nrkno/tv-automation-server-core/commit/16d9715)) +- RO overview:fix label lengths ([41dea0b](https://github.com/nrkno/tv-automation-server-core/commit/41dea0b)) +- ModalDialog: Don't wrap p elements in a p element ([fa4dcf9](https://github.com/nrkno/tv-automation-server-core/commit/fa4dcf9)) ### Other -* fix tslint warnings in mockData/mosData, since that's just mock ([ac054a7](https://github.com/nrkno/tv-automation-server-core/commit/ac054a7)) -* update meteor to 1.6.1.4 ([49a4ae6](https://github.com/nrkno/tv-automation-server-core/commit/49a4ae6)) -* Update README.md ([7063988](https://github.com/nrkno/tv-automation-server-core/commit/7063988)) -* Updated Norwegian translations and language tweaks to the broadcast evaluation form. ([b5ee879](https://github.com/nrkno/tv-automation-server-core/commit/b5ee879)) -* Add default values for new kam and rm input maps ([9ebafe1](https://github.com/nrkno/tv-automation-server-core/commit/9ebafe1)) -* added release script ([ef41771](https://github.com/nrkno/tv-automation-server-core/commit/ef41771)) -* better logging of mos actions ([38341cc](https://github.com/nrkno/tv-automation-server-core/commit/38341cc)) -* clean up SVG markup ([25f6342](https://github.com/nrkno/tv-automation-server-core/commit/25f6342)) -* convenience functions for rateLimiting ([0471c87](https://github.com/nrkno/tv-automation-server-core/commit/0471c87)) -* modalDialog example doc ([99ffaaf](https://github.com/nrkno/tv-automation-server-core/commit/99ffaaf)) -* moved cache prefixes into enum ([24dead4](https://github.com/nrkno/tv-automation-server-core/commit/24dead4)) -* Remove unused nora_init layer from initDB ([9ef8426](https://github.com/nrkno/tv-automation-server-core/commit/9ef8426)) -* Update grafikk lookahead mode ([844decd](https://github.com/nrkno/tv-automation-server-core/commit/844decd)) -* Update mock3 to have a valid super in apning kam ([a52863d](https://github.com/nrkno/tv-automation-server-core/commit/a52863d)) -* reorganize modifiers in keyboardEventToShortcut ([ac939ce](https://github.com/nrkno/tv-automation-server-core/commit/ac939ce)) +- fix tslint warnings in mockData/mosData, since that's just mock ([ac054a7](https://github.com/nrkno/tv-automation-server-core/commit/ac054a7)) +- update meteor to 1.6.1.4 ([49a4ae6](https://github.com/nrkno/tv-automation-server-core/commit/49a4ae6)) +- Update README.md ([7063988](https://github.com/nrkno/tv-automation-server-core/commit/7063988)) +- Updated Norwegian translations and language tweaks to the broadcast evaluation form. ([b5ee879](https://github.com/nrkno/tv-automation-server-core/commit/b5ee879)) +- Add default values for new kam and rm input maps ([9ebafe1](https://github.com/nrkno/tv-automation-server-core/commit/9ebafe1)) +- added release script ([ef41771](https://github.com/nrkno/tv-automation-server-core/commit/ef41771)) +- better logging of mos actions ([38341cc](https://github.com/nrkno/tv-automation-server-core/commit/38341cc)) +- clean up SVG markup ([25f6342](https://github.com/nrkno/tv-automation-server-core/commit/25f6342)) +- convenience functions for rateLimiting ([0471c87](https://github.com/nrkno/tv-automation-server-core/commit/0471c87)) +- modalDialog example doc ([99ffaaf](https://github.com/nrkno/tv-automation-server-core/commit/99ffaaf)) +- moved cache prefixes into enum ([24dead4](https://github.com/nrkno/tv-automation-server-core/commit/24dead4)) +- Remove unused nora_init layer from initDB ([9ef8426](https://github.com/nrkno/tv-automation-server-core/commit/9ef8426)) +- Update grafikk lookahead mode ([844decd](https://github.com/nrkno/tv-automation-server-core/commit/844decd)) +- Update mock3 to have a valid super in apning kam ([a52863d](https://github.com/nrkno/tv-automation-server-core/commit/a52863d)) +- reorganize modifiers in keyboardEventToShortcut ([ac939ce](https://github.com/nrkno/tv-automation-server-core/commit/ac939ce)) #### Other during pre-release: -* feat: use default renderer for MIC sourceLayerType ([ce845d4](https://github.com/nrkno/tv-automation-server-core/commit/ce845d4)) -* fix: merge in mouseTraphelper fix for broken enter-shortcut from develop into release 2 ([80b841e](https://github.com/nrkno/tv-automation-server-core/commit/80b841e)) -* fix: setAsNext on previous ([6ced09b](https://github.com/nrkno/tv-automation-server-core/commit/6ced09b)) -* fix: issue with roPrepareForBroadcast ([c3ad30c](https://github.com/nrkno/tv-automation-server-core/commit/c3ad30c)) -* fix: Add default exclusivity groups to InitDB ([dfd1782](https://github.com/nrkno/tv-automation-server-core/commit/dfd1782)) -* fix: hot fix for rehearsal activation when an RO is already active ([648c02d](https://github.com/nrkno/tv-automation-server-core/commit/648c02d)) -* fix: disable client-side RO updates ([72ba831](https://github.com/nrkno/tv-automation-server-core/commit/72ba831)) -* fix: broken GUI SegmentLineItems resolution, when simulating timeline output ([60fb843](https://github.com/nrkno/tv-automation-server-core/commit/60fb843)) -* fix: global ad-lib order was wrong, basline blueprint did not set _rank ([ffbacc8](https://github.com/nrkno/tv-automation-server-core/commit/ffbacc8)) -* fix: resetRunningorder should update timeline ([0d01e6a](https://github.com/nrkno/tv-automation-server-core/commit/0d01e6a)) -* fix: broken activation keyboard shortcuts ([cbb8353](https://github.com/nrkno/tv-automation-server-core/commit/cbb8353)) -* fix: Use thin styling for a solo 'AUTO' label ([74b5f15](https://github.com/nrkno/tv-automation-server-core/commit/74b5f15)) -* fix: Renamed warning icon file and references. ([081797c](https://github.com/nrkno/tv-automation-server-core/commit/081797c)) -* fix: activate past ROs ([4b128a5](https://github.com/nrkno/tv-automation-server-core/commit/4b128a5)) -* fix: be able to reset & activate inactivated RO ([e7d52da](https://github.com/nrkno/tv-automation-server-core/commit/e7d52da)) -* fix(lookahead): Fix lookahead when transition object starts at abs0 ([bd3edbd](https://github.com/nrkno/tv-automation-server-core/commit/bd3edbd)) -* fix(lookahead): Dont run lookahead on abs0 sli if there is an active transition. ([191df09](https://github.com/nrkno/tv-automation-server-core/commit/191df09)) -* chore: additional fix for numpad enter ([5d44383](https://github.com/nrkno/tv-automation-server-core/commit/5d44383)) -* chore: Increase contrast on secondary items ([87a1f17](https://github.com/nrkno/tv-automation-server-core/commit/87a1f17)) -* chore: guest segments feature ([3772e90](https://github.com/nrkno/tv-automation-server-core/commit/3772e90)) -* chore: change prerelease script name so its not picked up automatically by jenkins ([0baa588](https://github.com/nrkno/tv-automation-server-core/commit/0baa588)) + +- feat: use default renderer for MIC sourceLayerType ([ce845d4](https://github.com/nrkno/tv-automation-server-core/commit/ce845d4)) +- fix: merge in mouseTraphelper fix for broken enter-shortcut from develop into release 2 ([80b841e](https://github.com/nrkno/tv-automation-server-core/commit/80b841e)) +- fix: setAsNext on previous ([6ced09b](https://github.com/nrkno/tv-automation-server-core/commit/6ced09b)) +- fix: issue with roPrepareForBroadcast ([c3ad30c](https://github.com/nrkno/tv-automation-server-core/commit/c3ad30c)) +- fix: Add default exclusivity groups to InitDB ([dfd1782](https://github.com/nrkno/tv-automation-server-core/commit/dfd1782)) +- fix: hot fix for rehearsal activation when an RO is already active ([648c02d](https://github.com/nrkno/tv-automation-server-core/commit/648c02d)) +- fix: disable client-side RO updates ([72ba831](https://github.com/nrkno/tv-automation-server-core/commit/72ba831)) +- fix: broken GUI SegmentLineItems resolution, when simulating timeline output ([60fb843](https://github.com/nrkno/tv-automation-server-core/commit/60fb843)) +- fix: global ad-lib order was wrong, basline blueprint did not set \_rank ([ffbacc8](https://github.com/nrkno/tv-automation-server-core/commit/ffbacc8)) +- fix: resetRunningorder should update timeline ([0d01e6a](https://github.com/nrkno/tv-automation-server-core/commit/0d01e6a)) +- fix: broken activation keyboard shortcuts ([cbb8353](https://github.com/nrkno/tv-automation-server-core/commit/cbb8353)) +- fix: Use thin styling for a solo 'AUTO' label ([74b5f15](https://github.com/nrkno/tv-automation-server-core/commit/74b5f15)) +- fix: Renamed warning icon file and references. ([081797c](https://github.com/nrkno/tv-automation-server-core/commit/081797c)) +- fix: activate past ROs ([4b128a5](https://github.com/nrkno/tv-automation-server-core/commit/4b128a5)) +- fix: be able to reset & activate inactivated RO ([e7d52da](https://github.com/nrkno/tv-automation-server-core/commit/e7d52da)) +- fix(lookahead): Fix lookahead when transition object starts at abs0 ([bd3edbd](https://github.com/nrkno/tv-automation-server-core/commit/bd3edbd)) +- fix(lookahead): Dont run lookahead on abs0 sli if there is an active transition. ([191df09](https://github.com/nrkno/tv-automation-server-core/commit/191df09)) +- chore: additional fix for numpad enter ([5d44383](https://github.com/nrkno/tv-automation-server-core/commit/5d44383)) +- chore: Increase contrast on secondary items ([87a1f17](https://github.com/nrkno/tv-automation-server-core/commit/87a1f17)) +- chore: guest segments feature ([3772e90](https://github.com/nrkno/tv-automation-server-core/commit/3772e90)) +- chore: change prerelease script name so its not picked up automatically by jenkins ([0baa588](https://github.com/nrkno/tv-automation-server-core/commit/0baa588)) -# [0.14.0](https://github.com/nrkno/tv-automation-server-core/compare/v0.13.1...v0.14.0) (2018-09-13) +# [0.14.0](https://github.com/nrkno/tv-automation-server-core/compare/v0.13.1...v0.14.0) (2018-09-13) ### Bug Fixes -* ensure the same overlap is used for autonext and the previous sl ([efb39e6](https://github.com/nrkno/tv-automation-server-core/commit/efb39e6)) -* **timeline:** Infinite sli do not update properly on new mos data. Fix detection of the end of the chain, and ensure the last is set to not infinite ([61b2930](https://github.com/nrkno/tv-automation-server-core/commit/61b2930)) - +- ensure the same overlap is used for autonext and the previous sl ([efb39e6](https://github.com/nrkno/tv-automation-server-core/commit/efb39e6)) +- **timeline:** Infinite sli do not update properly on new mos data. Fix detection of the end of the chain, and ensure the last is set to not infinite ([61b2930](https://github.com/nrkno/tv-automation-server-core/commit/61b2930)) ### Features -* added afterBroadcast form ([e98b59e](https://github.com/nrkno/tv-automation-server-core/commit/e98b59e)) - - +- added afterBroadcast form ([e98b59e](https://github.com/nrkno/tv-automation-server-core/commit/e98b59e)) -## [0.13.1](https://github.com/nrkno/tv-automation-server-core/compare/v0.13.0...v0.13.1) (2018-09-13) +## [0.13.1](https://github.com/nrkno/tv-automation-server-core/compare/v0.13.0...v0.13.1) (2018-09-13) ### Bug Fixes -* **transition:** Using wrong overlap when combined with autonext ([4c56102](https://github.com/nrkno/tv-automation-server-core/commit/4c56102)) -* update timeline dependency ([b83f6be](https://github.com/nrkno/tv-automation-server-core/commit/b83f6be)) - - +- **transition:** Using wrong overlap when combined with autonext ([4c56102](https://github.com/nrkno/tv-automation-server-core/commit/4c56102)) +- update timeline dependency ([b83f6be](https://github.com/nrkno/tv-automation-server-core/commit/b83f6be)) -# [0.13.0](https://github.com/nrkno/tv-automation-server-core/compare/v0.12.0...v0.13.0) (2018-09-12) +# [0.13.0](https://github.com/nrkno/tv-automation-server-core/compare/v0.12.0...v0.13.0) (2018-09-12) ### Bug Fixes -* issue with rehearsal double-activation warning ([17b4e95](https://github.com/nrkno/tv-automation-server-core/commit/17b4e95)) -* **externalMessage:** encode proper html-entities in strings ([243995c](https://github.com/nrkno/tv-automation-server-core/commit/243995c)) - +- issue with rehearsal double-activation warning ([17b4e95](https://github.com/nrkno/tv-automation-server-core/commit/17b4e95)) +- **externalMessage:** encode proper html-entities in strings ([243995c](https://github.com/nrkno/tv-automation-server-core/commit/243995c)) ### Features -* Grafikk lookahead/preload ([78828fe](https://github.com/nrkno/tv-automation-server-core/commit/78828fe)) -* support preload lookahead mode for nora, which swaps out take commands for cue ([4cfd4fe](https://github.com/nrkno/tv-automation-server-core/commit/4cfd4fe)) - - +- Grafikk lookahead/preload ([78828fe](https://github.com/nrkno/tv-automation-server-core/commit/78828fe)) +- support preload lookahead mode for nora, which swaps out take commands for cue ([4cfd4fe](https://github.com/nrkno/tv-automation-server-core/commit/4cfd4fe)) -# [0.12.0](https://github.com/nrkno/tv-automation-server-core/compare/v0.10.1...v0.12.0) (2018-09-11) +# [0.12.0](https://github.com/nrkno/tv-automation-server-core/compare/v0.10.1...v0.12.0) (2018-09-11) ### Bug Fixes -* super.componentWillUnmount is required ([2342e48](https://github.com/nrkno/tv-automation-server-core/commit/2342e48)) - +- super.componentWillUnmount is required ([2342e48](https://github.com/nrkno/tv-automation-server-core/commit/2342e48)) ### Features -* reworked externalMessages page ([3b87242](https://github.com/nrkno/tv-automation-server-core/commit/3b87242)) -* use date-picker for user-activity-log ([5e2c218](https://github.com/nrkno/tv-automation-server-core/commit/5e2c218)) - - +- reworked externalMessages page ([3b87242](https://github.com/nrkno/tv-automation-server-core/commit/3b87242)) +- use date-picker for user-activity-log ([5e2c218](https://github.com/nrkno/tv-automation-server-core/commit/5e2c218)) -# [0.11.0](https://github.com/nrkno/tv-automation-server-core/compare/v0.4.2...v0.11.0) (2018-09-07) +# [0.11.0](https://github.com/nrkno/tv-automation-server-core/compare/v0.4.2...v0.11.0) (2018-09-07) ### Bug Fixes -* added _valid: true to mock-data ([6c2775b](https://github.com/nrkno/tv-automation-server-core/commit/6c2775b)) -* added missing debug-logging setting ([8f616ca](https://github.com/nrkno/tv-automation-server-core/commit/8f616ca)) -* added MomentFromNow, to use instead of ([aefea31](https://github.com/nrkno/tv-automation-server-core/commit/aefea31)) -* added peripheralDevices subscription, used by status display ([ccb309d](https://github.com/nrkno/tv-automation-server-core/commit/ccb309d)) -* added virtual lines to the generated function, so that line numbers add up in error messages ([df2366a](https://github.com/nrkno/tv-automation-server-core/commit/df2366a)) -* adlib items conflict with programmed content ([a304238](https://github.com/nrkno/tv-automation-server-core/commit/a304238)) -* allow duration 0 of segmentLines ([11a18ae](https://github.com/nrkno/tv-automation-server-core/commit/11a18ae)) -* apning with no heads ([dfb1976](https://github.com/nrkno/tv-automation-server-core/commit/dfb1976)) -* apparently componentwillmount is running in a reactive context and causes issues ([a8e53b6](https://github.com/nrkno/tv-automation-server-core/commit/a8e53b6)) -* better debug message ([17e1b4e](https://github.com/nrkno/tv-automation-server-core/commit/17e1b4e)) -* better handling of template-errors ([9f98100](https://github.com/nrkno/tv-automation-server-core/commit/9f98100)) -* broken settings page ([1e99ff7](https://github.com/nrkno/tv-automation-server-core/commit/1e99ff7)) -* bug in popup: nora payload can be deep objects, causing ui crash ([30bfca9](https://github.com/nrkno/tv-automation-server-core/commit/30bfca9)) -* bug that caused unhandledPromiseRejection. Also added logging of result of user action ([e799277](https://github.com/nrkno/tv-automation-server-core/commit/e799277)) -* bugfix: didn't correctly find the right segmentLineItem in next segmentLine ([0f9313f](https://github.com/nrkno/tv-automation-server-core/commit/0f9313f)) -* bugfix: executeFunction didn't really time out ([acba08c](https://github.com/nrkno/tv-automation-server-core/commit/acba08c)) -* dev Collections bug, due to collections being filled in later ([43e8856](https://github.com/nrkno/tv-automation-server-core/commit/43e8856)) -* dev debug data function ([e4570e2](https://github.com/nrkno/tv-automation-server-core/commit/e4570e2)) -* do not error CountdownItemLabel when sourceLayer is not found ([9451d1c](https://github.com/nrkno/tv-automation-server-core/commit/9451d1c)) -* don't send devicesMakeReady until verified no other runningOrders are active ([953a1a7](https://github.com/nrkno/tv-automation-server-core/commit/953a1a7)) -* don't wait for subscriptions before rendering ([2bbfa20](https://github.com/nrkno/tv-automation-server-core/commit/2bbfa20)) -* Ensure lookahead ids are always unique ([26f6637](https://github.com/nrkno/tv-automation-server-core/commit/26f6637)) -* Ensure the sl overlapDuration is respected on autonext. ([8c3bf3e](https://github.com/nrkno/tv-automation-server-core/commit/8c3bf3e)) -* error when content.boxSourceConfiguration is undefined ([81c896b](https://github.com/nrkno/tv-automation-server-core/commit/81c896b)) -* error when content.boxSourceConfiguration is undefined ([fc7ec40](https://github.com/nrkno/tv-automation-server-core/commit/fc7ec40)) -* externalMessage: priority of messages to send ([cffcd97](https://github.com/nrkno/tv-automation-server-core/commit/cffcd97)) -* externalMessages upd ([a803882](https://github.com/nrkno/tv-automation-server-core/commit/a803882)) -* filter on json files on restore backup file selector ([1a0b867](https://github.com/nrkno/tv-automation-server-core/commit/1a0b867)) -* Fix context.runHelper not working in templates. ([36ca5f3](https://github.com/nrkno/tv-automation-server-core/commit/36ca5f3)) -* generate statObject per device ([82a0736](https://github.com/nrkno/tv-automation-server-core/commit/82a0736)) -* getSnapshot: don't ask devices of type OTHER ([ea874d4](https://github.com/nrkno/tv-automation-server-core/commit/ea874d4)) -* HOLD add new llayer to initDB ([650b6e6](https://github.com/nrkno/tv-automation-server-core/commit/650b6e6)) -* if the next:ed segment is removed, instead next the one in its place ([22597b3](https://github.com/nrkno/tv-automation-server-core/commit/22597b3)) -* Improve missing mosId error message ([89695fb](https://github.com/nrkno/tv-automation-server-core/commit/89695fb)) -* Infinite items dont stop against a absolute 0 item properly. ([78c1499](https://github.com/nrkno/tv-automation-server-core/commit/78c1499)) -* Infinite segmentline bad guard when calculating the current infinites that caused the process to stop early ([2f9abeb](https://github.com/nrkno/tv-automation-server-core/commit/2f9abeb)) -* init state properly ([2572cdc](https://github.com/nrkno/tv-automation-server-core/commit/2572cdc)) -* limit db fetches to active running order ([f3aca8f](https://github.com/nrkno/tv-automation-server-core/commit/f3aca8f)) -* lookahead object id not being set correctly ([594a1e7](https://github.com/nrkno/tv-automation-server-core/commit/594a1e7)) -* mediaobjects to use computed field ([dba858f](https://github.com/nrkno/tv-automation-server-core/commit/dba858f)) -* mediaobjects to use computed field ([39d13b5](https://github.com/nrkno/tv-automation-server-core/commit/39d13b5)) -* **zoom:** moved zoom modifier for scroll action to ctrl ([863d81e](https://github.com/nrkno/tv-automation-server-core/commit/863d81e)) -* minor ui fix on status page ([97fc3c2](https://github.com/nrkno/tv-automation-server-core/commit/97fc3c2)) -* miss in merge ([93106b1](https://github.com/nrkno/tv-automation-server-core/commit/93106b1)) -* Mix transitions ([0ebf3e1](https://github.com/nrkno/tv-automation-server-core/commit/0ebf3e1)) -* Mix transitions ([5cf2314](https://github.com/nrkno/tv-automation-server-core/commit/5cf2314)) -* NymansPlayground caused issues in Timeline ([83e772d](https://github.com/nrkno/tv-automation-server-core/commit/83e772d)) -* playout, lookahead: use the originalLayer instear of isAbstract ([30fe842](https://github.com/nrkno/tv-automation-server-core/commit/30fe842)) -* prevent take + autotake bug ([b3d9a4d](https://github.com/nrkno/tv-automation-server-core/commit/b3d9a4d)) -* refactored execMethod, so it doesn't use promises and causes unhandled promise rejections ([24da71b](https://github.com/nrkno/tv-automation-server-core/commit/24da71b)) -* refactored/DRYd adminMode & studioMode, disabled trashbin-button for externalMessages when not in adminMode ([b29dae1](https://github.com/nrkno/tv-automation-server-core/commit/b29dae1)) -* relative durations causing type warnings for ui code ([5249435](https://github.com/nrkno/tv-automation-server-core/commit/5249435)) -* remove deprecated options ([ab7275b](https://github.com/nrkno/tv-automation-server-core/commit/ab7275b)) -* remove some console.logs ([a9f3f53](https://github.com/nrkno/tv-automation-server-core/commit/a9f3f53)) -* removed old, deprecated attr ([bf0cdfd](https://github.com/nrkno/tv-automation-server-core/commit/bf0cdfd)) -* removed uploadFileToAtem function, this should be done in devicesMakeReady ([4e96bb3](https://github.com/nrkno/tv-automation-server-core/commit/4e96bb3)) -* Removing trailing slashes in url defaults ([f6fa32c](https://github.com/nrkno/tv-automation-server-core/commit/f6fa32c)) -* Revert 594a1e7 ([edeb166](https://github.com/nrkno/tv-automation-server-core/commit/edeb166)) -* reworked systemStatus to use components instead ([cccfe3c](https://github.com/nrkno/tv-automation-server-core/commit/cccfe3c)) -* **cam/dir:** clear hotkeys ([2545de8](https://github.com/nrkno/tv-automation-server-core/commit/2545de8)) -* **countdowns:** ignore sourceLayers that we don't have an icon for ([27b2ac0](https://github.com/nrkno/tv-automation-server-core/commit/27b2ac0)) -* **FirstObjects:** Reverts regression introduced by removing isAbstract from firstObject items ([8f1608b](https://github.com/nrkno/tv-automation-server-core/commit/8f1608b)) -* **hold:** keep showing any infinite items that existed on the previous sl ([21a9973](https://github.com/nrkno/tv-automation-server-core/commit/21a9973)) -* **infinite items:** removes infinite icon from outOnNextSegment ([4a75d7d](https://github.com/nrkno/tv-automation-server-core/commit/4a75d7d)) -* **init:** adds qwerty to bakskjerm ([a45de4d](https://github.com/nrkno/tv-automation-server-core/commit/a45de4d)) -* **init:** adds qwerty to bakskjerm ([78198c9](https://github.com/nrkno/tv-automation-server-core/commit/78198c9)) -* **init:** adds qwerty to bakskjerm ([7329976](https://github.com/nrkno/tv-automation-server-core/commit/7329976)) -* **init:** hides klokke and logo layers by default ([1847ca4](https://github.com/nrkno/tv-automation-server-core/commit/1847ca4)) -* **init:** Layer names ([16a504c](https://github.com/nrkno/tv-automation-server-core/commit/16a504c)) -* **init:** Layer names ([221b374](https://github.com/nrkno/tv-automation-server-core/commit/221b374)) -* **init:** Splits init_layers and init_config. ([e056e5a](https://github.com/nrkno/tv-automation-server-core/commit/e056e5a)) -* **init:** swaps MP2 and MP1NXT layers ([b8a370c](https://github.com/nrkno/tv-automation-server-core/commit/b8a370c)) -* **init:** updated channel orders after 2-caspar setup ([3404b9b](https://github.com/nrkno/tv-automation-server-core/commit/3404b9b)) -* **Initdb:** Preload vignett ([156a454](https://github.com/nrkno/tv-automation-server-core/commit/156a454)) -* **Initdb:** Preload vignett ([9470318](https://github.com/nrkno/tv-automation-server-core/commit/9470318)) -* **iterateDeeply:** typos ([c9198f1](https://github.com/nrkno/tv-automation-server-core/commit/c9198f1)) -* **lookahead:** consider transitions properly in lookahead ([c78c6fa](https://github.com/nrkno/tv-automation-server-core/commit/c78c6fa)) -* **lookahead:** Ignore transition if this is the first sl and so no transition will be used ([3df2e1e](https://github.com/nrkno/tv-automation-server-core/commit/3df2e1e)) -* **lookahead:** Not using transition info when in a segmentline with no previous segmentline ([917b34e](https://github.com/nrkno/tv-automation-server-core/commit/917b34e)) -* **presenter screen:** display hours correctly ([e242a9e](https://github.com/nrkno/tv-automation-server-core/commit/e242a9e)) -* **sticky:** Fix sticky items with objects using relative triggers or durations ([0c47cff](https://github.com/nrkno/tv-automation-server-core/commit/0c47cff)) -* **Test:** Verifying build and deploy script ([0b13e18](https://github.com/nrkno/tv-automation-server-core/commit/0b13e18)) -* **transitions:** Ensure they are run with the correct overlap on autonext ([bbc6ca2](https://github.com/nrkno/tv-automation-server-core/commit/bbc6ca2)) -* update ro data cache when getting new metadata ([d700783](https://github.com/nrkno/tv-automation-server-core/commit/d700783)) -* **transitions:** Timed graphics being run wrong ([8b39960](https://github.com/nrkno/tv-automation-server-core/commit/8b39960)) -* timeline statObject: updated hashing function ([e00a01c](https://github.com/nrkno/tv-automation-server-core/commit/e00a01c)) -* **vignett:** do not preload vignett, as it is risky business preloading sluttvignett. Could be done better by separating vignett and sluttvignett ([8bf7ff8](https://github.com/nrkno/tv-automation-server-core/commit/8bf7ff8)) -* **vignett:** do not preload vignett, as it is risky business preloading sluttvignett. Could be done better by separating vignett and sluttvignett ([b0da067](https://github.com/nrkno/tv-automation-server-core/commit/b0da067)) -* ro-reset does not reset properly ([6367658](https://github.com/nrkno/tv-automation-server-core/commit/6367658)) -* run afterUpdateTimeline after timelineTriggerTime ([98ece60](https://github.com/nrkno/tv-automation-server-core/commit/98ece60)) -* setAsNext on previous line no longer shows default state, but now instead stalls when attempting to take ([e441aaf](https://github.com/nrkno/tv-automation-server-core/commit/e441aaf)) -* since afterUpdateTimeline is called in from a syncFunctionIgnore-function, we can remove the timeout ([e7f8f25](https://github.com/nrkno/tv-automation-server-core/commit/e7f8f25)) -* snapshots ([182c221](https://github.com/nrkno/tv-automation-server-core/commit/182c221)) -* subscription handling ([8aaa3ec](https://github.com/nrkno/tv-automation-server-core/commit/8aaa3ec)) -* temporary fix of typing error ([73bf56d](https://github.com/nrkno/tv-automation-server-core/commit/73bf56d)) -* text shadow in SegmentLineLabels ([3a310b1](https://github.com/nrkno/tv-automation-server-core/commit/3a310b1)) -* timeline dep ([b26eecb](https://github.com/nrkno/tv-automation-server-core/commit/b26eecb)) -* timeline statobj didn't update on inactivate (empty timeline) ([839b906](https://github.com/nrkno/tv-automation-server-core/commit/839b906)) -* timesync: better retry strategy on startup sync ([eda632a](https://github.com/nrkno/tv-automation-server-core/commit/eda632a)) -* tweaks on externalMessage send function, limiting the number of messages sent in one go ([046ae38](https://github.com/nrkno/tv-automation-server-core/commit/046ae38)) -* type bug ([de43835](https://github.com/nrkno/tv-automation-server-core/commit/de43835)) -* typing ([7c21efe](https://github.com/nrkno/tv-automation-server-core/commit/7c21efe)) -* UI tweaks for messages status view. so it doesn't break when having long error messages ([ca1e3ae](https://github.com/nrkno/tv-automation-server-core/commit/ca1e3ae)) -* update design of presenter screen ([4f41195](https://github.com/nrkno/tv-automation-server-core/commit/4f41195)) -* update supertimeline ([28bccfe](https://github.com/nrkno/tv-automation-server-core/commit/28bccfe)) -* Update timeline on removing a mos story ([fd3d443](https://github.com/nrkno/tv-automation-server-core/commit/fd3d443)) -* **zoom:** moved zoom modifier for scroll action to ctrl ([80829f2](https://github.com/nrkno/tv-automation-server-core/commit/80829f2)) -* Update TimelineObjCCGRoute. ([203ef91](https://github.com/nrkno/tv-automation-server-core/commit/203ef91)) -* updated mock data ([3e140c6](https://github.com/nrkno/tv-automation-server-core/commit/3e140c6)) -* updated mock data ([a7a4ae5](https://github.com/nrkno/tv-automation-server-core/commit/a7a4ae5)) -* updated systemTime endpoint ([503d2c8](https://github.com/nrkno/tv-automation-server-core/commit/503d2c8)) -* updated timeline dep (bugfixes) ([ff29ce6](https://github.com/nrkno/tv-automation-server-core/commit/ff29ce6)) -* when overriding componentWillUnmount, we need to call this._cleanup() ([0f39cd4](https://github.com/nrkno/tv-automation-server-core/commit/0f39cd4)) - +- added \_valid: true to mock-data ([6c2775b](https://github.com/nrkno/tv-automation-server-core/commit/6c2775b)) +- added missing debug-logging setting ([8f616ca](https://github.com/nrkno/tv-automation-server-core/commit/8f616ca)) +- added MomentFromNow, to use instead of ([aefea31](https://github.com/nrkno/tv-automation-server-core/commit/aefea31)) +- added peripheralDevices subscription, used by status display ([ccb309d](https://github.com/nrkno/tv-automation-server-core/commit/ccb309d)) +- added virtual lines to the generated function, so that line numbers add up in error messages ([df2366a](https://github.com/nrkno/tv-automation-server-core/commit/df2366a)) +- adlib items conflict with programmed content ([a304238](https://github.com/nrkno/tv-automation-server-core/commit/a304238)) +- allow duration 0 of segmentLines ([11a18ae](https://github.com/nrkno/tv-automation-server-core/commit/11a18ae)) +- apning with no heads ([dfb1976](https://github.com/nrkno/tv-automation-server-core/commit/dfb1976)) +- apparently componentwillmount is running in a reactive context and causes issues ([a8e53b6](https://github.com/nrkno/tv-automation-server-core/commit/a8e53b6)) +- better debug message ([17e1b4e](https://github.com/nrkno/tv-automation-server-core/commit/17e1b4e)) +- better handling of template-errors ([9f98100](https://github.com/nrkno/tv-automation-server-core/commit/9f98100)) +- broken settings page ([1e99ff7](https://github.com/nrkno/tv-automation-server-core/commit/1e99ff7)) +- bug in popup: nora payload can be deep objects, causing ui crash ([30bfca9](https://github.com/nrkno/tv-automation-server-core/commit/30bfca9)) +- bug that caused unhandledPromiseRejection. Also added logging of result of user action ([e799277](https://github.com/nrkno/tv-automation-server-core/commit/e799277)) +- bugfix: didn't correctly find the right segmentLineItem in next segmentLine ([0f9313f](https://github.com/nrkno/tv-automation-server-core/commit/0f9313f)) +- bugfix: executeFunction didn't really time out ([acba08c](https://github.com/nrkno/tv-automation-server-core/commit/acba08c)) +- dev Collections bug, due to collections being filled in later ([43e8856](https://github.com/nrkno/tv-automation-server-core/commit/43e8856)) +- dev debug data function ([e4570e2](https://github.com/nrkno/tv-automation-server-core/commit/e4570e2)) +- do not error CountdownItemLabel when sourceLayer is not found ([9451d1c](https://github.com/nrkno/tv-automation-server-core/commit/9451d1c)) +- don't send devicesMakeReady until verified no other runningOrders are active ([953a1a7](https://github.com/nrkno/tv-automation-server-core/commit/953a1a7)) +- don't wait for subscriptions before rendering ([2bbfa20](https://github.com/nrkno/tv-automation-server-core/commit/2bbfa20)) +- Ensure lookahead ids are always unique ([26f6637](https://github.com/nrkno/tv-automation-server-core/commit/26f6637)) +- Ensure the sl overlapDuration is respected on autonext. ([8c3bf3e](https://github.com/nrkno/tv-automation-server-core/commit/8c3bf3e)) +- error when content.boxSourceConfiguration is undefined ([81c896b](https://github.com/nrkno/tv-automation-server-core/commit/81c896b)) +- error when content.boxSourceConfiguration is undefined ([fc7ec40](https://github.com/nrkno/tv-automation-server-core/commit/fc7ec40)) +- externalMessage: priority of messages to send ([cffcd97](https://github.com/nrkno/tv-automation-server-core/commit/cffcd97)) +- externalMessages upd ([a803882](https://github.com/nrkno/tv-automation-server-core/commit/a803882)) +- filter on json files on restore backup file selector ([1a0b867](https://github.com/nrkno/tv-automation-server-core/commit/1a0b867)) +- Fix context.runHelper not working in templates. ([36ca5f3](https://github.com/nrkno/tv-automation-server-core/commit/36ca5f3)) +- generate statObject per device ([82a0736](https://github.com/nrkno/tv-automation-server-core/commit/82a0736)) +- getSnapshot: don't ask devices of type OTHER ([ea874d4](https://github.com/nrkno/tv-automation-server-core/commit/ea874d4)) +- HOLD add new llayer to initDB ([650b6e6](https://github.com/nrkno/tv-automation-server-core/commit/650b6e6)) +- if the next:ed segment is removed, instead next the one in its place ([22597b3](https://github.com/nrkno/tv-automation-server-core/commit/22597b3)) +- Improve missing mosId error message ([89695fb](https://github.com/nrkno/tv-automation-server-core/commit/89695fb)) +- Infinite items dont stop against a absolute 0 item properly. ([78c1499](https://github.com/nrkno/tv-automation-server-core/commit/78c1499)) +- Infinite segmentline bad guard when calculating the current infinites that caused the process to stop early ([2f9abeb](https://github.com/nrkno/tv-automation-server-core/commit/2f9abeb)) +- init state properly ([2572cdc](https://github.com/nrkno/tv-automation-server-core/commit/2572cdc)) +- limit db fetches to active running order ([f3aca8f](https://github.com/nrkno/tv-automation-server-core/commit/f3aca8f)) +- lookahead object id not being set correctly ([594a1e7](https://github.com/nrkno/tv-automation-server-core/commit/594a1e7)) +- mediaobjects to use computed field ([dba858f](https://github.com/nrkno/tv-automation-server-core/commit/dba858f)) +- mediaobjects to use computed field ([39d13b5](https://github.com/nrkno/tv-automation-server-core/commit/39d13b5)) +- **zoom:** moved zoom modifier for scroll action to ctrl ([863d81e](https://github.com/nrkno/tv-automation-server-core/commit/863d81e)) +- minor ui fix on status page ([97fc3c2](https://github.com/nrkno/tv-automation-server-core/commit/97fc3c2)) +- miss in merge ([93106b1](https://github.com/nrkno/tv-automation-server-core/commit/93106b1)) +- Mix transitions ([0ebf3e1](https://github.com/nrkno/tv-automation-server-core/commit/0ebf3e1)) +- Mix transitions ([5cf2314](https://github.com/nrkno/tv-automation-server-core/commit/5cf2314)) +- NymansPlayground caused issues in Timeline ([83e772d](https://github.com/nrkno/tv-automation-server-core/commit/83e772d)) +- playout, lookahead: use the originalLayer instear of isAbstract ([30fe842](https://github.com/nrkno/tv-automation-server-core/commit/30fe842)) +- prevent take + autotake bug ([b3d9a4d](https://github.com/nrkno/tv-automation-server-core/commit/b3d9a4d)) +- refactored execMethod, so it doesn't use promises and causes unhandled promise rejections ([24da71b](https://github.com/nrkno/tv-automation-server-core/commit/24da71b)) +- refactored/DRYd adminMode & studioMode, disabled trashbin-button for externalMessages when not in adminMode ([b29dae1](https://github.com/nrkno/tv-automation-server-core/commit/b29dae1)) +- relative durations causing type warnings for ui code ([5249435](https://github.com/nrkno/tv-automation-server-core/commit/5249435)) +- remove deprecated options ([ab7275b](https://github.com/nrkno/tv-automation-server-core/commit/ab7275b)) +- remove some console.logs ([a9f3f53](https://github.com/nrkno/tv-automation-server-core/commit/a9f3f53)) +- removed old, deprecated attr ([bf0cdfd](https://github.com/nrkno/tv-automation-server-core/commit/bf0cdfd)) +- removed uploadFileToAtem function, this should be done in devicesMakeReady ([4e96bb3](https://github.com/nrkno/tv-automation-server-core/commit/4e96bb3)) +- Removing trailing slashes in url defaults ([f6fa32c](https://github.com/nrkno/tv-automation-server-core/commit/f6fa32c)) +- Revert 594a1e7 ([edeb166](https://github.com/nrkno/tv-automation-server-core/commit/edeb166)) +- reworked systemStatus to use components instead ([cccfe3c](https://github.com/nrkno/tv-automation-server-core/commit/cccfe3c)) +- **cam/dir:** clear hotkeys ([2545de8](https://github.com/nrkno/tv-automation-server-core/commit/2545de8)) +- **countdowns:** ignore sourceLayers that we don't have an icon for ([27b2ac0](https://github.com/nrkno/tv-automation-server-core/commit/27b2ac0)) +- **FirstObjects:** Reverts regression introduced by removing isAbstract from firstObject items ([8f1608b](https://github.com/nrkno/tv-automation-server-core/commit/8f1608b)) +- **hold:** keep showing any infinite items that existed on the previous sl ([21a9973](https://github.com/nrkno/tv-automation-server-core/commit/21a9973)) +- **infinite items:** removes infinite icon from outOnNextSegment ([4a75d7d](https://github.com/nrkno/tv-automation-server-core/commit/4a75d7d)) +- **init:** adds qwerty to bakskjerm ([a45de4d](https://github.com/nrkno/tv-automation-server-core/commit/a45de4d)) +- **init:** adds qwerty to bakskjerm ([78198c9](https://github.com/nrkno/tv-automation-server-core/commit/78198c9)) +- **init:** adds qwerty to bakskjerm ([7329976](https://github.com/nrkno/tv-automation-server-core/commit/7329976)) +- **init:** hides klokke and logo layers by default ([1847ca4](https://github.com/nrkno/tv-automation-server-core/commit/1847ca4)) +- **init:** Layer names ([16a504c](https://github.com/nrkno/tv-automation-server-core/commit/16a504c)) +- **init:** Layer names ([221b374](https://github.com/nrkno/tv-automation-server-core/commit/221b374)) +- **init:** Splits init_layers and init_config. ([e056e5a](https://github.com/nrkno/tv-automation-server-core/commit/e056e5a)) +- **init:** swaps MP2 and MP1NXT layers ([b8a370c](https://github.com/nrkno/tv-automation-server-core/commit/b8a370c)) +- **init:** updated channel orders after 2-caspar setup ([3404b9b](https://github.com/nrkno/tv-automation-server-core/commit/3404b9b)) +- **Initdb:** Preload vignett ([156a454](https://github.com/nrkno/tv-automation-server-core/commit/156a454)) +- **Initdb:** Preload vignett ([9470318](https://github.com/nrkno/tv-automation-server-core/commit/9470318)) +- **iterateDeeply:** typos ([c9198f1](https://github.com/nrkno/tv-automation-server-core/commit/c9198f1)) +- **lookahead:** consider transitions properly in lookahead ([c78c6fa](https://github.com/nrkno/tv-automation-server-core/commit/c78c6fa)) +- **lookahead:** Ignore transition if this is the first sl and so no transition will be used ([3df2e1e](https://github.com/nrkno/tv-automation-server-core/commit/3df2e1e)) +- **lookahead:** Not using transition info when in a segmentline with no previous segmentline ([917b34e](https://github.com/nrkno/tv-automation-server-core/commit/917b34e)) +- **presenter screen:** display hours correctly ([e242a9e](https://github.com/nrkno/tv-automation-server-core/commit/e242a9e)) +- **sticky:** Fix sticky items with objects using relative triggers or durations ([0c47cff](https://github.com/nrkno/tv-automation-server-core/commit/0c47cff)) +- **Test:** Verifying build and deploy script ([0b13e18](https://github.com/nrkno/tv-automation-server-core/commit/0b13e18)) +- **transitions:** Ensure they are run with the correct overlap on autonext ([bbc6ca2](https://github.com/nrkno/tv-automation-server-core/commit/bbc6ca2)) +- update ro data cache when getting new metadata ([d700783](https://github.com/nrkno/tv-automation-server-core/commit/d700783)) +- **transitions:** Timed graphics being run wrong ([8b39960](https://github.com/nrkno/tv-automation-server-core/commit/8b39960)) +- timeline statObject: updated hashing function ([e00a01c](https://github.com/nrkno/tv-automation-server-core/commit/e00a01c)) +- **vignett:** do not preload vignett, as it is risky business preloading sluttvignett. Could be done better by separating vignett and sluttvignett ([8bf7ff8](https://github.com/nrkno/tv-automation-server-core/commit/8bf7ff8)) +- **vignett:** do not preload vignett, as it is risky business preloading sluttvignett. Could be done better by separating vignett and sluttvignett ([b0da067](https://github.com/nrkno/tv-automation-server-core/commit/b0da067)) +- ro-reset does not reset properly ([6367658](https://github.com/nrkno/tv-automation-server-core/commit/6367658)) +- run afterUpdateTimeline after timelineTriggerTime ([98ece60](https://github.com/nrkno/tv-automation-server-core/commit/98ece60)) +- setAsNext on previous line no longer shows default state, but now instead stalls when attempting to take ([e441aaf](https://github.com/nrkno/tv-automation-server-core/commit/e441aaf)) +- since afterUpdateTimeline is called in from a syncFunctionIgnore-function, we can remove the timeout ([e7f8f25](https://github.com/nrkno/tv-automation-server-core/commit/e7f8f25)) +- snapshots ([182c221](https://github.com/nrkno/tv-automation-server-core/commit/182c221)) +- subscription handling ([8aaa3ec](https://github.com/nrkno/tv-automation-server-core/commit/8aaa3ec)) +- temporary fix of typing error ([73bf56d](https://github.com/nrkno/tv-automation-server-core/commit/73bf56d)) +- text shadow in SegmentLineLabels ([3a310b1](https://github.com/nrkno/tv-automation-server-core/commit/3a310b1)) +- timeline dep ([b26eecb](https://github.com/nrkno/tv-automation-server-core/commit/b26eecb)) +- timeline statobj didn't update on inactivate (empty timeline) ([839b906](https://github.com/nrkno/tv-automation-server-core/commit/839b906)) +- timesync: better retry strategy on startup sync ([eda632a](https://github.com/nrkno/tv-automation-server-core/commit/eda632a)) +- tweaks on externalMessage send function, limiting the number of messages sent in one go ([046ae38](https://github.com/nrkno/tv-automation-server-core/commit/046ae38)) +- type bug ([de43835](https://github.com/nrkno/tv-automation-server-core/commit/de43835)) +- typing ([7c21efe](https://github.com/nrkno/tv-automation-server-core/commit/7c21efe)) +- UI tweaks for messages status view. so it doesn't break when having long error messages ([ca1e3ae](https://github.com/nrkno/tv-automation-server-core/commit/ca1e3ae)) +- update design of presenter screen ([4f41195](https://github.com/nrkno/tv-automation-server-core/commit/4f41195)) +- update supertimeline ([28bccfe](https://github.com/nrkno/tv-automation-server-core/commit/28bccfe)) +- Update timeline on removing a mos story ([fd3d443](https://github.com/nrkno/tv-automation-server-core/commit/fd3d443)) +- **zoom:** moved zoom modifier for scroll action to ctrl ([80829f2](https://github.com/nrkno/tv-automation-server-core/commit/80829f2)) +- Update TimelineObjCCGRoute. ([203ef91](https://github.com/nrkno/tv-automation-server-core/commit/203ef91)) +- updated mock data ([3e140c6](https://github.com/nrkno/tv-automation-server-core/commit/3e140c6)) +- updated mock data ([a7a4ae5](https://github.com/nrkno/tv-automation-server-core/commit/a7a4ae5)) +- updated systemTime endpoint ([503d2c8](https://github.com/nrkno/tv-automation-server-core/commit/503d2c8)) +- updated timeline dep (bugfixes) ([ff29ce6](https://github.com/nrkno/tv-automation-server-core/commit/ff29ce6)) +- when overriding componentWillUnmount, we need to call this.\_cleanup() ([0f39cd4](https://github.com/nrkno/tv-automation-server-core/commit/0f39cd4)) ### Features -* added .timings object to SegmentLine, to track take/playout times during playout ([5d860b3](https://github.com/nrkno/tv-automation-server-core/commit/5d860b3)) -* added "develop=1" to url, which re-enables right-click, for dev ([b73522c](https://github.com/nrkno/tv-automation-server-core/commit/b73522c)) -* added device version to status page ([ed0acda](https://github.com/nrkno/tv-automation-server-core/commit/ed0acda)) -* added getAllSegments, to use in metadata-template ([f8a5514](https://github.com/nrkno/tv-automation-server-core/commit/f8a5514)) -* added peripheralDevice.lastConnected, to be used for sorting so they wont jump around in the UI ([08e97f7](https://github.com/nrkno/tv-automation-server-core/commit/08e97f7)) -* added some shadow to the status dots ([04df33c](https://github.com/nrkno/tv-automation-server-core/commit/04df33c)) -* added timestamp to externalMessage error ([e13d1d8](https://github.com/nrkno/tv-automation-server-core/commit/e13d1d8)) -* added timings property to adlig segmentLineItems ([b333bf1](https://github.com/nrkno/tv-automation-server-core/commit/b333bf1)) -* Atem SuperSource properties support ([2688142](https://github.com/nrkno/tv-automation-server-core/commit/2688142)) -* codeControl: create syncFunctions which finer grained execution control based on arguments ([f53607f](https://github.com/nrkno/tv-automation-server-core/commit/f53607f)) -* converted more subscriptions (WIP) ([e047fef](https://github.com/nrkno/tv-automation-server-core/commit/e047fef)) -* converted StudioInstallation into a class, adding getConfigValue as member method, a step towards DRY ([4af278e](https://github.com/nrkno/tv-automation-server-core/commit/4af278e)) -* cron job for restarting casparcg ([19898d1](https://github.com/nrkno/tv-automation-server-core/commit/19898d1)) -* disable in next segmentLine & refactoring ([669166c](https://github.com/nrkno/tv-automation-server-core/commit/669166c)) -* ensure each sli has a mosId set ([57c977d](https://github.com/nrkno/tv-automation-server-core/commit/57c977d)) -* externalMessage: allow for multiple messages to be generated at the same time ([284efbe](https://github.com/nrkno/tv-automation-server-core/commit/284efbe)) -* f9, f10 buttons step next forward & down (shift reverses direction) ([a3be0cf](https://github.com/nrkno/tv-automation-server-core/commit/a3be0cf)) -* force some function to run synchronously. experimental, WIP! ([55a064c](https://github.com/nrkno/tv-automation-server-core/commit/55a064c)) -* force some function to run synchronously. experimental, WIP! ([54d83dd](https://github.com/nrkno/tv-automation-server-core/commit/54d83dd)) -* HOLD mode ([e41c5a4](https://github.com/nrkno/tv-automation-server-core/commit/e41c5a4)) -* HOLD mode ([ae1dacf](https://github.com/nrkno/tv-automation-server-core/commit/ae1dacf)) -* if template 'getId' returns null, don't throw an error. Also when templateId is not found, send warning instead of an error ([d98f09d](https://github.com/nrkno/tv-automation-server-core/commit/d98f09d)) -* implementation of disable-next-segmentLineItem ([a06d196](https://github.com/nrkno/tv-automation-server-core/commit/a06d196)) -* Implemented Notes into data structure & GUI ([735b8c5](https://github.com/nrkno/tv-automation-server-core/commit/735b8c5)) -* implemented partial timeline fix ([c8b56e4](https://github.com/nrkno/tv-automation-server-core/commit/c8b56e4)) -* implemented stricter typing & changed classes to ReactMeteorComponent where applicable ([9d2166e](https://github.com/nrkno/tv-automation-server-core/commit/9d2166e)) -* improved layout for presenter countdowns ([2bd61cc](https://github.com/nrkno/tv-automation-server-core/commit/2bd61cc)) -* load atem ssrc background when activating RO ([0eda9b4](https://github.com/nrkno/tv-automation-server-core/commit/0eda9b4)) -* lookahead ([5ed0f13](https://github.com/nrkno/tv-automation-server-core/commit/5ed0f13)) -* media scanner & casparcg launcher hostnames ([02ec8be](https://github.com/nrkno/tv-automation-server-core/commit/02ec8be)) -* MeteorReactComponent: return subscription & computation handle ([e20e6de](https://github.com/nrkno/tv-automation-server-core/commit/e20e6de)) -* method "ping" to be called by devices every now and then, to update lastSeen ([41a996c](https://github.com/nrkno/tv-automation-server-core/commit/41a996c)) -* Move sofie and metadata urls from templates to config ([af8e388](https://github.com/nrkno/tv-automation-server-core/commit/af8e388)) -* moved nightly cronjob to run after 4am ([8eb4e12](https://github.com/nrkno/tv-automation-server-core/commit/8eb4e12)) -* place all collections in Collections object, for debugging purposes ([9682a89](https://github.com/nrkno/tv-automation-server-core/commit/9682a89)) -* prevent next:ing of currently playing segmentLine ([b9c9ea1](https://github.com/nrkno/tv-automation-server-core/commit/b9c9ea1)) -* refactor of subscriptions (WIP) ([2b6f994](https://github.com/nrkno/tv-automation-server-core/commit/2b6f994)) -* refactor to use relative durations. affects infinite segmentlineitems, autonext, segmentline overlapduration property ([67c5444](https://github.com/nrkno/tv-automation-server-core/commit/67c5444)) -* refactored initDB into 2 separate methods, so we can easilly update just the layers and not the infrastructure ([d4fcc3f](https://github.com/nrkno/tv-automation-server-core/commit/d4fcc3f)) -* **shortcuts:** adds shortcuts to remove various graphic layers ([0d1a83d](https://github.com/nrkno/tv-automation-server-core/commit/0d1a83d)) -* restart CasparCG from UI ([64509c3](https://github.com/nrkno/tv-automation-server-core/commit/64509c3)) -* reworked externalMessages page ([3b87242](https://github.com/nrkno/tv-automation-server-core/commit/3b87242)) -* second upload to atem ([6697a80](https://github.com/nrkno/tv-automation-server-core/commit/6697a80)) -* **init:** adds studio monitor html player to casparcg ([6533b0f](https://github.com/nrkno/tv-automation-server-core/commit/6533b0f)) -* status endpoint /health updated to use device statuses ([2c4b7fa](https://github.com/nrkno/tv-automation-server-core/commit/2c4b7fa)) -* System snapshot ([006027b](https://github.com/nrkno/tv-automation-server-core/commit/006027b)) -* templates: added format functions for timecode ([ea38081](https://github.com/nrkno/tv-automation-server-core/commit/ea38081)) -* **init:** bakskjerm type ([8ffe776](https://github.com/nrkno/tv-automation-server-core/commit/8ffe776)) -* Update timeline and infinite items on enps update ([db0c041](https://github.com/nrkno/tv-automation-server-core/commit/db0c041)) -* **aux:** Adds tecnical error aux 2 ([34ce710](https://github.com/nrkno/tv-automation-server-core/commit/34ce710)) -* **AUX:** adds clock aux ([45479da](https://github.com/nrkno/tv-automation-server-core/commit/45479da)) -* **AUXes:** New AUX-mapping introducing more previews and moves the cleanfeed ([548bd8c](https://github.com/nrkno/tv-automation-server-core/commit/548bd8c)) -* **init:** adds clear shortcuts + skippabloe ([f824ae5](https://github.com/nrkno/tv-automation-server-core/commit/f824ae5)) -* **init:** adds multiple bak source layers ([c812510](https://github.com/nrkno/tv-automation-server-core/commit/c812510)) -* **init:** Adds RM 4,5,6 ([dd59d47](https://github.com/nrkno/tv-automation-server-core/commit/dd59d47)) -* **init:** Adds RM 4,5,6 ([0021d7b](https://github.com/nrkno/tv-automation-server-core/commit/0021d7b)) -* updated timeline dependency ([6ef9eb7](https://github.com/nrkno/tv-automation-server-core/commit/6ef9eb7)) -* use date-picker for user-activity-log ([5e2c218](https://github.com/nrkno/tv-automation-server-core/commit/5e2c218)) -* **init:** moves countdown to casparcg machine 2, channel 1 ([18c354b](https://github.com/nrkno/tv-automation-server-core/commit/18c354b)) -* **init:** moves countdown to casparcg machine 2, channel 1 ([6c93464](https://github.com/nrkno/tv-automation-server-core/commit/6c93464)) -* **iterateDeeply:** exports iterateDeeply to template context ([42cc886](https://github.com/nrkno/tv-automation-server-core/commit/42cc886)) -* **Next:** Adds warning/fallback of not loaded clips ([e20bc2f](https://github.com/nrkno/tv-automation-server-core/commit/e20bc2f)) - - +- added .timings object to SegmentLine, to track take/playout times during playout ([5d860b3](https://github.com/nrkno/tv-automation-server-core/commit/5d860b3)) +- added "develop=1" to url, which re-enables right-click, for dev ([b73522c](https://github.com/nrkno/tv-automation-server-core/commit/b73522c)) +- added device version to status page ([ed0acda](https://github.com/nrkno/tv-automation-server-core/commit/ed0acda)) +- added getAllSegments, to use in metadata-template ([f8a5514](https://github.com/nrkno/tv-automation-server-core/commit/f8a5514)) +- added peripheralDevice.lastConnected, to be used for sorting so they wont jump around in the UI ([08e97f7](https://github.com/nrkno/tv-automation-server-core/commit/08e97f7)) +- added some shadow to the status dots ([04df33c](https://github.com/nrkno/tv-automation-server-core/commit/04df33c)) +- added timestamp to externalMessage error ([e13d1d8](https://github.com/nrkno/tv-automation-server-core/commit/e13d1d8)) +- added timings property to adlig segmentLineItems ([b333bf1](https://github.com/nrkno/tv-automation-server-core/commit/b333bf1)) +- Atem SuperSource properties support ([2688142](https://github.com/nrkno/tv-automation-server-core/commit/2688142)) +- codeControl: create syncFunctions which finer grained execution control based on arguments ([f53607f](https://github.com/nrkno/tv-automation-server-core/commit/f53607f)) +- converted more subscriptions (WIP) ([e047fef](https://github.com/nrkno/tv-automation-server-core/commit/e047fef)) +- converted StudioInstallation into a class, adding getConfigValue as member method, a step towards DRY ([4af278e](https://github.com/nrkno/tv-automation-server-core/commit/4af278e)) +- cron job for restarting casparcg ([19898d1](https://github.com/nrkno/tv-automation-server-core/commit/19898d1)) +- disable in next segmentLine & refactoring ([669166c](https://github.com/nrkno/tv-automation-server-core/commit/669166c)) +- ensure each sli has a mosId set ([57c977d](https://github.com/nrkno/tv-automation-server-core/commit/57c977d)) +- externalMessage: allow for multiple messages to be generated at the same time ([284efbe](https://github.com/nrkno/tv-automation-server-core/commit/284efbe)) +- f9, f10 buttons step next forward & down (shift reverses direction) ([a3be0cf](https://github.com/nrkno/tv-automation-server-core/commit/a3be0cf)) +- force some function to run synchronously. experimental, WIP! ([55a064c](https://github.com/nrkno/tv-automation-server-core/commit/55a064c)) +- force some function to run synchronously. experimental, WIP! ([54d83dd](https://github.com/nrkno/tv-automation-server-core/commit/54d83dd)) +- HOLD mode ([e41c5a4](https://github.com/nrkno/tv-automation-server-core/commit/e41c5a4)) +- HOLD mode ([ae1dacf](https://github.com/nrkno/tv-automation-server-core/commit/ae1dacf)) +- if template 'getId' returns null, don't throw an error. Also when templateId is not found, send warning instead of an error ([d98f09d](https://github.com/nrkno/tv-automation-server-core/commit/d98f09d)) +- implementation of disable-next-segmentLineItem ([a06d196](https://github.com/nrkno/tv-automation-server-core/commit/a06d196)) +- Implemented Notes into data structure & GUI ([735b8c5](https://github.com/nrkno/tv-automation-server-core/commit/735b8c5)) +- implemented partial timeline fix ([c8b56e4](https://github.com/nrkno/tv-automation-server-core/commit/c8b56e4)) +- implemented stricter typing & changed classes to ReactMeteorComponent where applicable ([9d2166e](https://github.com/nrkno/tv-automation-server-core/commit/9d2166e)) +- improved layout for presenter countdowns ([2bd61cc](https://github.com/nrkno/tv-automation-server-core/commit/2bd61cc)) +- load atem ssrc background when activating RO ([0eda9b4](https://github.com/nrkno/tv-automation-server-core/commit/0eda9b4)) +- lookahead ([5ed0f13](https://github.com/nrkno/tv-automation-server-core/commit/5ed0f13)) +- media scanner & casparcg launcher hostnames ([02ec8be](https://github.com/nrkno/tv-automation-server-core/commit/02ec8be)) +- MeteorReactComponent: return subscription & computation handle ([e20e6de](https://github.com/nrkno/tv-automation-server-core/commit/e20e6de)) +- method "ping" to be called by devices every now and then, to update lastSeen ([41a996c](https://github.com/nrkno/tv-automation-server-core/commit/41a996c)) +- Move sofie and metadata urls from templates to config ([af8e388](https://github.com/nrkno/tv-automation-server-core/commit/af8e388)) +- moved nightly cronjob to run after 4am ([8eb4e12](https://github.com/nrkno/tv-automation-server-core/commit/8eb4e12)) +- place all collections in Collections object, for debugging purposes ([9682a89](https://github.com/nrkno/tv-automation-server-core/commit/9682a89)) +- prevent next:ing of currently playing segmentLine ([b9c9ea1](https://github.com/nrkno/tv-automation-server-core/commit/b9c9ea1)) +- refactor of subscriptions (WIP) ([2b6f994](https://github.com/nrkno/tv-automation-server-core/commit/2b6f994)) +- refactor to use relative durations. affects infinite segmentlineitems, autonext, segmentline overlapduration property ([67c5444](https://github.com/nrkno/tv-automation-server-core/commit/67c5444)) +- refactored initDB into 2 separate methods, so we can easilly update just the layers and not the infrastructure ([d4fcc3f](https://github.com/nrkno/tv-automation-server-core/commit/d4fcc3f)) +- **shortcuts:** adds shortcuts to remove various graphic layers ([0d1a83d](https://github.com/nrkno/tv-automation-server-core/commit/0d1a83d)) +- restart CasparCG from UI ([64509c3](https://github.com/nrkno/tv-automation-server-core/commit/64509c3)) +- reworked externalMessages page ([3b87242](https://github.com/nrkno/tv-automation-server-core/commit/3b87242)) +- second upload to atem ([6697a80](https://github.com/nrkno/tv-automation-server-core/commit/6697a80)) +- **init:** adds studio monitor html player to casparcg ([6533b0f](https://github.com/nrkno/tv-automation-server-core/commit/6533b0f)) +- status endpoint /health updated to use device statuses ([2c4b7fa](https://github.com/nrkno/tv-automation-server-core/commit/2c4b7fa)) +- System snapshot ([006027b](https://github.com/nrkno/tv-automation-server-core/commit/006027b)) +- templates: added format functions for timecode ([ea38081](https://github.com/nrkno/tv-automation-server-core/commit/ea38081)) +- **init:** bakskjerm type ([8ffe776](https://github.com/nrkno/tv-automation-server-core/commit/8ffe776)) +- Update timeline and infinite items on enps update ([db0c041](https://github.com/nrkno/tv-automation-server-core/commit/db0c041)) +- **aux:** Adds tecnical error aux 2 ([34ce710](https://github.com/nrkno/tv-automation-server-core/commit/34ce710)) +- **AUX:** adds clock aux ([45479da](https://github.com/nrkno/tv-automation-server-core/commit/45479da)) +- **AUXes:** New AUX-mapping introducing more previews and moves the cleanfeed ([548bd8c](https://github.com/nrkno/tv-automation-server-core/commit/548bd8c)) +- **init:** adds clear shortcuts + skippabloe ([f824ae5](https://github.com/nrkno/tv-automation-server-core/commit/f824ae5)) +- **init:** adds multiple bak source layers ([c812510](https://github.com/nrkno/tv-automation-server-core/commit/c812510)) +- **init:** Adds RM 4,5,6 ([dd59d47](https://github.com/nrkno/tv-automation-server-core/commit/dd59d47)) +- **init:** Adds RM 4,5,6 ([0021d7b](https://github.com/nrkno/tv-automation-server-core/commit/0021d7b)) +- updated timeline dependency ([6ef9eb7](https://github.com/nrkno/tv-automation-server-core/commit/6ef9eb7)) +- use date-picker for user-activity-log ([5e2c218](https://github.com/nrkno/tv-automation-server-core/commit/5e2c218)) +- **init:** moves countdown to casparcg machine 2, channel 1 ([18c354b](https://github.com/nrkno/tv-automation-server-core/commit/18c354b)) +- **init:** moves countdown to casparcg machine 2, channel 1 ([6c93464](https://github.com/nrkno/tv-automation-server-core/commit/6c93464)) +- **iterateDeeply:** exports iterateDeeply to template context ([42cc886](https://github.com/nrkno/tv-automation-server-core/commit/42cc886)) +- **Next:** Adds warning/fallback of not loaded clips ([e20bc2f](https://github.com/nrkno/tv-automation-server-core/commit/e20bc2f)) -## [0.10.1](https://github.com/nrkno/tv-automation-server-core/compare/v0.10.0...v0.10.1) (2018-09-07) +## [0.10.1](https://github.com/nrkno/tv-automation-server-core/compare/v0.10.0...v0.10.1) (2018-09-07) ### Bug Fixes -* reworked systemStatus to use components instead ([cccfe3c](https://github.com/nrkno/tv-automation-server-core/commit/cccfe3c)) -* ro-reset does not reset properly ([6367658](https://github.com/nrkno/tv-automation-server-core/commit/6367658)) -* updated systemTime endpoint ([503d2c8](https://github.com/nrkno/tv-automation-server-core/commit/503d2c8)) - - +- reworked systemStatus to use components instead ([cccfe3c](https://github.com/nrkno/tv-automation-server-core/commit/cccfe3c)) +- ro-reset does not reset properly ([6367658](https://github.com/nrkno/tv-automation-server-core/commit/6367658)) +- updated systemTime endpoint ([503d2c8](https://github.com/nrkno/tv-automation-server-core/commit/503d2c8)) -# [0.10.0](https://github.com/nrkno/tv-automation-server-core/compare/v0.9.1...v0.10.0) (2018-09-06) +# [0.10.0](https://github.com/nrkno/tv-automation-server-core/compare/v0.9.1...v0.10.0) (2018-09-06) ### Bug Fixes -* added _valid: true to mock-data ([6c2775b](https://github.com/nrkno/tv-automation-server-core/commit/6c2775b)) -* better handling of template-errors ([9f98100](https://github.com/nrkno/tv-automation-server-core/commit/9f98100)) -* bugfix: didn't correctly find the right segmentLineItem in next segmentLine ([0f9313f](https://github.com/nrkno/tv-automation-server-core/commit/0f9313f)) -* Ensure the sl overlapDuration is respected on autonext. ([8c3bf3e](https://github.com/nrkno/tv-automation-server-core/commit/8c3bf3e)) -* **cam/dir:** clear hotkeys ([2545de8](https://github.com/nrkno/tv-automation-server-core/commit/2545de8)) -* run afterUpdateTimeline after timelineTriggerTime ([98ece60](https://github.com/nrkno/tv-automation-server-core/commit/98ece60)) -* **init:** adds qwerty to bakskjerm ([a45de4d](https://github.com/nrkno/tv-automation-server-core/commit/a45de4d)) -* **init:** adds qwerty to bakskjerm ([7329976](https://github.com/nrkno/tv-automation-server-core/commit/7329976)) -* **init:** adds qwerty to bakskjerm ([78198c9](https://github.com/nrkno/tv-automation-server-core/commit/78198c9)) -* getSnapshot: don't ask devices of type OTHER ([ea874d4](https://github.com/nrkno/tv-automation-server-core/commit/ea874d4)) -* setAsNext on previous line no longer shows default state, but now instead stalls when attempting to take ([e441aaf](https://github.com/nrkno/tv-automation-server-core/commit/e441aaf)) -* since afterUpdateTimeline is called in from a syncFunctionIgnore-function, we can remove the timeout ([e7f8f25](https://github.com/nrkno/tv-automation-server-core/commit/e7f8f25)) -* timesync: better retry strategy on startup sync ([eda632a](https://github.com/nrkno/tv-automation-server-core/commit/eda632a)) -* updated timeline dep (bugfixes) ([ff29ce6](https://github.com/nrkno/tv-automation-server-core/commit/ff29ce6)) -* **init:** Splits init_layers and init_config. ([e056e5a](https://github.com/nrkno/tv-automation-server-core/commit/e056e5a)) -* **init:** updated channel orders after 2-caspar setup ([3404b9b](https://github.com/nrkno/tv-automation-server-core/commit/3404b9b)) -* **lookahead:** Ignore transition if this is the first sl and so no transition will be used ([3df2e1e](https://github.com/nrkno/tv-automation-server-core/commit/3df2e1e)) -* **lookahead:** Not using transition info when in a segmentline with no previous segmentline ([917b34e](https://github.com/nrkno/tv-automation-server-core/commit/917b34e)) -* **sticky:** Fix sticky items with objects using relative triggers or durations ([0c47cff](https://github.com/nrkno/tv-automation-server-core/commit/0c47cff)) - +- added \_valid: true to mock-data ([6c2775b](https://github.com/nrkno/tv-automation-server-core/commit/6c2775b)) +- better handling of template-errors ([9f98100](https://github.com/nrkno/tv-automation-server-core/commit/9f98100)) +- bugfix: didn't correctly find the right segmentLineItem in next segmentLine ([0f9313f](https://github.com/nrkno/tv-automation-server-core/commit/0f9313f)) +- Ensure the sl overlapDuration is respected on autonext. ([8c3bf3e](https://github.com/nrkno/tv-automation-server-core/commit/8c3bf3e)) +- **cam/dir:** clear hotkeys ([2545de8](https://github.com/nrkno/tv-automation-server-core/commit/2545de8)) +- run afterUpdateTimeline after timelineTriggerTime ([98ece60](https://github.com/nrkno/tv-automation-server-core/commit/98ece60)) +- **init:** adds qwerty to bakskjerm ([a45de4d](https://github.com/nrkno/tv-automation-server-core/commit/a45de4d)) +- **init:** adds qwerty to bakskjerm ([7329976](https://github.com/nrkno/tv-automation-server-core/commit/7329976)) +- **init:** adds qwerty to bakskjerm ([78198c9](https://github.com/nrkno/tv-automation-server-core/commit/78198c9)) +- getSnapshot: don't ask devices of type OTHER ([ea874d4](https://github.com/nrkno/tv-automation-server-core/commit/ea874d4)) +- setAsNext on previous line no longer shows default state, but now instead stalls when attempting to take ([e441aaf](https://github.com/nrkno/tv-automation-server-core/commit/e441aaf)) +- since afterUpdateTimeline is called in from a syncFunctionIgnore-function, we can remove the timeout ([e7f8f25](https://github.com/nrkno/tv-automation-server-core/commit/e7f8f25)) +- timesync: better retry strategy on startup sync ([eda632a](https://github.com/nrkno/tv-automation-server-core/commit/eda632a)) +- updated timeline dep (bugfixes) ([ff29ce6](https://github.com/nrkno/tv-automation-server-core/commit/ff29ce6)) +- **init:** Splits init_layers and init_config. ([e056e5a](https://github.com/nrkno/tv-automation-server-core/commit/e056e5a)) +- **init:** updated channel orders after 2-caspar setup ([3404b9b](https://github.com/nrkno/tv-automation-server-core/commit/3404b9b)) +- **lookahead:** Ignore transition if this is the first sl and so no transition will be used ([3df2e1e](https://github.com/nrkno/tv-automation-server-core/commit/3df2e1e)) +- **lookahead:** Not using transition info when in a segmentline with no previous segmentline ([917b34e](https://github.com/nrkno/tv-automation-server-core/commit/917b34e)) +- **sticky:** Fix sticky items with objects using relative triggers or durations ([0c47cff](https://github.com/nrkno/tv-automation-server-core/commit/0c47cff)) ### Features -* codeControl: create syncFunctions which finer grained execution control based on arguments ([f53607f](https://github.com/nrkno/tv-automation-server-core/commit/f53607f)) -* disable in next segmentLine & refactoring ([669166c](https://github.com/nrkno/tv-automation-server-core/commit/669166c)) -* implementation of disable-next-segmentLineItem ([a06d196](https://github.com/nrkno/tv-automation-server-core/commit/a06d196)) -* second upload to atem ([6697a80](https://github.com/nrkno/tv-automation-server-core/commit/6697a80)) -* **aux:** Adds tecnical error aux 2 ([34ce710](https://github.com/nrkno/tv-automation-server-core/commit/34ce710)) -* **init:** adds clear shortcuts + skippabloe ([f824ae5](https://github.com/nrkno/tv-automation-server-core/commit/f824ae5)) -* status endpoint /health updated to use device statuses ([2c4b7fa](https://github.com/nrkno/tv-automation-server-core/commit/2c4b7fa)) - - +- codeControl: create syncFunctions which finer grained execution control based on arguments ([f53607f](https://github.com/nrkno/tv-automation-server-core/commit/f53607f)) +- disable in next segmentLine & refactoring ([669166c](https://github.com/nrkno/tv-automation-server-core/commit/669166c)) +- implementation of disable-next-segmentLineItem ([a06d196](https://github.com/nrkno/tv-automation-server-core/commit/a06d196)) +- second upload to atem ([6697a80](https://github.com/nrkno/tv-automation-server-core/commit/6697a80)) +- **aux:** Adds tecnical error aux 2 ([34ce710](https://github.com/nrkno/tv-automation-server-core/commit/34ce710)) +- **init:** adds clear shortcuts + skippabloe ([f824ae5](https://github.com/nrkno/tv-automation-server-core/commit/f824ae5)) +- status endpoint /health updated to use device statuses ([2c4b7fa](https://github.com/nrkno/tv-automation-server-core/commit/2c4b7fa)) -## [0.9.1](https://github.com/nrkno/tv-automation-server-core/compare/v0.9.0...v0.9.1) (2018-09-04) - +## [0.9.1](https://github.com/nrkno/tv-automation-server-core/compare/v0.9.0...v0.9.1) (2018-09-04) -# [0.9.0](https://github.com/nrkno/tv-automation-server-core/compare/v0.8.0...v0.9.0) (2018-08-31) +# [0.9.0](https://github.com/nrkno/tv-automation-server-core/compare/v0.8.0...v0.9.0) (2018-08-31) ### Bug Fixes -* allow duration 0 of segmentLines ([11a18ae](https://github.com/nrkno/tv-automation-server-core/commit/11a18ae)) -* better debug message ([17e1b4e](https://github.com/nrkno/tv-automation-server-core/commit/17e1b4e)) -* bug in popup: nora payload can be deep objects, causing ui crash ([30bfca9](https://github.com/nrkno/tv-automation-server-core/commit/30bfca9)) -* Infinite segmentline bad guard when calculating the current infinites that caused the process to stop early ([2f9abeb](https://github.com/nrkno/tv-automation-server-core/commit/2f9abeb)) -* Mix transitions ([0ebf3e1](https://github.com/nrkno/tv-automation-server-core/commit/0ebf3e1)) -* Mix transitions ([5cf2314](https://github.com/nrkno/tv-automation-server-core/commit/5cf2314)) -* temporary fix of typing error ([73bf56d](https://github.com/nrkno/tv-automation-server-core/commit/73bf56d)) -* timeline dep ([b26eecb](https://github.com/nrkno/tv-automation-server-core/commit/b26eecb)) -* timeline statobj didn't update on inactivate (empty timeline) ([839b906](https://github.com/nrkno/tv-automation-server-core/commit/839b906)) -* **iterateDeeply:** typos ([c9198f1](https://github.com/nrkno/tv-automation-server-core/commit/c9198f1)) -* **transitions:** Ensure they are run with the correct overlap on autonext ([bbc6ca2](https://github.com/nrkno/tv-automation-server-core/commit/bbc6ca2)) -* **transitions:** Timed graphics being run wrong ([8b39960](https://github.com/nrkno/tv-automation-server-core/commit/8b39960)) -* typing ([7c21efe](https://github.com/nrkno/tv-automation-server-core/commit/7c21efe)) -* update design of presenter screen ([4f41195](https://github.com/nrkno/tv-automation-server-core/commit/4f41195)) - +- allow duration 0 of segmentLines ([11a18ae](https://github.com/nrkno/tv-automation-server-core/commit/11a18ae)) +- better debug message ([17e1b4e](https://github.com/nrkno/tv-automation-server-core/commit/17e1b4e)) +- bug in popup: nora payload can be deep objects, causing ui crash ([30bfca9](https://github.com/nrkno/tv-automation-server-core/commit/30bfca9)) +- Infinite segmentline bad guard when calculating the current infinites that caused the process to stop early ([2f9abeb](https://github.com/nrkno/tv-automation-server-core/commit/2f9abeb)) +- Mix transitions ([0ebf3e1](https://github.com/nrkno/tv-automation-server-core/commit/0ebf3e1)) +- Mix transitions ([5cf2314](https://github.com/nrkno/tv-automation-server-core/commit/5cf2314)) +- temporary fix of typing error ([73bf56d](https://github.com/nrkno/tv-automation-server-core/commit/73bf56d)) +- timeline dep ([b26eecb](https://github.com/nrkno/tv-automation-server-core/commit/b26eecb)) +- timeline statobj didn't update on inactivate (empty timeline) ([839b906](https://github.com/nrkno/tv-automation-server-core/commit/839b906)) +- **iterateDeeply:** typos ([c9198f1](https://github.com/nrkno/tv-automation-server-core/commit/c9198f1)) +- **transitions:** Ensure they are run with the correct overlap on autonext ([bbc6ca2](https://github.com/nrkno/tv-automation-server-core/commit/bbc6ca2)) +- **transitions:** Timed graphics being run wrong ([8b39960](https://github.com/nrkno/tv-automation-server-core/commit/8b39960)) +- typing ([7c21efe](https://github.com/nrkno/tv-automation-server-core/commit/7c21efe)) +- update design of presenter screen ([4f41195](https://github.com/nrkno/tv-automation-server-core/commit/4f41195)) ### Features -* added peripheralDevice.lastConnected, to be used for sorting so they wont jump around in the UI ([08e97f7](https://github.com/nrkno/tv-automation-server-core/commit/08e97f7)) -* f9, f10 buttons step next forward & down (shift reverses direction) ([a3be0cf](https://github.com/nrkno/tv-automation-server-core/commit/a3be0cf)) -* force some function to run synchronously. experimental, WIP! ([55a064c](https://github.com/nrkno/tv-automation-server-core/commit/55a064c)) -* force some function to run synchronously. experimental, WIP! ([54d83dd](https://github.com/nrkno/tv-automation-server-core/commit/54d83dd)) -* prevent next:ing of currently playing segmentLine ([b9c9ea1](https://github.com/nrkno/tv-automation-server-core/commit/b9c9ea1)) -* **init:** bakskjerm type ([8ffe776](https://github.com/nrkno/tv-automation-server-core/commit/8ffe776)) -* **iterateDeeply:** exports iterateDeeply to template context ([42cc886](https://github.com/nrkno/tv-automation-server-core/commit/42cc886)) -* **Next:** Adds warning/fallback of not loaded clips ([e20bc2f](https://github.com/nrkno/tv-automation-server-core/commit/e20bc2f)) - - +- added peripheralDevice.lastConnected, to be used for sorting so they wont jump around in the UI ([08e97f7](https://github.com/nrkno/tv-automation-server-core/commit/08e97f7)) +- f9, f10 buttons step next forward & down (shift reverses direction) ([a3be0cf](https://github.com/nrkno/tv-automation-server-core/commit/a3be0cf)) +- force some function to run synchronously. experimental, WIP! ([55a064c](https://github.com/nrkno/tv-automation-server-core/commit/55a064c)) +- force some function to run synchronously. experimental, WIP! ([54d83dd](https://github.com/nrkno/tv-automation-server-core/commit/54d83dd)) +- prevent next:ing of currently playing segmentLine ([b9c9ea1](https://github.com/nrkno/tv-automation-server-core/commit/b9c9ea1)) +- **init:** bakskjerm type ([8ffe776](https://github.com/nrkno/tv-automation-server-core/commit/8ffe776)) +- **iterateDeeply:** exports iterateDeeply to template context ([42cc886](https://github.com/nrkno/tv-automation-server-core/commit/42cc886)) +- **Next:** Adds warning/fallback of not loaded clips ([e20bc2f](https://github.com/nrkno/tv-automation-server-core/commit/e20bc2f)) -# [0.8.0](https://github.com/nrkno/tv-automation-server-core/compare/v0.7.0...v0.8.0) (2018-08-28) +# [0.8.0](https://github.com/nrkno/tv-automation-server-core/compare/v0.7.0...v0.8.0) (2018-08-28) ### Bug Fixes -* dev Collections bug, due to collections being filled in later ([43e8856](https://github.com/nrkno/tv-automation-server-core/commit/43e8856)) -* don't send devicesMakeReady until verified no other runningOrders are active ([953a1a7](https://github.com/nrkno/tv-automation-server-core/commit/953a1a7)) -* if the next:ed segment is removed, instead next the one in its place ([22597b3](https://github.com/nrkno/tv-automation-server-core/commit/22597b3)) -* NymansPlayground caused issues in Timeline ([83e772d](https://github.com/nrkno/tv-automation-server-core/commit/83e772d)) -* prevent take + autotake bug ([b3d9a4d](https://github.com/nrkno/tv-automation-server-core/commit/b3d9a4d)) -* type bug ([de43835](https://github.com/nrkno/tv-automation-server-core/commit/de43835)) - +- dev Collections bug, due to collections being filled in later ([43e8856](https://github.com/nrkno/tv-automation-server-core/commit/43e8856)) +- don't send devicesMakeReady until verified no other runningOrders are active ([953a1a7](https://github.com/nrkno/tv-automation-server-core/commit/953a1a7)) +- if the next:ed segment is removed, instead next the one in its place ([22597b3](https://github.com/nrkno/tv-automation-server-core/commit/22597b3)) +- NymansPlayground caused issues in Timeline ([83e772d](https://github.com/nrkno/tv-automation-server-core/commit/83e772d)) +- prevent take + autotake bug ([b3d9a4d](https://github.com/nrkno/tv-automation-server-core/commit/b3d9a4d)) +- type bug ([de43835](https://github.com/nrkno/tv-automation-server-core/commit/de43835)) ### Features -* **shortcuts:** adds shortcuts to remove various graphic layers ([0d1a83d](https://github.com/nrkno/tv-automation-server-core/commit/0d1a83d)) -* added "develop=1" to url, which re-enables right-click, for dev ([b73522c](https://github.com/nrkno/tv-automation-server-core/commit/b73522c)) -* Implemented Notes into data structure & GUI ([735b8c5](https://github.com/nrkno/tv-automation-server-core/commit/735b8c5)) -* moved nightly cronjob to run after 4am ([8eb4e12](https://github.com/nrkno/tv-automation-server-core/commit/8eb4e12)) - - +- **shortcuts:** adds shortcuts to remove various graphic layers ([0d1a83d](https://github.com/nrkno/tv-automation-server-core/commit/0d1a83d)) +- added "develop=1" to url, which re-enables right-click, for dev ([b73522c](https://github.com/nrkno/tv-automation-server-core/commit/b73522c)) +- Implemented Notes into data structure & GUI ([735b8c5](https://github.com/nrkno/tv-automation-server-core/commit/735b8c5)) +- moved nightly cronjob to run after 4am ([8eb4e12](https://github.com/nrkno/tv-automation-server-core/commit/8eb4e12)) -# [0.7.0](https://github.com/nrkno/tv-automation-server-core/compare/v0.6.0...v0.7.0) (2018-08-27) +# [0.7.0](https://github.com/nrkno/tv-automation-server-core/compare/v0.6.0...v0.7.0) (2018-08-27) ### Bug Fixes -* **infinite items:** removes infinite icon from outOnNextSegment ([4a75d7d](https://github.com/nrkno/tv-automation-server-core/commit/4a75d7d)) -* bugfix: executeFunction didn't really time out ([acba08c](https://github.com/nrkno/tv-automation-server-core/commit/acba08c)) -* refactored/DRYd adminMode & studioMode, disabled trashbin-button for externalMessages when not in adminMode ([b29dae1](https://github.com/nrkno/tv-automation-server-core/commit/b29dae1)) -* snapshots ([182c221](https://github.com/nrkno/tv-automation-server-core/commit/182c221)) - +- **infinite items:** removes infinite icon from outOnNextSegment ([4a75d7d](https://github.com/nrkno/tv-automation-server-core/commit/4a75d7d)) +- bugfix: executeFunction didn't really time out ([acba08c](https://github.com/nrkno/tv-automation-server-core/commit/acba08c)) +- refactored/DRYd adminMode & studioMode, disabled trashbin-button for externalMessages when not in adminMode ([b29dae1](https://github.com/nrkno/tv-automation-server-core/commit/b29dae1)) +- snapshots ([182c221](https://github.com/nrkno/tv-automation-server-core/commit/182c221)) ### Features -* place all collections in Collections object, for debugging purposes ([9682a89](https://github.com/nrkno/tv-automation-server-core/commit/9682a89)) -* System snapshot ([006027b](https://github.com/nrkno/tv-automation-server-core/commit/006027b)) - - +- place all collections in Collections object, for debugging purposes ([9682a89](https://github.com/nrkno/tv-automation-server-core/commit/9682a89)) +- System snapshot ([006027b](https://github.com/nrkno/tv-automation-server-core/commit/006027b)) -# [0.6.0](https://github.com/nrkno/tv-automation-server-core/compare/v0.5.3...v0.6.0) (2018-08-23) +# [0.6.0](https://github.com/nrkno/tv-automation-server-core/compare/v0.5.3...v0.6.0) (2018-08-23) ### Bug Fixes -* added MomentFromNow, to use instead of ([aefea31](https://github.com/nrkno/tv-automation-server-core/commit/aefea31)) -* added peripheralDevices subscription, used by status display ([ccb309d](https://github.com/nrkno/tv-automation-server-core/commit/ccb309d)) -* added virtual lines to the generated function, so that line numbers add up in error messages ([df2366a](https://github.com/nrkno/tv-automation-server-core/commit/df2366a)) -* adlib items conflict with programmed content ([a304238](https://github.com/nrkno/tv-automation-server-core/commit/a304238)) -* apning with no heads ([dfb1976](https://github.com/nrkno/tv-automation-server-core/commit/dfb1976)) -* apparently componentwillmount is running in a reactive context and causes issues ([a8e53b6](https://github.com/nrkno/tv-automation-server-core/commit/a8e53b6)) -* broken settings page ([1e99ff7](https://github.com/nrkno/tv-automation-server-core/commit/1e99ff7)) -* bug that caused unhandledPromiseRejection. Also added logging of result of user action ([e799277](https://github.com/nrkno/tv-automation-server-core/commit/e799277)) -* dev debug data function ([e4570e2](https://github.com/nrkno/tv-automation-server-core/commit/e4570e2)) -* do not error CountdownItemLabel when sourceLayer is not found ([9451d1c](https://github.com/nrkno/tv-automation-server-core/commit/9451d1c)) -* don't wait for subscriptions before rendering ([2bbfa20](https://github.com/nrkno/tv-automation-server-core/commit/2bbfa20)) -* Ensure lookahead ids are always unique ([26f6637](https://github.com/nrkno/tv-automation-server-core/commit/26f6637)) -* error when content.boxSourceConfiguration is undefined ([fc7ec40](https://github.com/nrkno/tv-automation-server-core/commit/fc7ec40)) -* error when content.boxSourceConfiguration is undefined ([81c896b](https://github.com/nrkno/tv-automation-server-core/commit/81c896b)) -* externalMessage: priority of messages to send ([cffcd97](https://github.com/nrkno/tv-automation-server-core/commit/cffcd97)) -* externalMessages upd ([a803882](https://github.com/nrkno/tv-automation-server-core/commit/a803882)) -* filter on json files on restore backup file selector ([1a0b867](https://github.com/nrkno/tv-automation-server-core/commit/1a0b867)) -* Fix context.runHelper not working in templates. ([36ca5f3](https://github.com/nrkno/tv-automation-server-core/commit/36ca5f3)) -* generate statObject per device ([82a0736](https://github.com/nrkno/tv-automation-server-core/commit/82a0736)) -* HOLD add new llayer to initDB ([650b6e6](https://github.com/nrkno/tv-automation-server-core/commit/650b6e6)) -* Improve missing mosId error message ([89695fb](https://github.com/nrkno/tv-automation-server-core/commit/89695fb)) -* **countdowns:** ignore sourceLayers that we don't have an icon for ([27b2ac0](https://github.com/nrkno/tv-automation-server-core/commit/27b2ac0)) -* **FirstObjects:** Reverts regression introduced by removing isAbstract from firstObject items ([8f1608b](https://github.com/nrkno/tv-automation-server-core/commit/8f1608b)) -* **hold:** keep showing any infinite items that existed on the previous sl ([21a9973](https://github.com/nrkno/tv-automation-server-core/commit/21a9973)) -* **init:** hides klokke and logo layers by default ([1847ca4](https://github.com/nrkno/tv-automation-server-core/commit/1847ca4)) -* **init:** Layer names ([16a504c](https://github.com/nrkno/tv-automation-server-core/commit/16a504c)) -* **init:** Layer names ([221b374](https://github.com/nrkno/tv-automation-server-core/commit/221b374)) -* **init:** swaps MP2 and MP1NXT layers ([b8a370c](https://github.com/nrkno/tv-automation-server-core/commit/b8a370c)) -* **Initdb:** Preload vignett ([9470318](https://github.com/nrkno/tv-automation-server-core/commit/9470318)) -* **Initdb:** Preload vignett ([156a454](https://github.com/nrkno/tv-automation-server-core/commit/156a454)) -* miss in merge ([93106b1](https://github.com/nrkno/tv-automation-server-core/commit/93106b1)) -* **lookahead:** consider transitions properly in lookahead ([c78c6fa](https://github.com/nrkno/tv-automation-server-core/commit/c78c6fa)) -* **presenter screen:** display hours correctly ([e242a9e](https://github.com/nrkno/tv-automation-server-core/commit/e242a9e)) -* **vignett:** do not preload vignett, as it is risky business preloading sluttvignett. Could be done better by separating vignett and sluttvignett ([8bf7ff8](https://github.com/nrkno/tv-automation-server-core/commit/8bf7ff8)) -* Infinite items dont stop against a absolute 0 item properly. ([78c1499](https://github.com/nrkno/tv-automation-server-core/commit/78c1499)) -* init state properly ([2572cdc](https://github.com/nrkno/tv-automation-server-core/commit/2572cdc)) -* limit db fetches to active running order ([f3aca8f](https://github.com/nrkno/tv-automation-server-core/commit/f3aca8f)) -* lookahead object id not being set correctly ([594a1e7](https://github.com/nrkno/tv-automation-server-core/commit/594a1e7)) -* mediaobjects to use computed field ([dba858f](https://github.com/nrkno/tv-automation-server-core/commit/dba858f)) -* mediaobjects to use computed field ([39d13b5](https://github.com/nrkno/tv-automation-server-core/commit/39d13b5)) -* playout, lookahead: use the originalLayer instear of isAbstract ([30fe842](https://github.com/nrkno/tv-automation-server-core/commit/30fe842)) -* refactored execMethod, so it doesn't use promises and causes unhandled promise rejections ([24da71b](https://github.com/nrkno/tv-automation-server-core/commit/24da71b)) -* remove deprecated options ([ab7275b](https://github.com/nrkno/tv-automation-server-core/commit/ab7275b)) -* remove some console.logs ([a9f3f53](https://github.com/nrkno/tv-automation-server-core/commit/a9f3f53)) -* removed old, deprecated attr ([bf0cdfd](https://github.com/nrkno/tv-automation-server-core/commit/bf0cdfd)) -* removed uploadFileToAtem function, this should be done in devicesMakeReady ([4e96bb3](https://github.com/nrkno/tv-automation-server-core/commit/4e96bb3)) -* Removing trailing slashes in url defaults ([f6fa32c](https://github.com/nrkno/tv-automation-server-core/commit/f6fa32c)) -* Revert 594a1e7 ([edeb166](https://github.com/nrkno/tv-automation-server-core/commit/edeb166)) -* subscription handling ([8aaa3ec](https://github.com/nrkno/tv-automation-server-core/commit/8aaa3ec)) -* text shadow in SegmentLineLabels ([3a310b1](https://github.com/nrkno/tv-automation-server-core/commit/3a310b1)) -* timeline statObject: updated hashing function ([e00a01c](https://github.com/nrkno/tv-automation-server-core/commit/e00a01c)) -* tweaks on externalMessage send function, limiting the number of messages sent in one go ([046ae38](https://github.com/nrkno/tv-automation-server-core/commit/046ae38)) -* UI tweaks for messages status view. so it doesn't break when having long error messages ([ca1e3ae](https://github.com/nrkno/tv-automation-server-core/commit/ca1e3ae)) -* update ro data cache when getting new metadata ([d700783](https://github.com/nrkno/tv-automation-server-core/commit/d700783)) -* Update timeline on removing a mos story ([fd3d443](https://github.com/nrkno/tv-automation-server-core/commit/fd3d443)) -* Update TimelineObjCCGRoute. ([203ef91](https://github.com/nrkno/tv-automation-server-core/commit/203ef91)) -* updated mock data ([a7a4ae5](https://github.com/nrkno/tv-automation-server-core/commit/a7a4ae5)) -* updated mock data ([3e140c6](https://github.com/nrkno/tv-automation-server-core/commit/3e140c6)) -* when overriding componentWillUnmount, we need to call this._cleanup() ([0f39cd4](https://github.com/nrkno/tv-automation-server-core/commit/0f39cd4)) -* **vignett:** do not preload vignett, as it is risky business preloading sluttvignett. Could be done better by separating vignett and sluttvignett ([b0da067](https://github.com/nrkno/tv-automation-server-core/commit/b0da067)) -* **zoom:** moved zoom modifier for scroll action to ctrl ([863d81e](https://github.com/nrkno/tv-automation-server-core/commit/863d81e)) -* **zoom:** moved zoom modifier for scroll action to ctrl ([80829f2](https://github.com/nrkno/tv-automation-server-core/commit/80829f2)) - +- added MomentFromNow, to use instead of ([aefea31](https://github.com/nrkno/tv-automation-server-core/commit/aefea31)) +- added peripheralDevices subscription, used by status display ([ccb309d](https://github.com/nrkno/tv-automation-server-core/commit/ccb309d)) +- added virtual lines to the generated function, so that line numbers add up in error messages ([df2366a](https://github.com/nrkno/tv-automation-server-core/commit/df2366a)) +- adlib items conflict with programmed content ([a304238](https://github.com/nrkno/tv-automation-server-core/commit/a304238)) +- apning with no heads ([dfb1976](https://github.com/nrkno/tv-automation-server-core/commit/dfb1976)) +- apparently componentwillmount is running in a reactive context and causes issues ([a8e53b6](https://github.com/nrkno/tv-automation-server-core/commit/a8e53b6)) +- broken settings page ([1e99ff7](https://github.com/nrkno/tv-automation-server-core/commit/1e99ff7)) +- bug that caused unhandledPromiseRejection. Also added logging of result of user action ([e799277](https://github.com/nrkno/tv-automation-server-core/commit/e799277)) +- dev debug data function ([e4570e2](https://github.com/nrkno/tv-automation-server-core/commit/e4570e2)) +- do not error CountdownItemLabel when sourceLayer is not found ([9451d1c](https://github.com/nrkno/tv-automation-server-core/commit/9451d1c)) +- don't wait for subscriptions before rendering ([2bbfa20](https://github.com/nrkno/tv-automation-server-core/commit/2bbfa20)) +- Ensure lookahead ids are always unique ([26f6637](https://github.com/nrkno/tv-automation-server-core/commit/26f6637)) +- error when content.boxSourceConfiguration is undefined ([fc7ec40](https://github.com/nrkno/tv-automation-server-core/commit/fc7ec40)) +- error when content.boxSourceConfiguration is undefined ([81c896b](https://github.com/nrkno/tv-automation-server-core/commit/81c896b)) +- externalMessage: priority of messages to send ([cffcd97](https://github.com/nrkno/tv-automation-server-core/commit/cffcd97)) +- externalMessages upd ([a803882](https://github.com/nrkno/tv-automation-server-core/commit/a803882)) +- filter on json files on restore backup file selector ([1a0b867](https://github.com/nrkno/tv-automation-server-core/commit/1a0b867)) +- Fix context.runHelper not working in templates. ([36ca5f3](https://github.com/nrkno/tv-automation-server-core/commit/36ca5f3)) +- generate statObject per device ([82a0736](https://github.com/nrkno/tv-automation-server-core/commit/82a0736)) +- HOLD add new llayer to initDB ([650b6e6](https://github.com/nrkno/tv-automation-server-core/commit/650b6e6)) +- Improve missing mosId error message ([89695fb](https://github.com/nrkno/tv-automation-server-core/commit/89695fb)) +- **countdowns:** ignore sourceLayers that we don't have an icon for ([27b2ac0](https://github.com/nrkno/tv-automation-server-core/commit/27b2ac0)) +- **FirstObjects:** Reverts regression introduced by removing isAbstract from firstObject items ([8f1608b](https://github.com/nrkno/tv-automation-server-core/commit/8f1608b)) +- **hold:** keep showing any infinite items that existed on the previous sl ([21a9973](https://github.com/nrkno/tv-automation-server-core/commit/21a9973)) +- **init:** hides klokke and logo layers by default ([1847ca4](https://github.com/nrkno/tv-automation-server-core/commit/1847ca4)) +- **init:** Layer names ([16a504c](https://github.com/nrkno/tv-automation-server-core/commit/16a504c)) +- **init:** Layer names ([221b374](https://github.com/nrkno/tv-automation-server-core/commit/221b374)) +- **init:** swaps MP2 and MP1NXT layers ([b8a370c](https://github.com/nrkno/tv-automation-server-core/commit/b8a370c)) +- **Initdb:** Preload vignett ([9470318](https://github.com/nrkno/tv-automation-server-core/commit/9470318)) +- **Initdb:** Preload vignett ([156a454](https://github.com/nrkno/tv-automation-server-core/commit/156a454)) +- miss in merge ([93106b1](https://github.com/nrkno/tv-automation-server-core/commit/93106b1)) +- **lookahead:** consider transitions properly in lookahead ([c78c6fa](https://github.com/nrkno/tv-automation-server-core/commit/c78c6fa)) +- **presenter screen:** display hours correctly ([e242a9e](https://github.com/nrkno/tv-automation-server-core/commit/e242a9e)) +- **vignett:** do not preload vignett, as it is risky business preloading sluttvignett. Could be done better by separating vignett and sluttvignett ([8bf7ff8](https://github.com/nrkno/tv-automation-server-core/commit/8bf7ff8)) +- Infinite items dont stop against a absolute 0 item properly. ([78c1499](https://github.com/nrkno/tv-automation-server-core/commit/78c1499)) +- init state properly ([2572cdc](https://github.com/nrkno/tv-automation-server-core/commit/2572cdc)) +- limit db fetches to active running order ([f3aca8f](https://github.com/nrkno/tv-automation-server-core/commit/f3aca8f)) +- lookahead object id not being set correctly ([594a1e7](https://github.com/nrkno/tv-automation-server-core/commit/594a1e7)) +- mediaobjects to use computed field ([dba858f](https://github.com/nrkno/tv-automation-server-core/commit/dba858f)) +- mediaobjects to use computed field ([39d13b5](https://github.com/nrkno/tv-automation-server-core/commit/39d13b5)) +- playout, lookahead: use the originalLayer instear of isAbstract ([30fe842](https://github.com/nrkno/tv-automation-server-core/commit/30fe842)) +- refactored execMethod, so it doesn't use promises and causes unhandled promise rejections ([24da71b](https://github.com/nrkno/tv-automation-server-core/commit/24da71b)) +- remove deprecated options ([ab7275b](https://github.com/nrkno/tv-automation-server-core/commit/ab7275b)) +- remove some console.logs ([a9f3f53](https://github.com/nrkno/tv-automation-server-core/commit/a9f3f53)) +- removed old, deprecated attr ([bf0cdfd](https://github.com/nrkno/tv-automation-server-core/commit/bf0cdfd)) +- removed uploadFileToAtem function, this should be done in devicesMakeReady ([4e96bb3](https://github.com/nrkno/tv-automation-server-core/commit/4e96bb3)) +- Removing trailing slashes in url defaults ([f6fa32c](https://github.com/nrkno/tv-automation-server-core/commit/f6fa32c)) +- Revert 594a1e7 ([edeb166](https://github.com/nrkno/tv-automation-server-core/commit/edeb166)) +- subscription handling ([8aaa3ec](https://github.com/nrkno/tv-automation-server-core/commit/8aaa3ec)) +- text shadow in SegmentLineLabels ([3a310b1](https://github.com/nrkno/tv-automation-server-core/commit/3a310b1)) +- timeline statObject: updated hashing function ([e00a01c](https://github.com/nrkno/tv-automation-server-core/commit/e00a01c)) +- tweaks on externalMessage send function, limiting the number of messages sent in one go ([046ae38](https://github.com/nrkno/tv-automation-server-core/commit/046ae38)) +- UI tweaks for messages status view. so it doesn't break when having long error messages ([ca1e3ae](https://github.com/nrkno/tv-automation-server-core/commit/ca1e3ae)) +- update ro data cache when getting new metadata ([d700783](https://github.com/nrkno/tv-automation-server-core/commit/d700783)) +- Update timeline on removing a mos story ([fd3d443](https://github.com/nrkno/tv-automation-server-core/commit/fd3d443)) +- Update TimelineObjCCGRoute. ([203ef91](https://github.com/nrkno/tv-automation-server-core/commit/203ef91)) +- updated mock data ([a7a4ae5](https://github.com/nrkno/tv-automation-server-core/commit/a7a4ae5)) +- updated mock data ([3e140c6](https://github.com/nrkno/tv-automation-server-core/commit/3e140c6)) +- when overriding componentWillUnmount, we need to call this.\_cleanup() ([0f39cd4](https://github.com/nrkno/tv-automation-server-core/commit/0f39cd4)) +- **vignett:** do not preload vignett, as it is risky business preloading sluttvignett. Could be done better by separating vignett and sluttvignett ([b0da067](https://github.com/nrkno/tv-automation-server-core/commit/b0da067)) +- **zoom:** moved zoom modifier for scroll action to ctrl ([863d81e](https://github.com/nrkno/tv-automation-server-core/commit/863d81e)) +- **zoom:** moved zoom modifier for scroll action to ctrl ([80829f2](https://github.com/nrkno/tv-automation-server-core/commit/80829f2)) ### Features -* added .timings object to SegmentLine, to track take/playout times during playout ([5d860b3](https://github.com/nrkno/tv-automation-server-core/commit/5d860b3)) -* added getAllSegments, to use in metadata-template ([f8a5514](https://github.com/nrkno/tv-automation-server-core/commit/f8a5514)) -* added some shadow to the status dots ([04df33c](https://github.com/nrkno/tv-automation-server-core/commit/04df33c)) -* added timestamp to externalMessage error ([e13d1d8](https://github.com/nrkno/tv-automation-server-core/commit/e13d1d8)) -* added timings property to adlig segmentLineItems ([b333bf1](https://github.com/nrkno/tv-automation-server-core/commit/b333bf1)) -* Atem SuperSource properties support ([2688142](https://github.com/nrkno/tv-automation-server-core/commit/2688142)) -* converted more subscriptions (WIP) ([e047fef](https://github.com/nrkno/tv-automation-server-core/commit/e047fef)) -* converted StudioInstallation into a class, adding getConfigValue as member method, a step towards DRY ([4af278e](https://github.com/nrkno/tv-automation-server-core/commit/4af278e)) -* ensure each sli has a mosId set ([57c977d](https://github.com/nrkno/tv-automation-server-core/commit/57c977d)) -* externalMessage: allow for multiple messages to be generated at the same time ([284efbe](https://github.com/nrkno/tv-automation-server-core/commit/284efbe)) -* HOLD mode ([e41c5a4](https://github.com/nrkno/tv-automation-server-core/commit/e41c5a4)) -* HOLD mode ([ae1dacf](https://github.com/nrkno/tv-automation-server-core/commit/ae1dacf)) -* if template 'getId' returns null, don't throw an error. Also when templateId is not found, send warning instead of an error ([d98f09d](https://github.com/nrkno/tv-automation-server-core/commit/d98f09d)) -* **init:** adds studio monitor html player to casparcg ([6533b0f](https://github.com/nrkno/tv-automation-server-core/commit/6533b0f)) -* implemented partial timeline fix ([c8b56e4](https://github.com/nrkno/tv-automation-server-core/commit/c8b56e4)) -* implemented stricter typing & changed classes to ReactMeteorComponent where applicable ([9d2166e](https://github.com/nrkno/tv-automation-server-core/commit/9d2166e)) -* improved layout for presenter countdowns ([2bd61cc](https://github.com/nrkno/tv-automation-server-core/commit/2bd61cc)) -* load atem ssrc background when activating RO ([0eda9b4](https://github.com/nrkno/tv-automation-server-core/commit/0eda9b4)) -* lookahead ([5ed0f13](https://github.com/nrkno/tv-automation-server-core/commit/5ed0f13)) -* **AUX:** adds clock aux ([45479da](https://github.com/nrkno/tv-automation-server-core/commit/45479da)) -* **AUXes:** New AUX-mapping introducing more previews and moves the cleanfeed ([548bd8c](https://github.com/nrkno/tv-automation-server-core/commit/548bd8c)) -* refactor of subscriptions (WIP) ([2b6f994](https://github.com/nrkno/tv-automation-server-core/commit/2b6f994)) -* **init:** adds multiple bak source layers ([c812510](https://github.com/nrkno/tv-automation-server-core/commit/c812510)) -* **init:** Adds RM 4,5,6 ([0021d7b](https://github.com/nrkno/tv-automation-server-core/commit/0021d7b)) -* **init:** Adds RM 4,5,6 ([dd59d47](https://github.com/nrkno/tv-automation-server-core/commit/dd59d47)) -* **init:** moves countdown to casparcg machine 2, channel 1 ([18c354b](https://github.com/nrkno/tv-automation-server-core/commit/18c354b)) -* **init:** moves countdown to casparcg machine 2, channel 1 ([6c93464](https://github.com/nrkno/tv-automation-server-core/commit/6c93464)) -* MeteorReactComponent: return subscription & computation handle ([e20e6de](https://github.com/nrkno/tv-automation-server-core/commit/e20e6de)) -* method "ping" to be called by devices every now and then, to update lastSeen ([41a996c](https://github.com/nrkno/tv-automation-server-core/commit/41a996c)) -* Move sofie and metadata urls from templates to config ([af8e388](https://github.com/nrkno/tv-automation-server-core/commit/af8e388)) -* refactored initDB into 2 separate methods, so we can easilly update just the layers and not the infrastructure ([d4fcc3f](https://github.com/nrkno/tv-automation-server-core/commit/d4fcc3f)) -* restart CasparCG from UI ([64509c3](https://github.com/nrkno/tv-automation-server-core/commit/64509c3)) -* templates: added format functions for timecode ([ea38081](https://github.com/nrkno/tv-automation-server-core/commit/ea38081)) -* Update timeline and infinite items on enps update ([db0c041](https://github.com/nrkno/tv-automation-server-core/commit/db0c041)) -* updated timeline dependency ([6ef9eb7](https://github.com/nrkno/tv-automation-server-core/commit/6ef9eb7)) - - +- added .timings object to SegmentLine, to track take/playout times during playout ([5d860b3](https://github.com/nrkno/tv-automation-server-core/commit/5d860b3)) +- added getAllSegments, to use in metadata-template ([f8a5514](https://github.com/nrkno/tv-automation-server-core/commit/f8a5514)) +- added some shadow to the status dots ([04df33c](https://github.com/nrkno/tv-automation-server-core/commit/04df33c)) +- added timestamp to externalMessage error ([e13d1d8](https://github.com/nrkno/tv-automation-server-core/commit/e13d1d8)) +- added timings property to adlig segmentLineItems ([b333bf1](https://github.com/nrkno/tv-automation-server-core/commit/b333bf1)) +- Atem SuperSource properties support ([2688142](https://github.com/nrkno/tv-automation-server-core/commit/2688142)) +- converted more subscriptions (WIP) ([e047fef](https://github.com/nrkno/tv-automation-server-core/commit/e047fef)) +- converted StudioInstallation into a class, adding getConfigValue as member method, a step towards DRY ([4af278e](https://github.com/nrkno/tv-automation-server-core/commit/4af278e)) +- ensure each sli has a mosId set ([57c977d](https://github.com/nrkno/tv-automation-server-core/commit/57c977d)) +- externalMessage: allow for multiple messages to be generated at the same time ([284efbe](https://github.com/nrkno/tv-automation-server-core/commit/284efbe)) +- HOLD mode ([e41c5a4](https://github.com/nrkno/tv-automation-server-core/commit/e41c5a4)) +- HOLD mode ([ae1dacf](https://github.com/nrkno/tv-automation-server-core/commit/ae1dacf)) +- if template 'getId' returns null, don't throw an error. Also when templateId is not found, send warning instead of an error ([d98f09d](https://github.com/nrkno/tv-automation-server-core/commit/d98f09d)) +- **init:** adds studio monitor html player to casparcg ([6533b0f](https://github.com/nrkno/tv-automation-server-core/commit/6533b0f)) +- implemented partial timeline fix ([c8b56e4](https://github.com/nrkno/tv-automation-server-core/commit/c8b56e4)) +- implemented stricter typing & changed classes to ReactMeteorComponent where applicable ([9d2166e](https://github.com/nrkno/tv-automation-server-core/commit/9d2166e)) +- improved layout for presenter countdowns ([2bd61cc](https://github.com/nrkno/tv-automation-server-core/commit/2bd61cc)) +- load atem ssrc background when activating RO ([0eda9b4](https://github.com/nrkno/tv-automation-server-core/commit/0eda9b4)) +- lookahead ([5ed0f13](https://github.com/nrkno/tv-automation-server-core/commit/5ed0f13)) +- **AUX:** adds clock aux ([45479da](https://github.com/nrkno/tv-automation-server-core/commit/45479da)) +- **AUXes:** New AUX-mapping introducing more previews and moves the cleanfeed ([548bd8c](https://github.com/nrkno/tv-automation-server-core/commit/548bd8c)) +- refactor of subscriptions (WIP) ([2b6f994](https://github.com/nrkno/tv-automation-server-core/commit/2b6f994)) +- **init:** adds multiple bak source layers ([c812510](https://github.com/nrkno/tv-automation-server-core/commit/c812510)) +- **init:** Adds RM 4,5,6 ([0021d7b](https://github.com/nrkno/tv-automation-server-core/commit/0021d7b)) +- **init:** Adds RM 4,5,6 ([dd59d47](https://github.com/nrkno/tv-automation-server-core/commit/dd59d47)) +- **init:** moves countdown to casparcg machine 2, channel 1 ([18c354b](https://github.com/nrkno/tv-automation-server-core/commit/18c354b)) +- **init:** moves countdown to casparcg machine 2, channel 1 ([6c93464](https://github.com/nrkno/tv-automation-server-core/commit/6c93464)) +- MeteorReactComponent: return subscription & computation handle ([e20e6de](https://github.com/nrkno/tv-automation-server-core/commit/e20e6de)) +- method "ping" to be called by devices every now and then, to update lastSeen ([41a996c](https://github.com/nrkno/tv-automation-server-core/commit/41a996c)) +- Move sofie and metadata urls from templates to config ([af8e388](https://github.com/nrkno/tv-automation-server-core/commit/af8e388)) +- refactored initDB into 2 separate methods, so we can easilly update just the layers and not the infrastructure ([d4fcc3f](https://github.com/nrkno/tv-automation-server-core/commit/d4fcc3f)) +- restart CasparCG from UI ([64509c3](https://github.com/nrkno/tv-automation-server-core/commit/64509c3)) +- templates: added format functions for timecode ([ea38081](https://github.com/nrkno/tv-automation-server-core/commit/ea38081)) +- Update timeline and infinite items on enps update ([db0c041](https://github.com/nrkno/tv-automation-server-core/commit/db0c041)) +- updated timeline dependency ([6ef9eb7](https://github.com/nrkno/tv-automation-server-core/commit/6ef9eb7)) -## [0.5.3](https://github.com/nrkno/tv-automation-server-core/compare/v0.5.2...v0.5.3) (2018-08-05) - +## [0.5.3](https://github.com/nrkno/tv-automation-server-core/compare/v0.5.2...v0.5.3) (2018-08-05) -## [0.5.2](https://github.com/nrkno/tv-automation-server-core/compare/v0.5.1...v0.5.2) (2018-08-02) - +## [0.5.2](https://github.com/nrkno/tv-automation-server-core/compare/v0.5.1...v0.5.2) (2018-08-02) -## [0.5.1](https://github.com/nrkno/tv-automation-server-core/compare/v0.5.0...v0.5.1) (2018-08-02) +## [0.5.1](https://github.com/nrkno/tv-automation-server-core/compare/v0.5.0...v0.5.1) (2018-08-02) ### Bug Fixes -* **Test:** Verifying build and deploy script ([0b13e18](https://github.com/nrkno/tv-automation-server-core/commit/0b13e18)) - - +- **Test:** Verifying build and deploy script ([0b13e18](https://github.com/nrkno/tv-automation-server-core/commit/0b13e18)) -# [0.5.0](https://github.com/nrkno/tv-automation-server-core/compare/v0.4.3...v0.5.0) (2018-08-02) +# [0.5.0](https://github.com/nrkno/tv-automation-server-core/compare/v0.4.3...v0.5.0) (2018-08-02) ### Bug Fixes -* added missing debug-logging setting ([8f616ca](https://github.com/nrkno/tv-automation-server-core/commit/8f616ca)) -* minor ui fix on status page ([97fc3c2](https://github.com/nrkno/tv-automation-server-core/commit/97fc3c2)) -* relative durations causing type warnings for ui code ([5249435](https://github.com/nrkno/tv-automation-server-core/commit/5249435)) -* update supertimeline ([28bccfe](https://github.com/nrkno/tv-automation-server-core/commit/28bccfe)) - +- added missing debug-logging setting ([8f616ca](https://github.com/nrkno/tv-automation-server-core/commit/8f616ca)) +- minor ui fix on status page ([97fc3c2](https://github.com/nrkno/tv-automation-server-core/commit/97fc3c2)) +- relative durations causing type warnings for ui code ([5249435](https://github.com/nrkno/tv-automation-server-core/commit/5249435)) +- update supertimeline ([28bccfe](https://github.com/nrkno/tv-automation-server-core/commit/28bccfe)) ### Features -* added device version to status page ([ed0acda](https://github.com/nrkno/tv-automation-server-core/commit/ed0acda)) -* cron job for restarting casparcg ([19898d1](https://github.com/nrkno/tv-automation-server-core/commit/19898d1)) -* media scanner & casparcg launcher hostnames ([02ec8be](https://github.com/nrkno/tv-automation-server-core/commit/02ec8be)) -* refactor to use relative durations. affects infinite segmentlineitems, autonext, segmentline overlapduration property ([67c5444](https://github.com/nrkno/tv-automation-server-core/commit/67c5444)) - - +- added device version to status page ([ed0acda](https://github.com/nrkno/tv-automation-server-core/commit/ed0acda)) +- cron job for restarting casparcg ([19898d1](https://github.com/nrkno/tv-automation-server-core/commit/19898d1)) +- media scanner & casparcg launcher hostnames ([02ec8be](https://github.com/nrkno/tv-automation-server-core/commit/02ec8be)) +- refactor to use relative durations. affects infinite segmentlineitems, autonext, segmentline overlapduration property ([67c5444](https://github.com/nrkno/tv-automation-server-core/commit/67c5444)) -## [0.4.3](https://github.com/nrkno/tv-automation-server-core/compare/v0.4.1...v0.4.3) (2018-08-01) - +## [0.4.3](https://github.com/nrkno/tv-automation-server-core/compare/v0.4.1...v0.4.3) (2018-08-01) -## [0.4.2](https://github.com/nrkno/tv-automation-server-core/compare/v0.4.0...v0.4.2) (2018-08-01) - +## [0.4.2](https://github.com/nrkno/tv-automation-server-core/compare/v0.4.0...v0.4.2) (2018-08-01) -## [0.4.1](https://github.com/nrkno/tv-automation-server-core/compare/v0.4.0...v0.4.1) (2018-08-01) - +## [0.4.1](https://github.com/nrkno/tv-automation-server-core/compare/v0.4.0...v0.4.1) (2018-08-01) -# 0.4.0 (2018-08-01) +# 0.4.0 (2018-08-01) ### Bug Fixes -* Add missing layers to initdb. Use readtime as possible duration of segmentline when calculating story length ([e388d63](https://github.com/nrkno/tv-automation-server-core/commit/e388d63)) -* added sorting of runtimeFunctions when generating backup, so diffing works ([17639a0](https://github.com/nrkno/tv-automation-server-core/commit/17639a0)) -* added sorting of runtimeFunctions when generating backup, so diffing works ([b3ba3f6](https://github.com/nrkno/tv-automation-server-core/commit/b3ba3f6)) -* allow timelineobjs to be declared as abstract, and always route those with the core_abstract layer ([9bfa6c4](https://github.com/nrkno/tv-automation-server-core/commit/9bfa6c4)) -* atem mappings ([8d4ea2d](https://github.com/nrkno/tv-automation-server-core/commit/8d4ea2d)) -* autoNext should update yellow line (it didn't) ([ff42a81](https://github.com/nrkno/tv-automation-server-core/commit/ff42a81)) -* baselineTemplates not being calculated correctly for showstyle ([e4799b4](https://github.com/nrkno/tv-automation-server-core/commit/e4799b4)) -* bind keydown for any keyup events to prevent their default behaviour ([83e42e4](https://github.com/nrkno/tv-automation-server-core/commit/83e42e4)) -* change lawo enum & interface ([3959761](https://github.com/nrkno/tv-automation-server-core/commit/3959761)) -* changed backup sorting to use templateId instead of _id ([d7047a5](https://github.com/nrkno/tv-automation-server-core/commit/d7047a5)) -* changed default chortcuts ([ba33bb7](https://github.com/nrkno/tv-automation-server-core/commit/ba33bb7)) -* changed header colors ([b9efc61](https://github.com/nrkno/tv-automation-server-core/commit/b9efc61)) -* changes attr. paths in lawo source objs ([55f8c7b](https://github.com/nrkno/tv-automation-server-core/commit/55f8c7b)) -* changes lawo mapping with the effects change ([dbe58fe](https://github.com/nrkno/tv-automation-server-core/commit/dbe58fe)) -* corrects the default baseline template ([bf4eb03](https://github.com/nrkno/tv-automation-server-core/commit/bf4eb03)) -* Ctrl-S in template editor triggers a save ([bacbc3e](https://github.com/nrkno/tv-automation-server-core/commit/bacbc3e)) -* device is first created as Abstract ([98dca79](https://github.com/nrkno/tv-automation-server-core/commit/98dca79)) -* dont set nora_* config values in initDB ([1330008](https://github.com/nrkno/tv-automation-server-core/commit/1330008)) -* Editattribute type typing ([392f4aa](https://github.com/nrkno/tv-automation-server-core/commit/392f4aa)) -* Editattribute type typing ([1206d0c](https://github.com/nrkno/tv-automation-server-core/commit/1206d0c)) -* Guard against there being no next segmentline ([849d97f](https://github.com/nrkno/tv-automation-server-core/commit/849d97f)) -* head mute audio and hold on last frame ([ceec7f6](https://github.com/nrkno/tv-automation-server-core/commit/ceec7f6)) -* incorrect typings for template editor ([9d021df](https://github.com/nrkno/tv-automation-server-core/commit/9d021df)) -* Increase size of template editor to make it better fill the screen ([3212d7b](https://github.com/nrkno/tv-automation-server-core/commit/3212d7b)) -* infinite segment line tidying and fixes ([8469ffb](https://github.com/nrkno/tv-automation-server-core/commit/8469ffb)) -* infinite segmentlines crossing an autonext throwing a duplicate key exception ([93b2a30](https://github.com/nrkno/tv-automation-server-core/commit/93b2a30)) -* keys should be handled at up, not down ([957f583](https://github.com/nrkno/tv-automation-server-core/commit/957f583)) -* made editor height dynamic ([c68ac4f](https://github.com/nrkno/tv-automation-server-core/commit/c68ac4f)) -* made editor height dynamic ([7f5f40e](https://github.com/nrkno/tv-automation-server-core/commit/7f5f40e)) -* Make the head to kam wipe not use the mosartVariant field. Correct the head order checking ([6030755](https://github.com/nrkno/tv-automation-server-core/commit/6030755)) -* new lawo source mappings ([20f7d5a](https://github.com/nrkno/tv-automation-server-core/commit/20f7d5a)) -* on startup, clear old connection statuses ([e9d7cba](https://github.com/nrkno/tv-automation-server-core/commit/e9d7cba)) -* Persist SegmentLine.updateStoryStatus ([427b24c](https://github.com/nrkno/tv-automation-server-core/commit/427b24c)) -* prevent default action for f1 & f3 ([53b2f22](https://github.com/nrkno/tv-automation-server-core/commit/53b2f22)) -* re-timing vignett ([17fbced](https://github.com/nrkno/tv-automation-server-core/commit/17fbced)) -* react errors while rendering nymansPlayground ([0c245d3](https://github.com/nrkno/tv-automation-server-core/commit/0c245d3)) -* React unique keys ([4f728d9](https://github.com/nrkno/tv-automation-server-core/commit/4f728d9)) -* removed autopublish and insecure packages, we'll implement publications and allow/deny rules from now on ([213998d](https://github.com/nrkno/tv-automation-server-core/commit/213998d)) -* removed ntp server debug code ([b9857e7](https://github.com/nrkno/tv-automation-server-core/commit/b9857e7)) -* Respect disableOutTransition on SegmentLine during manual takes (not just autonext) ([f19788d](https://github.com/nrkno/tv-automation-server-core/commit/f19788d)) -* Rundown name dissappearing from view ([91dcc21](https://github.com/nrkno/tv-automation-server-core/commit/91dcc21)) -* Set KAM source layer, and a probably incorrect duration (but its now non-zero) ([6e152f0](https://github.com/nrkno/tv-automation-server-core/commit/6e152f0)) -* sl prod init ([2ff4a46](https://github.com/nrkno/tv-automation-server-core/commit/2ff4a46)) -* Start on template for KAM ÅPNING ([4cd682f](https://github.com/nrkno/tv-automation-server-core/commit/4cd682f)) -* status colors ([46fdaf1](https://github.com/nrkno/tv-automation-server-core/commit/46fdaf1)) -* StudioInstallation key-value config tidying ([4b0bc1a](https://github.com/nrkno/tv-automation-server-core/commit/4b0bc1a)) -* templates with wipe. Readd seperate audio file ([5be2802](https://github.com/nrkno/tv-automation-server-core/commit/5be2802)) -* update all data in roReplaceMetadata ([8a5a671](https://github.com/nrkno/tv-automation-server-core/commit/8a5a671)) -* Update names passed to SegmentLineItems ([ed0fc0d](https://github.com/nrkno/tv-automation-server-core/commit/ed0fc0d)) -* updated versions file ([f6c9869](https://github.com/nrkno/tv-automation-server-core/commit/f6c9869)) -* use DisplayName field for graphic elements ([e2e9014](https://github.com/nrkno/tv-automation-server-core/commit/e2e9014)) -* use unique id for baseline items cache entries ([cf89409](https://github.com/nrkno/tv-automation-server-core/commit/cf89409)) -* **emberplus:** changes intiDB mapping to new .-delimited string format ([b6d8bc7](https://github.com/nrkno/tv-automation-server-core/commit/b6d8bc7)) -* **init:** Adds default lawo device settings ([28759df](https://github.com/nrkno/tv-automation-server-core/commit/28759df)) -* **Init:** Creat empty settings for Nora ([f8d0669](https://github.com/nrkno/tv-automation-server-core/commit/f8d0669)) -* **Init:** fixes wrong mapping of Lawo RMs ([ee68432](https://github.com/nrkno/tv-automation-server-core/commit/ee68432)) -* **Init:** Sets init defaults to xpro ([fd9c182](https://github.com/nrkno/tv-automation-server-core/commit/fd9c182)) -* **lawo:** changes tempaltes to new structure ([29bf666](https://github.com/nrkno/tv-automation-server-core/commit/29bf666)) -* **lawo:** more generic timeline object ([b0418ab](https://github.com/nrkno/tv-automation-server-core/commit/b0418ab)) -* **NRK Template:** Use LLayers Enum ([84ed5df](https://github.com/nrkno/tv-automation-server-core/commit/84ed5df)) -* **template:** Caspar portion of in-transition for segmentline rerun whenever timeline was recalculated ([3373457](https://github.com/nrkno/tv-automation-server-core/commit/3373457)) -* **template:** graphic supers group using wrong trigger. ([e28d1ef](https://github.com/nrkno/tv-automation-server-core/commit/e28d1ef)) -* **template:** Reduce volume of head wipes ([b2092cc](https://github.com/nrkno/tv-automation-server-core/commit/b2092cc)) -* **template:** setup dsk properly ([2e8309c](https://github.com/nrkno/tv-automation-server-core/commit/2e8309c)) -* **templates:** Fix incorrect camera number used with head transition. Hook in sluttvignett. Fix segments not respecting overlapduration if no transition is used ([00b7cdd](https://github.com/nrkno/tv-automation-server-core/commit/00b7cdd)) -* **templates:** use enum for nora channels ([55c0cfc](https://github.com/nrkno/tv-automation-server-core/commit/55c0cfc)) -* **templates:** Various tweaks ([eb93c6a](https://github.com/nrkno/tv-automation-server-core/commit/eb93c6a)) -* **Timeline:** Corrects the angle of the gradient indication mix-in-transition on a segmentLineItem ([151ecf9](https://github.com/nrkno/tv-automation-server-core/commit/151ecf9)) -* **transition:** reverses direction of wipe transitions ([9961a3f](https://github.com/nrkno/tv-automation-server-core/commit/9961a3f)) -* wrap ntpClient.getNetworkTime() in try/catch, as an attempt to fix fatal error thrown ([cd44862](https://github.com/nrkno/tv-automation-server-core/commit/cd44862)) - +- Add missing layers to initdb. Use readtime as possible duration of segmentline when calculating story length ([e388d63](https://github.com/nrkno/tv-automation-server-core/commit/e388d63)) +- added sorting of runtimeFunctions when generating backup, so diffing works ([17639a0](https://github.com/nrkno/tv-automation-server-core/commit/17639a0)) +- added sorting of runtimeFunctions when generating backup, so diffing works ([b3ba3f6](https://github.com/nrkno/tv-automation-server-core/commit/b3ba3f6)) +- allow timelineobjs to be declared as abstract, and always route those with the core_abstract layer ([9bfa6c4](https://github.com/nrkno/tv-automation-server-core/commit/9bfa6c4)) +- atem mappings ([8d4ea2d](https://github.com/nrkno/tv-automation-server-core/commit/8d4ea2d)) +- autoNext should update yellow line (it didn't) ([ff42a81](https://github.com/nrkno/tv-automation-server-core/commit/ff42a81)) +- baselineTemplates not being calculated correctly for showstyle ([e4799b4](https://github.com/nrkno/tv-automation-server-core/commit/e4799b4)) +- bind keydown for any keyup events to prevent their default behaviour ([83e42e4](https://github.com/nrkno/tv-automation-server-core/commit/83e42e4)) +- change lawo enum & interface ([3959761](https://github.com/nrkno/tv-automation-server-core/commit/3959761)) +- changed backup sorting to use templateId instead of \_id ([d7047a5](https://github.com/nrkno/tv-automation-server-core/commit/d7047a5)) +- changed default chortcuts ([ba33bb7](https://github.com/nrkno/tv-automation-server-core/commit/ba33bb7)) +- changed header colors ([b9efc61](https://github.com/nrkno/tv-automation-server-core/commit/b9efc61)) +- changes attr. paths in lawo source objs ([55f8c7b](https://github.com/nrkno/tv-automation-server-core/commit/55f8c7b)) +- changes lawo mapping with the effects change ([dbe58fe](https://github.com/nrkno/tv-automation-server-core/commit/dbe58fe)) +- corrects the default baseline template ([bf4eb03](https://github.com/nrkno/tv-automation-server-core/commit/bf4eb03)) +- Ctrl-S in template editor triggers a save ([bacbc3e](https://github.com/nrkno/tv-automation-server-core/commit/bacbc3e)) +- device is first created as Abstract ([98dca79](https://github.com/nrkno/tv-automation-server-core/commit/98dca79)) +- dont set nora\_\* config values in initDB ([1330008](https://github.com/nrkno/tv-automation-server-core/commit/1330008)) +- Editattribute type typing ([392f4aa](https://github.com/nrkno/tv-automation-server-core/commit/392f4aa)) +- Editattribute type typing ([1206d0c](https://github.com/nrkno/tv-automation-server-core/commit/1206d0c)) +- Guard against there being no next segmentline ([849d97f](https://github.com/nrkno/tv-automation-server-core/commit/849d97f)) +- head mute audio and hold on last frame ([ceec7f6](https://github.com/nrkno/tv-automation-server-core/commit/ceec7f6)) +- incorrect typings for template editor ([9d021df](https://github.com/nrkno/tv-automation-server-core/commit/9d021df)) +- Increase size of template editor to make it better fill the screen ([3212d7b](https://github.com/nrkno/tv-automation-server-core/commit/3212d7b)) +- infinite segment line tidying and fixes ([8469ffb](https://github.com/nrkno/tv-automation-server-core/commit/8469ffb)) +- infinite segmentlines crossing an autonext throwing a duplicate key exception ([93b2a30](https://github.com/nrkno/tv-automation-server-core/commit/93b2a30)) +- keys should be handled at up, not down ([957f583](https://github.com/nrkno/tv-automation-server-core/commit/957f583)) +- made editor height dynamic ([c68ac4f](https://github.com/nrkno/tv-automation-server-core/commit/c68ac4f)) +- made editor height dynamic ([7f5f40e](https://github.com/nrkno/tv-automation-server-core/commit/7f5f40e)) +- Make the head to kam wipe not use the mosartVariant field. Correct the head order checking ([6030755](https://github.com/nrkno/tv-automation-server-core/commit/6030755)) +- new lawo source mappings ([20f7d5a](https://github.com/nrkno/tv-automation-server-core/commit/20f7d5a)) +- on startup, clear old connection statuses ([e9d7cba](https://github.com/nrkno/tv-automation-server-core/commit/e9d7cba)) +- Persist SegmentLine.updateStoryStatus ([427b24c](https://github.com/nrkno/tv-automation-server-core/commit/427b24c)) +- prevent default action for f1 & f3 ([53b2f22](https://github.com/nrkno/tv-automation-server-core/commit/53b2f22)) +- re-timing vignett ([17fbced](https://github.com/nrkno/tv-automation-server-core/commit/17fbced)) +- react errors while rendering nymansPlayground ([0c245d3](https://github.com/nrkno/tv-automation-server-core/commit/0c245d3)) +- React unique keys ([4f728d9](https://github.com/nrkno/tv-automation-server-core/commit/4f728d9)) +- removed autopublish and insecure packages, we'll implement publications and allow/deny rules from now on ([213998d](https://github.com/nrkno/tv-automation-server-core/commit/213998d)) +- removed ntp server debug code ([b9857e7](https://github.com/nrkno/tv-automation-server-core/commit/b9857e7)) +- Respect disableOutTransition on SegmentLine during manual takes (not just autonext) ([f19788d](https://github.com/nrkno/tv-automation-server-core/commit/f19788d)) +- Rundown name dissappearing from view ([91dcc21](https://github.com/nrkno/tv-automation-server-core/commit/91dcc21)) +- Set KAM source layer, and a probably incorrect duration (but its now non-zero) ([6e152f0](https://github.com/nrkno/tv-automation-server-core/commit/6e152f0)) +- sl prod init ([2ff4a46](https://github.com/nrkno/tv-automation-server-core/commit/2ff4a46)) +- Start on template for KAM ÅPNING ([4cd682f](https://github.com/nrkno/tv-automation-server-core/commit/4cd682f)) +- status colors ([46fdaf1](https://github.com/nrkno/tv-automation-server-core/commit/46fdaf1)) +- StudioInstallation key-value config tidying ([4b0bc1a](https://github.com/nrkno/tv-automation-server-core/commit/4b0bc1a)) +- templates with wipe. Readd seperate audio file ([5be2802](https://github.com/nrkno/tv-automation-server-core/commit/5be2802)) +- update all data in roReplaceMetadata ([8a5a671](https://github.com/nrkno/tv-automation-server-core/commit/8a5a671)) +- Update names passed to SegmentLineItems ([ed0fc0d](https://github.com/nrkno/tv-automation-server-core/commit/ed0fc0d)) +- updated versions file ([f6c9869](https://github.com/nrkno/tv-automation-server-core/commit/f6c9869)) +- use DisplayName field for graphic elements ([e2e9014](https://github.com/nrkno/tv-automation-server-core/commit/e2e9014)) +- use unique id for baseline items cache entries ([cf89409](https://github.com/nrkno/tv-automation-server-core/commit/cf89409)) +- **emberplus:** changes intiDB mapping to new .-delimited string format ([b6d8bc7](https://github.com/nrkno/tv-automation-server-core/commit/b6d8bc7)) +- **init:** Adds default lawo device settings ([28759df](https://github.com/nrkno/tv-automation-server-core/commit/28759df)) +- **Init:** Creat empty settings for Nora ([f8d0669](https://github.com/nrkno/tv-automation-server-core/commit/f8d0669)) +- **Init:** fixes wrong mapping of Lawo RMs ([ee68432](https://github.com/nrkno/tv-automation-server-core/commit/ee68432)) +- **Init:** Sets init defaults to xpro ([fd9c182](https://github.com/nrkno/tv-automation-server-core/commit/fd9c182)) +- **lawo:** changes tempaltes to new structure ([29bf666](https://github.com/nrkno/tv-automation-server-core/commit/29bf666)) +- **lawo:** more generic timeline object ([b0418ab](https://github.com/nrkno/tv-automation-server-core/commit/b0418ab)) +- **NRK Template:** Use LLayers Enum ([84ed5df](https://github.com/nrkno/tv-automation-server-core/commit/84ed5df)) +- **template:** Caspar portion of in-transition for segmentline rerun whenever timeline was recalculated ([3373457](https://github.com/nrkno/tv-automation-server-core/commit/3373457)) +- **template:** graphic supers group using wrong trigger. ([e28d1ef](https://github.com/nrkno/tv-automation-server-core/commit/e28d1ef)) +- **template:** Reduce volume of head wipes ([b2092cc](https://github.com/nrkno/tv-automation-server-core/commit/b2092cc)) +- **template:** setup dsk properly ([2e8309c](https://github.com/nrkno/tv-automation-server-core/commit/2e8309c)) +- **templates:** Fix incorrect camera number used with head transition. Hook in sluttvignett. Fix segments not respecting overlapduration if no transition is used ([00b7cdd](https://github.com/nrkno/tv-automation-server-core/commit/00b7cdd)) +- **templates:** use enum for nora channels ([55c0cfc](https://github.com/nrkno/tv-automation-server-core/commit/55c0cfc)) +- **templates:** Various tweaks ([eb93c6a](https://github.com/nrkno/tv-automation-server-core/commit/eb93c6a)) +- **Timeline:** Corrects the angle of the gradient indication mix-in-transition on a segmentLineItem ([151ecf9](https://github.com/nrkno/tv-automation-server-core/commit/151ecf9)) +- **transition:** reverses direction of wipe transitions ([9961a3f](https://github.com/nrkno/tv-automation-server-core/commit/9961a3f)) +- wrap ntpClient.getNetworkTime() in try/catch, as an attempt to fix fatal error thrown ([cd44862](https://github.com/nrkno/tv-automation-server-core/commit/cd44862)) ### Features -* Add backup link to backup only active template data ([cdfffdf](https://github.com/nrkno/tv-automation-server-core/commit/cdfffdf)) -* Add http put request timeline object ([14f391c](https://github.com/nrkno/tv-automation-server-core/commit/14f391c)) -* Add runHelper method to template context ([ebc477a](https://github.com/nrkno/tv-automation-server-core/commit/ebc477a)) -* Add running order name to top of run page ([674c392](https://github.com/nrkno/tv-automation-server-core/commit/674c392)) -* **template:** setup atem wipe transition ([f0c576c](https://github.com/nrkno/tv-automation-server-core/commit/f0c576c)) -* Add SegmentLineItem.infiniteMode value for items which are infinite within the SegmentLine ([e99c661](https://github.com/nrkno/tv-automation-server-core/commit/e99c661)) -* Add some new template config data for sources information ([3e48508](https://github.com/nrkno/tv-automation-server-core/commit/3e48508)) -* added client-side logging wrapper ([06597be](https://github.com/nrkno/tv-automation-server-core/commit/06597be)) -* added connection status of peripheralDevices ([c0e0a94](https://github.com/nrkno/tv-automation-server-core/commit/c0e0a94)) -* Added dynamic template context ([0ea4849](https://github.com/nrkno/tv-automation-server-core/commit/0ea4849)) -* added indexes for all collections ([6ef324c](https://github.com/nrkno/tv-automation-server-core/commit/6ef324c)) -* added kill process buttons to device status UI ([6fdab68](https://github.com/nrkno/tv-automation-server-core/commit/6fdab68)) -* added killProcess method, to be used by integration tests of gateways in closed environments ([7f2b42c](https://github.com/nrkno/tv-automation-server-core/commit/7f2b42c)) -* added MeteorReactComponent, which exposes subscribe & autorun, which will stop automatically on component unmount ([cf11808](https://github.com/nrkno/tv-automation-server-core/commit/cf11808)) -* added name and type to peripheralDevice ([915c518](https://github.com/nrkno/tv-automation-server-core/commit/915c518)) -* added packages: mocha and typescript ([8b19269](https://github.com/nrkno/tv-automation-server-core/commit/8b19269)) -* added pingWithCommand method, used by watchdog ([6f6427b](https://github.com/nrkno/tv-automation-server-core/commit/6f6427b)) -* Added publications for all running order data, and changed some interfaces ([2365fd2](https://github.com/nrkno/tv-automation-server-core/commit/2365fd2)) -* added support for typescript ([d3471b3](https://github.com/nrkno/tv-automation-server-core/commit/d3471b3)) -* added temporary deploy script ([244fb5b](https://github.com/nrkno/tv-automation-server-core/commit/244fb5b)) -* added test-data for testing and mocking ([b277c3c](https://github.com/nrkno/tv-automation-server-core/commit/b277c3c)) -* added tests stub ([edd4b6e](https://github.com/nrkno/tv-automation-server-core/commit/edd4b6e)) -* added Timeline data structure ([35ce6db](https://github.com/nrkno/tv-automation-server-core/commit/35ce6db)) -* added updateStoryStatus. The yellow line will only be driven when this is set to true ([c7ec8da](https://github.com/nrkno/tv-automation-server-core/commit/c7ec8da)) -* Adjust split box values ([680eb11](https://github.com/nrkno/tv-automation-server-core/commit/680eb11)) -* autonext property is defined on the current SegmentLine rather than the next ([09441db](https://github.com/nrkno/tv-automation-server-core/commit/09441db)) -* backup and restore show styles (including templates) through ui ([9758b2c](https://github.com/nrkno/tv-automation-server-core/commit/9758b2c)) -* Break nrk templates into seperate files. Parse KAM templates better ([2ec0433](https://github.com/nrkno/tv-automation-server-core/commit/2ec0433)) -* changed keyboard shortcuts ([ef02f7c](https://github.com/nrkno/tv-automation-server-core/commit/ef02f7c)) -* converted app.js to typescript and added an example subscription-implementation ([da439af](https://github.com/nrkno/tv-automation-server-core/commit/da439af)) -* expose moment to templates ([c2a1cc5](https://github.com/nrkno/tv-automation-server-core/commit/c2a1cc5)) -* externalMessages implementation (it works now) ([3b8e88a](https://github.com/nrkno/tv-automation-server-core/commit/3b8e88a)) -* full implementation of mos-functions, profile 0 & 2 ([4bafeeb](https://github.com/nrkno/tv-automation-server-core/commit/4bafeeb)) -* implemented mos profiles 0-2 ([d803da1](https://github.com/nrkno/tv-automation-server-core/commit/d803da1)) -* **timeline:** some initial work on labels taking account of liveline ([3086eec](https://github.com/nrkno/tv-automation-server-core/commit/3086eec)) -* Infinite segmentlineitem ([c02a641](https://github.com/nrkno/tv-automation-server-core/commit/c02a641)) -* initial implementation of externalMessages, (not working yet) ([ace91f1](https://github.com/nrkno/tv-automation-server-core/commit/ace91f1)) -* Initial timings for opening templates ([a9bfb66](https://github.com/nrkno/tv-automation-server-core/commit/a9bfb66)) -* Interfaces for describing the timeline, segments (titles), layers ([ea96dfb](https://github.com/nrkno/tv-automation-server-core/commit/ea96dfb)) -* **template:** use upstream keyer for vignett playback. Adds some more layers for atem defaults, and overrides to stack changes better ([76b1e10](https://github.com/nrkno/tv-automation-server-core/commit/76b1e10)) -* KAM SLUTT variant ([e819269](https://github.com/nrkno/tv-automation-server-core/commit/e819269)) -* Read all templates from database ([3287f63](https://github.com/nrkno/tv-automation-server-core/commit/3287f63)) -* rename /clock into /countdowns/presenter ([96c3136](https://github.com/nrkno/tv-automation-server-core/commit/96c3136)) -* set triggerValue to lawo-TimelineObjs, so it triggers upon Nexting ([e3df655](https://github.com/nrkno/tv-automation-server-core/commit/e3df655)) -* ShowStyle templates can be marked as helpers and accessed from other templates ([a20ffa7](https://github.com/nrkno/tv-automation-server-core/commit/a20ffa7)) -* Split (DVE 2LIKE) template ([8ccf23e](https://github.com/nrkno/tv-automation-server-core/commit/8ccf23e)) -* Start of stk and grafikk templates ([0458e3e](https://github.com/nrkno/tv-automation-server-core/commit/0458e3e)) -* started on mos device data implementation ([1d3b19a](https://github.com/nrkno/tv-automation-server-core/commit/1d3b19a)) -* started working on integration tests, added a client-side stub ([c4cbadc](https://github.com/nrkno/tv-automation-server-core/commit/c4cbadc)) -* StudioInstallation key-value config store for template settings ([b37ea17](https://github.com/nrkno/tv-automation-server-core/commit/b37ea17)) -* StudioInstallation key-value config store for template settings ([812c313](https://github.com/nrkno/tv-automation-server-core/commit/812c313)) -* **Capabilities:** Added basic Lawo and ATEM capabilities ([90d6edd](https://github.com/nrkno/tv-automation-server-core/commit/90d6edd)) -* **ENV:** adds ENV vars for default devices - casparcg, atem and lawo ([9bf8eee](https://github.com/nrkno/tv-automation-server-core/commit/9bf8eee)) -* use generated svg as icons in countdown ([843ad10](https://github.com/nrkno/tv-automation-server-core/commit/843ad10)) -* **lawo:** New structure to lawo devices and mappings ([35d812b](https://github.com/nrkno/tv-automation-server-core/commit/35d812b)) -* **loggin:** uses logger for better kibana logs ([8d31691](https://github.com/nrkno/tv-automation-server-core/commit/8d31691)) -* **peripheralDevices:** added collection, publication, api, access control and tests ([794b5be](https://github.com/nrkno/tv-automation-server-core/commit/794b5be)) -* **Setting:** adds lawo setting to studio and devices ([5ab1717](https://github.com/nrkno/tv-automation-server-core/commit/5ab1717)) -* timings page ([6bc325a](https://github.com/nrkno/tv-automation-server-core/commit/6bc325a)) -* Transition as a seperate SegmentLineItem, which is not run if the first SegmentLine in the show, or the previous SegmentLine instructs it to not ([e676a43](https://github.com/nrkno/tv-automation-server-core/commit/e676a43)) -* Update template to use correct media files and durations. Adjust transitions from head to kam ([18f6c44](https://github.com/nrkno/tv-automation-server-core/commit/18f6c44)) -* **template:** temporary env variable for nora group (MESOS_NORA_GROUP) ([8b00bc4](https://github.com/nrkno/tv-automation-server-core/commit/8b00bc4)) -* **Template doc:** Added CasparCG resources ([80f98d5](https://github.com/nrkno/tv-automation-server-core/commit/80f98d5)) -* **templates:** Use ShowStyle to define default/fallback state. Play and stop head supers ([8375363](https://github.com/nrkno/tv-automation-server-core/commit/8375363)) -* **Templates:** Start parsing some new mos data. Process mesos based graphics. Set some lawo audio states ([df4b670](https://github.com/nrkno/tv-automation-server-core/commit/df4b670)) - - +- Add backup link to backup only active template data ([cdfffdf](https://github.com/nrkno/tv-automation-server-core/commit/cdfffdf)) +- Add http put request timeline object ([14f391c](https://github.com/nrkno/tv-automation-server-core/commit/14f391c)) +- Add runHelper method to template context ([ebc477a](https://github.com/nrkno/tv-automation-server-core/commit/ebc477a)) +- Add running order name to top of run page ([674c392](https://github.com/nrkno/tv-automation-server-core/commit/674c392)) +- **template:** setup atem wipe transition ([f0c576c](https://github.com/nrkno/tv-automation-server-core/commit/f0c576c)) +- Add SegmentLineItem.infiniteMode value for items which are infinite within the SegmentLine ([e99c661](https://github.com/nrkno/tv-automation-server-core/commit/e99c661)) +- Add some new template config data for sources information ([3e48508](https://github.com/nrkno/tv-automation-server-core/commit/3e48508)) +- added client-side logging wrapper ([06597be](https://github.com/nrkno/tv-automation-server-core/commit/06597be)) +- added connection status of peripheralDevices ([c0e0a94](https://github.com/nrkno/tv-automation-server-core/commit/c0e0a94)) +- Added dynamic template context ([0ea4849](https://github.com/nrkno/tv-automation-server-core/commit/0ea4849)) +- added indexes for all collections ([6ef324c](https://github.com/nrkno/tv-automation-server-core/commit/6ef324c)) +- added kill process buttons to device status UI ([6fdab68](https://github.com/nrkno/tv-automation-server-core/commit/6fdab68)) +- added killProcess method, to be used by integration tests of gateways in closed environments ([7f2b42c](https://github.com/nrkno/tv-automation-server-core/commit/7f2b42c)) +- added MeteorReactComponent, which exposes subscribe & autorun, which will stop automatically on component unmount ([cf11808](https://github.com/nrkno/tv-automation-server-core/commit/cf11808)) +- added name and type to peripheralDevice ([915c518](https://github.com/nrkno/tv-automation-server-core/commit/915c518)) +- added packages: mocha and typescript ([8b19269](https://github.com/nrkno/tv-automation-server-core/commit/8b19269)) +- added pingWithCommand method, used by watchdog ([6f6427b](https://github.com/nrkno/tv-automation-server-core/commit/6f6427b)) +- Added publications for all running order data, and changed some interfaces ([2365fd2](https://github.com/nrkno/tv-automation-server-core/commit/2365fd2)) +- added support for typescript ([d3471b3](https://github.com/nrkno/tv-automation-server-core/commit/d3471b3)) +- added temporary deploy script ([244fb5b](https://github.com/nrkno/tv-automation-server-core/commit/244fb5b)) +- added test-data for testing and mocking ([b277c3c](https://github.com/nrkno/tv-automation-server-core/commit/b277c3c)) +- added tests stub ([edd4b6e](https://github.com/nrkno/tv-automation-server-core/commit/edd4b6e)) +- added Timeline data structure ([35ce6db](https://github.com/nrkno/tv-automation-server-core/commit/35ce6db)) +- added updateStoryStatus. The yellow line will only be driven when this is set to true ([c7ec8da](https://github.com/nrkno/tv-automation-server-core/commit/c7ec8da)) +- Adjust split box values ([680eb11](https://github.com/nrkno/tv-automation-server-core/commit/680eb11)) +- autonext property is defined on the current SegmentLine rather than the next ([09441db](https://github.com/nrkno/tv-automation-server-core/commit/09441db)) +- backup and restore show styles (including templates) through ui ([9758b2c](https://github.com/nrkno/tv-automation-server-core/commit/9758b2c)) +- Break nrk templates into seperate files. Parse KAM templates better ([2ec0433](https://github.com/nrkno/tv-automation-server-core/commit/2ec0433)) +- changed keyboard shortcuts ([ef02f7c](https://github.com/nrkno/tv-automation-server-core/commit/ef02f7c)) +- converted app.js to typescript and added an example subscription-implementation ([da439af](https://github.com/nrkno/tv-automation-server-core/commit/da439af)) +- expose moment to templates ([c2a1cc5](https://github.com/nrkno/tv-automation-server-core/commit/c2a1cc5)) +- externalMessages implementation (it works now) ([3b8e88a](https://github.com/nrkno/tv-automation-server-core/commit/3b8e88a)) +- full implementation of mos-functions, profile 0 & 2 ([4bafeeb](https://github.com/nrkno/tv-automation-server-core/commit/4bafeeb)) +- implemented mos profiles 0-2 ([d803da1](https://github.com/nrkno/tv-automation-server-core/commit/d803da1)) +- **timeline:** some initial work on labels taking account of liveline ([3086eec](https://github.com/nrkno/tv-automation-server-core/commit/3086eec)) +- Infinite segmentlineitem ([c02a641](https://github.com/nrkno/tv-automation-server-core/commit/c02a641)) +- initial implementation of externalMessages, (not working yet) ([ace91f1](https://github.com/nrkno/tv-automation-server-core/commit/ace91f1)) +- Initial timings for opening templates ([a9bfb66](https://github.com/nrkno/tv-automation-server-core/commit/a9bfb66)) +- Interfaces for describing the timeline, segments (titles), layers ([ea96dfb](https://github.com/nrkno/tv-automation-server-core/commit/ea96dfb)) +- **template:** use upstream keyer for vignett playback. Adds some more layers for atem defaults, and overrides to stack changes better ([76b1e10](https://github.com/nrkno/tv-automation-server-core/commit/76b1e10)) +- KAM SLUTT variant ([e819269](https://github.com/nrkno/tv-automation-server-core/commit/e819269)) +- Read all templates from database ([3287f63](https://github.com/nrkno/tv-automation-server-core/commit/3287f63)) +- rename /clock into /countdowns/presenter ([96c3136](https://github.com/nrkno/tv-automation-server-core/commit/96c3136)) +- set triggerValue to lawo-TimelineObjs, so it triggers upon Nexting ([e3df655](https://github.com/nrkno/tv-automation-server-core/commit/e3df655)) +- ShowStyle templates can be marked as helpers and accessed from other templates ([a20ffa7](https://github.com/nrkno/tv-automation-server-core/commit/a20ffa7)) +- Split (DVE 2LIKE) template ([8ccf23e](https://github.com/nrkno/tv-automation-server-core/commit/8ccf23e)) +- Start of stk and grafikk templates ([0458e3e](https://github.com/nrkno/tv-automation-server-core/commit/0458e3e)) +- started on mos device data implementation ([1d3b19a](https://github.com/nrkno/tv-automation-server-core/commit/1d3b19a)) +- started working on integration tests, added a client-side stub ([c4cbadc](https://github.com/nrkno/tv-automation-server-core/commit/c4cbadc)) +- StudioInstallation key-value config store for template settings ([b37ea17](https://github.com/nrkno/tv-automation-server-core/commit/b37ea17)) +- StudioInstallation key-value config store for template settings ([812c313](https://github.com/nrkno/tv-automation-server-core/commit/812c313)) +- **Capabilities:** Added basic Lawo and ATEM capabilities ([90d6edd](https://github.com/nrkno/tv-automation-server-core/commit/90d6edd)) +- **ENV:** adds ENV vars for default devices - casparcg, atem and lawo ([9bf8eee](https://github.com/nrkno/tv-automation-server-core/commit/9bf8eee)) +- use generated svg as icons in countdown ([843ad10](https://github.com/nrkno/tv-automation-server-core/commit/843ad10)) +- **lawo:** New structure to lawo devices and mappings ([35d812b](https://github.com/nrkno/tv-automation-server-core/commit/35d812b)) +- **loggin:** uses logger for better kibana logs ([8d31691](https://github.com/nrkno/tv-automation-server-core/commit/8d31691)) +- **peripheralDevices:** added collection, publication, api, access control and tests ([794b5be](https://github.com/nrkno/tv-automation-server-core/commit/794b5be)) +- **Setting:** adds lawo setting to studio and devices ([5ab1717](https://github.com/nrkno/tv-automation-server-core/commit/5ab1717)) +- timings page ([6bc325a](https://github.com/nrkno/tv-automation-server-core/commit/6bc325a)) +- Transition as a seperate SegmentLineItem, which is not run if the first SegmentLine in the show, or the previous SegmentLine instructs it to not ([e676a43](https://github.com/nrkno/tv-automation-server-core/commit/e676a43)) +- Update template to use correct media files and durations. Adjust transitions from head to kam ([18f6c44](https://github.com/nrkno/tv-automation-server-core/commit/18f6c44)) +- **template:** temporary env variable for nora group (MESOS_NORA_GROUP) ([8b00bc4](https://github.com/nrkno/tv-automation-server-core/commit/8b00bc4)) +- **Template doc:** Added CasparCG resources ([80f98d5](https://github.com/nrkno/tv-automation-server-core/commit/80f98d5)) +- **templates:** Use ShowStyle to define default/fallback state. Play and stop head supers ([8375363](https://github.com/nrkno/tv-automation-server-core/commit/8375363)) +- **Templates:** Start parsing some new mos data. Process mesos based graphics. Set some lawo audio states ([df4b670](https://github.com/nrkno/tv-automation-server-core/commit/df4b670)) -# 0.3.0 (2018-08-01) +# 0.3.0 (2018-08-01) ### Bug Fixes -* Add missing layers to initdb. Use readtime as possible duration of segmentline when calculating story length ([e388d63](https://github.com/nrkno/tv-automation-server-core/commit/e388d63)) -* added sorting of runtimeFunctions when generating backup, so diffing works ([17639a0](https://github.com/nrkno/tv-automation-server-core/commit/17639a0)) -* added sorting of runtimeFunctions when generating backup, so diffing works ([b3ba3f6](https://github.com/nrkno/tv-automation-server-core/commit/b3ba3f6)) -* allow timelineobjs to be declared as abstract, and always route those with the core_abstract layer ([9bfa6c4](https://github.com/nrkno/tv-automation-server-core/commit/9bfa6c4)) -* atem mappings ([8d4ea2d](https://github.com/nrkno/tv-automation-server-core/commit/8d4ea2d)) -* autoNext should update yellow line (it didn't) ([ff42a81](https://github.com/nrkno/tv-automation-server-core/commit/ff42a81)) -* baselineTemplates not being calculated correctly for showstyle ([e4799b4](https://github.com/nrkno/tv-automation-server-core/commit/e4799b4)) -* bind keydown for any keyup events to prevent their default behaviour ([83e42e4](https://github.com/nrkno/tv-automation-server-core/commit/83e42e4)) -* change lawo enum & interface ([3959761](https://github.com/nrkno/tv-automation-server-core/commit/3959761)) -* changed backup sorting to use templateId instead of _id ([d7047a5](https://github.com/nrkno/tv-automation-server-core/commit/d7047a5)) -* changed default chortcuts ([ba33bb7](https://github.com/nrkno/tv-automation-server-core/commit/ba33bb7)) -* changed header colors ([b9efc61](https://github.com/nrkno/tv-automation-server-core/commit/b9efc61)) -* changes attr. paths in lawo source objs ([55f8c7b](https://github.com/nrkno/tv-automation-server-core/commit/55f8c7b)) -* changes lawo mapping with the effects change ([dbe58fe](https://github.com/nrkno/tv-automation-server-core/commit/dbe58fe)) -* corrects the default baseline template ([bf4eb03](https://github.com/nrkno/tv-automation-server-core/commit/bf4eb03)) -* Ctrl-S in template editor triggers a save ([bacbc3e](https://github.com/nrkno/tv-automation-server-core/commit/bacbc3e)) -* device is first created as Abstract ([98dca79](https://github.com/nrkno/tv-automation-server-core/commit/98dca79)) -* dont set nora_* config values in initDB ([1330008](https://github.com/nrkno/tv-automation-server-core/commit/1330008)) -* Editattribute type typing ([392f4aa](https://github.com/nrkno/tv-automation-server-core/commit/392f4aa)) -* Editattribute type typing ([1206d0c](https://github.com/nrkno/tv-automation-server-core/commit/1206d0c)) -* Guard against there being no next segmentline ([849d97f](https://github.com/nrkno/tv-automation-server-core/commit/849d97f)) -* head mute audio and hold on last frame ([ceec7f6](https://github.com/nrkno/tv-automation-server-core/commit/ceec7f6)) -* incorrect typings for template editor ([9d021df](https://github.com/nrkno/tv-automation-server-core/commit/9d021df)) -* Increase size of template editor to make it better fill the screen ([3212d7b](https://github.com/nrkno/tv-automation-server-core/commit/3212d7b)) -* infinite segment line tidying and fixes ([8469ffb](https://github.com/nrkno/tv-automation-server-core/commit/8469ffb)) -* infinite segmentlines crossing an autonext throwing a duplicate key exception ([93b2a30](https://github.com/nrkno/tv-automation-server-core/commit/93b2a30)) -* keys should be handled at up, not down ([957f583](https://github.com/nrkno/tv-automation-server-core/commit/957f583)) -* made editor height dynamic ([c68ac4f](https://github.com/nrkno/tv-automation-server-core/commit/c68ac4f)) -* made editor height dynamic ([7f5f40e](https://github.com/nrkno/tv-automation-server-core/commit/7f5f40e)) -* Make the head to kam wipe not use the mosartVariant field. Correct the head order checking ([6030755](https://github.com/nrkno/tv-automation-server-core/commit/6030755)) -* new lawo source mappings ([20f7d5a](https://github.com/nrkno/tv-automation-server-core/commit/20f7d5a)) -* on startup, clear old connection statuses ([e9d7cba](https://github.com/nrkno/tv-automation-server-core/commit/e9d7cba)) -* Persist SegmentLine.updateStoryStatus ([427b24c](https://github.com/nrkno/tv-automation-server-core/commit/427b24c)) -* prevent default action for f1 & f3 ([53b2f22](https://github.com/nrkno/tv-automation-server-core/commit/53b2f22)) -* re-timing vignett ([17fbced](https://github.com/nrkno/tv-automation-server-core/commit/17fbced)) -* react errors while rendering nymansPlayground ([0c245d3](https://github.com/nrkno/tv-automation-server-core/commit/0c245d3)) -* React unique keys ([4f728d9](https://github.com/nrkno/tv-automation-server-core/commit/4f728d9)) -* removed autopublish and insecure packages, we'll implement publications and allow/deny rules from now on ([213998d](https://github.com/nrkno/tv-automation-server-core/commit/213998d)) -* removed ntp server debug code ([b9857e7](https://github.com/nrkno/tv-automation-server-core/commit/b9857e7)) -* Respect disableOutTransition on SegmentLine during manual takes (not just autonext) ([f19788d](https://github.com/nrkno/tv-automation-server-core/commit/f19788d)) -* Rundown name dissappearing from view ([91dcc21](https://github.com/nrkno/tv-automation-server-core/commit/91dcc21)) -* Set KAM source layer, and a probably incorrect duration (but its now non-zero) ([6e152f0](https://github.com/nrkno/tv-automation-server-core/commit/6e152f0)) -* sl prod init ([2ff4a46](https://github.com/nrkno/tv-automation-server-core/commit/2ff4a46)) -* Start on template for KAM ÅPNING ([4cd682f](https://github.com/nrkno/tv-automation-server-core/commit/4cd682f)) -* status colors ([46fdaf1](https://github.com/nrkno/tv-automation-server-core/commit/46fdaf1)) -* StudioInstallation key-value config tidying ([4b0bc1a](https://github.com/nrkno/tv-automation-server-core/commit/4b0bc1a)) -* templates with wipe. Readd seperate audio file ([5be2802](https://github.com/nrkno/tv-automation-server-core/commit/5be2802)) -* update all data in roReplaceMetadata ([8a5a671](https://github.com/nrkno/tv-automation-server-core/commit/8a5a671)) -* Update names passed to SegmentLineItems ([ed0fc0d](https://github.com/nrkno/tv-automation-server-core/commit/ed0fc0d)) -* updated versions file ([f6c9869](https://github.com/nrkno/tv-automation-server-core/commit/f6c9869)) -* use DisplayName field for graphic elements ([e2e9014](https://github.com/nrkno/tv-automation-server-core/commit/e2e9014)) -* use unique id for baseline items cache entries ([cf89409](https://github.com/nrkno/tv-automation-server-core/commit/cf89409)) -* **emberplus:** changes intiDB mapping to new .-delimited string format ([b6d8bc7](https://github.com/nrkno/tv-automation-server-core/commit/b6d8bc7)) -* **init:** Adds default lawo device settings ([28759df](https://github.com/nrkno/tv-automation-server-core/commit/28759df)) -* **Init:** Creat empty settings for Nora ([f8d0669](https://github.com/nrkno/tv-automation-server-core/commit/f8d0669)) -* **Init:** fixes wrong mapping of Lawo RMs ([ee68432](https://github.com/nrkno/tv-automation-server-core/commit/ee68432)) -* **Init:** Sets init defaults to xpro ([fd9c182](https://github.com/nrkno/tv-automation-server-core/commit/fd9c182)) -* **lawo:** changes tempaltes to new structure ([29bf666](https://github.com/nrkno/tv-automation-server-core/commit/29bf666)) -* **lawo:** more generic timeline object ([b0418ab](https://github.com/nrkno/tv-automation-server-core/commit/b0418ab)) -* **NRK Template:** Use LLayers Enum ([84ed5df](https://github.com/nrkno/tv-automation-server-core/commit/84ed5df)) -* **template:** Caspar portion of in-transition for segmentline rerun whenever timeline was recalculated ([3373457](https://github.com/nrkno/tv-automation-server-core/commit/3373457)) -* **template:** graphic supers group using wrong trigger. ([e28d1ef](https://github.com/nrkno/tv-automation-server-core/commit/e28d1ef)) -* **template:** Reduce volume of head wipes ([b2092cc](https://github.com/nrkno/tv-automation-server-core/commit/b2092cc)) -* **template:** setup dsk properly ([2e8309c](https://github.com/nrkno/tv-automation-server-core/commit/2e8309c)) -* **templates:** Fix incorrect camera number used with head transition. Hook in sluttvignett. Fix segments not respecting overlapduration if no transition is used ([00b7cdd](https://github.com/nrkno/tv-automation-server-core/commit/00b7cdd)) -* **templates:** use enum for nora channels ([55c0cfc](https://github.com/nrkno/tv-automation-server-core/commit/55c0cfc)) -* **templates:** Various tweaks ([eb93c6a](https://github.com/nrkno/tv-automation-server-core/commit/eb93c6a)) -* **Timeline:** Corrects the angle of the gradient indication mix-in-transition on a segmentLineItem ([151ecf9](https://github.com/nrkno/tv-automation-server-core/commit/151ecf9)) -* **transition:** reverses direction of wipe transitions ([9961a3f](https://github.com/nrkno/tv-automation-server-core/commit/9961a3f)) -* wrap ntpClient.getNetworkTime() in try/catch, as an attempt to fix fatal error thrown ([cd44862](https://github.com/nrkno/tv-automation-server-core/commit/cd44862)) - +- Add missing layers to initdb. Use readtime as possible duration of segmentline when calculating story length ([e388d63](https://github.com/nrkno/tv-automation-server-core/commit/e388d63)) +- added sorting of runtimeFunctions when generating backup, so diffing works ([17639a0](https://github.com/nrkno/tv-automation-server-core/commit/17639a0)) +- added sorting of runtimeFunctions when generating backup, so diffing works ([b3ba3f6](https://github.com/nrkno/tv-automation-server-core/commit/b3ba3f6)) +- allow timelineobjs to be declared as abstract, and always route those with the core_abstract layer ([9bfa6c4](https://github.com/nrkno/tv-automation-server-core/commit/9bfa6c4)) +- atem mappings ([8d4ea2d](https://github.com/nrkno/tv-automation-server-core/commit/8d4ea2d)) +- autoNext should update yellow line (it didn't) ([ff42a81](https://github.com/nrkno/tv-automation-server-core/commit/ff42a81)) +- baselineTemplates not being calculated correctly for showstyle ([e4799b4](https://github.com/nrkno/tv-automation-server-core/commit/e4799b4)) +- bind keydown for any keyup events to prevent their default behaviour ([83e42e4](https://github.com/nrkno/tv-automation-server-core/commit/83e42e4)) +- change lawo enum & interface ([3959761](https://github.com/nrkno/tv-automation-server-core/commit/3959761)) +- changed backup sorting to use templateId instead of \_id ([d7047a5](https://github.com/nrkno/tv-automation-server-core/commit/d7047a5)) +- changed default chortcuts ([ba33bb7](https://github.com/nrkno/tv-automation-server-core/commit/ba33bb7)) +- changed header colors ([b9efc61](https://github.com/nrkno/tv-automation-server-core/commit/b9efc61)) +- changes attr. paths in lawo source objs ([55f8c7b](https://github.com/nrkno/tv-automation-server-core/commit/55f8c7b)) +- changes lawo mapping with the effects change ([dbe58fe](https://github.com/nrkno/tv-automation-server-core/commit/dbe58fe)) +- corrects the default baseline template ([bf4eb03](https://github.com/nrkno/tv-automation-server-core/commit/bf4eb03)) +- Ctrl-S in template editor triggers a save ([bacbc3e](https://github.com/nrkno/tv-automation-server-core/commit/bacbc3e)) +- device is first created as Abstract ([98dca79](https://github.com/nrkno/tv-automation-server-core/commit/98dca79)) +- dont set nora\_\* config values in initDB ([1330008](https://github.com/nrkno/tv-automation-server-core/commit/1330008)) +- Editattribute type typing ([392f4aa](https://github.com/nrkno/tv-automation-server-core/commit/392f4aa)) +- Editattribute type typing ([1206d0c](https://github.com/nrkno/tv-automation-server-core/commit/1206d0c)) +- Guard against there being no next segmentline ([849d97f](https://github.com/nrkno/tv-automation-server-core/commit/849d97f)) +- head mute audio and hold on last frame ([ceec7f6](https://github.com/nrkno/tv-automation-server-core/commit/ceec7f6)) +- incorrect typings for template editor ([9d021df](https://github.com/nrkno/tv-automation-server-core/commit/9d021df)) +- Increase size of template editor to make it better fill the screen ([3212d7b](https://github.com/nrkno/tv-automation-server-core/commit/3212d7b)) +- infinite segment line tidying and fixes ([8469ffb](https://github.com/nrkno/tv-automation-server-core/commit/8469ffb)) +- infinite segmentlines crossing an autonext throwing a duplicate key exception ([93b2a30](https://github.com/nrkno/tv-automation-server-core/commit/93b2a30)) +- keys should be handled at up, not down ([957f583](https://github.com/nrkno/tv-automation-server-core/commit/957f583)) +- made editor height dynamic ([c68ac4f](https://github.com/nrkno/tv-automation-server-core/commit/c68ac4f)) +- made editor height dynamic ([7f5f40e](https://github.com/nrkno/tv-automation-server-core/commit/7f5f40e)) +- Make the head to kam wipe not use the mosartVariant field. Correct the head order checking ([6030755](https://github.com/nrkno/tv-automation-server-core/commit/6030755)) +- new lawo source mappings ([20f7d5a](https://github.com/nrkno/tv-automation-server-core/commit/20f7d5a)) +- on startup, clear old connection statuses ([e9d7cba](https://github.com/nrkno/tv-automation-server-core/commit/e9d7cba)) +- Persist SegmentLine.updateStoryStatus ([427b24c](https://github.com/nrkno/tv-automation-server-core/commit/427b24c)) +- prevent default action for f1 & f3 ([53b2f22](https://github.com/nrkno/tv-automation-server-core/commit/53b2f22)) +- re-timing vignett ([17fbced](https://github.com/nrkno/tv-automation-server-core/commit/17fbced)) +- react errors while rendering nymansPlayground ([0c245d3](https://github.com/nrkno/tv-automation-server-core/commit/0c245d3)) +- React unique keys ([4f728d9](https://github.com/nrkno/tv-automation-server-core/commit/4f728d9)) +- removed autopublish and insecure packages, we'll implement publications and allow/deny rules from now on ([213998d](https://github.com/nrkno/tv-automation-server-core/commit/213998d)) +- removed ntp server debug code ([b9857e7](https://github.com/nrkno/tv-automation-server-core/commit/b9857e7)) +- Respect disableOutTransition on SegmentLine during manual takes (not just autonext) ([f19788d](https://github.com/nrkno/tv-automation-server-core/commit/f19788d)) +- Rundown name dissappearing from view ([91dcc21](https://github.com/nrkno/tv-automation-server-core/commit/91dcc21)) +- Set KAM source layer, and a probably incorrect duration (but its now non-zero) ([6e152f0](https://github.com/nrkno/tv-automation-server-core/commit/6e152f0)) +- sl prod init ([2ff4a46](https://github.com/nrkno/tv-automation-server-core/commit/2ff4a46)) +- Start on template for KAM ÅPNING ([4cd682f](https://github.com/nrkno/tv-automation-server-core/commit/4cd682f)) +- status colors ([46fdaf1](https://github.com/nrkno/tv-automation-server-core/commit/46fdaf1)) +- StudioInstallation key-value config tidying ([4b0bc1a](https://github.com/nrkno/tv-automation-server-core/commit/4b0bc1a)) +- templates with wipe. Readd seperate audio file ([5be2802](https://github.com/nrkno/tv-automation-server-core/commit/5be2802)) +- update all data in roReplaceMetadata ([8a5a671](https://github.com/nrkno/tv-automation-server-core/commit/8a5a671)) +- Update names passed to SegmentLineItems ([ed0fc0d](https://github.com/nrkno/tv-automation-server-core/commit/ed0fc0d)) +- updated versions file ([f6c9869](https://github.com/nrkno/tv-automation-server-core/commit/f6c9869)) +- use DisplayName field for graphic elements ([e2e9014](https://github.com/nrkno/tv-automation-server-core/commit/e2e9014)) +- use unique id for baseline items cache entries ([cf89409](https://github.com/nrkno/tv-automation-server-core/commit/cf89409)) +- **emberplus:** changes intiDB mapping to new .-delimited string format ([b6d8bc7](https://github.com/nrkno/tv-automation-server-core/commit/b6d8bc7)) +- **init:** Adds default lawo device settings ([28759df](https://github.com/nrkno/tv-automation-server-core/commit/28759df)) +- **Init:** Creat empty settings for Nora ([f8d0669](https://github.com/nrkno/tv-automation-server-core/commit/f8d0669)) +- **Init:** fixes wrong mapping of Lawo RMs ([ee68432](https://github.com/nrkno/tv-automation-server-core/commit/ee68432)) +- **Init:** Sets init defaults to xpro ([fd9c182](https://github.com/nrkno/tv-automation-server-core/commit/fd9c182)) +- **lawo:** changes tempaltes to new structure ([29bf666](https://github.com/nrkno/tv-automation-server-core/commit/29bf666)) +- **lawo:** more generic timeline object ([b0418ab](https://github.com/nrkno/tv-automation-server-core/commit/b0418ab)) +- **NRK Template:** Use LLayers Enum ([84ed5df](https://github.com/nrkno/tv-automation-server-core/commit/84ed5df)) +- **template:** Caspar portion of in-transition for segmentline rerun whenever timeline was recalculated ([3373457](https://github.com/nrkno/tv-automation-server-core/commit/3373457)) +- **template:** graphic supers group using wrong trigger. ([e28d1ef](https://github.com/nrkno/tv-automation-server-core/commit/e28d1ef)) +- **template:** Reduce volume of head wipes ([b2092cc](https://github.com/nrkno/tv-automation-server-core/commit/b2092cc)) +- **template:** setup dsk properly ([2e8309c](https://github.com/nrkno/tv-automation-server-core/commit/2e8309c)) +- **templates:** Fix incorrect camera number used with head transition. Hook in sluttvignett. Fix segments not respecting overlapduration if no transition is used ([00b7cdd](https://github.com/nrkno/tv-automation-server-core/commit/00b7cdd)) +- **templates:** use enum for nora channels ([55c0cfc](https://github.com/nrkno/tv-automation-server-core/commit/55c0cfc)) +- **templates:** Various tweaks ([eb93c6a](https://github.com/nrkno/tv-automation-server-core/commit/eb93c6a)) +- **Timeline:** Corrects the angle of the gradient indication mix-in-transition on a segmentLineItem ([151ecf9](https://github.com/nrkno/tv-automation-server-core/commit/151ecf9)) +- **transition:** reverses direction of wipe transitions ([9961a3f](https://github.com/nrkno/tv-automation-server-core/commit/9961a3f)) +- wrap ntpClient.getNetworkTime() in try/catch, as an attempt to fix fatal error thrown ([cd44862](https://github.com/nrkno/tv-automation-server-core/commit/cd44862)) ### Features -* Add backup link to backup only active template data ([cdfffdf](https://github.com/nrkno/tv-automation-server-core/commit/cdfffdf)) -* Add http put request timeline object ([14f391c](https://github.com/nrkno/tv-automation-server-core/commit/14f391c)) -* Add runHelper method to template context ([ebc477a](https://github.com/nrkno/tv-automation-server-core/commit/ebc477a)) -* Add running order name to top of run page ([674c392](https://github.com/nrkno/tv-automation-server-core/commit/674c392)) -* **template:** setup atem wipe transition ([f0c576c](https://github.com/nrkno/tv-automation-server-core/commit/f0c576c)) -* Add SegmentLineItem.infiniteMode value for items which are infinite within the SegmentLine ([e99c661](https://github.com/nrkno/tv-automation-server-core/commit/e99c661)) -* Add some new template config data for sources information ([3e48508](https://github.com/nrkno/tv-automation-server-core/commit/3e48508)) -* added client-side logging wrapper ([06597be](https://github.com/nrkno/tv-automation-server-core/commit/06597be)) -* added connection status of peripheralDevices ([c0e0a94](https://github.com/nrkno/tv-automation-server-core/commit/c0e0a94)) -* Added dynamic template context ([0ea4849](https://github.com/nrkno/tv-automation-server-core/commit/0ea4849)) -* added indexes for all collections ([6ef324c](https://github.com/nrkno/tv-automation-server-core/commit/6ef324c)) -* added kill process buttons to device status UI ([6fdab68](https://github.com/nrkno/tv-automation-server-core/commit/6fdab68)) -* added killProcess method, to be used by integration tests of gateways in closed environments ([7f2b42c](https://github.com/nrkno/tv-automation-server-core/commit/7f2b42c)) -* added MeteorReactComponent, which exposes subscribe & autorun, which will stop automatically on component unmount ([cf11808](https://github.com/nrkno/tv-automation-server-core/commit/cf11808)) -* added name and type to peripheralDevice ([915c518](https://github.com/nrkno/tv-automation-server-core/commit/915c518)) -* added packages: mocha and typescript ([8b19269](https://github.com/nrkno/tv-automation-server-core/commit/8b19269)) -* added pingWithCommand method, used by watchdog ([6f6427b](https://github.com/nrkno/tv-automation-server-core/commit/6f6427b)) -* Added publications for all running order data, and changed some interfaces ([2365fd2](https://github.com/nrkno/tv-automation-server-core/commit/2365fd2)) -* added support for typescript ([d3471b3](https://github.com/nrkno/tv-automation-server-core/commit/d3471b3)) -* added temporary deploy script ([244fb5b](https://github.com/nrkno/tv-automation-server-core/commit/244fb5b)) -* added test-data for testing and mocking ([b277c3c](https://github.com/nrkno/tv-automation-server-core/commit/b277c3c)) -* added tests stub ([edd4b6e](https://github.com/nrkno/tv-automation-server-core/commit/edd4b6e)) -* added Timeline data structure ([35ce6db](https://github.com/nrkno/tv-automation-server-core/commit/35ce6db)) -* added updateStoryStatus. The yellow line will only be driven when this is set to true ([c7ec8da](https://github.com/nrkno/tv-automation-server-core/commit/c7ec8da)) -* Adjust split box values ([680eb11](https://github.com/nrkno/tv-automation-server-core/commit/680eb11)) -* autonext property is defined on the current SegmentLine rather than the next ([09441db](https://github.com/nrkno/tv-automation-server-core/commit/09441db)) -* backup and restore show styles (including templates) through ui ([9758b2c](https://github.com/nrkno/tv-automation-server-core/commit/9758b2c)) -* Break nrk templates into seperate files. Parse KAM templates better ([2ec0433](https://github.com/nrkno/tv-automation-server-core/commit/2ec0433)) -* changed keyboard shortcuts ([ef02f7c](https://github.com/nrkno/tv-automation-server-core/commit/ef02f7c)) -* converted app.js to typescript and added an example subscription-implementation ([da439af](https://github.com/nrkno/tv-automation-server-core/commit/da439af)) -* expose moment to templates ([c2a1cc5](https://github.com/nrkno/tv-automation-server-core/commit/c2a1cc5)) -* externalMessages implementation (it works now) ([3b8e88a](https://github.com/nrkno/tv-automation-server-core/commit/3b8e88a)) -* full implementation of mos-functions, profile 0 & 2 ([4bafeeb](https://github.com/nrkno/tv-automation-server-core/commit/4bafeeb)) -* implemented mos profiles 0-2 ([d803da1](https://github.com/nrkno/tv-automation-server-core/commit/d803da1)) -* **timeline:** some initial work on labels taking account of liveline ([3086eec](https://github.com/nrkno/tv-automation-server-core/commit/3086eec)) -* Infinite segmentlineitem ([c02a641](https://github.com/nrkno/tv-automation-server-core/commit/c02a641)) -* initial implementation of externalMessages, (not working yet) ([ace91f1](https://github.com/nrkno/tv-automation-server-core/commit/ace91f1)) -* Initial timings for opening templates ([a9bfb66](https://github.com/nrkno/tv-automation-server-core/commit/a9bfb66)) -* Interfaces for describing the timeline, segments (titles), layers ([ea96dfb](https://github.com/nrkno/tv-automation-server-core/commit/ea96dfb)) -* **template:** use upstream keyer for vignett playback. Adds some more layers for atem defaults, and overrides to stack changes better ([76b1e10](https://github.com/nrkno/tv-automation-server-core/commit/76b1e10)) -* KAM SLUTT variant ([e819269](https://github.com/nrkno/tv-automation-server-core/commit/e819269)) -* Read all templates from database ([3287f63](https://github.com/nrkno/tv-automation-server-core/commit/3287f63)) -* rename /clock into /countdowns/presenter ([96c3136](https://github.com/nrkno/tv-automation-server-core/commit/96c3136)) -* set triggerValue to lawo-TimelineObjs, so it triggers upon Nexting ([e3df655](https://github.com/nrkno/tv-automation-server-core/commit/e3df655)) -* ShowStyle templates can be marked as helpers and accessed from other templates ([a20ffa7](https://github.com/nrkno/tv-automation-server-core/commit/a20ffa7)) -* Split (DVE 2LIKE) template ([8ccf23e](https://github.com/nrkno/tv-automation-server-core/commit/8ccf23e)) -* Start of stk and grafikk templates ([0458e3e](https://github.com/nrkno/tv-automation-server-core/commit/0458e3e)) -* started on mos device data implementation ([1d3b19a](https://github.com/nrkno/tv-automation-server-core/commit/1d3b19a)) -* started working on integration tests, added a client-side stub ([c4cbadc](https://github.com/nrkno/tv-automation-server-core/commit/c4cbadc)) -* StudioInstallation key-value config store for template settings ([b37ea17](https://github.com/nrkno/tv-automation-server-core/commit/b37ea17)) -* StudioInstallation key-value config store for template settings ([812c313](https://github.com/nrkno/tv-automation-server-core/commit/812c313)) -* **Capabilities:** Added basic Lawo and ATEM capabilities ([90d6edd](https://github.com/nrkno/tv-automation-server-core/commit/90d6edd)) -* **ENV:** adds ENV vars for default devices - casparcg, atem and lawo ([9bf8eee](https://github.com/nrkno/tv-automation-server-core/commit/9bf8eee)) -* use generated svg as icons in countdown ([843ad10](https://github.com/nrkno/tv-automation-server-core/commit/843ad10)) -* **lawo:** New structure to lawo devices and mappings ([35d812b](https://github.com/nrkno/tv-automation-server-core/commit/35d812b)) -* **loggin:** uses logger for better kibana logs ([8d31691](https://github.com/nrkno/tv-automation-server-core/commit/8d31691)) -* **peripheralDevices:** added collection, publication, api, access control and tests ([794b5be](https://github.com/nrkno/tv-automation-server-core/commit/794b5be)) -* **Setting:** adds lawo setting to studio and devices ([5ab1717](https://github.com/nrkno/tv-automation-server-core/commit/5ab1717)) -* timings page ([6bc325a](https://github.com/nrkno/tv-automation-server-core/commit/6bc325a)) -* Transition as a seperate SegmentLineItem, which is not run if the first SegmentLine in the show, or the previous SegmentLine instructs it to not ([e676a43](https://github.com/nrkno/tv-automation-server-core/commit/e676a43)) -* Update template to use correct media files and durations. Adjust transitions from head to kam ([18f6c44](https://github.com/nrkno/tv-automation-server-core/commit/18f6c44)) -* **template:** temporary env variable for nora group (MESOS_NORA_GROUP) ([8b00bc4](https://github.com/nrkno/tv-automation-server-core/commit/8b00bc4)) -* **Template doc:** Added CasparCG resources ([80f98d5](https://github.com/nrkno/tv-automation-server-core/commit/80f98d5)) -* **templates:** Use ShowStyle to define default/fallback state. Play and stop head supers ([8375363](https://github.com/nrkno/tv-automation-server-core/commit/8375363)) -* **Templates:** Start parsing some new mos data. Process mesos based graphics. Set some lawo audio states ([df4b670](https://github.com/nrkno/tv-automation-server-core/commit/df4b670)) - - +- Add backup link to backup only active template data ([cdfffdf](https://github.com/nrkno/tv-automation-server-core/commit/cdfffdf)) +- Add http put request timeline object ([14f391c](https://github.com/nrkno/tv-automation-server-core/commit/14f391c)) +- Add runHelper method to template context ([ebc477a](https://github.com/nrkno/tv-automation-server-core/commit/ebc477a)) +- Add running order name to top of run page ([674c392](https://github.com/nrkno/tv-automation-server-core/commit/674c392)) +- **template:** setup atem wipe transition ([f0c576c](https://github.com/nrkno/tv-automation-server-core/commit/f0c576c)) +- Add SegmentLineItem.infiniteMode value for items which are infinite within the SegmentLine ([e99c661](https://github.com/nrkno/tv-automation-server-core/commit/e99c661)) +- Add some new template config data for sources information ([3e48508](https://github.com/nrkno/tv-automation-server-core/commit/3e48508)) +- added client-side logging wrapper ([06597be](https://github.com/nrkno/tv-automation-server-core/commit/06597be)) +- added connection status of peripheralDevices ([c0e0a94](https://github.com/nrkno/tv-automation-server-core/commit/c0e0a94)) +- Added dynamic template context ([0ea4849](https://github.com/nrkno/tv-automation-server-core/commit/0ea4849)) +- added indexes for all collections ([6ef324c](https://github.com/nrkno/tv-automation-server-core/commit/6ef324c)) +- added kill process buttons to device status UI ([6fdab68](https://github.com/nrkno/tv-automation-server-core/commit/6fdab68)) +- added killProcess method, to be used by integration tests of gateways in closed environments ([7f2b42c](https://github.com/nrkno/tv-automation-server-core/commit/7f2b42c)) +- added MeteorReactComponent, which exposes subscribe & autorun, which will stop automatically on component unmount ([cf11808](https://github.com/nrkno/tv-automation-server-core/commit/cf11808)) +- added name and type to peripheralDevice ([915c518](https://github.com/nrkno/tv-automation-server-core/commit/915c518)) +- added packages: mocha and typescript ([8b19269](https://github.com/nrkno/tv-automation-server-core/commit/8b19269)) +- added pingWithCommand method, used by watchdog ([6f6427b](https://github.com/nrkno/tv-automation-server-core/commit/6f6427b)) +- Added publications for all running order data, and changed some interfaces ([2365fd2](https://github.com/nrkno/tv-automation-server-core/commit/2365fd2)) +- added support for typescript ([d3471b3](https://github.com/nrkno/tv-automation-server-core/commit/d3471b3)) +- added temporary deploy script ([244fb5b](https://github.com/nrkno/tv-automation-server-core/commit/244fb5b)) +- added test-data for testing and mocking ([b277c3c](https://github.com/nrkno/tv-automation-server-core/commit/b277c3c)) +- added tests stub ([edd4b6e](https://github.com/nrkno/tv-automation-server-core/commit/edd4b6e)) +- added Timeline data structure ([35ce6db](https://github.com/nrkno/tv-automation-server-core/commit/35ce6db)) +- added updateStoryStatus. The yellow line will only be driven when this is set to true ([c7ec8da](https://github.com/nrkno/tv-automation-server-core/commit/c7ec8da)) +- Adjust split box values ([680eb11](https://github.com/nrkno/tv-automation-server-core/commit/680eb11)) +- autonext property is defined on the current SegmentLine rather than the next ([09441db](https://github.com/nrkno/tv-automation-server-core/commit/09441db)) +- backup and restore show styles (including templates) through ui ([9758b2c](https://github.com/nrkno/tv-automation-server-core/commit/9758b2c)) +- Break nrk templates into seperate files. Parse KAM templates better ([2ec0433](https://github.com/nrkno/tv-automation-server-core/commit/2ec0433)) +- changed keyboard shortcuts ([ef02f7c](https://github.com/nrkno/tv-automation-server-core/commit/ef02f7c)) +- converted app.js to typescript and added an example subscription-implementation ([da439af](https://github.com/nrkno/tv-automation-server-core/commit/da439af)) +- expose moment to templates ([c2a1cc5](https://github.com/nrkno/tv-automation-server-core/commit/c2a1cc5)) +- externalMessages implementation (it works now) ([3b8e88a](https://github.com/nrkno/tv-automation-server-core/commit/3b8e88a)) +- full implementation of mos-functions, profile 0 & 2 ([4bafeeb](https://github.com/nrkno/tv-automation-server-core/commit/4bafeeb)) +- implemented mos profiles 0-2 ([d803da1](https://github.com/nrkno/tv-automation-server-core/commit/d803da1)) +- **timeline:** some initial work on labels taking account of liveline ([3086eec](https://github.com/nrkno/tv-automation-server-core/commit/3086eec)) +- Infinite segmentlineitem ([c02a641](https://github.com/nrkno/tv-automation-server-core/commit/c02a641)) +- initial implementation of externalMessages, (not working yet) ([ace91f1](https://github.com/nrkno/tv-automation-server-core/commit/ace91f1)) +- Initial timings for opening templates ([a9bfb66](https://github.com/nrkno/tv-automation-server-core/commit/a9bfb66)) +- Interfaces for describing the timeline, segments (titles), layers ([ea96dfb](https://github.com/nrkno/tv-automation-server-core/commit/ea96dfb)) +- **template:** use upstream keyer for vignett playback. Adds some more layers for atem defaults, and overrides to stack changes better ([76b1e10](https://github.com/nrkno/tv-automation-server-core/commit/76b1e10)) +- KAM SLUTT variant ([e819269](https://github.com/nrkno/tv-automation-server-core/commit/e819269)) +- Read all templates from database ([3287f63](https://github.com/nrkno/tv-automation-server-core/commit/3287f63)) +- rename /clock into /countdowns/presenter ([96c3136](https://github.com/nrkno/tv-automation-server-core/commit/96c3136)) +- set triggerValue to lawo-TimelineObjs, so it triggers upon Nexting ([e3df655](https://github.com/nrkno/tv-automation-server-core/commit/e3df655)) +- ShowStyle templates can be marked as helpers and accessed from other templates ([a20ffa7](https://github.com/nrkno/tv-automation-server-core/commit/a20ffa7)) +- Split (DVE 2LIKE) template ([8ccf23e](https://github.com/nrkno/tv-automation-server-core/commit/8ccf23e)) +- Start of stk and grafikk templates ([0458e3e](https://github.com/nrkno/tv-automation-server-core/commit/0458e3e)) +- started on mos device data implementation ([1d3b19a](https://github.com/nrkno/tv-automation-server-core/commit/1d3b19a)) +- started working on integration tests, added a client-side stub ([c4cbadc](https://github.com/nrkno/tv-automation-server-core/commit/c4cbadc)) +- StudioInstallation key-value config store for template settings ([b37ea17](https://github.com/nrkno/tv-automation-server-core/commit/b37ea17)) +- StudioInstallation key-value config store for template settings ([812c313](https://github.com/nrkno/tv-automation-server-core/commit/812c313)) +- **Capabilities:** Added basic Lawo and ATEM capabilities ([90d6edd](https://github.com/nrkno/tv-automation-server-core/commit/90d6edd)) +- **ENV:** adds ENV vars for default devices - casparcg, atem and lawo ([9bf8eee](https://github.com/nrkno/tv-automation-server-core/commit/9bf8eee)) +- use generated svg as icons in countdown ([843ad10](https://github.com/nrkno/tv-automation-server-core/commit/843ad10)) +- **lawo:** New structure to lawo devices and mappings ([35d812b](https://github.com/nrkno/tv-automation-server-core/commit/35d812b)) +- **loggin:** uses logger for better kibana logs ([8d31691](https://github.com/nrkno/tv-automation-server-core/commit/8d31691)) +- **peripheralDevices:** added collection, publication, api, access control and tests ([794b5be](https://github.com/nrkno/tv-automation-server-core/commit/794b5be)) +- **Setting:** adds lawo setting to studio and devices ([5ab1717](https://github.com/nrkno/tv-automation-server-core/commit/5ab1717)) +- timings page ([6bc325a](https://github.com/nrkno/tv-automation-server-core/commit/6bc325a)) +- Transition as a seperate SegmentLineItem, which is not run if the first SegmentLine in the show, or the previous SegmentLine instructs it to not ([e676a43](https://github.com/nrkno/tv-automation-server-core/commit/e676a43)) +- Update template to use correct media files and durations. Adjust transitions from head to kam ([18f6c44](https://github.com/nrkno/tv-automation-server-core/commit/18f6c44)) +- **template:** temporary env variable for nora group (MESOS_NORA_GROUP) ([8b00bc4](https://github.com/nrkno/tv-automation-server-core/commit/8b00bc4)) +- **Template doc:** Added CasparCG resources ([80f98d5](https://github.com/nrkno/tv-automation-server-core/commit/80f98d5)) +- **templates:** Use ShowStyle to define default/fallback state. Play and stop head supers ([8375363](https://github.com/nrkno/tv-automation-server-core/commit/8375363)) +- **Templates:** Start parsing some new mos data. Process mesos based graphics. Set some lawo audio states ([df4b670](https://github.com/nrkno/tv-automation-server-core/commit/df4b670)) -# 0.2.0 (2018-08-01) +# 0.2.0 (2018-08-01) ### Bug Fixes -* Add missing layers to initdb. Use readtime as possible duration of segmentline when calculating story length ([e388d63](https://github.com/nrkno/tv-automation-server-core/commit/e388d63)) -* added sorting of runtimeFunctions when generating backup, so diffing works ([17639a0](https://github.com/nrkno/tv-automation-server-core/commit/17639a0)) -* added sorting of runtimeFunctions when generating backup, so diffing works ([b3ba3f6](https://github.com/nrkno/tv-automation-server-core/commit/b3ba3f6)) -* allow timelineobjs to be declared as abstract, and always route those with the core_abstract layer ([9bfa6c4](https://github.com/nrkno/tv-automation-server-core/commit/9bfa6c4)) -* atem mappings ([8d4ea2d](https://github.com/nrkno/tv-automation-server-core/commit/8d4ea2d)) -* autoNext should update yellow line (it didn't) ([ff42a81](https://github.com/nrkno/tv-automation-server-core/commit/ff42a81)) -* baselineTemplates not being calculated correctly for showstyle ([e4799b4](https://github.com/nrkno/tv-automation-server-core/commit/e4799b4)) -* bind keydown for any keyup events to prevent their default behaviour ([83e42e4](https://github.com/nrkno/tv-automation-server-core/commit/83e42e4)) -* change lawo enum & interface ([3959761](https://github.com/nrkno/tv-automation-server-core/commit/3959761)) -* changed backup sorting to use templateId instead of _id ([d7047a5](https://github.com/nrkno/tv-automation-server-core/commit/d7047a5)) -* changed default chortcuts ([ba33bb7](https://github.com/nrkno/tv-automation-server-core/commit/ba33bb7)) -* changed header colors ([b9efc61](https://github.com/nrkno/tv-automation-server-core/commit/b9efc61)) -* changes attr. paths in lawo source objs ([55f8c7b](https://github.com/nrkno/tv-automation-server-core/commit/55f8c7b)) -* changes lawo mapping with the effects change ([dbe58fe](https://github.com/nrkno/tv-automation-server-core/commit/dbe58fe)) -* corrects the default baseline template ([bf4eb03](https://github.com/nrkno/tv-automation-server-core/commit/bf4eb03)) -* Ctrl-S in template editor triggers a save ([bacbc3e](https://github.com/nrkno/tv-automation-server-core/commit/bacbc3e)) -* device is first created as Abstract ([98dca79](https://github.com/nrkno/tv-automation-server-core/commit/98dca79)) -* dont set nora_* config values in initDB ([1330008](https://github.com/nrkno/tv-automation-server-core/commit/1330008)) -* Editattribute type typing ([392f4aa](https://github.com/nrkno/tv-automation-server-core/commit/392f4aa)) -* Editattribute type typing ([1206d0c](https://github.com/nrkno/tv-automation-server-core/commit/1206d0c)) -* Guard against there being no next segmentline ([849d97f](https://github.com/nrkno/tv-automation-server-core/commit/849d97f)) -* head mute audio and hold on last frame ([ceec7f6](https://github.com/nrkno/tv-automation-server-core/commit/ceec7f6)) -* incorrect typings for template editor ([9d021df](https://github.com/nrkno/tv-automation-server-core/commit/9d021df)) -* Increase size of template editor to make it better fill the screen ([3212d7b](https://github.com/nrkno/tv-automation-server-core/commit/3212d7b)) -* infinite segment line tidying and fixes ([8469ffb](https://github.com/nrkno/tv-automation-server-core/commit/8469ffb)) -* infinite segmentlines crossing an autonext throwing a duplicate key exception ([93b2a30](https://github.com/nrkno/tv-automation-server-core/commit/93b2a30)) -* keys should be handled at up, not down ([957f583](https://github.com/nrkno/tv-automation-server-core/commit/957f583)) -* made editor height dynamic ([c68ac4f](https://github.com/nrkno/tv-automation-server-core/commit/c68ac4f)) -* made editor height dynamic ([7f5f40e](https://github.com/nrkno/tv-automation-server-core/commit/7f5f40e)) -* Make the head to kam wipe not use the mosartVariant field. Correct the head order checking ([6030755](https://github.com/nrkno/tv-automation-server-core/commit/6030755)) -* new lawo source mappings ([20f7d5a](https://github.com/nrkno/tv-automation-server-core/commit/20f7d5a)) -* on startup, clear old connection statuses ([e9d7cba](https://github.com/nrkno/tv-automation-server-core/commit/e9d7cba)) -* Persist SegmentLine.updateStoryStatus ([427b24c](https://github.com/nrkno/tv-automation-server-core/commit/427b24c)) -* prevent default action for f1 & f3 ([53b2f22](https://github.com/nrkno/tv-automation-server-core/commit/53b2f22)) -* re-timing vignett ([17fbced](https://github.com/nrkno/tv-automation-server-core/commit/17fbced)) -* react errors while rendering nymansPlayground ([0c245d3](https://github.com/nrkno/tv-automation-server-core/commit/0c245d3)) -* React unique keys ([4f728d9](https://github.com/nrkno/tv-automation-server-core/commit/4f728d9)) -* removed autopublish and insecure packages, we'll implement publications and allow/deny rules from now on ([213998d](https://github.com/nrkno/tv-automation-server-core/commit/213998d)) -* removed ntp server debug code ([b9857e7](https://github.com/nrkno/tv-automation-server-core/commit/b9857e7)) -* Respect disableOutTransition on SegmentLine during manual takes (not just autonext) ([f19788d](https://github.com/nrkno/tv-automation-server-core/commit/f19788d)) -* Rundown name dissappearing from view ([91dcc21](https://github.com/nrkno/tv-automation-server-core/commit/91dcc21)) -* Set KAM source layer, and a probably incorrect duration (but its now non-zero) ([6e152f0](https://github.com/nrkno/tv-automation-server-core/commit/6e152f0)) -* sl prod init ([2ff4a46](https://github.com/nrkno/tv-automation-server-core/commit/2ff4a46)) -* Start on template for KAM ÅPNING ([4cd682f](https://github.com/nrkno/tv-automation-server-core/commit/4cd682f)) -* status colors ([46fdaf1](https://github.com/nrkno/tv-automation-server-core/commit/46fdaf1)) -* StudioInstallation key-value config tidying ([4b0bc1a](https://github.com/nrkno/tv-automation-server-core/commit/4b0bc1a)) -* templates with wipe. Readd seperate audio file ([5be2802](https://github.com/nrkno/tv-automation-server-core/commit/5be2802)) -* update all data in roReplaceMetadata ([8a5a671](https://github.com/nrkno/tv-automation-server-core/commit/8a5a671)) -* Update names passed to SegmentLineItems ([ed0fc0d](https://github.com/nrkno/tv-automation-server-core/commit/ed0fc0d)) -* updated versions file ([f6c9869](https://github.com/nrkno/tv-automation-server-core/commit/f6c9869)) -* use DisplayName field for graphic elements ([e2e9014](https://github.com/nrkno/tv-automation-server-core/commit/e2e9014)) -* use unique id for baseline items cache entries ([cf89409](https://github.com/nrkno/tv-automation-server-core/commit/cf89409)) -* **emberplus:** changes intiDB mapping to new .-delimited string format ([b6d8bc7](https://github.com/nrkno/tv-automation-server-core/commit/b6d8bc7)) -* **init:** Adds default lawo device settings ([28759df](https://github.com/nrkno/tv-automation-server-core/commit/28759df)) -* **Init:** Creat empty settings for Nora ([f8d0669](https://github.com/nrkno/tv-automation-server-core/commit/f8d0669)) -* **Init:** fixes wrong mapping of Lawo RMs ([ee68432](https://github.com/nrkno/tv-automation-server-core/commit/ee68432)) -* **Init:** Sets init defaults to xpro ([fd9c182](https://github.com/nrkno/tv-automation-server-core/commit/fd9c182)) -* **lawo:** changes tempaltes to new structure ([29bf666](https://github.com/nrkno/tv-automation-server-core/commit/29bf666)) -* **lawo:** more generic timeline object ([b0418ab](https://github.com/nrkno/tv-automation-server-core/commit/b0418ab)) -* **NRK Template:** Use LLayers Enum ([84ed5df](https://github.com/nrkno/tv-automation-server-core/commit/84ed5df)) -* **template:** Caspar portion of in-transition for segmentline rerun whenever timeline was recalculated ([3373457](https://github.com/nrkno/tv-automation-server-core/commit/3373457)) -* **template:** graphic supers group using wrong trigger. ([e28d1ef](https://github.com/nrkno/tv-automation-server-core/commit/e28d1ef)) -* **template:** Reduce volume of head wipes ([b2092cc](https://github.com/nrkno/tv-automation-server-core/commit/b2092cc)) -* **template:** setup dsk properly ([2e8309c](https://github.com/nrkno/tv-automation-server-core/commit/2e8309c)) -* **templates:** Fix incorrect camera number used with head transition. Hook in sluttvignett. Fix segments not respecting overlapduration if no transition is used ([00b7cdd](https://github.com/nrkno/tv-automation-server-core/commit/00b7cdd)) -* **templates:** use enum for nora channels ([55c0cfc](https://github.com/nrkno/tv-automation-server-core/commit/55c0cfc)) -* **templates:** Various tweaks ([eb93c6a](https://github.com/nrkno/tv-automation-server-core/commit/eb93c6a)) -* **Timeline:** Corrects the angle of the gradient indication mix-in-transition on a segmentLineItem ([151ecf9](https://github.com/nrkno/tv-automation-server-core/commit/151ecf9)) -* **transition:** reverses direction of wipe transitions ([9961a3f](https://github.com/nrkno/tv-automation-server-core/commit/9961a3f)) -* wrap ntpClient.getNetworkTime() in try/catch, as an attempt to fix fatal error thrown ([cd44862](https://github.com/nrkno/tv-automation-server-core/commit/cd44862)) - +- Add missing layers to initdb. Use readtime as possible duration of segmentline when calculating story length ([e388d63](https://github.com/nrkno/tv-automation-server-core/commit/e388d63)) +- added sorting of runtimeFunctions when generating backup, so diffing works ([17639a0](https://github.com/nrkno/tv-automation-server-core/commit/17639a0)) +- added sorting of runtimeFunctions when generating backup, so diffing works ([b3ba3f6](https://github.com/nrkno/tv-automation-server-core/commit/b3ba3f6)) +- allow timelineobjs to be declared as abstract, and always route those with the core_abstract layer ([9bfa6c4](https://github.com/nrkno/tv-automation-server-core/commit/9bfa6c4)) +- atem mappings ([8d4ea2d](https://github.com/nrkno/tv-automation-server-core/commit/8d4ea2d)) +- autoNext should update yellow line (it didn't) ([ff42a81](https://github.com/nrkno/tv-automation-server-core/commit/ff42a81)) +- baselineTemplates not being calculated correctly for showstyle ([e4799b4](https://github.com/nrkno/tv-automation-server-core/commit/e4799b4)) +- bind keydown for any keyup events to prevent their default behaviour ([83e42e4](https://github.com/nrkno/tv-automation-server-core/commit/83e42e4)) +- change lawo enum & interface ([3959761](https://github.com/nrkno/tv-automation-server-core/commit/3959761)) +- changed backup sorting to use templateId instead of \_id ([d7047a5](https://github.com/nrkno/tv-automation-server-core/commit/d7047a5)) +- changed default chortcuts ([ba33bb7](https://github.com/nrkno/tv-automation-server-core/commit/ba33bb7)) +- changed header colors ([b9efc61](https://github.com/nrkno/tv-automation-server-core/commit/b9efc61)) +- changes attr. paths in lawo source objs ([55f8c7b](https://github.com/nrkno/tv-automation-server-core/commit/55f8c7b)) +- changes lawo mapping with the effects change ([dbe58fe](https://github.com/nrkno/tv-automation-server-core/commit/dbe58fe)) +- corrects the default baseline template ([bf4eb03](https://github.com/nrkno/tv-automation-server-core/commit/bf4eb03)) +- Ctrl-S in template editor triggers a save ([bacbc3e](https://github.com/nrkno/tv-automation-server-core/commit/bacbc3e)) +- device is first created as Abstract ([98dca79](https://github.com/nrkno/tv-automation-server-core/commit/98dca79)) +- dont set nora\_\* config values in initDB ([1330008](https://github.com/nrkno/tv-automation-server-core/commit/1330008)) +- Editattribute type typing ([392f4aa](https://github.com/nrkno/tv-automation-server-core/commit/392f4aa)) +- Editattribute type typing ([1206d0c](https://github.com/nrkno/tv-automation-server-core/commit/1206d0c)) +- Guard against there being no next segmentline ([849d97f](https://github.com/nrkno/tv-automation-server-core/commit/849d97f)) +- head mute audio and hold on last frame ([ceec7f6](https://github.com/nrkno/tv-automation-server-core/commit/ceec7f6)) +- incorrect typings for template editor ([9d021df](https://github.com/nrkno/tv-automation-server-core/commit/9d021df)) +- Increase size of template editor to make it better fill the screen ([3212d7b](https://github.com/nrkno/tv-automation-server-core/commit/3212d7b)) +- infinite segment line tidying and fixes ([8469ffb](https://github.com/nrkno/tv-automation-server-core/commit/8469ffb)) +- infinite segmentlines crossing an autonext throwing a duplicate key exception ([93b2a30](https://github.com/nrkno/tv-automation-server-core/commit/93b2a30)) +- keys should be handled at up, not down ([957f583](https://github.com/nrkno/tv-automation-server-core/commit/957f583)) +- made editor height dynamic ([c68ac4f](https://github.com/nrkno/tv-automation-server-core/commit/c68ac4f)) +- made editor height dynamic ([7f5f40e](https://github.com/nrkno/tv-automation-server-core/commit/7f5f40e)) +- Make the head to kam wipe not use the mosartVariant field. Correct the head order checking ([6030755](https://github.com/nrkno/tv-automation-server-core/commit/6030755)) +- new lawo source mappings ([20f7d5a](https://github.com/nrkno/tv-automation-server-core/commit/20f7d5a)) +- on startup, clear old connection statuses ([e9d7cba](https://github.com/nrkno/tv-automation-server-core/commit/e9d7cba)) +- Persist SegmentLine.updateStoryStatus ([427b24c](https://github.com/nrkno/tv-automation-server-core/commit/427b24c)) +- prevent default action for f1 & f3 ([53b2f22](https://github.com/nrkno/tv-automation-server-core/commit/53b2f22)) +- re-timing vignett ([17fbced](https://github.com/nrkno/tv-automation-server-core/commit/17fbced)) +- react errors while rendering nymansPlayground ([0c245d3](https://github.com/nrkno/tv-automation-server-core/commit/0c245d3)) +- React unique keys ([4f728d9](https://github.com/nrkno/tv-automation-server-core/commit/4f728d9)) +- removed autopublish and insecure packages, we'll implement publications and allow/deny rules from now on ([213998d](https://github.com/nrkno/tv-automation-server-core/commit/213998d)) +- removed ntp server debug code ([b9857e7](https://github.com/nrkno/tv-automation-server-core/commit/b9857e7)) +- Respect disableOutTransition on SegmentLine during manual takes (not just autonext) ([f19788d](https://github.com/nrkno/tv-automation-server-core/commit/f19788d)) +- Rundown name dissappearing from view ([91dcc21](https://github.com/nrkno/tv-automation-server-core/commit/91dcc21)) +- Set KAM source layer, and a probably incorrect duration (but its now non-zero) ([6e152f0](https://github.com/nrkno/tv-automation-server-core/commit/6e152f0)) +- sl prod init ([2ff4a46](https://github.com/nrkno/tv-automation-server-core/commit/2ff4a46)) +- Start on template for KAM ÅPNING ([4cd682f](https://github.com/nrkno/tv-automation-server-core/commit/4cd682f)) +- status colors ([46fdaf1](https://github.com/nrkno/tv-automation-server-core/commit/46fdaf1)) +- StudioInstallation key-value config tidying ([4b0bc1a](https://github.com/nrkno/tv-automation-server-core/commit/4b0bc1a)) +- templates with wipe. Readd seperate audio file ([5be2802](https://github.com/nrkno/tv-automation-server-core/commit/5be2802)) +- update all data in roReplaceMetadata ([8a5a671](https://github.com/nrkno/tv-automation-server-core/commit/8a5a671)) +- Update names passed to SegmentLineItems ([ed0fc0d](https://github.com/nrkno/tv-automation-server-core/commit/ed0fc0d)) +- updated versions file ([f6c9869](https://github.com/nrkno/tv-automation-server-core/commit/f6c9869)) +- use DisplayName field for graphic elements ([e2e9014](https://github.com/nrkno/tv-automation-server-core/commit/e2e9014)) +- use unique id for baseline items cache entries ([cf89409](https://github.com/nrkno/tv-automation-server-core/commit/cf89409)) +- **emberplus:** changes intiDB mapping to new .-delimited string format ([b6d8bc7](https://github.com/nrkno/tv-automation-server-core/commit/b6d8bc7)) +- **init:** Adds default lawo device settings ([28759df](https://github.com/nrkno/tv-automation-server-core/commit/28759df)) +- **Init:** Creat empty settings for Nora ([f8d0669](https://github.com/nrkno/tv-automation-server-core/commit/f8d0669)) +- **Init:** fixes wrong mapping of Lawo RMs ([ee68432](https://github.com/nrkno/tv-automation-server-core/commit/ee68432)) +- **Init:** Sets init defaults to xpro ([fd9c182](https://github.com/nrkno/tv-automation-server-core/commit/fd9c182)) +- **lawo:** changes tempaltes to new structure ([29bf666](https://github.com/nrkno/tv-automation-server-core/commit/29bf666)) +- **lawo:** more generic timeline object ([b0418ab](https://github.com/nrkno/tv-automation-server-core/commit/b0418ab)) +- **NRK Template:** Use LLayers Enum ([84ed5df](https://github.com/nrkno/tv-automation-server-core/commit/84ed5df)) +- **template:** Caspar portion of in-transition for segmentline rerun whenever timeline was recalculated ([3373457](https://github.com/nrkno/tv-automation-server-core/commit/3373457)) +- **template:** graphic supers group using wrong trigger. ([e28d1ef](https://github.com/nrkno/tv-automation-server-core/commit/e28d1ef)) +- **template:** Reduce volume of head wipes ([b2092cc](https://github.com/nrkno/tv-automation-server-core/commit/b2092cc)) +- **template:** setup dsk properly ([2e8309c](https://github.com/nrkno/tv-automation-server-core/commit/2e8309c)) +- **templates:** Fix incorrect camera number used with head transition. Hook in sluttvignett. Fix segments not respecting overlapduration if no transition is used ([00b7cdd](https://github.com/nrkno/tv-automation-server-core/commit/00b7cdd)) +- **templates:** use enum for nora channels ([55c0cfc](https://github.com/nrkno/tv-automation-server-core/commit/55c0cfc)) +- **templates:** Various tweaks ([eb93c6a](https://github.com/nrkno/tv-automation-server-core/commit/eb93c6a)) +- **Timeline:** Corrects the angle of the gradient indication mix-in-transition on a segmentLineItem ([151ecf9](https://github.com/nrkno/tv-automation-server-core/commit/151ecf9)) +- **transition:** reverses direction of wipe transitions ([9961a3f](https://github.com/nrkno/tv-automation-server-core/commit/9961a3f)) +- wrap ntpClient.getNetworkTime() in try/catch, as an attempt to fix fatal error thrown ([cd44862](https://github.com/nrkno/tv-automation-server-core/commit/cd44862)) ### Features -* Add backup link to backup only active template data ([cdfffdf](https://github.com/nrkno/tv-automation-server-core/commit/cdfffdf)) -* Add http put request timeline object ([14f391c](https://github.com/nrkno/tv-automation-server-core/commit/14f391c)) -* Add runHelper method to template context ([ebc477a](https://github.com/nrkno/tv-automation-server-core/commit/ebc477a)) -* Add running order name to top of run page ([674c392](https://github.com/nrkno/tv-automation-server-core/commit/674c392)) -* **template:** setup atem wipe transition ([f0c576c](https://github.com/nrkno/tv-automation-server-core/commit/f0c576c)) -* Add SegmentLineItem.infiniteMode value for items which are infinite within the SegmentLine ([e99c661](https://github.com/nrkno/tv-automation-server-core/commit/e99c661)) -* Add some new template config data for sources information ([3e48508](https://github.com/nrkno/tv-automation-server-core/commit/3e48508)) -* added client-side logging wrapper ([06597be](https://github.com/nrkno/tv-automation-server-core/commit/06597be)) -* added connection status of peripheralDevices ([c0e0a94](https://github.com/nrkno/tv-automation-server-core/commit/c0e0a94)) -* Added dynamic template context ([0ea4849](https://github.com/nrkno/tv-automation-server-core/commit/0ea4849)) -* added indexes for all collections ([6ef324c](https://github.com/nrkno/tv-automation-server-core/commit/6ef324c)) -* added kill process buttons to device status UI ([6fdab68](https://github.com/nrkno/tv-automation-server-core/commit/6fdab68)) -* added killProcess method, to be used by integration tests of gateways in closed environments ([7f2b42c](https://github.com/nrkno/tv-automation-server-core/commit/7f2b42c)) -* added MeteorReactComponent, which exposes subscribe & autorun, which will stop automatically on component unmount ([cf11808](https://github.com/nrkno/tv-automation-server-core/commit/cf11808)) -* added name and type to peripheralDevice ([915c518](https://github.com/nrkno/tv-automation-server-core/commit/915c518)) -* added packages: mocha and typescript ([8b19269](https://github.com/nrkno/tv-automation-server-core/commit/8b19269)) -* added pingWithCommand method, used by watchdog ([6f6427b](https://github.com/nrkno/tv-automation-server-core/commit/6f6427b)) -* Added publications for all running order data, and changed some interfaces ([2365fd2](https://github.com/nrkno/tv-automation-server-core/commit/2365fd2)) -* added support for typescript ([d3471b3](https://github.com/nrkno/tv-automation-server-core/commit/d3471b3)) -* added temporary deploy script ([244fb5b](https://github.com/nrkno/tv-automation-server-core/commit/244fb5b)) -* added test-data for testing and mocking ([b277c3c](https://github.com/nrkno/tv-automation-server-core/commit/b277c3c)) -* added tests stub ([edd4b6e](https://github.com/nrkno/tv-automation-server-core/commit/edd4b6e)) -* added Timeline data structure ([35ce6db](https://github.com/nrkno/tv-automation-server-core/commit/35ce6db)) -* added updateStoryStatus. The yellow line will only be driven when this is set to true ([c7ec8da](https://github.com/nrkno/tv-automation-server-core/commit/c7ec8da)) -* Adjust split box values ([680eb11](https://github.com/nrkno/tv-automation-server-core/commit/680eb11)) -* autonext property is defined on the current SegmentLine rather than the next ([09441db](https://github.com/nrkno/tv-automation-server-core/commit/09441db)) -* backup and restore show styles (including templates) through ui ([9758b2c](https://github.com/nrkno/tv-automation-server-core/commit/9758b2c)) -* Break nrk templates into seperate files. Parse KAM templates better ([2ec0433](https://github.com/nrkno/tv-automation-server-core/commit/2ec0433)) -* changed keyboard shortcuts ([ef02f7c](https://github.com/nrkno/tv-automation-server-core/commit/ef02f7c)) -* converted app.js to typescript and added an example subscription-implementation ([da439af](https://github.com/nrkno/tv-automation-server-core/commit/da439af)) -* expose moment to templates ([c2a1cc5](https://github.com/nrkno/tv-automation-server-core/commit/c2a1cc5)) -* externalMessages implementation (it works now) ([3b8e88a](https://github.com/nrkno/tv-automation-server-core/commit/3b8e88a)) -* full implementation of mos-functions, profile 0 & 2 ([4bafeeb](https://github.com/nrkno/tv-automation-server-core/commit/4bafeeb)) -* implemented mos profiles 0-2 ([d803da1](https://github.com/nrkno/tv-automation-server-core/commit/d803da1)) -* **timeline:** some initial work on labels taking account of liveline ([3086eec](https://github.com/nrkno/tv-automation-server-core/commit/3086eec)) -* Infinite segmentlineitem ([c02a641](https://github.com/nrkno/tv-automation-server-core/commit/c02a641)) -* initial implementation of externalMessages, (not working yet) ([ace91f1](https://github.com/nrkno/tv-automation-server-core/commit/ace91f1)) -* Initial timings for opening templates ([a9bfb66](https://github.com/nrkno/tv-automation-server-core/commit/a9bfb66)) -* Interfaces for describing the timeline, segments (titles), layers ([ea96dfb](https://github.com/nrkno/tv-automation-server-core/commit/ea96dfb)) -* **template:** use upstream keyer for vignett playback. Adds some more layers for atem defaults, and overrides to stack changes better ([76b1e10](https://github.com/nrkno/tv-automation-server-core/commit/76b1e10)) -* KAM SLUTT variant ([e819269](https://github.com/nrkno/tv-automation-server-core/commit/e819269)) -* Read all templates from database ([3287f63](https://github.com/nrkno/tv-automation-server-core/commit/3287f63)) -* rename /clock into /countdowns/presenter ([96c3136](https://github.com/nrkno/tv-automation-server-core/commit/96c3136)) -* set triggerValue to lawo-TimelineObjs, so it triggers upon Nexting ([e3df655](https://github.com/nrkno/tv-automation-server-core/commit/e3df655)) -* ShowStyle templates can be marked as helpers and accessed from other templates ([a20ffa7](https://github.com/nrkno/tv-automation-server-core/commit/a20ffa7)) -* Split (DVE 2LIKE) template ([8ccf23e](https://github.com/nrkno/tv-automation-server-core/commit/8ccf23e)) -* Start of stk and grafikk templates ([0458e3e](https://github.com/nrkno/tv-automation-server-core/commit/0458e3e)) -* started on mos device data implementation ([1d3b19a](https://github.com/nrkno/tv-automation-server-core/commit/1d3b19a)) -* started working on integration tests, added a client-side stub ([c4cbadc](https://github.com/nrkno/tv-automation-server-core/commit/c4cbadc)) -* StudioInstallation key-value config store for template settings ([b37ea17](https://github.com/nrkno/tv-automation-server-core/commit/b37ea17)) -* StudioInstallation key-value config store for template settings ([812c313](https://github.com/nrkno/tv-automation-server-core/commit/812c313)) -* **Capabilities:** Added basic Lawo and ATEM capabilities ([90d6edd](https://github.com/nrkno/tv-automation-server-core/commit/90d6edd)) -* **ENV:** adds ENV vars for default devices - casparcg, atem and lawo ([9bf8eee](https://github.com/nrkno/tv-automation-server-core/commit/9bf8eee)) -* use generated svg as icons in countdown ([843ad10](https://github.com/nrkno/tv-automation-server-core/commit/843ad10)) -* **lawo:** New structure to lawo devices and mappings ([35d812b](https://github.com/nrkno/tv-automation-server-core/commit/35d812b)) -* **loggin:** uses logger for better kibana logs ([8d31691](https://github.com/nrkno/tv-automation-server-core/commit/8d31691)) -* **peripheralDevices:** added collection, publication, api, access control and tests ([794b5be](https://github.com/nrkno/tv-automation-server-core/commit/794b5be)) -* **Setting:** adds lawo setting to studio and devices ([5ab1717](https://github.com/nrkno/tv-automation-server-core/commit/5ab1717)) -* timings page ([6bc325a](https://github.com/nrkno/tv-automation-server-core/commit/6bc325a)) -* Transition as a seperate SegmentLineItem, which is not run if the first SegmentLine in the show, or the previous SegmentLine instructs it to not ([e676a43](https://github.com/nrkno/tv-automation-server-core/commit/e676a43)) -* Update template to use correct media files and durations. Adjust transitions from head to kam ([18f6c44](https://github.com/nrkno/tv-automation-server-core/commit/18f6c44)) -* **template:** temporary env variable for nora group (MESOS_NORA_GROUP) ([8b00bc4](https://github.com/nrkno/tv-automation-server-core/commit/8b00bc4)) -* **Template doc:** Added CasparCG resources ([80f98d5](https://github.com/nrkno/tv-automation-server-core/commit/80f98d5)) -* **templates:** Use ShowStyle to define default/fallback state. Play and stop head supers ([8375363](https://github.com/nrkno/tv-automation-server-core/commit/8375363)) -* **Templates:** Start parsing some new mos data. Process mesos based graphics. Set some lawo audio states ([df4b670](https://github.com/nrkno/tv-automation-server-core/commit/df4b670)) - - +- Add backup link to backup only active template data ([cdfffdf](https://github.com/nrkno/tv-automation-server-core/commit/cdfffdf)) +- Add http put request timeline object ([14f391c](https://github.com/nrkno/tv-automation-server-core/commit/14f391c)) +- Add runHelper method to template context ([ebc477a](https://github.com/nrkno/tv-automation-server-core/commit/ebc477a)) +- Add running order name to top of run page ([674c392](https://github.com/nrkno/tv-automation-server-core/commit/674c392)) +- **template:** setup atem wipe transition ([f0c576c](https://github.com/nrkno/tv-automation-server-core/commit/f0c576c)) +- Add SegmentLineItem.infiniteMode value for items which are infinite within the SegmentLine ([e99c661](https://github.com/nrkno/tv-automation-server-core/commit/e99c661)) +- Add some new template config data for sources information ([3e48508](https://github.com/nrkno/tv-automation-server-core/commit/3e48508)) +- added client-side logging wrapper ([06597be](https://github.com/nrkno/tv-automation-server-core/commit/06597be)) +- added connection status of peripheralDevices ([c0e0a94](https://github.com/nrkno/tv-automation-server-core/commit/c0e0a94)) +- Added dynamic template context ([0ea4849](https://github.com/nrkno/tv-automation-server-core/commit/0ea4849)) +- added indexes for all collections ([6ef324c](https://github.com/nrkno/tv-automation-server-core/commit/6ef324c)) +- added kill process buttons to device status UI ([6fdab68](https://github.com/nrkno/tv-automation-server-core/commit/6fdab68)) +- added killProcess method, to be used by integration tests of gateways in closed environments ([7f2b42c](https://github.com/nrkno/tv-automation-server-core/commit/7f2b42c)) +- added MeteorReactComponent, which exposes subscribe & autorun, which will stop automatically on component unmount ([cf11808](https://github.com/nrkno/tv-automation-server-core/commit/cf11808)) +- added name and type to peripheralDevice ([915c518](https://github.com/nrkno/tv-automation-server-core/commit/915c518)) +- added packages: mocha and typescript ([8b19269](https://github.com/nrkno/tv-automation-server-core/commit/8b19269)) +- added pingWithCommand method, used by watchdog ([6f6427b](https://github.com/nrkno/tv-automation-server-core/commit/6f6427b)) +- Added publications for all running order data, and changed some interfaces ([2365fd2](https://github.com/nrkno/tv-automation-server-core/commit/2365fd2)) +- added support for typescript ([d3471b3](https://github.com/nrkno/tv-automation-server-core/commit/d3471b3)) +- added temporary deploy script ([244fb5b](https://github.com/nrkno/tv-automation-server-core/commit/244fb5b)) +- added test-data for testing and mocking ([b277c3c](https://github.com/nrkno/tv-automation-server-core/commit/b277c3c)) +- added tests stub ([edd4b6e](https://github.com/nrkno/tv-automation-server-core/commit/edd4b6e)) +- added Timeline data structure ([35ce6db](https://github.com/nrkno/tv-automation-server-core/commit/35ce6db)) +- added updateStoryStatus. The yellow line will only be driven when this is set to true ([c7ec8da](https://github.com/nrkno/tv-automation-server-core/commit/c7ec8da)) +- Adjust split box values ([680eb11](https://github.com/nrkno/tv-automation-server-core/commit/680eb11)) +- autonext property is defined on the current SegmentLine rather than the next ([09441db](https://github.com/nrkno/tv-automation-server-core/commit/09441db)) +- backup and restore show styles (including templates) through ui ([9758b2c](https://github.com/nrkno/tv-automation-server-core/commit/9758b2c)) +- Break nrk templates into seperate files. Parse KAM templates better ([2ec0433](https://github.com/nrkno/tv-automation-server-core/commit/2ec0433)) +- changed keyboard shortcuts ([ef02f7c](https://github.com/nrkno/tv-automation-server-core/commit/ef02f7c)) +- converted app.js to typescript and added an example subscription-implementation ([da439af](https://github.com/nrkno/tv-automation-server-core/commit/da439af)) +- expose moment to templates ([c2a1cc5](https://github.com/nrkno/tv-automation-server-core/commit/c2a1cc5)) +- externalMessages implementation (it works now) ([3b8e88a](https://github.com/nrkno/tv-automation-server-core/commit/3b8e88a)) +- full implementation of mos-functions, profile 0 & 2 ([4bafeeb](https://github.com/nrkno/tv-automation-server-core/commit/4bafeeb)) +- implemented mos profiles 0-2 ([d803da1](https://github.com/nrkno/tv-automation-server-core/commit/d803da1)) +- **timeline:** some initial work on labels taking account of liveline ([3086eec](https://github.com/nrkno/tv-automation-server-core/commit/3086eec)) +- Infinite segmentlineitem ([c02a641](https://github.com/nrkno/tv-automation-server-core/commit/c02a641)) +- initial implementation of externalMessages, (not working yet) ([ace91f1](https://github.com/nrkno/tv-automation-server-core/commit/ace91f1)) +- Initial timings for opening templates ([a9bfb66](https://github.com/nrkno/tv-automation-server-core/commit/a9bfb66)) +- Interfaces for describing the timeline, segments (titles), layers ([ea96dfb](https://github.com/nrkno/tv-automation-server-core/commit/ea96dfb)) +- **template:** use upstream keyer for vignett playback. Adds some more layers for atem defaults, and overrides to stack changes better ([76b1e10](https://github.com/nrkno/tv-automation-server-core/commit/76b1e10)) +- KAM SLUTT variant ([e819269](https://github.com/nrkno/tv-automation-server-core/commit/e819269)) +- Read all templates from database ([3287f63](https://github.com/nrkno/tv-automation-server-core/commit/3287f63)) +- rename /clock into /countdowns/presenter ([96c3136](https://github.com/nrkno/tv-automation-server-core/commit/96c3136)) +- set triggerValue to lawo-TimelineObjs, so it triggers upon Nexting ([e3df655](https://github.com/nrkno/tv-automation-server-core/commit/e3df655)) +- ShowStyle templates can be marked as helpers and accessed from other templates ([a20ffa7](https://github.com/nrkno/tv-automation-server-core/commit/a20ffa7)) +- Split (DVE 2LIKE) template ([8ccf23e](https://github.com/nrkno/tv-automation-server-core/commit/8ccf23e)) +- Start of stk and grafikk templates ([0458e3e](https://github.com/nrkno/tv-automation-server-core/commit/0458e3e)) +- started on mos device data implementation ([1d3b19a](https://github.com/nrkno/tv-automation-server-core/commit/1d3b19a)) +- started working on integration tests, added a client-side stub ([c4cbadc](https://github.com/nrkno/tv-automation-server-core/commit/c4cbadc)) +- StudioInstallation key-value config store for template settings ([b37ea17](https://github.com/nrkno/tv-automation-server-core/commit/b37ea17)) +- StudioInstallation key-value config store for template settings ([812c313](https://github.com/nrkno/tv-automation-server-core/commit/812c313)) +- **Capabilities:** Added basic Lawo and ATEM capabilities ([90d6edd](https://github.com/nrkno/tv-automation-server-core/commit/90d6edd)) +- **ENV:** adds ENV vars for default devices - casparcg, atem and lawo ([9bf8eee](https://github.com/nrkno/tv-automation-server-core/commit/9bf8eee)) +- use generated svg as icons in countdown ([843ad10](https://github.com/nrkno/tv-automation-server-core/commit/843ad10)) +- **lawo:** New structure to lawo devices and mappings ([35d812b](https://github.com/nrkno/tv-automation-server-core/commit/35d812b)) +- **loggin:** uses logger for better kibana logs ([8d31691](https://github.com/nrkno/tv-automation-server-core/commit/8d31691)) +- **peripheralDevices:** added collection, publication, api, access control and tests ([794b5be](https://github.com/nrkno/tv-automation-server-core/commit/794b5be)) +- **Setting:** adds lawo setting to studio and devices ([5ab1717](https://github.com/nrkno/tv-automation-server-core/commit/5ab1717)) +- timings page ([6bc325a](https://github.com/nrkno/tv-automation-server-core/commit/6bc325a)) +- Transition as a seperate SegmentLineItem, which is not run if the first SegmentLine in the show, or the previous SegmentLine instructs it to not ([e676a43](https://github.com/nrkno/tv-automation-server-core/commit/e676a43)) +- Update template to use correct media files and durations. Adjust transitions from head to kam ([18f6c44](https://github.com/nrkno/tv-automation-server-core/commit/18f6c44)) +- **template:** temporary env variable for nora group (MESOS_NORA_GROUP) ([8b00bc4](https://github.com/nrkno/tv-automation-server-core/commit/8b00bc4)) +- **Template doc:** Added CasparCG resources ([80f98d5](https://github.com/nrkno/tv-automation-server-core/commit/80f98d5)) +- **templates:** Use ShowStyle to define default/fallback state. Play and stop head supers ([8375363](https://github.com/nrkno/tv-automation-server-core/commit/8375363)) +- **Templates:** Start parsing some new mos data. Process mesos based graphics. Set some lawo audio states ([df4b670](https://github.com/nrkno/tv-automation-server-core/commit/df4b670)) -# 0.1.0 (2018-08-01) +# 0.1.0 (2018-08-01) ### Bug Fixes -* Add missing layers to initdb. Use readtime as possible duration of segmentline when calculating story length ([e388d63](https://github.com/nrkno/tv-automation-server-core/commit/e388d63)) -* added sorting of runtimeFunctions when generating backup, so diffing works ([17639a0](https://github.com/nrkno/tv-automation-server-core/commit/17639a0)) -* added sorting of runtimeFunctions when generating backup, so diffing works ([b3ba3f6](https://github.com/nrkno/tv-automation-server-core/commit/b3ba3f6)) -* allow timelineobjs to be declared as abstract, and always route those with the core_abstract layer ([9bfa6c4](https://github.com/nrkno/tv-automation-server-core/commit/9bfa6c4)) -* atem mappings ([8d4ea2d](https://github.com/nrkno/tv-automation-server-core/commit/8d4ea2d)) -* autoNext should update yellow line (it didn't) ([ff42a81](https://github.com/nrkno/tv-automation-server-core/commit/ff42a81)) -* baselineTemplates not being calculated correctly for showstyle ([e4799b4](https://github.com/nrkno/tv-automation-server-core/commit/e4799b4)) -* bind keydown for any keyup events to prevent their default behaviour ([83e42e4](https://github.com/nrkno/tv-automation-server-core/commit/83e42e4)) -* change lawo enum & interface ([3959761](https://github.com/nrkno/tv-automation-server-core/commit/3959761)) -* changed backup sorting to use templateId instead of _id ([d7047a5](https://github.com/nrkno/tv-automation-server-core/commit/d7047a5)) -* changed default chortcuts ([ba33bb7](https://github.com/nrkno/tv-automation-server-core/commit/ba33bb7)) -* changed header colors ([b9efc61](https://github.com/nrkno/tv-automation-server-core/commit/b9efc61)) -* changes attr. paths in lawo source objs ([55f8c7b](https://github.com/nrkno/tv-automation-server-core/commit/55f8c7b)) -* changes lawo mapping with the effects change ([dbe58fe](https://github.com/nrkno/tv-automation-server-core/commit/dbe58fe)) -* corrects the default baseline template ([bf4eb03](https://github.com/nrkno/tv-automation-server-core/commit/bf4eb03)) -* Ctrl-S in template editor triggers a save ([bacbc3e](https://github.com/nrkno/tv-automation-server-core/commit/bacbc3e)) -* device is first created as Abstract ([98dca79](https://github.com/nrkno/tv-automation-server-core/commit/98dca79)) -* dont set nora_* config values in initDB ([1330008](https://github.com/nrkno/tv-automation-server-core/commit/1330008)) -* Editattribute type typing ([392f4aa](https://github.com/nrkno/tv-automation-server-core/commit/392f4aa)) -* Editattribute type typing ([1206d0c](https://github.com/nrkno/tv-automation-server-core/commit/1206d0c)) -* Guard against there being no next segmentline ([849d97f](https://github.com/nrkno/tv-automation-server-core/commit/849d97f)) -* head mute audio and hold on last frame ([ceec7f6](https://github.com/nrkno/tv-automation-server-core/commit/ceec7f6)) -* incorrect typings for template editor ([9d021df](https://github.com/nrkno/tv-automation-server-core/commit/9d021df)) -* Increase size of template editor to make it better fill the screen ([3212d7b](https://github.com/nrkno/tv-automation-server-core/commit/3212d7b)) -* infinite segment line tidying and fixes ([8469ffb](https://github.com/nrkno/tv-automation-server-core/commit/8469ffb)) -* infinite segmentlines crossing an autonext throwing a duplicate key exception ([93b2a30](https://github.com/nrkno/tv-automation-server-core/commit/93b2a30)) -* keys should be handled at up, not down ([957f583](https://github.com/nrkno/tv-automation-server-core/commit/957f583)) -* made editor height dynamic ([c68ac4f](https://github.com/nrkno/tv-automation-server-core/commit/c68ac4f)) -* made editor height dynamic ([7f5f40e](https://github.com/nrkno/tv-automation-server-core/commit/7f5f40e)) -* Make the head to kam wipe not use the mosartVariant field. Correct the head order checking ([6030755](https://github.com/nrkno/tv-automation-server-core/commit/6030755)) -* new lawo source mappings ([20f7d5a](https://github.com/nrkno/tv-automation-server-core/commit/20f7d5a)) -* on startup, clear old connection statuses ([e9d7cba](https://github.com/nrkno/tv-automation-server-core/commit/e9d7cba)) -* Persist SegmentLine.updateStoryStatus ([427b24c](https://github.com/nrkno/tv-automation-server-core/commit/427b24c)) -* prevent default action for f1 & f3 ([53b2f22](https://github.com/nrkno/tv-automation-server-core/commit/53b2f22)) -* re-timing vignett ([17fbced](https://github.com/nrkno/tv-automation-server-core/commit/17fbced)) -* react errors while rendering nymansPlayground ([0c245d3](https://github.com/nrkno/tv-automation-server-core/commit/0c245d3)) -* React unique keys ([4f728d9](https://github.com/nrkno/tv-automation-server-core/commit/4f728d9)) -* removed autopublish and insecure packages, we'll implement publications and allow/deny rules from now on ([213998d](https://github.com/nrkno/tv-automation-server-core/commit/213998d)) -* removed ntp server debug code ([b9857e7](https://github.com/nrkno/tv-automation-server-core/commit/b9857e7)) -* Respect disableOutTransition on SegmentLine during manual takes (not just autonext) ([f19788d](https://github.com/nrkno/tv-automation-server-core/commit/f19788d)) -* Rundown name dissappearing from view ([91dcc21](https://github.com/nrkno/tv-automation-server-core/commit/91dcc21)) -* Set KAM source layer, and a probably incorrect duration (but its now non-zero) ([6e152f0](https://github.com/nrkno/tv-automation-server-core/commit/6e152f0)) -* sl prod init ([2ff4a46](https://github.com/nrkno/tv-automation-server-core/commit/2ff4a46)) -* Start on template for KAM ÅPNING ([4cd682f](https://github.com/nrkno/tv-automation-server-core/commit/4cd682f)) -* status colors ([46fdaf1](https://github.com/nrkno/tv-automation-server-core/commit/46fdaf1)) -* StudioInstallation key-value config tidying ([4b0bc1a](https://github.com/nrkno/tv-automation-server-core/commit/4b0bc1a)) -* templates with wipe. Readd seperate audio file ([5be2802](https://github.com/nrkno/tv-automation-server-core/commit/5be2802)) -* update all data in roReplaceMetadata ([8a5a671](https://github.com/nrkno/tv-automation-server-core/commit/8a5a671)) -* Update names passed to SegmentLineItems ([ed0fc0d](https://github.com/nrkno/tv-automation-server-core/commit/ed0fc0d)) -* updated versions file ([f6c9869](https://github.com/nrkno/tv-automation-server-core/commit/f6c9869)) -* use DisplayName field for graphic elements ([e2e9014](https://github.com/nrkno/tv-automation-server-core/commit/e2e9014)) -* use unique id for baseline items cache entries ([cf89409](https://github.com/nrkno/tv-automation-server-core/commit/cf89409)) -* **emberplus:** changes intiDB mapping to new .-delimited string format ([b6d8bc7](https://github.com/nrkno/tv-automation-server-core/commit/b6d8bc7)) -* **init:** Adds default lawo device settings ([28759df](https://github.com/nrkno/tv-automation-server-core/commit/28759df)) -* **Init:** Creat empty settings for Nora ([f8d0669](https://github.com/nrkno/tv-automation-server-core/commit/f8d0669)) -* **Init:** fixes wrong mapping of Lawo RMs ([ee68432](https://github.com/nrkno/tv-automation-server-core/commit/ee68432)) -* **Init:** Sets init defaults to xpro ([fd9c182](https://github.com/nrkno/tv-automation-server-core/commit/fd9c182)) -* **lawo:** changes tempaltes to new structure ([29bf666](https://github.com/nrkno/tv-automation-server-core/commit/29bf666)) -* **lawo:** more generic timeline object ([b0418ab](https://github.com/nrkno/tv-automation-server-core/commit/b0418ab)) -* **NRK Template:** Use LLayers Enum ([84ed5df](https://github.com/nrkno/tv-automation-server-core/commit/84ed5df)) -* **template:** Caspar portion of in-transition for segmentline rerun whenever timeline was recalculated ([3373457](https://github.com/nrkno/tv-automation-server-core/commit/3373457)) -* **template:** graphic supers group using wrong trigger. ([e28d1ef](https://github.com/nrkno/tv-automation-server-core/commit/e28d1ef)) -* **template:** Reduce volume of head wipes ([b2092cc](https://github.com/nrkno/tv-automation-server-core/commit/b2092cc)) -* **template:** setup dsk properly ([2e8309c](https://github.com/nrkno/tv-automation-server-core/commit/2e8309c)) -* **templates:** Fix incorrect camera number used with head transition. Hook in sluttvignett. Fix segments not respecting overlapduration if no transition is used ([00b7cdd](https://github.com/nrkno/tv-automation-server-core/commit/00b7cdd)) -* **templates:** use enum for nora channels ([55c0cfc](https://github.com/nrkno/tv-automation-server-core/commit/55c0cfc)) -* **templates:** Various tweaks ([eb93c6a](https://github.com/nrkno/tv-automation-server-core/commit/eb93c6a)) -* **Timeline:** Corrects the angle of the gradient indication mix-in-transition on a segmentLineItem ([151ecf9](https://github.com/nrkno/tv-automation-server-core/commit/151ecf9)) -* **transition:** reverses direction of wipe transitions ([9961a3f](https://github.com/nrkno/tv-automation-server-core/commit/9961a3f)) -* wrap ntpClient.getNetworkTime() in try/catch, as an attempt to fix fatal error thrown ([cd44862](https://github.com/nrkno/tv-automation-server-core/commit/cd44862)) - +- Add missing layers to initdb. Use readtime as possible duration of segmentline when calculating story length ([e388d63](https://github.com/nrkno/tv-automation-server-core/commit/e388d63)) +- added sorting of runtimeFunctions when generating backup, so diffing works ([17639a0](https://github.com/nrkno/tv-automation-server-core/commit/17639a0)) +- added sorting of runtimeFunctions when generating backup, so diffing works ([b3ba3f6](https://github.com/nrkno/tv-automation-server-core/commit/b3ba3f6)) +- allow timelineobjs to be declared as abstract, and always route those with the core_abstract layer ([9bfa6c4](https://github.com/nrkno/tv-automation-server-core/commit/9bfa6c4)) +- atem mappings ([8d4ea2d](https://github.com/nrkno/tv-automation-server-core/commit/8d4ea2d)) +- autoNext should update yellow line (it didn't) ([ff42a81](https://github.com/nrkno/tv-automation-server-core/commit/ff42a81)) +- baselineTemplates not being calculated correctly for showstyle ([e4799b4](https://github.com/nrkno/tv-automation-server-core/commit/e4799b4)) +- bind keydown for any keyup events to prevent their default behaviour ([83e42e4](https://github.com/nrkno/tv-automation-server-core/commit/83e42e4)) +- change lawo enum & interface ([3959761](https://github.com/nrkno/tv-automation-server-core/commit/3959761)) +- changed backup sorting to use templateId instead of \_id ([d7047a5](https://github.com/nrkno/tv-automation-server-core/commit/d7047a5)) +- changed default chortcuts ([ba33bb7](https://github.com/nrkno/tv-automation-server-core/commit/ba33bb7)) +- changed header colors ([b9efc61](https://github.com/nrkno/tv-automation-server-core/commit/b9efc61)) +- changes attr. paths in lawo source objs ([55f8c7b](https://github.com/nrkno/tv-automation-server-core/commit/55f8c7b)) +- changes lawo mapping with the effects change ([dbe58fe](https://github.com/nrkno/tv-automation-server-core/commit/dbe58fe)) +- corrects the default baseline template ([bf4eb03](https://github.com/nrkno/tv-automation-server-core/commit/bf4eb03)) +- Ctrl-S in template editor triggers a save ([bacbc3e](https://github.com/nrkno/tv-automation-server-core/commit/bacbc3e)) +- device is first created as Abstract ([98dca79](https://github.com/nrkno/tv-automation-server-core/commit/98dca79)) +- dont set nora\_\* config values in initDB ([1330008](https://github.com/nrkno/tv-automation-server-core/commit/1330008)) +- Editattribute type typing ([392f4aa](https://github.com/nrkno/tv-automation-server-core/commit/392f4aa)) +- Editattribute type typing ([1206d0c](https://github.com/nrkno/tv-automation-server-core/commit/1206d0c)) +- Guard against there being no next segmentline ([849d97f](https://github.com/nrkno/tv-automation-server-core/commit/849d97f)) +- head mute audio and hold on last frame ([ceec7f6](https://github.com/nrkno/tv-automation-server-core/commit/ceec7f6)) +- incorrect typings for template editor ([9d021df](https://github.com/nrkno/tv-automation-server-core/commit/9d021df)) +- Increase size of template editor to make it better fill the screen ([3212d7b](https://github.com/nrkno/tv-automation-server-core/commit/3212d7b)) +- infinite segment line tidying and fixes ([8469ffb](https://github.com/nrkno/tv-automation-server-core/commit/8469ffb)) +- infinite segmentlines crossing an autonext throwing a duplicate key exception ([93b2a30](https://github.com/nrkno/tv-automation-server-core/commit/93b2a30)) +- keys should be handled at up, not down ([957f583](https://github.com/nrkno/tv-automation-server-core/commit/957f583)) +- made editor height dynamic ([c68ac4f](https://github.com/nrkno/tv-automation-server-core/commit/c68ac4f)) +- made editor height dynamic ([7f5f40e](https://github.com/nrkno/tv-automation-server-core/commit/7f5f40e)) +- Make the head to kam wipe not use the mosartVariant field. Correct the head order checking ([6030755](https://github.com/nrkno/tv-automation-server-core/commit/6030755)) +- new lawo source mappings ([20f7d5a](https://github.com/nrkno/tv-automation-server-core/commit/20f7d5a)) +- on startup, clear old connection statuses ([e9d7cba](https://github.com/nrkno/tv-automation-server-core/commit/e9d7cba)) +- Persist SegmentLine.updateStoryStatus ([427b24c](https://github.com/nrkno/tv-automation-server-core/commit/427b24c)) +- prevent default action for f1 & f3 ([53b2f22](https://github.com/nrkno/tv-automation-server-core/commit/53b2f22)) +- re-timing vignett ([17fbced](https://github.com/nrkno/tv-automation-server-core/commit/17fbced)) +- react errors while rendering nymansPlayground ([0c245d3](https://github.com/nrkno/tv-automation-server-core/commit/0c245d3)) +- React unique keys ([4f728d9](https://github.com/nrkno/tv-automation-server-core/commit/4f728d9)) +- removed autopublish and insecure packages, we'll implement publications and allow/deny rules from now on ([213998d](https://github.com/nrkno/tv-automation-server-core/commit/213998d)) +- removed ntp server debug code ([b9857e7](https://github.com/nrkno/tv-automation-server-core/commit/b9857e7)) +- Respect disableOutTransition on SegmentLine during manual takes (not just autonext) ([f19788d](https://github.com/nrkno/tv-automation-server-core/commit/f19788d)) +- Rundown name dissappearing from view ([91dcc21](https://github.com/nrkno/tv-automation-server-core/commit/91dcc21)) +- Set KAM source layer, and a probably incorrect duration (but its now non-zero) ([6e152f0](https://github.com/nrkno/tv-automation-server-core/commit/6e152f0)) +- sl prod init ([2ff4a46](https://github.com/nrkno/tv-automation-server-core/commit/2ff4a46)) +- Start on template for KAM ÅPNING ([4cd682f](https://github.com/nrkno/tv-automation-server-core/commit/4cd682f)) +- status colors ([46fdaf1](https://github.com/nrkno/tv-automation-server-core/commit/46fdaf1)) +- StudioInstallation key-value config tidying ([4b0bc1a](https://github.com/nrkno/tv-automation-server-core/commit/4b0bc1a)) +- templates with wipe. Readd seperate audio file ([5be2802](https://github.com/nrkno/tv-automation-server-core/commit/5be2802)) +- update all data in roReplaceMetadata ([8a5a671](https://github.com/nrkno/tv-automation-server-core/commit/8a5a671)) +- Update names passed to SegmentLineItems ([ed0fc0d](https://github.com/nrkno/tv-automation-server-core/commit/ed0fc0d)) +- updated versions file ([f6c9869](https://github.com/nrkno/tv-automation-server-core/commit/f6c9869)) +- use DisplayName field for graphic elements ([e2e9014](https://github.com/nrkno/tv-automation-server-core/commit/e2e9014)) +- use unique id for baseline items cache entries ([cf89409](https://github.com/nrkno/tv-automation-server-core/commit/cf89409)) +- **emberplus:** changes intiDB mapping to new .-delimited string format ([b6d8bc7](https://github.com/nrkno/tv-automation-server-core/commit/b6d8bc7)) +- **init:** Adds default lawo device settings ([28759df](https://github.com/nrkno/tv-automation-server-core/commit/28759df)) +- **Init:** Creat empty settings for Nora ([f8d0669](https://github.com/nrkno/tv-automation-server-core/commit/f8d0669)) +- **Init:** fixes wrong mapping of Lawo RMs ([ee68432](https://github.com/nrkno/tv-automation-server-core/commit/ee68432)) +- **Init:** Sets init defaults to xpro ([fd9c182](https://github.com/nrkno/tv-automation-server-core/commit/fd9c182)) +- **lawo:** changes tempaltes to new structure ([29bf666](https://github.com/nrkno/tv-automation-server-core/commit/29bf666)) +- **lawo:** more generic timeline object ([b0418ab](https://github.com/nrkno/tv-automation-server-core/commit/b0418ab)) +- **NRK Template:** Use LLayers Enum ([84ed5df](https://github.com/nrkno/tv-automation-server-core/commit/84ed5df)) +- **template:** Caspar portion of in-transition for segmentline rerun whenever timeline was recalculated ([3373457](https://github.com/nrkno/tv-automation-server-core/commit/3373457)) +- **template:** graphic supers group using wrong trigger. ([e28d1ef](https://github.com/nrkno/tv-automation-server-core/commit/e28d1ef)) +- **template:** Reduce volume of head wipes ([b2092cc](https://github.com/nrkno/tv-automation-server-core/commit/b2092cc)) +- **template:** setup dsk properly ([2e8309c](https://github.com/nrkno/tv-automation-server-core/commit/2e8309c)) +- **templates:** Fix incorrect camera number used with head transition. Hook in sluttvignett. Fix segments not respecting overlapduration if no transition is used ([00b7cdd](https://github.com/nrkno/tv-automation-server-core/commit/00b7cdd)) +- **templates:** use enum for nora channels ([55c0cfc](https://github.com/nrkno/tv-automation-server-core/commit/55c0cfc)) +- **templates:** Various tweaks ([eb93c6a](https://github.com/nrkno/tv-automation-server-core/commit/eb93c6a)) +- **Timeline:** Corrects the angle of the gradient indication mix-in-transition on a segmentLineItem ([151ecf9](https://github.com/nrkno/tv-automation-server-core/commit/151ecf9)) +- **transition:** reverses direction of wipe transitions ([9961a3f](https://github.com/nrkno/tv-automation-server-core/commit/9961a3f)) +- wrap ntpClient.getNetworkTime() in try/catch, as an attempt to fix fatal error thrown ([cd44862](https://github.com/nrkno/tv-automation-server-core/commit/cd44862)) ### Features -* Add backup link to backup only active template data ([cdfffdf](https://github.com/nrkno/tv-automation-server-core/commit/cdfffdf)) -* Add http put request timeline object ([14f391c](https://github.com/nrkno/tv-automation-server-core/commit/14f391c)) -* Add runHelper method to template context ([ebc477a](https://github.com/nrkno/tv-automation-server-core/commit/ebc477a)) -* Add running order name to top of run page ([674c392](https://github.com/nrkno/tv-automation-server-core/commit/674c392)) -* **template:** setup atem wipe transition ([f0c576c](https://github.com/nrkno/tv-automation-server-core/commit/f0c576c)) -* Add SegmentLineItem.infiniteMode value for items which are infinite within the SegmentLine ([e99c661](https://github.com/nrkno/tv-automation-server-core/commit/e99c661)) -* Add some new template config data for sources information ([3e48508](https://github.com/nrkno/tv-automation-server-core/commit/3e48508)) -* added client-side logging wrapper ([06597be](https://github.com/nrkno/tv-automation-server-core/commit/06597be)) -* added connection status of peripheralDevices ([c0e0a94](https://github.com/nrkno/tv-automation-server-core/commit/c0e0a94)) -* Added dynamic template context ([0ea4849](https://github.com/nrkno/tv-automation-server-core/commit/0ea4849)) -* added indexes for all collections ([6ef324c](https://github.com/nrkno/tv-automation-server-core/commit/6ef324c)) -* added kill process buttons to device status UI ([6fdab68](https://github.com/nrkno/tv-automation-server-core/commit/6fdab68)) -* added killProcess method, to be used by integration tests of gateways in closed environments ([7f2b42c](https://github.com/nrkno/tv-automation-server-core/commit/7f2b42c)) -* added MeteorReactComponent, which exposes subscribe & autorun, which will stop automatically on component unmount ([cf11808](https://github.com/nrkno/tv-automation-server-core/commit/cf11808)) -* added name and type to peripheralDevice ([915c518](https://github.com/nrkno/tv-automation-server-core/commit/915c518)) -* added packages: mocha and typescript ([8b19269](https://github.com/nrkno/tv-automation-server-core/commit/8b19269)) -* added pingWithCommand method, used by watchdog ([6f6427b](https://github.com/nrkno/tv-automation-server-core/commit/6f6427b)) -* Added publications for all running order data, and changed some interfaces ([2365fd2](https://github.com/nrkno/tv-automation-server-core/commit/2365fd2)) -* added support for typescript ([d3471b3](https://github.com/nrkno/tv-automation-server-core/commit/d3471b3)) -* added temporary deploy script ([244fb5b](https://github.com/nrkno/tv-automation-server-core/commit/244fb5b)) -* added test-data for testing and mocking ([b277c3c](https://github.com/nrkno/tv-automation-server-core/commit/b277c3c)) -* added tests stub ([edd4b6e](https://github.com/nrkno/tv-automation-server-core/commit/edd4b6e)) -* added Timeline data structure ([35ce6db](https://github.com/nrkno/tv-automation-server-core/commit/35ce6db)) -* added updateStoryStatus. The yellow line will only be driven when this is set to true ([c7ec8da](https://github.com/nrkno/tv-automation-server-core/commit/c7ec8da)) -* Adjust split box values ([680eb11](https://github.com/nrkno/tv-automation-server-core/commit/680eb11)) -* autonext property is defined on the current SegmentLine rather than the next ([09441db](https://github.com/nrkno/tv-automation-server-core/commit/09441db)) -* backup and restore show styles (including templates) through ui ([9758b2c](https://github.com/nrkno/tv-automation-server-core/commit/9758b2c)) -* Break nrk templates into seperate files. Parse KAM templates better ([2ec0433](https://github.com/nrkno/tv-automation-server-core/commit/2ec0433)) -* changed keyboard shortcuts ([ef02f7c](https://github.com/nrkno/tv-automation-server-core/commit/ef02f7c)) -* converted app.js to typescript and added an example subscription-implementation ([da439af](https://github.com/nrkno/tv-automation-server-core/commit/da439af)) -* expose moment to templates ([c2a1cc5](https://github.com/nrkno/tv-automation-server-core/commit/c2a1cc5)) -* externalMessages implementation (it works now) ([3b8e88a](https://github.com/nrkno/tv-automation-server-core/commit/3b8e88a)) -* full implementation of mos-functions, profile 0 & 2 ([4bafeeb](https://github.com/nrkno/tv-automation-server-core/commit/4bafeeb)) -* implemented mos profiles 0-2 ([d803da1](https://github.com/nrkno/tv-automation-server-core/commit/d803da1)) -* **timeline:** some initial work on labels taking account of liveline ([3086eec](https://github.com/nrkno/tv-automation-server-core/commit/3086eec)) -* Infinite segmentlineitem ([c02a641](https://github.com/nrkno/tv-automation-server-core/commit/c02a641)) -* initial implementation of externalMessages, (not working yet) ([ace91f1](https://github.com/nrkno/tv-automation-server-core/commit/ace91f1)) -* Initial timings for opening templates ([a9bfb66](https://github.com/nrkno/tv-automation-server-core/commit/a9bfb66)) -* Interfaces for describing the timeline, segments (titles), layers ([ea96dfb](https://github.com/nrkno/tv-automation-server-core/commit/ea96dfb)) -* **template:** use upstream keyer for vignett playback. Adds some more layers for atem defaults, and overrides to stack changes better ([76b1e10](https://github.com/nrkno/tv-automation-server-core/commit/76b1e10)) -* KAM SLUTT variant ([e819269](https://github.com/nrkno/tv-automation-server-core/commit/e819269)) -* Read all templates from database ([3287f63](https://github.com/nrkno/tv-automation-server-core/commit/3287f63)) -* rename /clock into /countdowns/presenter ([96c3136](https://github.com/nrkno/tv-automation-server-core/commit/96c3136)) -* set triggerValue to lawo-TimelineObjs, so it triggers upon Nexting ([e3df655](https://github.com/nrkno/tv-automation-server-core/commit/e3df655)) -* ShowStyle templates can be marked as helpers and accessed from other templates ([a20ffa7](https://github.com/nrkno/tv-automation-server-core/commit/a20ffa7)) -* Split (DVE 2LIKE) template ([8ccf23e](https://github.com/nrkno/tv-automation-server-core/commit/8ccf23e)) -* Start of stk and grafikk templates ([0458e3e](https://github.com/nrkno/tv-automation-server-core/commit/0458e3e)) -* started on mos device data implementation ([1d3b19a](https://github.com/nrkno/tv-automation-server-core/commit/1d3b19a)) -* started working on integration tests, added a client-side stub ([c4cbadc](https://github.com/nrkno/tv-automation-server-core/commit/c4cbadc)) -* StudioInstallation key-value config store for template settings ([b37ea17](https://github.com/nrkno/tv-automation-server-core/commit/b37ea17)) -* StudioInstallation key-value config store for template settings ([812c313](https://github.com/nrkno/tv-automation-server-core/commit/812c313)) -* **Capabilities:** Added basic Lawo and ATEM capabilities ([90d6edd](https://github.com/nrkno/tv-automation-server-core/commit/90d6edd)) -* **ENV:** adds ENV vars for default devices - casparcg, atem and lawo ([9bf8eee](https://github.com/nrkno/tv-automation-server-core/commit/9bf8eee)) -* use generated svg as icons in countdown ([843ad10](https://github.com/nrkno/tv-automation-server-core/commit/843ad10)) -* **lawo:** New structure to lawo devices and mappings ([35d812b](https://github.com/nrkno/tv-automation-server-core/commit/35d812b)) -* **loggin:** uses logger for better kibana logs ([8d31691](https://github.com/nrkno/tv-automation-server-core/commit/8d31691)) -* **peripheralDevices:** added collection, publication, api, access control and tests ([794b5be](https://github.com/nrkno/tv-automation-server-core/commit/794b5be)) -* **Setting:** adds lawo setting to studio and devices ([5ab1717](https://github.com/nrkno/tv-automation-server-core/commit/5ab1717)) -* timings page ([6bc325a](https://github.com/nrkno/tv-automation-server-core/commit/6bc325a)) -* Transition as a seperate SegmentLineItem, which is not run if the first SegmentLine in the show, or the previous SegmentLine instructs it to not ([e676a43](https://github.com/nrkno/tv-automation-server-core/commit/e676a43)) -* Update template to use correct media files and durations. Adjust transitions from head to kam ([18f6c44](https://github.com/nrkno/tv-automation-server-core/commit/18f6c44)) -* **template:** temporary env variable for nora group (MESOS_NORA_GROUP) ([8b00bc4](https://github.com/nrkno/tv-automation-server-core/commit/8b00bc4)) -* **Template doc:** Added CasparCG resources ([80f98d5](https://github.com/nrkno/tv-automation-server-core/commit/80f98d5)) -* **templates:** Use ShowStyle to define default/fallback state. Play and stop head supers ([8375363](https://github.com/nrkno/tv-automation-server-core/commit/8375363)) -* **Templates:** Start parsing some new mos data. Process mesos based graphics. Set some lawo audio states ([df4b670](https://github.com/nrkno/tv-automation-server-core/commit/df4b670)) +- Add backup link to backup only active template data ([cdfffdf](https://github.com/nrkno/tv-automation-server-core/commit/cdfffdf)) +- Add http put request timeline object ([14f391c](https://github.com/nrkno/tv-automation-server-core/commit/14f391c)) +- Add runHelper method to template context ([ebc477a](https://github.com/nrkno/tv-automation-server-core/commit/ebc477a)) +- Add running order name to top of run page ([674c392](https://github.com/nrkno/tv-automation-server-core/commit/674c392)) +- **template:** setup atem wipe transition ([f0c576c](https://github.com/nrkno/tv-automation-server-core/commit/f0c576c)) +- Add SegmentLineItem.infiniteMode value for items which are infinite within the SegmentLine ([e99c661](https://github.com/nrkno/tv-automation-server-core/commit/e99c661)) +- Add some new template config data for sources information ([3e48508](https://github.com/nrkno/tv-automation-server-core/commit/3e48508)) +- added client-side logging wrapper ([06597be](https://github.com/nrkno/tv-automation-server-core/commit/06597be)) +- added connection status of peripheralDevices ([c0e0a94](https://github.com/nrkno/tv-automation-server-core/commit/c0e0a94)) +- Added dynamic template context ([0ea4849](https://github.com/nrkno/tv-automation-server-core/commit/0ea4849)) +- added indexes for all collections ([6ef324c](https://github.com/nrkno/tv-automation-server-core/commit/6ef324c)) +- added kill process buttons to device status UI ([6fdab68](https://github.com/nrkno/tv-automation-server-core/commit/6fdab68)) +- added killProcess method, to be used by integration tests of gateways in closed environments ([7f2b42c](https://github.com/nrkno/tv-automation-server-core/commit/7f2b42c)) +- added MeteorReactComponent, which exposes subscribe & autorun, which will stop automatically on component unmount ([cf11808](https://github.com/nrkno/tv-automation-server-core/commit/cf11808)) +- added name and type to peripheralDevice ([915c518](https://github.com/nrkno/tv-automation-server-core/commit/915c518)) +- added packages: mocha and typescript ([8b19269](https://github.com/nrkno/tv-automation-server-core/commit/8b19269)) +- added pingWithCommand method, used by watchdog ([6f6427b](https://github.com/nrkno/tv-automation-server-core/commit/6f6427b)) +- Added publications for all running order data, and changed some interfaces ([2365fd2](https://github.com/nrkno/tv-automation-server-core/commit/2365fd2)) +- added support for typescript ([d3471b3](https://github.com/nrkno/tv-automation-server-core/commit/d3471b3)) +- added temporary deploy script ([244fb5b](https://github.com/nrkno/tv-automation-server-core/commit/244fb5b)) +- added test-data for testing and mocking ([b277c3c](https://github.com/nrkno/tv-automation-server-core/commit/b277c3c)) +- added tests stub ([edd4b6e](https://github.com/nrkno/tv-automation-server-core/commit/edd4b6e)) +- added Timeline data structure ([35ce6db](https://github.com/nrkno/tv-automation-server-core/commit/35ce6db)) +- added updateStoryStatus. The yellow line will only be driven when this is set to true ([c7ec8da](https://github.com/nrkno/tv-automation-server-core/commit/c7ec8da)) +- Adjust split box values ([680eb11](https://github.com/nrkno/tv-automation-server-core/commit/680eb11)) +- autonext property is defined on the current SegmentLine rather than the next ([09441db](https://github.com/nrkno/tv-automation-server-core/commit/09441db)) +- backup and restore show styles (including templates) through ui ([9758b2c](https://github.com/nrkno/tv-automation-server-core/commit/9758b2c)) +- Break nrk templates into seperate files. Parse KAM templates better ([2ec0433](https://github.com/nrkno/tv-automation-server-core/commit/2ec0433)) +- changed keyboard shortcuts ([ef02f7c](https://github.com/nrkno/tv-automation-server-core/commit/ef02f7c)) +- converted app.js to typescript and added an example subscription-implementation ([da439af](https://github.com/nrkno/tv-automation-server-core/commit/da439af)) +- expose moment to templates ([c2a1cc5](https://github.com/nrkno/tv-automation-server-core/commit/c2a1cc5)) +- externalMessages implementation (it works now) ([3b8e88a](https://github.com/nrkno/tv-automation-server-core/commit/3b8e88a)) +- full implementation of mos-functions, profile 0 & 2 ([4bafeeb](https://github.com/nrkno/tv-automation-server-core/commit/4bafeeb)) +- implemented mos profiles 0-2 ([d803da1](https://github.com/nrkno/tv-automation-server-core/commit/d803da1)) +- **timeline:** some initial work on labels taking account of liveline ([3086eec](https://github.com/nrkno/tv-automation-server-core/commit/3086eec)) +- Infinite segmentlineitem ([c02a641](https://github.com/nrkno/tv-automation-server-core/commit/c02a641)) +- initial implementation of externalMessages, (not working yet) ([ace91f1](https://github.com/nrkno/tv-automation-server-core/commit/ace91f1)) +- Initial timings for opening templates ([a9bfb66](https://github.com/nrkno/tv-automation-server-core/commit/a9bfb66)) +- Interfaces for describing the timeline, segments (titles), layers ([ea96dfb](https://github.com/nrkno/tv-automation-server-core/commit/ea96dfb)) +- **template:** use upstream keyer for vignett playback. Adds some more layers for atem defaults, and overrides to stack changes better ([76b1e10](https://github.com/nrkno/tv-automation-server-core/commit/76b1e10)) +- KAM SLUTT variant ([e819269](https://github.com/nrkno/tv-automation-server-core/commit/e819269)) +- Read all templates from database ([3287f63](https://github.com/nrkno/tv-automation-server-core/commit/3287f63)) +- rename /clock into /countdowns/presenter ([96c3136](https://github.com/nrkno/tv-automation-server-core/commit/96c3136)) +- set triggerValue to lawo-TimelineObjs, so it triggers upon Nexting ([e3df655](https://github.com/nrkno/tv-automation-server-core/commit/e3df655)) +- ShowStyle templates can be marked as helpers and accessed from other templates ([a20ffa7](https://github.com/nrkno/tv-automation-server-core/commit/a20ffa7)) +- Split (DVE 2LIKE) template ([8ccf23e](https://github.com/nrkno/tv-automation-server-core/commit/8ccf23e)) +- Start of stk and grafikk templates ([0458e3e](https://github.com/nrkno/tv-automation-server-core/commit/0458e3e)) +- started on mos device data implementation ([1d3b19a](https://github.com/nrkno/tv-automation-server-core/commit/1d3b19a)) +- started working on integration tests, added a client-side stub ([c4cbadc](https://github.com/nrkno/tv-automation-server-core/commit/c4cbadc)) +- StudioInstallation key-value config store for template settings ([b37ea17](https://github.com/nrkno/tv-automation-server-core/commit/b37ea17)) +- StudioInstallation key-value config store for template settings ([812c313](https://github.com/nrkno/tv-automation-server-core/commit/812c313)) +- **Capabilities:** Added basic Lawo and ATEM capabilities ([90d6edd](https://github.com/nrkno/tv-automation-server-core/commit/90d6edd)) +- **ENV:** adds ENV vars for default devices - casparcg, atem and lawo ([9bf8eee](https://github.com/nrkno/tv-automation-server-core/commit/9bf8eee)) +- use generated svg as icons in countdown ([843ad10](https://github.com/nrkno/tv-automation-server-core/commit/843ad10)) +- **lawo:** New structure to lawo devices and mappings ([35d812b](https://github.com/nrkno/tv-automation-server-core/commit/35d812b)) +- **loggin:** uses logger for better kibana logs ([8d31691](https://github.com/nrkno/tv-automation-server-core/commit/8d31691)) +- **peripheralDevices:** added collection, publication, api, access control and tests ([794b5be](https://github.com/nrkno/tv-automation-server-core/commit/794b5be)) +- **Setting:** adds lawo setting to studio and devices ([5ab1717](https://github.com/nrkno/tv-automation-server-core/commit/5ab1717)) +- timings page ([6bc325a](https://github.com/nrkno/tv-automation-server-core/commit/6bc325a)) +- Transition as a seperate SegmentLineItem, which is not run if the first SegmentLine in the show, or the previous SegmentLine instructs it to not ([e676a43](https://github.com/nrkno/tv-automation-server-core/commit/e676a43)) +- Update template to use correct media files and durations. Adjust transitions from head to kam ([18f6c44](https://github.com/nrkno/tv-automation-server-core/commit/18f6c44)) +- **template:** temporary env variable for nora group (MESOS_NORA_GROUP) ([8b00bc4](https://github.com/nrkno/tv-automation-server-core/commit/8b00bc4)) +- **Template doc:** Added CasparCG resources ([80f98d5](https://github.com/nrkno/tv-automation-server-core/commit/80f98d5)) +- **templates:** Use ShowStyle to define default/fallback state. Play and stop head supers ([8375363](https://github.com/nrkno/tv-automation-server-core/commit/8375363)) +- **Templates:** Start parsing some new mos data. Process mesos based graphics. Set some lawo audio states ([df4b670](https://github.com/nrkno/tv-automation-server-core/commit/df4b670)) diff --git a/meteor/Dockerfile b/meteor/Dockerfile index 1d4641382b..7d49bc3e2f 100644 --- a/meteor/Dockerfile +++ b/meteor/Dockerfile @@ -15,7 +15,7 @@ RUN yarn install && yarn build # BUILD IMAGE FROM node:22 -RUN curl "https://install.meteor.com/?release=3.1" | sh +RUN curl "https://install.meteor.com/?release=3.1.2" | sh # Temporary change the NODE_ENV env variable, so that all libraries are installed: ENV NODE_ENV_TMP $NODE_ENV @@ -30,6 +30,8 @@ COPY meteor /opt/core/meteor COPY scripts /opt/core/scripts WORKDIR /opt/core/meteor +# remove the dev only assets from the webui output +RUN rm -Rf /opt/core/packages/webui/dist/dev # move the webui to the correct place RUN rm -Rf /opt/core/meteor/public RUN cp -R /opt/core/packages/webui/dist /opt/core/meteor/public @@ -60,4 +62,4 @@ COPY meteor/docker-entrypoint.sh /opt WORKDIR /opt/core/ RUN chown -R 1000:1000 /opt/core USER 1000 -CMD ["/opt/docker-entrypoint.sh"] +ENTRYPOINT ["/opt/docker-entrypoint.sh"] diff --git a/meteor/Dockerfile.circle b/meteor/Dockerfile.circle index d377806afb..d9bc8cd995 100644 --- a/meteor/Dockerfile.circle +++ b/meteor/Dockerfile.circle @@ -8,4 +8,4 @@ COPY meteor/docker-entrypoint.sh /opt WORKDIR /opt/core RUN chown -R 1000:1000 /opt/core USER 1000 -CMD ["/opt/docker-entrypoint.sh"] +ENTRYPOINT ["/opt/docker-entrypoint.sh"] diff --git a/meteor/__mocks__/_extendJest.ts b/meteor/__mocks__/_extendJest.ts index 68bead0d24..4a0add48a3 100644 --- a/meteor/__mocks__/_extendJest.ts +++ b/meteor/__mocks__/_extendJest.ts @@ -42,7 +42,7 @@ expect.extend({ received = received.error } - if (UserError.isUserError(received)) { + if (received instanceof UserError) { const expected = UserError.create(msg, args) const received2 = clone(received) @@ -68,10 +68,11 @@ expect.extend({ received = received.error } - if (UserError.isUserError(received)) { - const pass = !!received.rawError.toString().match(regexp) + if (UserError.isSerializedUserErrorObject(received)) { + received = UserError.fromUnknown(received) + const pass = !!received.toString().match(regexp) return { - message: () => `expected ${received} to match ${regexp}`, + message: () => `expected ${stringifyError(received)} to match ${regexp}`, pass: pass, } } else { diff --git a/meteor/__mocks__/_setupMocks.ts b/meteor/__mocks__/_setupMocks.ts index b9e7936792..8cf580f95d 100644 --- a/meteor/__mocks__/_setupMocks.ts +++ b/meteor/__mocks__/_setupMocks.ts @@ -39,3 +39,6 @@ afterEach(() => { // Expect all log messages that have been explicitly supressed, to have been handled: SupressLogMessages.expectAllMessagesToHaveBeenHandled() }) + +// @ts-expect-error mock meteor runtime config +global.__meteor_runtime_config__ = {} diff --git a/meteor/__mocks__/check/isPlainObject.js b/meteor/__mocks__/check/isPlainObject.js index babeeac32d..da4c647d79 100644 --- a/meteor/__mocks__/check/isPlainObject.js +++ b/meteor/__mocks__/check/isPlainObject.js @@ -2,6 +2,7 @@ var class2type = {} +// eslint-disable-next-line no-redeclare var toString = class2type.toString var hasOwn = class2type.hasOwnProperty diff --git a/meteor/__mocks__/check/match.js b/meteor/__mocks__/check/match.js index 29cf17a69b..7ef1495c34 100644 --- a/meteor/__mocks__/check/match.js +++ b/meteor/__mocks__/check/match.js @@ -554,7 +554,7 @@ var isArguments = baseIsArguments( ? baseIsArguments : function (value) { return isObject(value) && typeof value.callee === 'function' - } + } module.exports = { check, diff --git a/meteor/__mocks__/helpers/database.ts b/meteor/__mocks__/helpers/database.ts index ea62db5c5b..e19ea399e3 100644 --- a/meteor/__mocks__/helpers/database.ts +++ b/meteor/__mocks__/helpers/database.ts @@ -1,4 +1,4 @@ -import * as _ from 'underscore' +import _ from 'underscore' import { PeripheralDevice, PeripheralDeviceType, @@ -401,7 +401,15 @@ export async function setupMockStudioBlueprint( const blueprintId: BlueprintId = protectString('mockBlueprint' + dbI++) const blueprintName = 'mockBlueprint' - return internalUploadBlueprint(blueprintId, code, blueprintName, true, organizationId) + return internalUploadBlueprint( + blueprintId, + code, + { + blueprintName, + ignoreIdChange: true, + }, + organizationId + ) } export async function setupMockShowStyleBlueprint( showStyleVariantId: ShowStyleVariantId, @@ -532,7 +540,15 @@ export async function setupMockShowStyleBlueprint( const blueprintId: BlueprintId = protectString('mockBlueprint' + dbI++) const blueprintName = 'mockBlueprint' - return internalUploadBlueprint(blueprintId, code, blueprintName, true, organizationId) + return internalUploadBlueprint( + blueprintId, + code, + { + blueprintName, + ignoreIdChange: true, + }, + organizationId + ) } export interface DefaultEnvironment { showStyleBaseId: ShowStyleBaseId diff --git a/meteor/__mocks__/helpers/jest.ts b/meteor/__mocks__/helpers/jest.ts index 1ed979896d..ebdbadc3e6 100644 --- a/meteor/__mocks__/helpers/jest.ts +++ b/meteor/__mocks__/helpers/jest.ts @@ -41,7 +41,6 @@ export async function waitUntil(expectFcn: () => void | Promise, maxWaitTi const iterateInterval = maxWaitTime < 100 ? 10 : 100 const startTime = Date.now() - // eslint-disable-next-line no-constant-condition while (true) { await waitTime(iterateInterval) try { diff --git a/meteor/__mocks__/helpers/lib.ts b/meteor/__mocks__/helpers/lib.ts index 06b0adc241..d7166ae97b 100644 --- a/meteor/__mocks__/helpers/lib.ts +++ b/meteor/__mocks__/helpers/lib.ts @@ -1,4 +1,4 @@ -import * as _ from 'underscore' +import _ from 'underscore' import { LogLevel, ProtectedString } from '../../server/lib/tempLib' import { AsyncOnlyMongoCollection } from '../../server/collections/collection' import { getLogLevel, setLogLevel } from '../../server/logging' diff --git a/meteor/__mocks__/meteor.ts b/meteor/__mocks__/meteor.ts index 593eab34c4..c281e4b35b 100644 --- a/meteor/__mocks__/meteor.ts +++ b/meteor/__mocks__/meteor.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-unsafe-function-type, @typescript-eslint/only-throw-error */ import { USER_PERMISSIONS_HEADER } from '@sofie-automation/meteor-lib/dist/userPermissions' let controllableDefer = false @@ -110,7 +111,10 @@ export namespace MeteorMock { } export class Error { private _stack?: string - constructor(public error: number, public reason?: string) { + constructor( + public error: number, + public reason?: string + ) { const e = new $.Error('') let stack: string = e.stack || '' diff --git a/meteor/__mocks__/mongo.ts b/meteor/__mocks__/mongo.ts index fdd2074222..adebfb4f25 100644 --- a/meteor/__mocks__/mongo.ts +++ b/meteor/__mocks__/mongo.ts @@ -1,5 +1,6 @@ +/* eslint-disable @typescript-eslint/only-throw-error */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -import * as _ from 'underscore' +import _ from 'underscore' import { literal, ProtectedString, unprotectString, protectString, getRandomString } from '../server/lib/tempLib' import { RandomMock } from './random' import { MeteorMock } from './meteor' @@ -22,7 +23,7 @@ import type { MinimalMeteorMongoCollection, MinimalMongoCursor, } from '../server/collections/implementations/asyncCollection' -const clone = require('fast-clone') +import clone from 'fast-clone' export namespace MongoMock { interface ObserverEntry { diff --git a/meteor/__mocks__/suppressLogging.ts b/meteor/__mocks__/suppressLogging.ts index a50865afe7..83457c42b7 100644 --- a/meteor/__mocks__/suppressLogging.ts +++ b/meteor/__mocks__/suppressLogging.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-unsafe-function-type */ import { overrideLogger } from '../server/logging' export class SupressLogMessages { @@ -40,7 +41,6 @@ export class SupressLogMessages { static expectAllMessagesToHaveBeenHandled(): void { const unhandledSuppressMessages = [...SupressLogMessages.suppressMessages] SupressLogMessages.suppressMessages.length = 0 - // eslint-disable-next-line jest/no-standalone-expect expect(unhandledSuppressMessages).toHaveLength(0) } } diff --git a/meteor/__mocks__/tracker.ts b/meteor/__mocks__/tracker.ts index 47ebb8cfcd..97d7fa6e71 100644 --- a/meteor/__mocks__/tracker.ts +++ b/meteor/__mocks__/tracker.ts @@ -116,6 +116,7 @@ export namespace TrackerMock { TrackerMock.currentComputation.onInvalidate(clb) } + // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type export function afterFlush(_clb: Function): void { throw new Error(`Tracker.afterFlush() is not implemented in the mock Tracker`) } diff --git a/meteor/__mocks__/validated-method.ts b/meteor/__mocks__/validated-method.ts index 8238b1bbf6..05965f764d 100644 --- a/meteor/__mocks__/validated-method.ts +++ b/meteor/__mocks__/validated-method.ts @@ -1,3 +1,5 @@ +/* eslint-disable @typescript-eslint/no-unsafe-function-type */ + interface Options { name: string // DDP method name mixins: any // Method extensions diff --git a/meteor/__mocks__/webapp.ts b/meteor/__mocks__/webapp.ts index 28bb8d218e..4e0b5a4a93 100644 --- a/meteor/__mocks__/webapp.ts +++ b/meteor/__mocks__/webapp.ts @@ -1,5 +1,5 @@ export const WebAppMock = { - rawHandlers: { + rawConnectHandlers: { use: (): void => { // No web server to setup }, diff --git a/meteor/eslint.config.mjs b/meteor/eslint.config.mjs new file mode 100644 index 0000000000..7f4a7a7e27 --- /dev/null +++ b/meteor/eslint.config.mjs @@ -0,0 +1,39 @@ +import { generateEslintConfig } from '@sofie-automation/code-standard-preset/eslint/main.mjs' + +const tmpRules = { + // Temporary rules to be removed over time + '@typescript-eslint/ban-types': 'off', + '@typescript-eslint/no-namespace': 'off', + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/unbound-method': 'off', + '@typescript-eslint/no-misused-promises': 'off', + '@typescript-eslint/no-unnecessary-type-assertion': 'off', + '@typescript-eslint/no-require-imports': 'off', +} + +const extendedRules = await generateEslintConfig({ + // tsconfigName: 'tsconfig.eslint.json', + ignores: ['.meteor', 'public', 'scripts', 'server/_force_restart.js', '/packages/'], + + // disableNodeRules: true, +}) +extendedRules.push({ + files: ['**/*'], + rules: { + // custom + 'no-inner-declarations': 'off', // some functions are unexported and placed inside a namespace next to related ones + + 'n/no-extraneous-import': 'off', // because there are a lot of them as dev-dependencies + 'n/no-missing-import': 'off', // erroring on every single import + 'react/prop-types': 'off', // we don't use this + '@typescript-eslint/no-empty-interface': 'off', // many prop/state types are {} + '@typescript-eslint/promise-function-async': 'off', // event handlers can't be async + + 'n/file-extension-in-import': ['error', 'never'], // Meteor breaks on importing ts files with a js extension + + ...tmpRules, + }, +}) + +export default extendedRules diff --git a/meteor/i18n/nb.po b/meteor/i18n/nb.po index 3f32216e70..fc71d132ee 100644 --- a/meteor/i18n/nb.po +++ b/meteor/i18n/nb.po @@ -699,6 +699,15 @@ msgstr "Planlagt varighet" msgid "Planned End" msgstr "Planlagt slutt" +msgid "Time to planned end" +msgstr "Tid til planlagt slutt" + +msgid "Time since planned end" +msgstr "Tid siden planlagt slutt" + +msgid "Over/Under" +msgstr "Over/Under" + msgid "" "The rundown \"{{rundownName}}\" is not published or activated in " "{{nrcsName}}! No data updates will currently come through." diff --git a/meteor/i18n/nn.po b/meteor/i18n/nn.po index 0ea3e9ca7f..cc2d2cc3f3 100644 --- a/meteor/i18n/nn.po +++ b/meteor/i18n/nn.po @@ -700,6 +700,15 @@ msgstr "Planlagt varigheit" msgid "Planned End" msgstr "Planlagt slutt" +msgid "Time to planned end" +msgstr "Tid til planlagt slutt" + +msgid "Time since planned end" +msgstr "Tid sidan planlagt slutt" + +msgid "Over/Under" +msgstr "Over/Under" + msgid "" "The rundown \"{{rundownName}}\" is not published or activated in " "{{nrcsName}}! No data updates will currently come through." diff --git a/meteor/i18n/template.pot b/meteor/i18n/template.pot index bebf4b2bc7..ac4e0e454e 100644 --- a/meteor/i18n/template.pot +++ b/meteor/i18n/template.pot @@ -660,6 +660,15 @@ msgstr "" msgid "Planned End" msgstr "" +msgid "Time to planned end" +msgstr "" + +msgid "Time since planned end" +msgstr "" + +msgid "Over/Under" +msgstr "" + msgid "" "The rundown \"{{rundownName}}\" is not published or activated in " "{{nrcsName}}! No data updates will currently come through." diff --git a/meteor/jest.config.js b/meteor/jest.config.js index b39804ae23..34c1398c62 100644 --- a/meteor/jest.config.js +++ b/meteor/jest.config.js @@ -2,7 +2,12 @@ const path = require('path') const commonConfig = { modulePaths: ['/node_modules/'], - moduleNameMapper: {}, + moduleNameMapper: { + // Ensure libraries that would match the extension rule are still resolved + 'bignumber.js': 'bignumber.js', + // Drop file extensions in imports + '(.+)\\.js$': '$1', + }, unmockedModulePathPatterns: ['/^imports\\/.*\\.jsx?$/', '/^node_modules/'], globals: {}, moduleFileExtensions: ['ts', 'js', 'json'], diff --git a/meteor/package.json b/meteor/package.json index a2bd3d8955..59acef13e0 100644 --- a/meteor/package.json +++ b/meteor/package.json @@ -1,13 +1,13 @@ { "name": "automation-core", - "version": "1.52.0", + "version": "1.53.0-in-development", "private": true, "engines": { - "node": ">=22.11" + "node": ">=22.13.1" }, "scripts": { "preinstall": "node -v", - "debug": "meteor run", + "debug": "meteor run --exclude-archs \"web.browser.legacy,web.browser,web.cordova\"", "libs:syncVersions": "node scripts/libs-sync-version.js", "libs:syncVersionsAndChangelogs": "node scripts/libs-sync-version-and-changelog.js", "inject-git-hash": "node ./scripts/generate-version-file.js", @@ -22,7 +22,7 @@ "cov": "yarn unitcov && yarn cov-open", "license-validate": "node ../scripts/checkLicenses.js --allowed=\"MIT,BSD,ISC,Apache,Unlicense,CC0,LGPL,CC BY 3.0,CC BY 4.0,MPL 2.0,Python 2.0\" --excludePackages=timecode,rxjs/ajax,rxjs/fetch,rxjs/internal-compatibility,nw-pre-gyp-module-test,rxjs/operators,rxjs/testing,rxjs/webSocket,undefined,i18next-conv,@fortawesome/fontawesome-common-types,argv,indexof,custom-license,private,public-domain-module,@sofie-automation/corelib,@sofie-automation/shared-lib,@sofie-automation/job-worker", "lint": "run lint:raw .", - "lint:raw": "eslint --ext .ts --ext .js --ext .tsx --ext .jsx", + "lint:raw": "eslint", "lintfix": "run lint --fix", "quickformat": "prettier \"__mocks__/**\" --write ; prettier \"lib/**\" --write ; prettier \"server/**\" --write ; prettier \"client/**\" --write ; prettier \"*.json\" --write ; prettier \"*.js\" --write ; prettier \"*.md\" --write", "i18n-extract-pot": "node ./scripts/extract-i18next-pot.mjs -f \"{./lib/**/*.+(ts|tsx),./server/**/*.+(ts|tsx),../packages/job-worker/src/**/*.+(ts|tsx),../packages/corelib/src/**/*.+(ts|tsx),../packages/webui/src/**/*.+(ts|tsx)}\" -o i18n/template.pot", @@ -57,6 +57,7 @@ "indexof": "0.0.1", "koa": "^2.15.3", "koa-bodyparser": "^4.4.1", + "koa-mount": "^4.0.0", "koa-static": "^5.0.0", "meteor-node-stubs": "^1.2.12", "moment": "^2.30.1", @@ -77,14 +78,14 @@ "@babel/core": "^7.26.7", "@babel/plugin-transform-modules-commonjs": "^7.26.3", "@shopify/jest-koa-mocks": "^5.3.1", - "@sofie-automation/code-standard-preset": "~2.4.7", - "@sofie-automation/eslint-plugin": "^0.1.1", + "@sofie-automation/code-standard-preset": "^3.0.0", "@types/app-root-path": "^1.2.8", "@types/body-parser": "^1.19.5", "@types/deep-extend": "^0.6.2", "@types/jest": "^29.5.14", "@types/koa": "^2.15.0", "@types/koa-bodyparser": "^4.3.12", + "@types/koa-mount": "^4", "@types/koa-static": "^4.0.4", "@types/koa__cors": "^5.0.0", "@types/koa__router": "^12.0.4", @@ -92,27 +93,20 @@ "@types/request": "^2.48.12", "@types/semver": "^7.5.8", "@types/underscore": "^1.13.0", - "@typescript-eslint/eslint-plugin": "^5.62.0", - "@typescript-eslint/parser": "^5.62.0", - "@typescript-eslint/utils": "^5.62.0", "babel-jest": "^29.7.0", "ejson": "^2.2.3", - "eslint": "^8.57.1", - "eslint-config-prettier": "^8.10.0", - "eslint-plugin-jest": "^27.9.0", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prettier": "^4.2.1", + "eslint": "^9.18.0", "fast-clone": "^1.5.13", - "glob": "^8.1.0", + "glob": "^11.0.1", "i18next-conv": "^10.2.0", "i18next-scanner": "^4.6.0", "jest": "^29.7.0", "legally": "^3.5.10", "open-cli": "^8.0.0", - "prettier": "^2.8.8", + "prettier": "^3.4.2", "standard-version": "^9.5.0", "ts-jest": "^29.2.5", - "typescript": "~5.1.6", + "typescript": "~5.7.3", "yargs": "^17.7.2" }, "prettier": "@sofie-automation/code-standard-preset/.prettierrc.json", diff --git a/meteor/scripts/extract-i18next-pot.mjs b/meteor/scripts/extract-i18next-pot.mjs index 443cf5417e..a9d5f795e1 100644 --- a/meteor/scripts/extract-i18next-pot.mjs +++ b/meteor/scripts/extract-i18next-pot.mjs @@ -27,12 +27,11 @@ * SOFTWARE. */ -import { promisify } from 'util' import fs from 'fs' import yargs from 'yargs' import { Parser } from 'i18next-scanner' import converter from 'i18next-conv' -import glob from 'glob' +import { glob } from 'glob' const args = yargs(process.argv) .option('files', { @@ -66,8 +65,6 @@ const args = yargs(process.argv) .help() .alias('help', 'h').argv -const pGlob = promisify(glob) - const parserOptions = { // Include react helpers into parsing attr: { @@ -101,7 +98,7 @@ console.log('Extracting translatable strings...') console.log('This process may print out some error messages, but the translation template should work fine.') console.log('──────\n') -const files = await pGlob(fileGlob) +const files = await glob(fileGlob) // console.debug('Loading content of ' + files.length + ' files') diff --git a/meteor/scripts/i18n-compile-json.mjs b/meteor/scripts/i18n-compile-json.mjs index fb2a0b4d55..464922ede8 100644 --- a/meteor/scripts/i18n-compile-json.mjs +++ b/meteor/scripts/i18n-compile-json.mjs @@ -1,9 +1,6 @@ -import { promisify } from 'util' -import glob from 'glob' +import { glob } from 'glob' import { spawn } from 'child_process' -const pGlob = promisify(glob) - /************************************************* This script goes through all of the languages (.po files) @@ -14,7 +11,7 @@ and compiles the json-files (used in production). const errors = [] const failedLanguages = [] // List all po-files: -const poFiles = await pGlob('./i18n/*.po') +const poFiles = await glob('./i18n/*.po') const languages = [] for (const poFile of poFiles) { diff --git a/meteor/server/Connections.ts b/meteor/server/Connections.ts index 0983e99878..953fe220d3 100644 --- a/meteor/server/Connections.ts +++ b/meteor/server/Connections.ts @@ -4,8 +4,6 @@ import { logger } from './logging' import { sendTrace } from './api/integration/influx' import { PeripheralDevices } from './collections' import { MetricsGauge } from '@sofie-automation/corelib/dist/prometheus' -import { parseUserPermissions, USER_PERMISSIONS_HEADER } from '@sofie-automation/meteor-lib/dist/userPermissions' -import { Settings } from './Settings' const connections = new Set() const connectionsGauge = new MetricsGauge({ @@ -16,24 +14,6 @@ const connectionsGauge = new MetricsGauge({ Meteor.onConnection((conn: Meteor.Connection) => { // This is called whenever a new ddp-connection is opened (ie a web-client or a peripheral-device) - if (Settings.enableHeaderAuth) { - const userLevel = parseUserPermissions(conn.httpHeaders[USER_PERMISSIONS_HEADER]) - - // HACK: force the userId of the connection before it can be used. - // This ensures we know the permissions of the connection before it can try to do anything - // This could probably be safely done inside a meteor method, as we only need it when directly modifying a collection in the client, - // but that will cause all the publications to restart when changing the userId. - const connSession = (Meteor as any).server.sessions.get(conn.id) - if (!connSession) { - logger.error(`Failed to find session for ddp connection! "${conn.id}"`) - // Close the connection, it won't be secure - conn.close() - return - } else { - connSession.userId = JSON.stringify(userLevel) - } - } - const connectionId: string = conn.id // var clientAddress = conn.clientAddress; // ip-adress diff --git a/meteor/server/Settings.ts b/meteor/server/Settings.ts index 4a0d402ea3..647be536c2 100644 --- a/meteor/server/Settings.ts +++ b/meteor/server/Settings.ts @@ -1,5 +1,5 @@ import { Meteor } from 'meteor/meteor' -import * as _ from 'underscore' +import _ from 'underscore' import { ISettings, DEFAULT_SETTINGS } from '@sofie-automation/meteor-lib/dist/Settings' /** diff --git a/meteor/server/__tests__/_testEnvironment.test.ts b/meteor/server/__tests__/_testEnvironment.test.ts index 385c946810..fb46384e34 100644 --- a/meteor/server/__tests__/_testEnvironment.test.ts +++ b/meteor/server/__tests__/_testEnvironment.test.ts @@ -7,12 +7,9 @@ import { Blueprints, CoreSystem, Evaluations, - ExpectedMediaItems, ExternalMessageQueue, NrcsIngestDataCache, MediaObjects, - MediaWorkFlows, - MediaWorkFlowSteps, Parts, PeripheralDeviceCommands, PeripheralDevices, @@ -48,18 +45,12 @@ describe('Basic test of test environment', () => { // @ts-ignore expect(Evaluations._isMock).toBeTruthy() // @ts-ignore - expect(ExpectedMediaItems._isMock).toBeTruthy() - // @ts-ignore expect(ExternalMessageQueue._isMock).toBeTruthy() // @ts-ignore expect(NrcsIngestDataCache._isMock).toBeTruthy() // @ts-ignore expect(MediaObjects._isMock).toBeTruthy() // @ts-ignore - expect(MediaWorkFlows._isMock).toBeTruthy() - // @ts-ignore - expect(MediaWorkFlowSteps._isMock).toBeTruthy() - // @ts-ignore expect(Parts._isMock).toBeTruthy() // @ts-ignore expect(PeripheralDeviceCommands._isMock).toBeTruthy() diff --git a/meteor/server/__tests__/cronjobs.test.ts b/meteor/server/__tests__/cronjobs.test.ts index 8412106e30..23461683ae 100644 --- a/meteor/server/__tests__/cronjobs.test.ts +++ b/meteor/server/__tests__/cronjobs.test.ts @@ -111,12 +111,14 @@ describe('cronjobs', () => { await MeteorMock.mockRunMeteorStartup() origGetCurrentTime = lib.getCurrentTime //@ts-ignore Mock getCurrentTime for tests + // eslint-disable-next-line no-import-assign lib.getCurrentTime = jest.fn(() => { return mockCurrentTime }) }) afterAll(async () => { //@ts-ignore Return getCurrentTime to orig + // eslint-disable-next-line no-import-assign lib.getCurrentTime = origGetCurrentTime await CoreSystem.removeAsync(SYSTEM_ID) }) @@ -536,7 +538,7 @@ describe('cronjobs', () => { ? { configId: '', studioId, - } + } : undefined, }) const mockCasparCg = await insertPlayoutDevice({ @@ -566,7 +568,7 @@ describe('cronjobs', () => { studioId: StudioId rundownPlaylistId: RundownPlaylistId }> { - function newObjectWithOverrides(defaults: T): ObjectWithOverrides { + function newObjectWithOverrides(defaults: T): ObjectWithOverrides { return { defaults, overrides: [], diff --git a/meteor/server/api/__tests__/cleanup.test.ts b/meteor/server/api/__tests__/cleanup.test.ts index 7834e3aa06..37771f049c 100644 --- a/meteor/server/api/__tests__/cleanup.test.ts +++ b/meteor/server/api/__tests__/cleanup.test.ts @@ -257,6 +257,7 @@ async function setDefaultDatatoDB(env: DefaultEnvironment, now: number) { const packageId = await ExpectedPackages.mutableCollection.insertAsync({ _id: getRandomId(), blueprintPackageId: '', + // @ts-expect-error bucketId is not a part of all ExpectedPackageDBs bucketId, content: {} as any, contentVersionHash: '', @@ -410,6 +411,7 @@ async function setDefaultDatatoDB(env: DefaultEnvironment, now: number) { generationVersions: {} as any, timelineBlob: '' as any, timelineHash: '' as any, + regenerateTimelineToken: undefined, }) await TimelineDatastore.mutableCollection.insertAsync({ _id: getRandomId(), @@ -470,10 +472,7 @@ async function setDefaultDatatoDB(env: DefaultEnvironment, now: number) { 'organizations', 'Users', // Deprecated: - 'expectedMediaItems', 'mediaObjects', - 'mediaWorkFlows', - 'mediaWorkFlowSteps', ].includes(collectionName) ) continue diff --git a/meteor/server/api/__tests__/client.test.ts b/meteor/server/api/__tests__/client.test.ts index 78fcfcc4dc..4eecaf3277 100644 --- a/meteor/server/api/__tests__/client.test.ts +++ b/meteor/server/api/__tests__/client.test.ts @@ -175,7 +175,7 @@ describe('ClientAPI', () => { // This will probably resolve after around 3s, since that is the timeout time // of checkReply and the observeChanges is not implemented in the mock - await expect(promise).rejects.toBe('Failed') + await expect(promise).rejects.toThrow(/Failed/) const log = (await UserActionsLog.findOneAsync({ method: logMethodName, diff --git a/meteor/server/api/__tests__/peripheralDevice.test.ts b/meteor/server/api/__tests__/peripheralDevice.test.ts index 7c0c850376..c520533aaa 100644 --- a/meteor/server/api/__tests__/peripheralDevice.test.ts +++ b/meteor/server/api/__tests__/peripheralDevice.test.ts @@ -12,9 +12,6 @@ import { waitUntil } from '../../../__mocks__/helpers/jest' import { setupDefaultStudioEnvironment, DefaultEnvironment } from '../../../__mocks__/helpers/database' import { setLogLevel } from '../../logging' import { IngestDeviceSecretSettings } from '@sofie-automation/corelib/dist/dataModel/PeripheralDeviceSettings/ingestDevice' -import { MediaWorkFlow } from '@sofie-automation/shared-lib/dist/core/model/MediaWorkFlows' -import { MediaWorkFlowStep } from '@sofie-automation/shared-lib/dist/core/model/MediaWorkFlowSteps' -import { MediaManagerAPI } from '@sofie-automation/meteor-lib/dist/api/mediaManager' import { MediaObject } from '@sofie-automation/shared-lib/dist/core/model/MediaObjects' import { IBlueprintPieceType, @@ -39,8 +36,6 @@ import { RundownId, RundownPlaylistId, SegmentId } from '@sofie-automation/corel import { PeripheralDeviceAPIMethods } from '@sofie-automation/shared-lib/dist/peripheralDevice/methodsAPI' import { MediaObjects, - MediaWorkFlows, - MediaWorkFlowSteps, Parts, PeripheralDeviceCommands, PeripheralDevices, @@ -624,166 +619,6 @@ describe('test peripheralDevice general API methods', () => { } }) - // test MediaManagerIntegration API - describe('Media Manager API', () => { - let workFlowId: ProtectedString - let workStepIds: ProtectedString[] - let deviceId: ProtectedString - let device: PeripheralDevice - beforeEach(async () => { - workFlowId = getRandomId() - workStepIds = [getRandomId(), getRandomId()] - deviceId = getRandomId() - env = await setupDefaultStudioEnvironment() - await PeripheralDevices.insertAsync({ - _id: deviceId, - organizationId: null, - name: 'Mock Media Manager', - deviceName: 'Media Manager', - studioAndConfigId: { - studioId: env.studio._id, - configId: 'test', - }, - category: PeripheralDeviceCategory.MEDIA_MANAGER, - configManifest: { - deviceConfigSchema: JSONBlobStringify({}), - subdeviceManifest: {}, - }, - connected: true, - connectionId: '0', - created: 0, - lastConnected: 0, - lastSeen: 0, - status: { - statusCode: StatusCode.GOOD, - }, - subType: '_process', - token: 'MockToken', - type: PeripheralDeviceType.MEDIA_MANAGER, - }) - device = (await PeripheralDevices.findOneAsync(deviceId))! - await MediaWorkFlows.insertAsync({ - _id: workFlowId, - _rev: '1', - created: 0, - deviceId: device._id, - priority: 1, - source: 'MockSource', - studioId: device.studioAndConfigId!.studioId, - finished: false, - success: false, - }) - await MediaWorkFlowSteps.insertAsync({ - _id: workStepIds[0], - _rev: '1', - criticalStep: false, - action: MediaManagerAPI.WorkStepAction.COPY, - deviceId: device._id, - priority: 2, - status: MediaManagerAPI.WorkStepStatus.IDLE, - studioId: device.studioAndConfigId!.studioId, - workFlowId: workFlowId, - }) - await MediaWorkFlowSteps.insertAsync({ - _id: workStepIds[1], - _rev: '1', - criticalStep: false, - action: MediaManagerAPI.WorkStepAction.GENERATE_METADATA, - deviceId: device._id, - priority: 1, - status: MediaManagerAPI.WorkStepStatus.IDLE, - studioId: device.studioAndConfigId!.studioId, - workFlowId: workFlowId, - }) - }) - test('getMediaWorkFlowRevisions', async () => { - const workFlows = ( - await MediaWorkFlows.findFetchAsync({ - studioId: device.studioAndConfigId!.studioId, - }) - ).map((wf) => ({ - _id: wf._id, - _rev: wf._rev, - })) - expect(workFlows.length).toBeGreaterThan(0) - const res = await MeteorCall.peripheralDevice.getMediaWorkFlowRevisions(device._id, device.token) - expect(res).toHaveLength(workFlows.length) - expect(res).toMatchObject(workFlows) - }) - test('getMediaWorkFlowStepRevisions', async () => { - const workFlowSteps = ( - await MediaWorkFlowSteps.findFetchAsync({ - studioId: device.studioAndConfigId!.studioId, - }) - ).map((wf) => ({ - _id: wf._id, - _rev: wf._rev, - })) - expect(workFlowSteps.length).toBeGreaterThan(0) - const res = await MeteorCall.peripheralDevice.getMediaWorkFlowStepRevisions(device._id, device.token) - expect(res).toHaveLength(workFlowSteps.length) - expect(res).toMatchObject(workFlowSteps) - }) - describe('updateMediaWorkFlow', () => { - test('update', async () => { - const workFlow = await MediaWorkFlows.findOneAsync(workFlowId) - - expect(workFlow).toBeTruthy() - const newWorkFlow = Object.assign({}, workFlow) - newWorkFlow._rev = '2' - newWorkFlow.comment = 'New comment' - - await MeteorCall.peripheralDevice.updateMediaWorkFlow( - device._id, - device.token, - newWorkFlow._id, - newWorkFlow - ) - - const updatedWorkFlow = await MediaWorkFlows.findOneAsync(workFlowId) - expect(updatedWorkFlow).toMatchObject(newWorkFlow) - }) - test('remove', async () => { - const workFlow = (await MediaWorkFlows.findOneAsync(workFlowId)) as MediaWorkFlow - expect(workFlow).toBeTruthy() - - await MeteorCall.peripheralDevice.updateMediaWorkFlow(device._id, device.token, workFlow._id, null) - - const updatedWorkFlow = await MediaWorkFlows.findOneAsync(workFlowId) - expect(updatedWorkFlow).toBeFalsy() - }) - }) - describe('updateMediaWorkFlowStep', () => { - test('update', async () => { - const workStep = await MediaWorkFlowSteps.findOneAsync(workStepIds[0]) - - expect(workStep).toBeTruthy() - const newWorkStep = Object.assign({}, workStep) - newWorkStep._rev = '2' - newWorkStep.status = MediaManagerAPI.WorkStepStatus.WORKING - - await MeteorCall.peripheralDevice.updateMediaWorkFlowStep( - device._id, - device.token, - newWorkStep._id, - newWorkStep - ) - - const updatedWorkFlow = await MediaWorkFlowSteps.findOneAsync(workStepIds[0]) - expect(updatedWorkFlow).toMatchObject(newWorkStep) - }) - test('remove', async () => { - const workStep = (await MediaWorkFlowSteps.findOneAsync(workStepIds[0])) as MediaWorkFlowStep - expect(workStep).toBeTruthy() - - await MeteorCall.peripheralDevice.updateMediaWorkFlowStep(device._id, device.token, workStep._id, null) - - const updatedWorkFlow = await MediaWorkFlowSteps.findOneAsync(workStepIds[0]) - expect(updatedWorkFlow).toBeFalsy() - }) - }) - }) - // test Media Scanner API describe('Media Scanner API', () => { let deviceId: ProtectedString @@ -802,7 +637,7 @@ describe('test peripheralDevice general API methods', () => { studioId: env.studio._id, configId: 'test', }, - category: PeripheralDeviceCategory.MEDIA_MANAGER, + category: PeripheralDeviceCategory.PLAYOUT, configManifest: { deviceConfigSchema: JSONBlobStringify({}), subdeviceManifest: {}, @@ -817,7 +652,7 @@ describe('test peripheralDevice general API methods', () => { }, subType: '_process', token: 'MockToken', - type: PeripheralDeviceType.MEDIA_MANAGER, + type: PeripheralDeviceType.PLAYOUT, }) device = (await PeripheralDevices.findOneAsync(deviceId))! diff --git a/meteor/server/api/__tests__/userActions/mediaManager.test.ts b/meteor/server/api/__tests__/userActions/mediaManager.test.ts deleted file mode 100644 index bf58417d6f..0000000000 --- a/meteor/server/api/__tests__/userActions/mediaManager.test.ts +++ /dev/null @@ -1,195 +0,0 @@ -import '../../../../__mocks__/_extendJest' -import { waitUntil } from '../../../../__mocks__/helpers/jest' -import { getRandomId, protectString } from '../../../lib/tempLib' -import { getCurrentTime } from '../../../lib/lib' -import { setupDefaultStudioEnvironment, DefaultEnvironment } from '../../../../__mocks__/helpers/database' -import { MeteorCall } from '../../methods' -import { MediaWorkFlowId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { MediaWorkFlows, PeripheralDeviceCommands, PeripheralDevices } from '../../../collections' - -require('../../client') // include in order to create the Meteor methods needed -require('../../userActions') // include in order to create the Meteor methods needed - -const MAX_WAIT_TIME = 300 - -describe('User Actions - Media Manager', () => { - let env: DefaultEnvironment - async function setupMockWorkFlow() { - const workFlowId: MediaWorkFlowId = getRandomId() - const workFlow = { - _id: workFlowId, - _rev: '', - created: getCurrentTime(), - deviceId: env.ingestDevice._id, - finished: false, - priority: 1, - source: '', - studioId: env.studio._id, - success: false, - } - await MediaWorkFlows.insertAsync(workFlow) - - return { workFlow, workFlowId } - } - beforeEach(async () => { - // clean up old peripheral devices and MediaWorkFlows - await PeripheralDevices.removeAsync({ - _id: { - $exists: true, - }, - }) - await MediaWorkFlows.removeAsync({ - _id: { - $exists: true, - }, - }) - env = await setupDefaultStudioEnvironment() - jest.resetAllMocks() - }) - test('Restart workflow', async () => { - const { workFlowId, workFlow } = await setupMockWorkFlow() - - // should fail if the workflow doesn't exist - await expect( - MeteorCall.userAction.mediaRestartWorkflow( - '', - getCurrentTime(), - workFlow.deviceId, - protectString('FAKE_ID') - ) - ).resolves.toMatchUserRawError(/not found/gi) - - { - // should execute function on the target device - const p = waitUntil(async () => { - const functionCall = ( - await PeripheralDeviceCommands.findFetchAsync({ - deviceId: env.ingestDevice._id, - functionName: 'restartWorkflow', - }) - )[0] - expect(functionCall).toBeTruthy() - await PeripheralDeviceCommands.updateAsync(functionCall._id, { - $set: { - hasReply: true, - reply: 'done', - }, - }) - }, MAX_WAIT_TIME) - - await MeteorCall.userAction.mediaRestartWorkflow('', getCurrentTime(), workFlow.deviceId, workFlowId) - await p - } - }) - test('Abort worfklow', async () => { - const { workFlowId, workFlow } = await setupMockWorkFlow() - - // should fail if the workflow doesn't exist - await expect( - MeteorCall.userAction.mediaAbortWorkflow('', getCurrentTime(), workFlow.deviceId, protectString('FAKE_ID')) - ).resolves.toMatchUserRawError(/not found/gi) - - { - // should execute function on the target device - - const p = waitUntil(async () => { - const functionCall = ( - await PeripheralDeviceCommands.findFetchAsync({ - deviceId: env.ingestDevice._id, - functionName: 'abortWorkflow', - }) - )[0] - expect(functionCall).toBeTruthy() - await PeripheralDeviceCommands.updateAsync(functionCall._id, { - $set: { - hasReply: true, - reply: 'done', - }, - }) - }, MAX_WAIT_TIME) - - await MeteorCall.userAction.mediaAbortWorkflow('', getCurrentTime(), workFlow.deviceId, workFlowId) - await p - } - }) - test('Prioritize workflow', async () => { - const { workFlowId, workFlow } = await setupMockWorkFlow() - - // should fail if the workflow doesn't exist - await expect( - MeteorCall.userAction.mediaPrioritizeWorkflow( - '', - getCurrentTime(), - workFlow.deviceId, - protectString('FAKE_ID') - ) - ).resolves.toMatchUserRawError(/not found/gi) - - { - // should execute function on the target device - const p = waitUntil(async () => { - const functionCall = ( - await PeripheralDeviceCommands.findFetchAsync({ - deviceId: env.ingestDevice._id, - functionName: 'prioritizeWorkflow', - }) - )[0] - - expect(functionCall).toBeTruthy() - await PeripheralDeviceCommands.updateAsync(functionCall._id, { - $set: { - hasReply: true, - reply: 'done', - }, - }) - }, MAX_WAIT_TIME) - - await MeteorCall.userAction.mediaPrioritizeWorkflow('', getCurrentTime(), workFlow.deviceId, workFlowId) - await p - } - }) - test('Restart all workflows', async () => { - await setupMockWorkFlow() - - { - // should execute function on all the target devices - const p = waitUntil(async () => { - const functionCalls = await PeripheralDeviceCommands.findFetchAsync({ - functionName: 'restartAllWorkflows', - }) - expect(functionCalls).toHaveLength(1) - await PeripheralDeviceCommands.updateAsync(functionCalls[0]._id, { - $set: { - hasReply: true, - reply: 'done', - }, - }) - }, MAX_WAIT_TIME) - - await MeteorCall.userAction.mediaRestartAllWorkflows('', getCurrentTime()) - await p - } - }) - test('Abort all workflows', async () => { - await setupMockWorkFlow() - - { - // should execute function on all the target devices - const p = waitUntil(async () => { - const functionCalls = await PeripheralDeviceCommands.findFetchAsync({ - functionName: 'abortAllWorkflows', - }) - expect(functionCalls).toHaveLength(1) - await PeripheralDeviceCommands.updateAsync(functionCalls[0]._id, { - $set: { - hasReply: true, - reply: 'done', - }, - }) - }, MAX_WAIT_TIME) - - await MeteorCall.userAction.mediaAbortAllWorkflows('', getCurrentTime()) - await p - } - }) -}) diff --git a/meteor/server/api/blueprintConfigPresets.ts b/meteor/server/api/blueprintConfigPresets.ts index d705c63702..3d9a88b51a 100644 --- a/meteor/server/api/blueprintConfigPresets.ts +++ b/meteor/server/api/blueprintConfigPresets.ts @@ -35,7 +35,7 @@ Meteor.startup(async () => { const blueprint = (await Blueprints.findOneAsync( { _id: doc.blueprintId, blueprintType: BlueprintManifestType.STUDIO }, - { fields: { _id: 1, studioConfigPresets: 1 } } + { projection: { _id: 1, studioConfigPresets: 1 } } )) as Pick | undefined if (!blueprint?.studioConfigPresets) { @@ -100,7 +100,7 @@ Meteor.startup(async () => { const blueprint = (await Blueprints.findOneAsync( { _id: doc.blueprintId, blueprintType: BlueprintManifestType.SHOWSTYLE }, - { fields: { _id: 1, showStyleConfigPresets: 1 } } + { projection: { _id: 1, showStyleConfigPresets: 1 } } )) as Pick | undefined if (!blueprint?.showStyleConfigPresets) { @@ -116,7 +116,7 @@ Meteor.startup(async () => { const variants = (await ShowStyleVariants.findFetchAsync( { showStyleBaseId: doc._id }, - { fields: { blueprintConfigPresetId: 1 } } + { projection: { blueprintConfigPresetId: 1 } } )) as Pick[] const ps: Promise[] = [ @@ -188,7 +188,7 @@ Meteor.startup(async () => { const blueprint = (await Blueprints.findOneAsync( { _id: showStyleBase.blueprintId, blueprintType: BlueprintManifestType.SHOWSTYLE }, - { fields: { _id: 1, showStyleConfigPresets: 1 } } + { projection: { _id: 1, showStyleConfigPresets: 1 } } )) as Pick | undefined if (!blueprint?.showStyleConfigPresets) { diff --git a/meteor/server/api/blueprints/__tests__/api.test.ts b/meteor/server/api/blueprints/__tests__/api.test.ts index af2cf6b8b1..7623efa50e 100644 --- a/meteor/server/api/blueprints/__tests__/api.test.ts +++ b/meteor/server/api/blueprints/__tests__/api.test.ts @@ -1,4 +1,4 @@ -import * as _ from 'underscore' +import _ from 'underscore' import { setupDefaultStudioEnvironment, packageBlueprint } from '../../../../__mocks__/helpers/database' import { literal, getRandomId, protectString } from '../../../lib/tempLib' import { Blueprint } from '@sofie-automation/corelib/dist/dataModel/Blueprint' @@ -336,12 +336,9 @@ describe('Test blueprint management api', () => { } ) - const blueprint = await uploadBlueprint( - DEFAULT_CONNECTION, - protectString('tmp_studio'), - blueprintStr, - 'tmp name' - ) + const blueprint = await uploadBlueprint(DEFAULT_CONNECTION, protectString('tmp_studio'), blueprintStr, { + blueprintName: 'tmp name', + }) expect(blueprint).toBeTruthy() expect(blueprint).toMatchObject( literal>({ @@ -380,12 +377,9 @@ describe('Test blueprint management api', () => { } ) - const blueprint = await uploadBlueprint( - DEFAULT_CONNECTION, - protectString('tmp_system'), - blueprintStr, - 'tmp name' - ) + const blueprint = await uploadBlueprint(DEFAULT_CONNECTION, protectString('tmp_system'), blueprintStr, { + blueprintName: 'tmp name', + }) expect(blueprint).toBeTruthy() expect(blueprint).toMatchObject( literal>({ diff --git a/meteor/server/api/blueprints/__tests__/http.test.ts b/meteor/server/api/blueprints/__tests__/http.test.ts index 887b7d61d8..6673f4eb6a 100644 --- a/meteor/server/api/blueprints/__tests__/http.test.ts +++ b/meteor/server/api/blueprints/__tests__/http.test.ts @@ -1,4 +1,4 @@ -import * as _ from 'underscore' +import _ from 'underscore' import { Meteor } from 'meteor/meteor' import { SupressLogMessages } from '../../../../__mocks__/suppressLogging' import { callKoaRoute } from '../../../../__mocks__/koa-util' @@ -14,8 +14,18 @@ require('../http.ts') // include in order to create the Meteor methods needed describe('Test blueprint http api', () => { describe('router restore single', () => { - async function callRoute(blueprintId: string, body: any, name?: string, force?: boolean) { - const queryParams = _.compact([name ? `name=${name}` : undefined, force ? 'force=1' : undefined]) + async function callRoute( + blueprintId: string, + body: any, + name?: string, + force?: boolean, + developmentMode?: boolean + ) { + const queryParams = _.compact([ + name ? `name=${name}` : undefined, + force ? 'force=1' : undefined, + developmentMode ? 'developmentMode=1' : undefined, + ]) const ctx = await callKoaRoute(blueprintsRouter, { method: 'POST', @@ -74,7 +84,11 @@ describe('Test blueprint http api', () => { expect(res.body).toEqual('') expect(api.uploadBlueprint).toHaveBeenCalledTimes(1) - expect(api.uploadBlueprint).toHaveBeenCalledWith(DEFAULT_CONTEXT, id, body, undefined, false) + expect(api.uploadBlueprint).toHaveBeenCalledWith(DEFAULT_CONTEXT, id, body, { + blueprintName: undefined, + ignoreIdChange: false, + developmentMode: false, + } satisfies api.UploadBlueprintOptions) }) test('with body & force', async () => { const id = 'id1' @@ -85,7 +99,26 @@ describe('Test blueprint http api', () => { expect(res.body).toEqual('') expect(api.uploadBlueprint).toHaveBeenCalledTimes(1) - expect(api.uploadBlueprint).toHaveBeenCalledWith(DEFAULT_CONTEXT, id, body, undefined, true) + expect(api.uploadBlueprint).toHaveBeenCalledWith(DEFAULT_CONTEXT, id, body, { + blueprintName: undefined, + ignoreIdChange: true, + developmentMode: false, + } satisfies api.UploadBlueprintOptions) + }) + test('with body & developmentMode', async () => { + const id = 'id1' + const body = '0123456789' + + const res = await callRoute(id, body, undefined, false, true) + expect(res.response.status).toEqual(200) + expect(res.body).toEqual('') + + expect(api.uploadBlueprint).toHaveBeenCalledTimes(1) + expect(api.uploadBlueprint).toHaveBeenCalledWith(DEFAULT_CONTEXT, id, body, { + blueprintName: undefined, + ignoreIdChange: false, + developmentMode: true, + } satisfies api.UploadBlueprintOptions) }) test('internal error', async () => { const id = 'id1' @@ -104,7 +137,11 @@ describe('Test blueprint http api', () => { expect(res.body).toEqual('[505] Some thrown error') expect(api.uploadBlueprint).toHaveBeenCalledTimes(1) - expect(api.uploadBlueprint).toHaveBeenCalledWith(DEFAULT_CONTEXT, id, body, undefined, false) + expect(api.uploadBlueprint).toHaveBeenCalledWith(DEFAULT_CONTEXT, id, body, { + blueprintName: undefined, + ignoreIdChange: false, + developmentMode: false, + } satisfies api.UploadBlueprintOptions) } finally { uploadBlueprint.mockRestore() } @@ -119,15 +156,21 @@ describe('Test blueprint http api', () => { expect(res.body).toEqual('') expect(api.uploadBlueprint).toHaveBeenCalledTimes(1) - expect(api.uploadBlueprint).toHaveBeenCalledWith(DEFAULT_CONTEXT, id, body, name, false) + expect(api.uploadBlueprint).toHaveBeenCalledWith(DEFAULT_CONTEXT, id, body, { + blueprintName: name, + ignoreIdChange: false, + developmentMode: false, + } satisfies api.UploadBlueprintOptions) }) }) describe('router restore bulk', () => { - async function callRoute(body: any) { + async function callRoute(body: any, developmentMode?: boolean) { + const queryParams = _.compact(['force=1', developmentMode ? 'developmentMode=1' : undefined]) + const ctx = await callKoaRoute(blueprintsRouter, { method: 'POST', - url: `/restore?force=1`, + url: `/restore?${queryParams.join('&')}`, requestBody: body, }) @@ -207,7 +250,30 @@ describe('Test blueprint http api', () => { expect(res.body).toEqual('') expect(api.uploadBlueprint).toHaveBeenCalledTimes(1) - expect(api.uploadBlueprint).toHaveBeenCalledWith(DEFAULT_CONTEXT, id, body, id) + expect(api.uploadBlueprint).toHaveBeenCalledWith(DEFAULT_CONTEXT, id, body, { + blueprintName: id, + developmentMode: false, + } satisfies api.UploadBlueprintOptions) + }) + test('with json body & developmentMode', async () => { + const id = 'id1' + const body = 'bodyStr1' + + const payload: any = { + blueprints: { + [id]: body, + }, + } + + const res = await callRoute(payload, true) + expect(res.response.status).toEqual(200) + expect(res.body).toEqual('') + + expect(api.uploadBlueprint).toHaveBeenCalledTimes(1) + expect(api.uploadBlueprint).toHaveBeenCalledWith(DEFAULT_CONTEXT, id, body, { + blueprintName: id, + developmentMode: true, + } satisfies api.UploadBlueprintOptions) }) test('with json body as object', async () => { const id = 'id1' @@ -224,7 +290,10 @@ describe('Test blueprint http api', () => { expect(res.body).toEqual('') expect(api.uploadBlueprint).toHaveBeenCalledTimes(1) - expect(api.uploadBlueprint).toHaveBeenCalledWith(DEFAULT_CONTEXT, id, body, id) + expect(api.uploadBlueprint).toHaveBeenCalledWith(DEFAULT_CONTEXT, id, body, { + blueprintName: id, + developmentMode: false, + } satisfies api.UploadBlueprintOptions) }) test('with json body - multiple', async () => { const count = 10 @@ -242,7 +311,10 @@ describe('Test blueprint http api', () => { expect(api.uploadBlueprint).toHaveBeenCalledTimes(count) for (let i = 0; i < count; i++) { - expect(api.uploadBlueprint).toHaveBeenCalledWith(DEFAULT_CONTEXT, `id${i}`, `body${i}`, `id${i}`) + expect(api.uploadBlueprint).toHaveBeenCalledWith(DEFAULT_CONTEXT, `id${i}`, `body${i}`, { + blueprintName: `id${i}`, + developmentMode: false, + } satisfies api.UploadBlueprintOptions) } }) test('with errors', async () => { @@ -275,7 +347,10 @@ describe('Test blueprint http api', () => { expect(api.uploadBlueprint).toHaveBeenCalledTimes(count) for (let i = 0; i < count; i++) { - expect(api.uploadBlueprint).toHaveBeenCalledWith(DEFAULT_CONTEXT, `id${i}`, `body${i}`, `id${i}`) + expect(api.uploadBlueprint).toHaveBeenCalledWith(DEFAULT_CONTEXT, `id${i}`, `body${i}`, { + blueprintName: `id${i}`, + developmentMode: false, + }) } } finally { uploadBlueprint.mockRestore() diff --git a/meteor/server/api/blueprints/api.ts b/meteor/server/api/blueprints/api.ts index ef4b534654..7c4229d9f0 100644 --- a/meteor/server/api/blueprints/api.ts +++ b/meteor/server/api/blueprints/api.ts @@ -1,4 +1,4 @@ -import * as _ from 'underscore' +import _ from 'underscore' import path from 'path' import { ReadStream, createReadStream, promises as fsp } from 'fs' import { unprotectString, getRandomId } from '../../lib/tempLib' @@ -30,6 +30,7 @@ import { DBShowStyleVariant } from '@sofie-automation/corelib/dist/dataModel/Sho import { DBStudio } from '@sofie-automation/corelib/dist/dataModel/Studio' import { UserPermissions } from '@sofie-automation/meteor-lib/dist/userPermissions' import { assertConnectionHasOneOfPermissions, RequestCredentials } from '../../security/auth' +import { blueprintsPerformDevelopmentMode } from './development' const PERMISSIONS_FOR_MANAGE_BLUEPRINTS: Array = ['configure'] @@ -75,16 +76,24 @@ export async function removeBlueprint(methodContext: MethodContext, blueprintId: removeSystemStatus('blueprintCompability_' + blueprintId) } +export interface UploadBlueprintOptions { + /** The display name of the blueprint. If not provided, the blueprintId will be used. This is only used when the blueprint is first uploaded */ + blueprintName?: string + /** If true, the blueprint will replace an existing blueprint even if the blueprintId is different. */ + ignoreIdChange?: boolean + /** If true, after uploading the blueprint, the config will be auto-applied and rundowns will be regenerated from cached ingest data */ + developmentMode?: boolean +} + export async function uploadBlueprint( cred: RequestCredentials, blueprintId: BlueprintId, body: string, - blueprintName?: string, - ignoreIdChange?: boolean + options?: UploadBlueprintOptions ): Promise { check(blueprintId, String) check(body, String) - check(blueprintName, Match.Maybe(String)) + check(options?.blueprintName, Match.Maybe(String)) assertConnectionHasOneOfPermissions(cred, ...PERMISSIONS_FOR_MANAGE_BLUEPRINTS) @@ -93,7 +102,7 @@ export async function uploadBlueprint( if (!blueprintId) throw new Meteor.Error(400, `Blueprint id "${blueprintId}" is not valid`) const blueprint = await fetchBlueprintLight(blueprintId) - return innerUploadBlueprint(null, blueprint, blueprintId, body, blueprintName, ignoreIdChange) + return innerUploadBlueprint(null, blueprint, blueprintId, body, options) } export async function uploadBlueprintAsset(cred: RequestCredentials, fileId: string, body: string): Promise { check(fileId, String) @@ -124,27 +133,25 @@ export function retrieveBlueprintAsset(_cred: RequestCredentials, fileId: string export async function internalUploadBlueprint( blueprintId: BlueprintId, body: string, - blueprintName?: string, - ignoreIdChange?: boolean, + options?: UploadBlueprintOptions, organizationId?: OrganizationId | null ): Promise { organizationId = organizationId || null const blueprint = await fetchBlueprintLight(blueprintId) - return innerUploadBlueprint(organizationId, blueprint, blueprintId, body, blueprintName, ignoreIdChange) + return innerUploadBlueprint(organizationId, blueprint, blueprintId, body, options) } async function innerUploadBlueprint( organizationId: OrganizationId | null, blueprint: BlueprintLight | undefined, blueprintId: BlueprintId, body: string, - blueprintName?: string, - ignoreIdChange?: boolean + options?: UploadBlueprintOptions ): Promise { const newBlueprint: Blueprint = { _id: blueprintId, organizationId: organizationId, - name: blueprint ? blueprint.name : blueprintName || unprotectString(blueprintId), + name: blueprint ? blueprint.name : options?.blueprintName || unprotectString(blueprintId), created: blueprint ? blueprint.created : getCurrentTime(), code: body, hasCode: !!body, @@ -153,7 +160,7 @@ async function innerUploadBlueprint( ? blueprint.databaseVersion : { system: undefined, - }, + }, blueprintId: '', blueprintVersion: '', integrationVersion: '', @@ -167,7 +174,7 @@ async function innerUploadBlueprint( let blueprintManifest: SomeBlueprintManifest | undefined try { blueprintManifest = evalBlueprint(newBlueprint) - } catch (e) { + } catch (_e) { throw new Meteor.Error(400, `Blueprint ${blueprintId} failed to parse`) } @@ -194,7 +201,7 @@ async function innerUploadBlueprint( ) } if (blueprint && blueprint.blueprintId && blueprint.blueprintId !== newBlueprint.blueprintId) { - if (ignoreIdChange) { + if (options?.ignoreIdChange) { logger.warn( `Replacing blueprint "${newBlueprint._id}" ("${blueprint.blueprintId}") with new blueprint "${newBlueprint.blueprintId}"` ) @@ -254,6 +261,11 @@ async function innerUploadBlueprint( await syncConfigPresetsToStudios(newBlueprint) } + // If in development mode, auto-apply any config and perform live reloading + if (options?.developmentMode) { + await blueprintsPerformDevelopmentMode(newBlueprint) + } + return newBlueprint } @@ -261,7 +273,7 @@ async function syncConfigPresetsToShowStyles(blueprint: Blueprint): Promise s._id) } }, { - fields: { + projection: { _id: 1, showStyleBaseId: 1, blueprintConfigPresetId: 1, @@ -316,10 +328,10 @@ async function syncConfigPresetsToShowStyles(blueprint: Blueprint): Promise { const studios = (await Studios.findFetchAsync( { blueprintId: blueprint._id }, { - fields: { + projection: { _id: 1, blueprintConfigPresetId: 1, }, @@ -347,10 +359,10 @@ async function syncConfigPresetsToStudios(blueprint: Blueprint): Promise { ? { 'blueprintConfigWithOverrides.defaults': configPreset.config, blueprintConfigPresetIdUnlinked: false, - } + } : { blueprintConfigPresetIdUnlinked: true, - }, + }, }) }) ) diff --git a/meteor/server/api/blueprints/development.ts b/meteor/server/api/blueprints/development.ts new file mode 100644 index 0000000000..ebcabfcd23 --- /dev/null +++ b/meteor/server/api/blueprints/development.ts @@ -0,0 +1,127 @@ +import { BlueprintManifestType } from '@sofie-automation/blueprints-integration' +import { Blueprint } from '@sofie-automation/corelib/dist/dataModel/Blueprint' +import { assertNever } from '@sofie-automation/corelib/dist/lib' +import { SYSTEM_ID } from '@sofie-automation/meteor-lib/dist/collections/CoreSystem' +import { Meteor } from 'meteor/meteor' +import { Studios, CoreSystem, Rundowns, ShowStyleBases } from '../../collections' +import { runUpgradeForShowStyleBase, runUpgradeForStudio } from '../../migration/upgrades' +import { runUpgradeForCoreSystem } from '../../migration/upgrades/system' +import { RundownId } from '@sofie-automation/corelib/dist/dataModel/Ids' +import _ from 'underscore' +import { Rundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' +import { QueueIngestJob, QueueStudioJob } from '../../worker/worker' +import { StudioJobs } from '@sofie-automation/corelib/dist/worker/studio' +import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' +import { logger } from '../../logging' +import { IngestJobs } from '@sofie-automation/corelib/dist/worker/ingest' + +export async function blueprintsPerformDevelopmentMode(blueprint: Blueprint): Promise { + // Note: These are not the most efficient implementations, but this is a development tool so the simplicity is more important + switch (blueprint.blueprintType) { + case BlueprintManifestType.SHOWSTYLE: { + const showStyles = await ShowStyleBases.findFetchAsync( + { blueprintId: blueprint._id }, + { projection: { _id: 1 } } + ) + + // Run upgrade for all studios + await Promise.all(showStyles.map(async (showStyle) => runUpgradeForShowStyleBase(showStyle._id))) + + // Reload any rundowns + const affectedRundowns = (await Rundowns.findFetchAsync( + { showStyleBaseId: { $in: showStyles.map((showStyle) => showStyle._id) } }, + { projection: { _id: 1 } } + )) as Pick[] + + // Perform a debounced reload + for (const rundown of affectedRundowns) { + rundownIdsToReload.add(rundown._id) + } + debouncedReloadRundowns() + + break + } + case BlueprintManifestType.STUDIO: { + const studios = await Studios.findFetchAsync({ blueprintId: blueprint._id }, { projection: { _id: 1 } }) + + // Run upgrade for all studios + await Promise.all(studios.map(async (studio) => runUpgradeForStudio(studio._id))) + + // Trigger a regeneration of the timeline + await Promise.all( + studios.map(async (studio) => { + try { + const job = await QueueStudioJob(StudioJobs.UpdateTimeline, studio._id, undefined) + + await job.complete + } catch (e) { + logger.error(`Failed to update timeline for studio ${studio._id}: ${stringifyError(e)}`) + } + }) + ) + + // Reload any rundowns + const affectedRundowns = (await Rundowns.findFetchAsync( + { studioId: { $in: studios.map((studio) => studio._id) } }, + { projection: { _id: 1 } } + )) as Pick[] + + // Perform a debounced reload + for (const rundown of affectedRundowns) { + rundownIdsToReload.add(rundown._id) + } + debouncedReloadRundowns() + + break + } + case BlueprintManifestType.SYSTEM: { + const coreSystem = await CoreSystem.findOneAsync(SYSTEM_ID, { projection: { blueprintId: 1 } }) + if (coreSystem?.blueprintId !== blueprint._id) return + await runUpgradeForCoreSystem(SYSTEM_ID) + break + } + case undefined: + // Nothing to do + break + default: + assertNever(blueprint.blueprintType) + throw new Meteor.Error(400, `Blueprint type "${blueprint.blueprintType}" is not valid`) + } +} + +// Note: This is a development tool, so doesn't need to worry about replication +const rundownIdsToReload = new Set() +const debouncedReloadRundowns = _.debounce( + () => { + if (rundownIdsToReload.size === 0) return + + const rundownIds = Array.from(rundownIdsToReload) + rundownIdsToReload.clear() + + // Perform the reload + Rundowns.findFetchAsync({ _id: { $in: rundownIds } }) + .then(async (rundowns) => { + // Trigger a reload with the default strategy + await Promise.all( + rundowns.map(async (rundown) => { + try { + const job = await QueueIngestJob(IngestJobs.RegenerateRundown, rundown.studioId, { + rundownExternalId: rundown.externalId, + }) + + await job.complete + } catch (e) { + logger.error( + `Regenerating rundown "${rundown.name}"(${rundown._id}) failed: ${stringifyError(e)}` + ) + } + }) + ) + }) + .catch((e) => { + logger.error(`Failed to reload rundowns: ${stringifyError(e)}`) + }) + }, + 1000, + false +) diff --git a/meteor/server/api/blueprints/http.ts b/meteor/server/api/blueprints/http.ts index ae364dd81f..627b45d2c9 100644 --- a/meteor/server/api/blueprints/http.ts +++ b/meteor/server/api/blueprints/http.ts @@ -1,4 +1,4 @@ -import * as _ from 'underscore' +import _ from 'underscore' import { logger } from '../../logging' import { Meteor } from 'meteor/meteor' import { BlueprintManifestSet } from '@sofie-automation/blueprints-integration' @@ -31,6 +31,7 @@ blueprintsRouter.post( try { const blueprintId = ctx.params.blueprintId const force = ctx.query['force'] === '1' || ctx.query['force'] === 'true' + const developmentMode = ctx.query['developmentMode'] === '1' || ctx.query['developmentMode'] === 'true' const blueprintNames = ctx.query['name'] const blueprintName: string | undefined = Array.isArray(blueprintNames) ? blueprintNames[0] : blueprintNames @@ -43,7 +44,11 @@ blueprintsRouter.post( if (typeof body !== 'string' || body.length < 10) throw new Meteor.Error(400, 'Restore Blueprint: Invalid request body') - await uploadBlueprint(ctx, protectString(blueprintId), body, blueprintName, force) + await uploadBlueprint(ctx, protectString(blueprintId), body, { + blueprintName, + ignoreIdChange: force, + developmentMode, + }) ctx.response.status = 200 ctx.body = '' @@ -69,6 +74,8 @@ blueprintsRouter.post( if (typeof body !== 'object' || Object.keys(body as any).length === 0) throw new Meteor.Error(400, 'Restore Blueprint: Invalid request body') + const developmentMode = ctx.query['developmentMode'] === '1' || ctx.query['developmentMode'] === 'true' + const collection = body as BlueprintManifestSet const isBlueprintManifestSet = (obj: string | object): obj is BlueprintManifestSet => @@ -81,7 +88,10 @@ blueprintsRouter.post( const errors: any[] = [] for (const id of _.keys(collection.blueprints)) { try { - await uploadBlueprint(ctx, protectString(id), collection.blueprints[id], id) + await uploadBlueprint(ctx, protectString(id), collection.blueprints[id], { + blueprintName: id, + developmentMode, + }) } catch (e) { logger.error('Blueprint restore failed: ' + e) errors.push(e) diff --git a/meteor/server/api/buckets.ts b/meteor/server/api/buckets.ts index 109ae82ba9..ad0b6d4b41 100644 --- a/meteor/server/api/buckets.ts +++ b/meteor/server/api/buckets.ts @@ -1,6 +1,6 @@ -import * as _ from 'underscore' +import _ from 'underscore' import { Meteor } from 'meteor/meteor' -import { Bucket } from '@sofie-automation/meteor-lib/dist/collections/Buckets' +import { Bucket } from '@sofie-automation/corelib/dist/dataModel/Bucket' import { getRandomId, getRandomString, literal } from '../lib/tempLib' import { BucketAdLib } from '@sofie-automation/corelib/dist/dataModel/BucketAdLibPiece' import { AdLibAction, AdLibActionCommon } from '@sofie-automation/corelib/dist/dataModel/AdlibAction' @@ -89,7 +89,7 @@ export namespace BucketsAPI { sort: { _rank: 1, }, - fields: { + projection: { _rank: 1, }, } diff --git a/meteor/server/api/cleanup.ts b/meteor/server/api/cleanup.ts index 03085b6b00..d2251665d1 100644 --- a/meteor/server/api/cleanup.ts +++ b/meteor/server/api/cleanup.ts @@ -14,7 +14,6 @@ import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collect import { BlueprintId, BucketId, - MediaWorkFlowId, OrganizationId, PartId, PartInstanceId, @@ -32,15 +31,12 @@ import { BucketAdLibs, Buckets, Evaluations, - ExpectedMediaItems, ExpectedPackages, ExpectedPackageWorkStatuses, ExpectedPlayoutItems, ExternalMessageQueue, NrcsIngestDataCache, MediaObjects, - MediaWorkFlows, - MediaWorkFlowSteps, Organizations, PackageContainerPackageStatuses, PackageContainerStatuses, @@ -107,7 +103,7 @@ export async function cleanupOldDataInner(actuallyCleanup = false): Promise => { const collectionName = getCollectionKey(collection) - const ids = (await collection.findFetchAsync(query, { fields: { _id: 1 } })).map((doc) => doc._id) + const ids = (await collection.findFetchAsync(query, { projection: { _id: 1 } })).map((doc) => doc._id) const count = ids.length if (actuallyCleanup) { await collection.mutableCollection.removeAsync(query) @@ -137,7 +133,7 @@ export async function cleanupOldDataInner(actuallyCleanup = false): Promise + ID extends ProtectedString, >( collection: AsyncOnlyReadOnlyMongoCollection ): Promise => { @@ -162,12 +158,11 @@ export async function cleanupOldDataInner(actuallyCleanup = false): Promise() const deviceIds = await getAllIdsInCollection(PeripheralDevices, removedDeviceIds) { const ownedByDeviceId = async < DBInterface extends { _id: ID; deviceId: PeripheralDeviceId }, - ID extends ProtectedString + ID extends ProtectedString, >( collection: AsyncOnlyReadOnlyMongoCollection ): Promise => { @@ -176,7 +171,6 @@ export async function cleanupOldDataInner(actuallyCleanup = false): Promise removedMediaWorkFlows.add(id)) await ownedByDeviceId(PackageContainerPackageStatuses) await ownedByDeviceId(PackageContainerStatuses) await ownedByDeviceId(PackageInfos) @@ -190,7 +184,7 @@ export async function cleanupOldDataInner(actuallyCleanup = false): Promise + ID extends ProtectedString, >( collection: AsyncOnlyReadOnlyMongoCollection ): Promise => { @@ -248,7 +242,7 @@ export async function cleanupOldDataInner(actuallyCleanup = false): Promise + ID extends ProtectedString, >( collection: AsyncOnlyReadOnlyMongoCollection ): Promise => { @@ -265,7 +259,7 @@ export async function cleanupOldDataInner(actuallyCleanup = false): Promise + ID extends ProtectedString, >( collection: AsyncOnlyReadOnlyMongoCollection ): Promise => { @@ -339,45 +333,6 @@ export async function cleanupOldDataInner(actuallyCleanup = false): Promise o._id) }, - }) - } - } // ExternalMessageQueue { await removeByQuery(ExternalMessageQueue, { @@ -387,13 +342,6 @@ export async function cleanupOldDataInner(actuallyCleanup = false): Promise { // HACK: TODO - should we check this? // if (isAnyQueuedWorkRunning()) return `Another sync-function is running, try again later` - const studios = await Studios.findFetchAsync({}, { fields: { _id: 1 } }) + const studios = await Studios.findFetchAsync({}, { projection: { _id: 1 } }) for (const studio of studios) { const activePlaylist: DBRundownPlaylist | undefined = ( await getActiveRundownPlaylistsInStudioFromDb(studio._id) @@ -500,7 +448,7 @@ async function getAllIdsInCollection { logger.error(stringifyError(e)) // allow the exception to be handled by the Client code - return Promise.reject(e) + return Promise.reject(e instanceof Error ? e : new Error(e)) }) } @@ -359,7 +357,7 @@ export namespace ServerClientAPI { }) // allow the exception to be handled by the Client code - return Promise.reject(err) + return Promise.reject(err instanceof Error ? err : new Error(err)) }) } @@ -385,7 +383,7 @@ export namespace ServerClientAPI { }).catch(async (e) => { logger.error(stringifyError(e)) // allow the exception to be handled by the Client code - return Promise.reject(e) + return Promise.reject(e instanceof Error ? e : new Error(e)) }) } @@ -399,7 +397,7 @@ export namespace ServerClientAPI { const errMsg = stringifyError(err) logger.error(errMsg) // allow the exception to be handled by the Client code - return Promise.reject(err) + return Promise.reject(err instanceof Error ? err : new Error(err)) }) } } diff --git a/meteor/server/api/deviceTriggers/PieceInstancesObserver.ts b/meteor/server/api/deviceTriggers/PieceInstancesObserver.ts new file mode 100644 index 0000000000..e23f92eb5d --- /dev/null +++ b/meteor/server/api/deviceTriggers/PieceInstancesObserver.ts @@ -0,0 +1,99 @@ +import { Meteor } from 'meteor/meteor' +import { RundownPlaylistActivationId, ShowStyleBaseId } from '@sofie-automation/corelib/dist/dataModel/Ids' +import { RundownPlaylists, ShowStyleBases, PieceInstances, PartInstances } from '../../collections' +import { logger } from '../../logging' +import { rundownPlaylistFieldSpecifier } from './reactiveContentCache' +import { + ContentCache, + createReactiveContentCache, + partInstanceFieldSpecifier, + pieceInstanceFieldSpecifier, +} from './reactiveContentCacheForPieceInstances' +import { waitForAllObserversReady } from '../../publications/lib/lib' + +const REACTIVITY_DEBOUNCE = 20 + +type ChangedHandler = (cache: ContentCache) => () => void + +export class PieceInstancesObserver { + #observers: Meteor.LiveQueryHandle[] = [] + #cache: ContentCache + #cancelCache: () => void + #cleanup: (() => void) | undefined + #disposed = false + + constructor(onChanged: ChangedHandler) { + const { cache, cancel: cancelCache } = createReactiveContentCache(() => { + this.#cleanup = onChanged(cache) + if (this.#disposed) this.#cleanup() + }, REACTIVITY_DEBOUNCE) + + this.#cache = cache + this.#cancelCache = cancelCache + } + + static async create( + activationId: RundownPlaylistActivationId, + showStyleBaseId: ShowStyleBaseId, + onChanged: ChangedHandler + ): Promise { + logger.silly(`Creating PieceInstancesObserver for activationId "${activationId}"`) + + const observer = new PieceInstancesObserver(onChanged) + + await observer.initObservers(activationId, showStyleBaseId) + + return observer + } + + private async initObservers(activationId: RundownPlaylistActivationId, showStyleBaseId: ShowStyleBaseId) { + this.#observers = await waitForAllObserversReady([ + RundownPlaylists.observeChanges( + { + activationId, + }, + this.#cache.RundownPlaylists.link(), + { + projection: rundownPlaylistFieldSpecifier, + } + ), + ShowStyleBases.observeChanges(showStyleBaseId, this.#cache.ShowStyleBases.link()), + PieceInstances.observeChanges( + { + playlistActivationId: activationId, + reset: { $ne: true }, + disabled: { $ne: true }, + reportedStoppedPlayback: { $exists: false }, + 'piece.virtual': { $ne: true }, + }, + this.#cache.PieceInstances.link(), + { + projection: pieceInstanceFieldSpecifier, + } + ), + PartInstances.observeChanges( + { + playlistActivationId: activationId, + reset: { $ne: true }, + 'timings.reportedStoppedPlayback': { $ne: true }, + }, + this.#cache.PartInstances.link(), + { + projection: partInstanceFieldSpecifier, + } + ), + ]) + } + + public get cache(): ContentCache { + return this.#cache + } + + public stop = (): void => { + this.#disposed = true + this.#cancelCache() + this.#observers.forEach((observer) => observer.stop()) + this.#cleanup?.() + this.#cleanup = undefined + } +} diff --git a/meteor/server/api/deviceTriggers/StudioDeviceTriggerManager.ts b/meteor/server/api/deviceTriggers/StudioDeviceTriggerManager.ts index ebb3e41ee8..bd07e3e037 100644 --- a/meteor/server/api/deviceTriggers/StudioDeviceTriggerManager.ts +++ b/meteor/server/api/deviceTriggers/StudioDeviceTriggerManager.ts @@ -25,16 +25,23 @@ import { protectString } from '../../lib/tempLib' import { StudioActionManager, StudioActionManagers } from './StudioActionManagers' import { DeviceTriggerMountedActionAdlibsPreview, DeviceTriggerMountedActions } from './observer' import { ContentCache } from './reactiveContentCache' +import { ContentCache as PieceInstancesContentCache } from './reactiveContentCacheForPieceInstances' import { logger } from '../../logging' import { SomeAction, SomeBlueprintTrigger } from '@sofie-automation/blueprints-integration' import { DeviceActions } from '@sofie-automation/shared-lib/dist/core/model/ShowStyle' import { DummyReactiveVar } from '@sofie-automation/meteor-lib/dist/triggers/reactive-var' import { MeteorTriggersContext } from './triggersContext' +import { TagsService } from './TagsService' export class StudioDeviceTriggerManager { #lastShowStyleBaseId: ShowStyleBaseId | null = null - constructor(public studioId: StudioId) { + lastCache: ContentCache | undefined + + constructor( + public studioId: StudioId, + protected tagsService: TagsService + ) { if (StudioActionManagers.get(studioId)) { logger.error(`A StudioActionManager for "${studioId}" already exists`) return @@ -45,6 +52,7 @@ export class StudioDeviceTriggerManager { async updateTriggers(cache: ContentCache, showStyleBaseId: ShowStyleBaseId): Promise { const studioId = this.studioId + this.lastCache = cache this.#lastShowStyleBaseId = showStyleBaseId const [showStyleBase, rundownPlaylist] = await Promise.all([ @@ -79,6 +87,8 @@ export class StudioDeviceTriggerManager { const upsertedDeviceTriggerMountedActionIds: DeviceTriggerMountedActionId[] = [] const touchedActionIds: DeviceActionId[] = [] + this.tagsService.clearObservedTags() + for (const rawTriggeredAction of allTriggeredActions) { const triggeredAction = convertDocument(rawTriggeredAction) @@ -163,6 +173,8 @@ export class StudioDeviceTriggerManager { sourceLayerType: undefined, sourceLayerName: undefined, styleClassNames: triggeredAction.styleClassNames, + isActive: undefined, + isNext: undefined, }), }) } else { @@ -174,6 +186,9 @@ export class StudioDeviceTriggerManager { ) addedPreviewIds.push(adLibPreviewId) + + this.tagsService.observeTallyTags(adLib) + const { isActive, isNext } = this.tagsService.getTallyStateFromTags(adLib) return DeviceTriggerMountedActionAdlibsPreview.upsertAsync(adLibPreviewId, { $set: literal({ ...adLib, @@ -189,9 +204,11 @@ export class StudioDeviceTriggerManager { ? { name: sourceLayers[adLib.sourceLayerId]?.name, abbreviation: sourceLayers[adLib.sourceLayerId]?.abbreviation, - } + } : undefined, styleClassNames: triggeredAction.styleClassNames, + isActive, + isNext, }), }) }) @@ -224,6 +241,18 @@ export class StudioDeviceTriggerManager { actionManager.deleteActionsOtherThan(touchedActionIds) } + protected async updateTriggersFromLastCache(): Promise { + if (!this.lastCache || !this.#lastShowStyleBaseId) return + return this.updateTriggers(this.lastCache, this.#lastShowStyleBaseId) + } + + async updatePieceInstances(cache: PieceInstancesContentCache, showStyleBaseId: ShowStyleBaseId): Promise { + const shouldUpdateTriggers = this.tagsService.updatePieceInstances(cache, showStyleBaseId) + if (shouldUpdateTriggers) { + await this.updateTriggersFromLastCache() + } + } + async clearTriggers(): Promise { const studioId = this.studioId const showStyleBaseId = this.#lastShowStyleBaseId @@ -309,14 +338,14 @@ async function createCurrentContextFromCache( const currentSegmentPartIds = currentPartInstance ? await cache.Parts.find({ segmentId: currentPartInstance.part.segmentId, - }).mapAsync((part) => part._id) + }).mapAsync((part) => part._id) : [] const nextSegmentPartIds = nextPartInstance ? nextPartInstance.part.segmentId === currentPartInstance?.part.segmentId ? currentSegmentPartIds : await cache.Parts.find({ segmentId: nextPartInstance.part.segmentId, - }).mapAsync((part) => part._id) + }).mapAsync((part) => part._id) : [] return { diff --git a/meteor/server/api/deviceTriggers/StudioObserver.ts b/meteor/server/api/deviceTriggers/StudioObserver.ts index eea90f3f77..43adfdace1 100644 --- a/meteor/server/api/deviceTriggers/StudioObserver.ts +++ b/meteor/server/api/deviceTriggers/StudioObserver.ts @@ -16,13 +16,16 @@ import { DBShowStyleBase } from '@sofie-automation/corelib/dist/dataModel/ShowSt import { logger } from '../../logging' import { observerChain } from '../../publications/lib/observerChain' import { ContentCache } from './reactiveContentCache' +import { ContentCache as PieceInstancesContentCache } from './reactiveContentCacheForPieceInstances' import { RundownContentObserver } from './RundownContentObserver' import { RundownsObserver } from './RundownsObserver' import { RundownPlaylists, Rundowns, ShowStyleBases } from '../../collections' import { PromiseDebounce } from '../../publications/lib/PromiseDebounce' import { MinimalMongoCursor } from '../../collections/implementations/asyncCollection' +import { PieceInstancesObserver } from './PieceInstancesObserver' -type ChangedHandler = (showStyleBaseId: ShowStyleBaseId, cache: ContentCache) => () => void +type RundownContentChangeHandler = (showStyleBaseId: ShowStyleBaseId, cache: ContentCache) => () => void +type PieceInstancesChangeHandler = (showStyleBaseId: ShowStyleBaseId, cache: PieceInstancesContentCache) => () => void const REACTIVITY_DEBOUNCE = 20 @@ -60,18 +63,26 @@ export class StudioObserver extends EventEmitter { #playlistInStudioLiveQuery: Meteor.LiveQueryHandle #showStyleOfRundownLiveQuery: Meteor.LiveQueryHandle | undefined #rundownsLiveQuery: Meteor.LiveQueryHandle | undefined + #pieceInstancesLiveQuery: Meteor.LiveQueryHandle | undefined + showStyleBaseId: ShowStyleBaseId | undefined currentProps: StudioObserverProps | undefined = undefined nextProps: StudioObserverProps | undefined = undefined - #changed: ChangedHandler + #rundownContentChanged: RundownContentChangeHandler + #pieceInstancesChanged: PieceInstancesChangeHandler #disposed = false - constructor(studioId: StudioId, onChanged: ChangedHandler) { + constructor( + studioId: StudioId, + onRundownContentChanged: RundownContentChangeHandler, + pieceInstancesChanged: PieceInstancesChangeHandler + ) { super() - this.#changed = onChanged + this.#rundownContentChanged = onRundownContentChanged + this.#pieceInstancesChanged = pieceInstancesChanged this.#playlistInStudioLiveQuery = observerChain() .next( 'activePlaylist', @@ -136,19 +147,20 @@ export class StudioObserver extends EventEmitter { .next( 'currentRundown', async () => - Rundowns.findWithCursor({ _id: rundownId }, { fields: rundownFieldSpecifier, limit: 1 }) as Promise< - MinimalMongoCursor> - > + Rundowns.findWithCursor( + { _id: rundownId }, + { projection: rundownFieldSpecifier, limit: 1 } + ) as Promise>> ) .next('showStyleBase', async (chain) => chain.currentRundown ? (ShowStyleBases.findWithCursor( { _id: chain.currentRundown.showStyleBaseId }, { - fields: showStyleBaseFieldSpecifier, + projection: showStyleBaseFieldSpecifier, limit: 1, } - ) as Promise>>) + ) as Promise>>) : null ) .end(this.updateShowStyle.call) @@ -160,7 +172,7 @@ export class StudioObserver extends EventEmitter { { currentRundown: Pick showStyleBase: Pick - } | null + } | null, ] >(async (state): Promise => { if (this.#disposed) return @@ -172,6 +184,9 @@ export class StudioObserver extends EventEmitter { this.#rundownsLiveQuery?.stop() this.#rundownsLiveQuery = undefined this.showStyleBaseId = showStyleBaseId + + this.#pieceInstancesLiveQuery?.stop() + this.#pieceInstancesLiveQuery = undefined return } @@ -186,10 +201,15 @@ export class StudioObserver extends EventEmitter { this.#rundownsLiveQuery?.stop() this.#rundownsLiveQuery = undefined + this.#pieceInstancesLiveQuery?.stop() + this.#pieceInstancesLiveQuery = undefined + + this.showStyleBaseId = showStyleBaseId + this.currentProps = this.nextProps this.nextProps = undefined - const { activePlaylistId } = this.currentProps + const { activePlaylistId, activationId } = this.currentProps this.showStyleBaseId = showStyleBaseId @@ -197,7 +217,7 @@ export class StudioObserver extends EventEmitter { logger.silly(`Creating new RundownContentObserver`) const obs1 = await RundownContentObserver.create(activePlaylistId, showStyleBaseId, rundownIds, (cache) => { - return this.#changed(showStyleBaseId, cache) + return this.#rundownContentChanged(showStyleBaseId, cache) }) return () => { @@ -205,9 +225,18 @@ export class StudioObserver extends EventEmitter { } }) + this.#pieceInstancesLiveQuery = await PieceInstancesObserver.create(activationId, showStyleBaseId, (cache) => { + const cleanupChanges = this.#pieceInstancesChanged(showStyleBaseId, cache) + + return () => { + cleanupChanges?.() + } + }) + if (this.#disposed) { // If we were disposed of while waiting for the observer to be created, stop it immediately this.#rundownsLiveQuery.stop() + this.#pieceInstancesLiveQuery.stop() } }, REACTIVITY_DEBOUNCE) diff --git a/meteor/server/api/deviceTriggers/TagsService.ts b/meteor/server/api/deviceTriggers/TagsService.ts new file mode 100644 index 0000000000..6983c3d888 --- /dev/null +++ b/meteor/server/api/deviceTriggers/TagsService.ts @@ -0,0 +1,161 @@ +import { PartInstanceId, ShowStyleBaseId } from '@sofie-automation/corelib/dist/dataModel/Ids' +import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' +import { PieceInstance } from '@sofie-automation/corelib/dist/dataModel/PieceInstance' +import { PieceInstanceFields, ContentCache } from './reactiveContentCacheForPieceInstances' +import { SourceLayers } from '@sofie-automation/corelib/dist/dataModel/ShowStyleBase' +import { + PieceInstanceWithTimings, + processAndPrunePieceInstanceTimings, +} from '@sofie-automation/corelib/dist/playout/processAndPrune' +import { applyAndValidateOverrides } from '@sofie-automation/corelib/dist/settings/objectWithOverrides' +import { IWrappedAdLib } from '@sofie-automation/meteor-lib/dist/triggers/actionFilterChainCompilers' +import { areSetsEqual, doSetsIntersect } from '@sofie-automation/corelib/dist/lib' + +export class TagsService { + protected onAirPiecesTags: Set = new Set() + protected nextPiecesTags: Set = new Set() + + protected tagsObservedByTriggers: Set = new Set() + + public clearObservedTags(): void { + this.tagsObservedByTriggers.clear() + } + + public observeTallyTags(adLib: IWrappedAdLib): void { + if ('currentPieceTags' in adLib && adLib.currentPieceTags) { + adLib.currentPieceTags.forEach((tag) => { + this.tagsObservedByTriggers.add(tag) + }) + } + } + + public getTallyStateFromTags(adLib: IWrappedAdLib): { isActive: boolean; isNext: boolean } { + let isActive = false + let isNext = false + if ('currentPieceTags' in adLib && adLib.currentPieceTags) { + isActive = adLib.currentPieceTags.every((tag) => this.onAirPiecesTags.has(tag)) + isNext = adLib.currentPieceTags.every((tag) => this.nextPiecesTags.has(tag)) + } + return { isActive, isNext } + } + + /** + * @param cache + * @param showStyleBaseId + * @returns whether triggers should be updated + */ + public updatePieceInstances(cache: ContentCache, showStyleBaseId: ShowStyleBaseId): boolean { + const rundownPlaylist = cache.RundownPlaylists.findOne({ + activationId: { + $exists: true, + }, + }) + if (!rundownPlaylist) { + return false + } + + const previousPartInstanceId = rundownPlaylist?.previousPartInfo?.partInstanceId + const currentPartInstanceId = rundownPlaylist?.currentPartInfo?.partInstanceId + const nextPartInstanceId = rundownPlaylist?.nextPartInfo?.partInstanceId + + const showStyleBase = cache.ShowStyleBases.findOne(showStyleBaseId) + + if (!showStyleBase) return false + + const resolvedSourceLayers = applyAndValidateOverrides(showStyleBase.sourceLayersWithOverrides).obj + + const inPreviousPartInstance = previousPartInstanceId + ? this.processAndPrunePieceInstanceTimings( + cache.PartInstances.findOne(previousPartInstanceId)?.timings, + cache.PieceInstances.find({ partInstanceId: previousPartInstanceId }).fetch(), + resolvedSourceLayers + ) + : [] + const inCurrentPartInstance = currentPartInstanceId + ? this.processAndPrunePieceInstanceTimings( + cache.PartInstances.findOne(currentPartInstanceId)?.timings, + cache.PieceInstances.find({ partInstanceId: currentPartInstanceId }).fetch(), + resolvedSourceLayers + ) + : [] + const inNextPartInstance = nextPartInstanceId + ? this.processAndPrunePieceInstanceTimings( + undefined, + cache.PieceInstances.find({ partInstanceId: nextPartInstanceId }).fetch(), + resolvedSourceLayers + ) + : [] + + const activePieceInstances = [...inPreviousPartInstance, ...inCurrentPartInstance].filter((pieceInstance) => + this.isPieceInstanceActive(pieceInstance, previousPartInstanceId, currentPartInstanceId) + ) + + const activePieceInstancesTags = new Set() + activePieceInstances.forEach((pieceInstance) => { + pieceInstance.piece.tags?.forEach((tag) => { + activePieceInstancesTags.add(tag) + }) + }) + + const nextPieceInstancesTags = new Set() + inNextPartInstance.forEach((pieceInstance) => { + pieceInstance.piece.tags?.forEach((tag) => { + nextPieceInstancesTags.add(tag) + }) + }) + + const shouldUpdateTriggers = this.shouldUpdateTriggers(activePieceInstancesTags, nextPieceInstancesTags) + + this.onAirPiecesTags = activePieceInstancesTags + this.nextPiecesTags = nextPieceInstancesTags + + return shouldUpdateTriggers + } + + private shouldUpdateTriggers(activePieceInstancesTags: Set, nextPieceInstancesTags: Set) { + return ( + (!areSetsEqual(this.onAirPiecesTags, activePieceInstancesTags) || + !areSetsEqual(this.nextPiecesTags, nextPieceInstancesTags)) && + (doSetsIntersect(activePieceInstancesTags, this.tagsObservedByTriggers) || + doSetsIntersect(nextPieceInstancesTags, this.tagsObservedByTriggers) || + doSetsIntersect(this.onAirPiecesTags, this.tagsObservedByTriggers) || + doSetsIntersect(this.nextPiecesTags, this.tagsObservedByTriggers)) + ) + } + + private processAndPrunePieceInstanceTimings( + partInstanceTimings: DBPartInstance['timings'] | undefined, + pieceInstances: Array>, + sourceLayers: SourceLayers + ): PieceInstanceWithTimings[] { + // Approximate when 'now' is in the PartInstance, so that any adlibbed Pieces will be timed roughly correctly + const partStarted = partInstanceTimings?.plannedStartedPlayback + const nowInPart = partStarted === undefined ? 0 : Date.now() - partStarted + + return processAndPrunePieceInstanceTimings( + sourceLayers, + pieceInstances as PieceInstance[], + nowInPart, + false, + false + ) + } + + private isPieceInstanceActive( + pieceInstance: PieceInstanceWithTimings, + previousPartInstanceId: PartInstanceId | undefined, + currentPartInstanceId: PartInstanceId | undefined + ) { + return ( + pieceInstance.reportedStoppedPlayback == null && + pieceInstance.piece.virtual !== true && + pieceInstance.disabled !== true && + (pieceInstance.partInstanceId === previousPartInstanceId || // a piece from previous part instance may be active during transition + pieceInstance.partInstanceId === currentPartInstanceId) && + (pieceInstance.reportedStartedPlayback != null || // has been reported to have started by the Playout Gateway + pieceInstance.plannedStartedPlayback != null || // a time to start playing has been set by Core + (pieceInstance.partInstanceId === currentPartInstanceId && pieceInstance.piece.enable.start === 0) || // this is to speed things up immediately after a part instance is taken when not yet reported by the Playout Gateway + pieceInstance.infinite?.fromPreviousPart) // infinites from previous part also are on air from the start of the current part + ) + } +} diff --git a/meteor/server/api/deviceTriggers/__tests__/TagsService.test.ts b/meteor/server/api/deviceTriggers/__tests__/TagsService.test.ts new file mode 100644 index 0000000000..1248e39158 --- /dev/null +++ b/meteor/server/api/deviceTriggers/__tests__/TagsService.test.ts @@ -0,0 +1,236 @@ +import { protectString } from '@sofie-automation/corelib/dist/protectedString' +import { TagsService } from '../TagsService' +import { + PartInstanceId, + PieceInstanceId, + RundownPlaylistActivationId, + RundownPlaylistId, + ShowStyleBaseId, +} from '@sofie-automation/corelib/dist/dataModel/Ids' +import { ContentCache } from '../reactiveContentCacheForPieceInstances' +import { ReactiveCacheCollection } from '../../../publications/lib/ReactiveCacheCollection' +import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' +import { DBShowStyleBase } from '@sofie-automation/corelib/dist/dataModel/ShowStyleBase' +import { wrapDefaultObject } from '@sofie-automation/corelib/dist/settings/objectWithOverrides' +import { literal, normalizeArray } from '@sofie-automation/corelib/dist/lib' +import { ISourceLayer, PieceLifespan, SourceLayerType } from '@sofie-automation/blueprints-integration' +import { PieceInstance } from '@sofie-automation/corelib/dist/dataModel/PieceInstance' +import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' +import { IWrappedAdLib } from '@sofie-automation/meteor-lib/dist/triggers/actionFilterChainCompilers' + +const createTestee = () => new TagsService() + +const playlistId = protectString('playlist0') +const activationId = protectString('activation0') +const showStyleBaseId = protectString('showStyleBase0') +const partInstanceId0 = protectString('partInstance0') +const partInstanceId1 = protectString('partInstance1') +const partInstanceId2 = protectString('partInstance2') +const pieceInstanceId0 = protectString('pieceInstance0') +const pieceInstanceId1 = protectString('pieceInstance1') +const pieceInstanceId2 = protectString('pieceInstance2') +const pieceInstanceId3 = protectString('pieceInstance3') + +const sourceLayerId0 = 'sourceLayerId0' +const sourceLayerId1 = 'sourceLayerId1' + +const tag0 = 'tag0' +const tag1 = 'tag1' +const tag2 = 'tag2' +const tag3 = 'tag3' + +const tag4 = 'tag4' + +function createAndPopulateMockCache(): ContentCache { + const newCache: ContentCache = { + RundownPlaylists: new ReactiveCacheCollection('rundownPlaylists'), + ShowStyleBases: new ReactiveCacheCollection('showStyleBases'), + PieceInstances: new ReactiveCacheCollection('pieceInstances'), + PartInstances: new ReactiveCacheCollection('partInstances'), + } + + newCache.RundownPlaylists.insert({ + _id: playlistId, + activationId: activationId, + currentPartInfo: { + partInstanceId: partInstanceId0, + }, + nextPartInfo: { + partInstanceId: partInstanceId1, + }, + } as DBRundownPlaylist) + + newCache.ShowStyleBases.insert({ + _id: showStyleBaseId, + sourceLayersWithOverrides: wrapDefaultObject( + normalizeArray( + [ + literal({ + _id: sourceLayerId0, + _rank: 0, + name: 'Camera', + type: SourceLayerType.CAMERA, + exclusiveGroup: 'main', + }), + literal({ + _id: sourceLayerId1, + _rank: 1, + name: 'Graphic', + type: SourceLayerType.GRAPHICS, + }), + ], + '_id' + ) + ), + } as DBShowStyleBase) + + newCache.PieceInstances.insert({ + _id: pieceInstanceId0, + piece: { + tags: [tag0, tag2], + sourceLayerId: sourceLayerId0, + enable: { start: 0 }, + lifespan: PieceLifespan.WithinPart, + }, + partInstanceId: partInstanceId0, + } as PieceInstance) + newCache.PieceInstances.insert({ + _id: pieceInstanceId1, + piece: { + tags: [tag1], + sourceLayerId: sourceLayerId0, + enable: { start: 0 }, + lifespan: PieceLifespan.WithinPart, + }, + partInstanceId: partInstanceId1, + } as PieceInstance) + newCache.PieceInstances.insert({ + _id: pieceInstanceId2, + piece: { + tags: [tag2], + sourceLayerId: sourceLayerId1, + enable: { start: 0 }, + lifespan: PieceLifespan.WithinPart, + }, + partInstanceId: partInstanceId1, + } as PieceInstance) + newCache.PieceInstances.insert({ + _id: pieceInstanceId3, + piece: { + tags: [tag3], + sourceLayerId: sourceLayerId0, + enable: { start: 0 }, + lifespan: PieceLifespan.WithinPart, + }, + partInstanceId: partInstanceId2, + } as PieceInstance) + + newCache.PartInstances.insert({ + _id: partInstanceId0, + } as DBPartInstance) + newCache.PartInstances.insert({ + _id: partInstanceId1, + } as DBPartInstance) + newCache.PartInstances.insert({ + _id: partInstanceId2, + } as DBPartInstance) + + return newCache +} + +describe('TagsService', () => { + test('adlib that has no tags', () => { + const testee = createTestee() + const cache = createAndPopulateMockCache() + + testee.updatePieceInstances(cache, showStyleBaseId) + const result = testee.getTallyStateFromTags({} as IWrappedAdLib) + expect(result).toEqual({ isActive: false, isNext: false }) + }) + + test('adlib that is neither on air or next', () => { + const testee = createTestee() + const cache = createAndPopulateMockCache() + + testee.updatePieceInstances(cache, showStyleBaseId) + const result = testee.getTallyStateFromTags({ + currentPieceTags: [tag3], + } as IWrappedAdLib) + expect(result).toEqual({ isActive: false, isNext: false }) + }) + + test('adlib that is both on air and next', () => { + const testee = createTestee() + const cache = createAndPopulateMockCache() + + testee.updatePieceInstances(cache, showStyleBaseId) + const result = testee.getTallyStateFromTags({ + currentPieceTags: [tag2], + } as IWrappedAdLib) + + expect(result).toEqual({ isActive: true, isNext: true }) + }) + + test('adlib that is only on air', () => { + const testee = createTestee() + const cache = createAndPopulateMockCache() + + testee.updatePieceInstances(cache, showStyleBaseId) + const result = testee.getTallyStateFromTags({ + currentPieceTags: [tag0], + } as IWrappedAdLib) + expect(result).toEqual({ isActive: true, isNext: false }) + }) + + test('adlib that is only next', () => { + const testee = createTestee() + const cache = createAndPopulateMockCache() + + testee.updatePieceInstances(cache, showStyleBaseId) + const result = testee.getTallyStateFromTags({ + currentPieceTags: [tag1], + } as IWrappedAdLib) + expect(result).toEqual({ isActive: false, isNext: true }) + }) + + test('updatePieceInstances returns true if observed tags are present in pieces', () => { + const testee = createTestee() + const cache = createAndPopulateMockCache() + + testee.observeTallyTags({ + currentPieceTags: [tag1], + } as IWrappedAdLib) + const result = testee.updatePieceInstances(cache, showStyleBaseId) + + expect(result).toEqual(true) + }) + + test('updatePieceInstances returns false if observed tags are not included in pieces', () => { + const testee = createTestee() + const cache = createAndPopulateMockCache() + + testee.observeTallyTags({ + currentPieceTags: [tag4], + } as IWrappedAdLib) + const result = testee.updatePieceInstances(cache, showStyleBaseId) + + expect(result).toEqual(false) + }) + + test('updatePieceInstances returns true if observed tags are no longer present on pieces', () => { + const testee = createTestee() + const cache = createAndPopulateMockCache() + + testee.observeTallyTags({ + currentPieceTags: [tag1], + } as IWrappedAdLib) + testee.updatePieceInstances(cache, showStyleBaseId) + + cache.PieceInstances.find({}).forEach((pieceInstance) => { + pieceInstance.piece.tags = [tag2] + }) + const result = testee.updatePieceInstances(cache, showStyleBaseId) + + expect(result).toEqual(true) + }) +}) diff --git a/meteor/server/api/deviceTriggers/observer.ts b/meteor/server/api/deviceTriggers/observer.ts index ebe1939df2..cbabcc5356 100644 --- a/meteor/server/api/deviceTriggers/observer.ts +++ b/meteor/server/api/deviceTriggers/observer.ts @@ -18,6 +18,7 @@ import { StudioObserver } from './StudioObserver' import { Studios } from '../../collections' import { ReactiveCacheCollection } from '../../publications/lib/ReactiveCacheCollection' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' +import { TagsService } from './TagsService' type ObserverAndManager = { observer: StudioObserver @@ -43,15 +44,25 @@ Meteor.startup(async () => { function createObserverAndManager(studioId: StudioId) { logger.debug(`Creating observer for studio "${studioId}"`) - const manager = new StudioDeviceTriggerManager(studioId) - const observer = new StudioObserver(studioId, (showStyleBaseId, cache) => { - logger.silly(`Studio observer updating triggers for "${studioId}":"${showStyleBaseId}"`) - workInQueue(async () => manager.updateTriggers(cache, showStyleBaseId)) + const manager = new StudioDeviceTriggerManager(studioId, new TagsService()) + const observer = new StudioObserver( + studioId, + (showStyleBaseId, cache) => { + logger.silly(`Studio observer updating triggers for "${studioId}":"${showStyleBaseId}"`) + workInQueue(async () => manager.updateTriggers(cache, showStyleBaseId)) + + return () => { + workInQueue(async () => manager.clearTriggers()) + } + }, + (showStyleBaseId, cache) => { + workInQueue(async () => manager.updatePieceInstances(cache, showStyleBaseId)) - return () => { - workInQueue(async () => manager.clearTriggers()) + return () => { + return + } } - }) + ) studioObserversAndManagers.set(studioId, { manager, observer }) } diff --git a/meteor/server/api/deviceTriggers/reactiveContentCacheForPieceInstances.ts b/meteor/server/api/deviceTriggers/reactiveContentCacheForPieceInstances.ts new file mode 100644 index 0000000000..fafba70f46 --- /dev/null +++ b/meteor/server/api/deviceTriggers/reactiveContentCacheForPieceInstances.ts @@ -0,0 +1,108 @@ +import { Meteor } from 'meteor/meteor' +import _ from 'underscore' +import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' +import { DBShowStyleBase } from '@sofie-automation/corelib/dist/dataModel/ShowStyleBase' +import { ReactiveCacheCollection } from '../../publications/lib/ReactiveCacheCollection' +import { MongoFieldSpecifierOnesStrict } from '@sofie-automation/corelib/dist/mongo' +import { literal } from '@sofie-automation/corelib/dist/lib' +import { PieceInstance } from '@sofie-automation/corelib/dist/dataModel/PieceInstance' +import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' + +export type RundownPlaylistFields = + | '_id' + | 'name' + | 'activationId' + | 'currentPartInfo' + | 'nextPartInfo' + | 'previousPartInfo' +export const rundownPlaylistFieldSpecifier = literal< + MongoFieldSpecifierOnesStrict> +>({ + _id: 1, + name: 1, + activationId: 1, + currentPartInfo: 1, + nextPartInfo: 1, + previousPartInfo: 1, +}) + +export type PieceInstanceFields = + | '_id' + | 'partInstanceId' + | 'playlistActivationId' + | 'reportedStartedPlayback' + | 'reportedStoppedPlayback' + | 'piece' + | 'disabled' + | 'infinite' + | 'reset' +export const pieceInstanceFieldSpecifier = literal< + MongoFieldSpecifierOnesStrict> +>({ + _id: 1, + partInstanceId: 1, + playlistActivationId: 1, + reportedStartedPlayback: 1, + reportedStoppedPlayback: 1, + piece: 1, + disabled: 1, + infinite: 1, + reset: 1, +}) + +export type PartInstanceFields = '_id' | 'playlistActivationId' | 'timings' | 'reset' +export const partInstanceFieldSpecifier = literal< + MongoFieldSpecifierOnesStrict> +>({ + _id: 1, + playlistActivationId: 1, + timings: 1, + reset: 1, +}) + +export interface ContentCache { + RundownPlaylists: ReactiveCacheCollection> + ShowStyleBases: ReactiveCacheCollection + PieceInstances: ReactiveCacheCollection> + PartInstances: ReactiveCacheCollection> +} + +type ReactionWithCache = (cache: ContentCache) => void + +export function createReactiveContentCache( + reaction: ReactionWithCache, + reactivityDebounce: number +): { cache: ContentCache; cancel: () => void } { + let isCancelled = false + const innerReaction = _.debounce( + Meteor.bindEnvironment(() => { + if (isCancelled) return + reaction(cache) + }), + reactivityDebounce + ) + const cancel = () => { + isCancelled = true + innerReaction.cancel() + } + + const cache: ContentCache = { + RundownPlaylists: new ReactiveCacheCollection>( + 'rundownPlaylists', + innerReaction + ), + ShowStyleBases: new ReactiveCacheCollection('showStyleBases', innerReaction), + PieceInstances: new ReactiveCacheCollection>( + 'pieceInstances', + innerReaction + ), + PartInstances: new ReactiveCacheCollection>( + 'partInstances', + innerReaction + ), + } + + innerReaction() + + return { cache, cancel } +} diff --git a/meteor/server/api/evaluations.ts b/meteor/server/api/evaluations.ts index cfa30748db..355a4138d5 100644 --- a/meteor/server/api/evaluations.ts +++ b/meteor/server/api/evaluations.ts @@ -4,7 +4,7 @@ import { getCurrentTime } from '../lib/lib' import { deferAsync } from '../lib/lib' import { logger } from '../logging' import { Meteor } from 'meteor/meteor' -import * as _ from 'underscore' +import _ from 'underscore' import { fetchStudioLight } from '../optimizations' import { sendSlackMessageToWebhook } from './integration/slack' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' @@ -63,7 +63,7 @@ export async function saveEvaluation( // only send message for evaluations with content if (evaluationMessage) { const playlist = (await RundownPlaylists.findOneAsync(evaluation.playlistId, { - fields: { + projection: { _id: 1, name: 1, }, diff --git a/meteor/server/api/ingest/debug.ts b/meteor/server/api/ingest/debug.ts index 4645a26450..37c2947233 100644 --- a/meteor/server/api/ingest/debug.ts +++ b/meteor/server/api/ingest/debug.ts @@ -49,7 +49,7 @@ MeteorDebugMethods({ }, /** * Regenerate all the expected packages for all rundowns in the system. - * Additionally it will recreate any expectedMediaItems and expectedPlayoutItems. + * Additionally it will recreate any expectedPlayoutItems. * This shouldn't be necessary as ingest will do this for each rundown as part of its workflow */ debug_recreateExpectedPackages: async () => { diff --git a/meteor/server/api/ingest/genericDevice/actions.ts b/meteor/server/api/ingest/genericDevice/actions.ts index b78832a54c..5474b88de2 100644 --- a/meteor/server/api/ingest/genericDevice/actions.ts +++ b/meteor/server/api/ingest/genericDevice/actions.ts @@ -4,7 +4,7 @@ import { Rundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' import { TriggerReloadDataResponse } from '@sofie-automation/meteor-lib/dist/api/userActions' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' import { logger } from '../../../logging' -import * as _ from 'underscore' +import _ from 'underscore' import { IngestRundown } from '@sofie-automation/blueprints-integration' import { generateRundownSource, runIngestOperation } from '../lib' import { IngestJobs } from '@sofie-automation/corelib/dist/worker/ingest' diff --git a/meteor/server/api/ingest/ingestCache.ts b/meteor/server/api/ingest/ingestCache.ts index 36ca3a381f..a88ab84d0d 100644 --- a/meteor/server/api/ingest/ingestCache.ts +++ b/meteor/server/api/ingest/ingestCache.ts @@ -1,4 +1,4 @@ -import * as _ from 'underscore' +import _ from 'underscore' import { Meteor } from 'meteor/meteor' import { IngestRundown, IngestSegment } from '@sofie-automation/blueprints-integration' import { logger } from '../../logging' @@ -18,7 +18,10 @@ import { groupByToMap } from '@sofie-automation/corelib/dist/lib' * (or its child types) from the NrcsIngestDataCache collection */ export class RundownIngestDataCache { - private constructor(private readonly rundownId: RundownId, private readonly documents: NrcsIngestDataCacheObj[]) {} + private constructor( + private readonly rundownId: RundownId, + private readonly documents: NrcsIngestDataCacheObj[] + ) {} static async create(rundownId: RundownId): Promise { const docs = await NrcsIngestDataCache.findFetchAsync({ rundownId }) diff --git a/meteor/server/api/ingest/mosDevice/actions.ts b/meteor/server/api/ingest/mosDevice/actions.ts index c2bc59275c..64754fb475 100644 --- a/meteor/server/api/ingest/mosDevice/actions.ts +++ b/meteor/server/api/ingest/mosDevice/actions.ts @@ -6,7 +6,7 @@ import { Piece } from '@sofie-automation/corelib/dist/dataModel/Piece' import { IngestPart } from '@sofie-automation/blueprints-integration' import { parseMosString } from './lib' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' -import * as _ from 'underscore' +import _ from 'underscore' import { TriggerReloadDataResponse } from '@sofie-automation/meteor-lib/dist/api/userActions' import { generateRundownSource, getPeripheralDeviceFromRundown, runIngestOperation } from '../lib' import { IngestJobs } from '@sofie-automation/corelib/dist/worker/ingest' diff --git a/meteor/server/api/ingest/rundownInput.ts b/meteor/server/api/ingest/rundownInput.ts index 4013b465ef..86a28b547f 100644 --- a/meteor/server/api/ingest/rundownInput.ts +++ b/meteor/server/api/ingest/rundownInput.ts @@ -366,7 +366,7 @@ Meteor.startup(async () => { added: onMediaObjectChanged, changed: onMediaObjectChanged, }, - { fields: { _id: 1, mediaId: 1, mediainfo: 1, studioId: 1 } } + { projection: { _id: 1, mediaId: 1, mediainfo: 1, studioId: 1 } } ) }) @@ -382,7 +382,7 @@ async function onMediaObjectChanged(newDocument: MediaObject, oldDocument?: Medi oldDocument.mediainfo?.format?.duration !== newDocument.mediainfo.format.duration) ) { const rundownIdsInStudio = ( - await Rundowns.findFetchAsync({ studioId: newDocument.studioId }, { fields: { _id: 1 } }) + await Rundowns.findFetchAsync({ studioId: newDocument.studioId }, { projection: { _id: 1 } }) ).map((rundown) => rundown._id) const updateIds: MediaObjectUpdatedIds[] = ( @@ -392,7 +392,7 @@ async function onMediaObjectChanged(newDocument: MediaObject, oldDocument?: Medi 'hackListenToMediaObjectUpdates.mediaId': newDocument.mediaId, }, { - fields: { + projection: { rundownId: 1, segmentId: 1, }, @@ -415,7 +415,7 @@ async function onMediaObjectChanged(newDocument: MediaObject, oldDocument?: Medi rundownId: { $in: updateIds.map((obj) => obj.rundownId) }, }, { - fields: { + projection: { segmentId: 1, }, } diff --git a/meteor/server/api/integration/expectedPackages.ts b/meteor/server/api/integration/expectedPackages.ts index 0127307b4f..89861c55c0 100644 --- a/meteor/server/api/integration/expectedPackages.ts +++ b/meteor/server/api/integration/expectedPackages.ts @@ -363,7 +363,7 @@ export namespace PackageManagerIntegration { $or: [{ removeTime: null }, { removeTime: { $exists: false } }], }, { - fields: { + projection: { payload: 0, }, } diff --git a/meteor/server/api/integration/media-scanner.ts b/meteor/server/api/integration/media-scanner.ts index cda12b162e..889df52452 100644 --- a/meteor/server/api/integration/media-scanner.ts +++ b/meteor/server/api/integration/media-scanner.ts @@ -26,7 +26,7 @@ export namespace MediaScannerIntegration { collectionId: collectionId, }, { - fields: { + projection: { _id: 1, objId: 1, _rev: 1, diff --git a/meteor/server/api/integration/mediaWorkFlows.ts b/meteor/server/api/integration/mediaWorkFlows.ts deleted file mode 100644 index c2167e6365..0000000000 --- a/meteor/server/api/integration/mediaWorkFlows.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { check, Match } from '../../lib/check' -import { Meteor } from 'meteor/meteor' -import { logger } from '../../logging' -import { MediaWorkFlow } from '@sofie-automation/shared-lib/dist/core/model/MediaWorkFlows' -import { MediaWorkFlowStep } from '@sofie-automation/shared-lib/dist/core/model/MediaWorkFlowSteps' -import { - MediaWorkFlowRevision, - MediaWorkFlowStepRevision, -} from '@sofie-automation/shared-lib/dist/peripheralDevice/mediaManager' -import { PeripheralDeviceType } from '@sofie-automation/corelib/dist/dataModel/PeripheralDevice' -import { MethodContext } from '../methodContext' -import { checkAccessAndGetPeripheralDevice } from '../../security/check' -import { MediaWorkFlowId, MediaWorkFlowStepId, PeripheralDeviceId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { MediaWorkFlows, MediaWorkFlowSteps } from '../../collections' - -export namespace MediaManagerIntegration { - export async function getMediaWorkFlowStepRevisions( - context: MethodContext, - deviceId: PeripheralDeviceId, - deviceToken: string - ): Promise { - logger.debug('getMediaWorkFlowStepRevisions') - const peripheralDevice = await checkAccessAndGetPeripheralDevice(deviceId, deviceToken, context) - - if (peripheralDevice.studioAndConfigId) { - const rawSteps = (await MediaWorkFlowSteps.findFetchAsync( - { - studioId: peripheralDevice.studioAndConfigId.studioId, - }, - { - fields: { - _id: 1, - _rev: 1, - }, - } - )) as Array> - - return rawSteps.map((ws) => { - return { - _id: ws._id, - _rev: ws._rev, - } - }) - } else { - throw new Meteor.Error(400, 'Device "' + peripheralDevice._id + '" has no studio') - } - } - - export async function getMediaWorkFlowRevisions( - context: MethodContext, - deviceId: PeripheralDeviceId, - deviceToken: string - ): Promise { - logger.debug('getMediaWorkFlowRevisions') - const peripheralDevice = await checkAccessAndGetPeripheralDevice(deviceId, deviceToken, context) - - if (peripheralDevice.studioAndConfigId) { - const rawWorkflows = (await MediaWorkFlows.findFetchAsync( - { - studioId: peripheralDevice.studioAndConfigId.studioId, - }, - { - fields: { - _id: 1, - _rev: 1, - }, - } - )) as Array> - - return rawWorkflows.map((wf) => { - return { - _id: wf._id, - _rev: wf._rev, - } - }) - } else { - throw new Meteor.Error(400, 'Device "' + peripheralDevice._id + '" has no studio') - } - } - - export async function updateMediaWorkFlow( - context: MethodContext, - deviceId: PeripheralDeviceId, - deviceToken: string, - workFlowId: MediaWorkFlowId, - obj: MediaWorkFlow | null - ): Promise { - const peripheralDevice = await checkAccessAndGetPeripheralDevice(deviceId, deviceToken, context) - if (peripheralDevice.type !== PeripheralDeviceType.MEDIA_MANAGER) - throw new Meteor.Error( - 400, - `Device "${peripheralDevice._id}".type is "${peripheralDevice.type}", should be MEDIA_MANAGER ` - ) - if (!peripheralDevice.studioAndConfigId) - throw new Meteor.Error(400, 'Device "' + peripheralDevice._id + '" has no studio') - - check(workFlowId, String) - check(obj, Match.Maybe(Object)) - - if (obj) { - check(obj._id, String) - obj.deviceId = peripheralDevice._id - obj.studioId = peripheralDevice.studioAndConfigId.studioId - - await MediaWorkFlows.upsertAsync(workFlowId, obj) - - if (obj.finished && !obj.success) { - logger.info('mm job failed') - } else if (obj.finished && obj.success) { - logger.info('mm job success') - } - } else { - await MediaWorkFlows.removeAsync(workFlowId) - - await MediaWorkFlowSteps.removeAsync({ - workFlowId: workFlowId, - }) - } - } - - export async function updateMediaWorkFlowStep( - context: MethodContext, - deviceId: PeripheralDeviceId, - deviceToken: string, - stepId: MediaWorkFlowStepId, - obj: MediaWorkFlowStep | null - ): Promise { - const peripheralDevice = await checkAccessAndGetPeripheralDevice(deviceId, deviceToken, context) - if (peripheralDevice.type !== PeripheralDeviceType.MEDIA_MANAGER) - throw new Meteor.Error( - 400, - `Device "${peripheralDevice._id}".type is "${peripheralDevice.type}", should be MEDIA_MANAGER ` - ) - if (!peripheralDevice.studioAndConfigId) - throw new Meteor.Error(400, 'Device "' + peripheralDevice._id + '" has no studio') - - check(stepId, String) - check(obj, Match.Maybe(Object)) - - if (obj) { - check(obj._id, String) - check(obj.workFlowId, String) - - const workflow = await MediaWorkFlows.findOneAsync(obj.workFlowId) - - if (!workflow) throw new Meteor.Error(404, `Workflow "${obj.workFlowId}" not found`) - - obj.workFlowId = workflow._id - obj.deviceId = peripheralDevice._id - obj.studioId = peripheralDevice.studioAndConfigId.studioId - - await MediaWorkFlowSteps.upsertAsync(stepId, obj) - } else { - await MediaWorkFlowSteps.removeAsync(stepId) - } - } -} diff --git a/meteor/server/api/mediaManager.ts b/meteor/server/api/mediaManager.ts deleted file mode 100644 index ea9caa8113..0000000000 --- a/meteor/server/api/mediaManager.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { MediaWorkFlow } from '@sofie-automation/shared-lib/dist/core/model/MediaWorkFlows' -import { PeripheralDevice } from '@sofie-automation/corelib/dist/dataModel/PeripheralDevice' -import { MediaWorkFlows, PeripheralDevices } from '../collections' -import { executePeripheralDeviceFunction } from './peripheralDevice/executeFunction' -import { MediaWorkFlowId, OrganizationId, PeripheralDeviceId } from '@sofie-automation/corelib/dist/dataModel/Ids' - -export async function restartAllWorkflows(organizationId: OrganizationId | null): Promise { - const devices: Array> = await PeripheralDevices.findFetchAsync( - organizationId ? { organizationId: organizationId } : {}, - { - fields: { - _id: 1, - }, - } - ) - const workflows: Array> = await MediaWorkFlows.findFetchAsync( - { - deviceId: { $in: devices.map((d) => d._id) }, - }, - { - fields: { - deviceId: 1, - }, - } - ) - - const deviceIds = Array.from(new Set(workflows.map((w) => w.deviceId))) - - await Promise.all( - deviceIds.map(async (deviceId) => executePeripheralDeviceFunction(deviceId, 'restartAllWorkflows')) - ) -} -export async function abortAllWorkflows(organizationId: OrganizationId | null): Promise { - const devices: Array> = await PeripheralDevices.findFetchAsync( - organizationId ? { organizationId: organizationId } : {}, - { - fields: { - _id: 1, - }, - } - ) - const workflows: Array> = await MediaWorkFlows.findFetchAsync( - { - deviceId: { $in: devices.map((d) => d._id) }, - }, - { - fields: { - deviceId: 1, - }, - } - ) - - const deviceIds = Array.from(new Set(workflows.map((w) => w.deviceId))) - - await Promise.all(deviceIds.map(async (deviceId) => executePeripheralDeviceFunction(deviceId, 'abortAllWorkflows'))) -} - -export async function restartWorkflow(deviceId: PeripheralDeviceId, workflowId: MediaWorkFlowId): Promise { - await ensureWorkflowExists(workflowId) - - await executePeripheralDeviceFunction(deviceId, 'restartWorkflow', workflowId) -} -export async function abortWorkflow(deviceId: PeripheralDeviceId, workflowId: MediaWorkFlowId): Promise { - await ensureWorkflowExists(workflowId) - - await executePeripheralDeviceFunction(deviceId, 'abortWorkflow', workflowId) -} -export async function prioritizeWorkflow(deviceId: PeripheralDeviceId, workflowId: MediaWorkFlowId): Promise { - await ensureWorkflowExists(workflowId) - - await executePeripheralDeviceFunction(deviceId, 'prioritizeWorkflow', workflowId) -} - -async function ensureWorkflowExists(workflowId: MediaWorkFlowId): Promise { - const doc = await MediaWorkFlows.findOneAsync(workflowId, { projection: { _id: 1 } }) - if (!doc) throw new Error(`Workflow "${workflowId}" not found`) -} diff --git a/meteor/server/api/mongo.ts b/meteor/server/api/mongo.ts new file mode 100644 index 0000000000..4d944ca6dc --- /dev/null +++ b/meteor/server/api/mongo.ts @@ -0,0 +1,102 @@ +import { registerClassToMeteorMethods } from '../methods' +import { MethodContextAPI } from './methodContext' +import { MongoAPI, MongoAPIMethods } from '@sofie-automation/meteor-lib/dist/api/mongo' +import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' +import { ProtectedString } from '../lib/tempLib' +import { logger } from '../logging' +import { collectionsAllowDenyCache, collectionsCache } from '../collections/collection' +import { Meteor } from 'meteor/meteor' +import { checkHasOneOfPermissions, parseConnectionPermissions } from '../security/auth' +import { triggerWriteAccess } from '../security/securityVerify' + +const hasOwn = Object.prototype.hasOwnProperty +const ALLOWED_UPDATE_OPERATIONS = { + $inc: 1, + $set: 1, + $unset: 1, + $addToSet: 1, + $pop: 1, + $pullAll: 1, + $pull: 1, + $pushAll: 1, + $push: 1, + $bit: 1, +} + +class MongoAPIClass extends MethodContextAPI implements MongoAPI { + async insertDocument(collectionName: CollectionName, _newDocument: any): Promise> { + triggerWriteAccess() + + logger.error(`MongoAPI.insertDocument for "${collectionName}"`) + throw new Error('Not supported') + } + + async updateDocument(collectionName: CollectionName, selector: any, modifier: any, _options: any): Promise { + triggerWriteAccess() + + if (!this.connection) throw new Meteor.Error(403, 'Only supported from the client') + + const validator = collectionsAllowDenyCache.get(collectionName) + if (!validator) throw new Meteor.Error(403, `Not allowed to update collection: "${collectionName}`) + + const collection = collectionsCache.get(collectionName) + if (!collection) throw new Meteor.Error(403, `Unknown collection: "${collectionName}`) + + const permissions = parseConnectionPermissions(this.connection) + if (!checkHasOneOfPermissions(permissions, collectionName, ...validator.requiredPermissions)) + throw new Meteor.Error(403, `Not allowed to update collection: "${collectionName}"`) + + let documentId: string | null = null + if (typeof selector === 'string') { + documentId = selector + } else if (selector && typeof selector === 'object') { + documentId = selector._id + } + if (!documentId || typeof documentId !== 'string') { + throw new Meteor.Error(403, `Update operations can only do so by id: "${collectionName}"`) + } + + const mutatorKeys = Object.keys(modifier) + if (mutatorKeys.length === 0) { + throw new Meteor.Error(403, 'Update modifier is not valid.') + } + + // compute modified fields + const modifiedFields = new Set() + mutatorKeys.forEach((op) => { + const params = modifier[op] + if (op.charAt(0) !== '$') { + throw new Meteor.Error(403, 'Update modifier is not valid.') + } else if (!hasOwn.call(ALLOWED_UPDATE_OPERATIONS, op)) { + throw new Meteor.Error(403, `Access denied. Operator ${op} not allowed in a restricted collection.`) + } else { + Object.keys(params).forEach((field) => { + // treat dotted fields as if they are replacing their + // top-level part + if (field.indexOf('.') !== -1) field = field.substring(0, field.indexOf('.')) + + // record the field we are trying to change + modifiedFields.add(field) + }) + } + }) + + const currentDocument = await collection.findOneAsync(selector) + if (!currentDocument) throw new Meteor.Error(404, `Document not found`) + + // Perform check + const isAllowed = await validator.update(permissions, currentDocument, Array.from(modifiedFields), modifier) + if (!isAllowed) throw new Meteor.Error(403, `Not allowed to update collection: "${collectionName}"`) + + // Perform update + return collection.updateAsync(currentDocument._id, modifier) + } + + async removeDocument(collectionName: CollectionName, _selector: any): Promise { + triggerWriteAccess() + + logger.error(`MongoAPI.insertDocument for "${collectionName}"`) + throw new Meteor.Error(500, 'Not supported') + } +} +registerClassToMeteorMethods(MongoAPIMethods, MongoAPIClass, true) diff --git a/meteor/server/api/organizations.ts b/meteor/server/api/organizations.ts index e56b615163..13f6acf543 100644 --- a/meteor/server/api/organizations.ts +++ b/meteor/server/api/organizations.ts @@ -11,6 +11,7 @@ import { Blueprints, CoreSystem, Organizations, ShowStyleBases, Studios } from ' import { getCoreSystemAsync } from '../coreSystem/collection' import { UserPermissions } from '@sofie-automation/meteor-lib/dist/userPermissions' import { assertConnectionHasOneOfPermissions } from '../security/auth' +import { BlueprintManifestType } from '@sofie-automation/blueprints-integration' const PERMISSIONS_FOR_MANAGE_ORGANIZATIONS: Array = ['configure'] @@ -25,9 +26,9 @@ async function createDefaultEnvironmentForOrg(orgId: OrganizationId) { const core = await getCoreSystemAsync() const blueprints = await Blueprints.findFetchAsync({}) for (const blueprint of blueprints) { - if (blueprint.blueprintType === 'system') systemBlueprintId = blueprint._id - if (blueprint.blueprintType === 'studio') studioBlueprintId = blueprint._id - if (blueprint.blueprintType === 'showstyle') showStyleBlueprintId = blueprint._id + if (blueprint.blueprintType === BlueprintManifestType.SYSTEM) systemBlueprintId = blueprint._id + if (blueprint.blueprintType === BlueprintManifestType.STUDIO) studioBlueprintId = blueprint._id + if (blueprint.blueprintType === BlueprintManifestType.SHOWSTYLE) showStyleBlueprintId = blueprint._id } if (systemBlueprintId && core) await CoreSystem.updateAsync(core._id, { $set: { blueprintId: systemBlueprintId } }) diff --git a/meteor/server/api/peripheralDevice.ts b/meteor/server/api/peripheralDevice.ts index e20cdae255..01da278aff 100644 --- a/meteor/server/api/peripheralDevice.ts +++ b/meteor/server/api/peripheralDevice.ts @@ -1,6 +1,6 @@ import { Meteor } from 'meteor/meteor' import { check, Match } from '../lib/check' -import * as _ from 'underscore' +import _ from 'underscore' import { PeripheralDeviceType, PeripheralDevice } from '@sofie-automation/corelib/dist/dataModel/PeripheralDevice' import { PeripheralDeviceCommands, PeripheralDevices, Rundowns, Studios, UserActionsLog } from '../collections' import { protectString, stringifyObjects, literal, unprotectString } from '../lib/tempLib' @@ -20,9 +20,6 @@ import { import { MosIntegration } from './ingest/mosDevice/mosIntegration' import { MediaScannerIntegration } from './integration/media-scanner' import { MediaObject } from '@sofie-automation/shared-lib/dist/core/model/MediaObjects' -import { MediaManagerIntegration } from './integration/mediaWorkFlows' -import { MediaWorkFlow } from '@sofie-automation/shared-lib/dist/core/model/MediaWorkFlows' -import { MediaWorkFlowStep } from '@sofie-automation/shared-lib/dist/core/model/MediaWorkFlowSteps' import { MOS } from '@sofie-automation/corelib' import { determineDiffTime } from './systemTime/systemTime' import { getTimeDiff } from './systemTime/api' @@ -34,7 +31,6 @@ import { PackageManagerIntegration } from './integration/expectedPackages' import { profiler } from './profiler' import { QueueStudioJob } from '../worker/worker' import { StudioJobs } from '@sofie-automation/corelib/dist/worker/studio' -import { DeviceConfigManifest } from '@sofie-automation/corelib/dist/deviceConfig' import { PlayoutChangedResults, PeripheralDeviceInitOptions, @@ -45,8 +41,6 @@ import { checkStudioExists } from '../optimizations' import { ExpectedPackageId, ExpectedPackageWorkStatusId, - MediaWorkFlowId, - MediaWorkFlowStepId, PeripheralDeviceCommandId, PeripheralDeviceId, } from '@sofie-automation/corelib/dist/dataModel/Ids' @@ -58,7 +52,7 @@ import { insertInputDeviceTriggerIntoPreview } from '../publications/deviceTrigg import { receiveInputDeviceTrigger } from './deviceTriggers/observer' import { upsertBundles, generateTranslationBundleOriginId } from './translationsBundles' import { isTranslatableMessage } from '@sofie-automation/corelib/dist/TranslatableMessage' -import { JSONBlobParse, JSONBlobStringify } from '@sofie-automation/shared-lib/dist/lib/JSONBlob' +import { JSONBlobParse } from '@sofie-automation/shared-lib/dist/lib/JSONBlob' import { applyAndValidateOverrides, SomeObjectOverrideOp, @@ -69,6 +63,7 @@ import KoaRouter from '@koa/router' import bodyParser from 'koa-bodyparser' import { assertConnectionHasOneOfPermissions } from '../security/auth' import { DBStudio } from '@sofie-automation/corelib/dist/dataModel/Studio' +import { getRootSubpath } from '../lib' const apmNamespace = 'peripheralDevice' export namespace ServerPeripheralDeviceAPI { @@ -127,16 +122,16 @@ export namespace ServerPeripheralDeviceAPI { ? { ...options.configManifest, translations: undefined, // unset the translations - } + } : undefined, documentationUrl: options.documentationUrl, - }, + } satisfies Partial, $unset: newVersionsStr !== oldVersionsStr ? { disableVersionChecks: 1, - } + } : undefined, }) } else { @@ -166,11 +161,8 @@ export namespace ServerPeripheralDeviceAPI { ? { ...options.configManifest, translations: undefined, - } - : literal({ - deviceConfigSchema: JSONBlobStringify({}), - subdeviceManifest: {}, - }), + } + : undefined, documentationUrl: options.documentationUrl, }) @@ -357,7 +349,7 @@ export namespace ServerPeripheralDeviceAPI { if (really) { logger.info('KillProcess command received from ' + peripheralDevice._id + ', shutting down in 1000ms!') setTimeout(() => { - // eslint-disable-next-line no-process-exit + // eslint-disable-next-line n/no-process-exit process.exit(0) }, 1000) return true @@ -455,7 +447,7 @@ export namespace ServerPeripheralDeviceAPI { // Fetch the relevant studio const studioForDevice = (await Studios.findOneAsync(peripheralDevice.studioAndConfigId.studioId, { - fields: { + projection: { peripheralDeviceSettings: 1, }, })) as Pick | undefined @@ -579,7 +571,7 @@ export namespace ServerPeripheralDeviceAPI { timelineHash: timelineHash, }, { - fields: { + projection: { timelineGenerated: 1, }, } @@ -680,7 +672,7 @@ peripheralDeviceRouter.get('/:deviceId/oauthResponse', async (ctx) => { .catch(logger.error) } - ctx.redirect(`/settings/peripheralDevice/${deviceId}`) + ctx.redirect(`${getRootSubpath()}/settings/peripheralDevice/${deviceId}`) } catch (e) { ctx.response.type = 'text/plain' ctx.response.status = 500 @@ -1133,7 +1125,7 @@ class ServerPeripheralDeviceAPIClass extends MethodContextAPI implements NewPeri async mosRoFullStory(deviceId: PeripheralDeviceId, deviceToken: string, story: MOS.IMOSROFullStory) { return MosIntegration.mosRoFullStory(this, deviceId, deviceToken, story) } - // ------- Media Manager (Media Scanner) + // ------- Expected Playout Items (Previously: Media Manager (Media Scanner)) async getMediaObjectRevisions(deviceId: PeripheralDeviceId, deviceToken: string, collectionId: string) { return MediaScannerIntegration.getMediaObjectRevisions(this, deviceId, deviceToken, collectionId) } @@ -1149,29 +1141,7 @@ class ServerPeripheralDeviceAPIClass extends MethodContextAPI implements NewPeri async clearMediaObjectCollection(deviceId: PeripheralDeviceId, deviceToken: string, collectionId: string) { return MediaScannerIntegration.clearMediaObjectCollection(this, deviceId, deviceToken, collectionId) } - // ------- Media Manager -------------- - async getMediaWorkFlowRevisions(deviceId: PeripheralDeviceId, deviceToken: string) { - return MediaManagerIntegration.getMediaWorkFlowRevisions(this, deviceId, deviceToken) - } - async getMediaWorkFlowStepRevisions(deviceId: PeripheralDeviceId, deviceToken: string) { - return MediaManagerIntegration.getMediaWorkFlowStepRevisions(this, deviceId, deviceToken) - } - async updateMediaWorkFlow( - deviceId: PeripheralDeviceId, - deviceToken: string, - workFlowId: MediaWorkFlowId, - obj: MediaWorkFlow | null - ) { - return MediaManagerIntegration.updateMediaWorkFlow(this, deviceId, deviceToken, workFlowId, obj) - } - async updateMediaWorkFlowStep( - deviceId: PeripheralDeviceId, - deviceToken: string, - docId: MediaWorkFlowStepId, - obj: MediaWorkFlowStep | null - ) { - return MediaManagerIntegration.updateMediaWorkFlowStep(this, deviceId, deviceToken, docId, obj) - } + // ------- Package Manager -------------- async updateExpectedPackageWorkStatuses( deviceId: PeripheralDeviceId, deviceToken: string, diff --git a/meteor/server/api/playout/playout.ts b/meteor/server/api/playout/playout.ts index a9d36df0a9..90a4e9d4ed 100644 --- a/meteor/server/api/playout/playout.ts +++ b/meteor/server/api/playout/playout.ts @@ -14,14 +14,14 @@ export namespace ServerPlayoutAPI { if (studio) { const activePlaylists = await RundownPlaylists.findFetchAsync( { studioId: studio._id, activationId: { $exists: true } }, - { fields: { _id: 1 } } + { projection: { _id: 1 } } ) if (activePlaylists.length > 0) return false const [timeline, blueprint] = await Promise.all([ Timeline.findOneAsync(studio._id), studio.blueprintId - ? Blueprints.findOneAsync(studio.blueprintId, { fields: { blueprintVersion: 1 } }) + ? Blueprints.findOneAsync(studio.blueprintId, { projection: { blueprintVersion: 1 } }) : null, ]) if (blueprint === undefined) return 'missingBlueprint' diff --git a/meteor/server/api/profiler/apm.ts b/meteor/server/api/profiler/apm.ts index 6e2eb99d70..8c1e0eacbe 100644 --- a/meteor/server/api/profiler/apm.ts +++ b/meteor/server/api/profiler/apm.ts @@ -1,5 +1,5 @@ import { Meteor } from 'meteor/meteor' -// const shimmer = require('shimmer') +// import shimmer from 'shimmer' import Agent, { AgentConfigOptions } from 'elastic-apm-node' // const { Session, Subscription, MongoCursor } = require('./meteorx') diff --git a/meteor/server/api/rest/api.ts b/meteor/server/api/rest/api.ts index f7c2b7d076..4496cd493b 100644 --- a/meteor/server/api/rest/api.ts +++ b/meteor/server/api/rest/api.ts @@ -11,6 +11,7 @@ import { peripheralDeviceRouter } from '../peripheralDevice' import { blueprintsRouter } from '../blueprints/http' import { createLegacyApiRouter } from './v0/index' import { heapSnapshotPrivateApiRouter } from '../heapSnapshot' +import { getRootSubpath } from '../../lib' const LATEST_REST_API = 'v1.0' @@ -34,7 +35,7 @@ apiRouter.use( ) async function redirectToLatest(ctx: koa.ParameterizedContext, _next: koa.Next): Promise { - ctx.redirect(`/api/${LATEST_REST_API}`) + ctx.redirect(`${getRootSubpath()}/api/${LATEST_REST_API}`) ctx.status = 307 } diff --git a/meteor/server/api/rest/koa.ts b/meteor/server/api/rest/koa.ts index 673e9c3174..ec57fc79ce 100644 --- a/meteor/server/api/rest/koa.ts +++ b/meteor/server/api/rest/koa.ts @@ -1,15 +1,18 @@ import Koa from 'koa' import cors from '@koa/cors' import KoaRouter from '@koa/router' +import KoaMount from 'koa-mount' import { WebApp } from 'meteor/webapp' import { Meteor } from 'meteor/meteor' import { getRandomString } from '@sofie-automation/corelib/dist/lib' +import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' import _ from 'underscore' -import { public_dir } from '../../lib' +import { getRootSubpath, public_dir } from '../../lib' import staticServe from 'koa-static' import { logger } from '../../logging' import { PackageInfo } from '../../coreSystem' import { profiler } from '../profiler' +import fs from 'fs/promises' declare module 'http' { interface IncomingMessage { @@ -46,7 +49,7 @@ Meteor.startup(() => { ) // Expose the API at the url - WebApp.rawHandlers.use((req, res) => { + WebApp.rawConnectHandlers.use((req, res) => { const transaction = profiler.startTransaction(`${req.method}:${req.url}`, 'http.incoming') if (transaction) { transaction.setLabel('url', `${req.url}`) @@ -78,28 +81,30 @@ Meteor.startup(() => { // serve the webui through koa // This is to avoid meteor injecting anything into the served html - const webuiServer = staticServe(public_dir) - koaApp.use(webuiServer) + const webuiServer = staticServe(public_dir, { + index: false, // Performed manually + }) + koaApp.use(KoaMount(getRootSubpath() || '/', webuiServer)) logger.debug(`Serving static files from ${public_dir}`) - // Serve the meteor runtime config - rootRouter.get('/meteor-runtime-config.js', async (ctx) => { - const versionExtended: string = PackageInfo.versionExtended || PackageInfo.version // package version - - ctx.body = `window.__meteor_runtime_config__ = (${JSON.stringify({ - // @ts-expect-error missing types for internal meteor detail - ...__meteor_runtime_config__, - sofieVersionExtended: versionExtended, - })})` - }) + if (Meteor.isDevelopment) { + // Serve the meteor runtime config. In production, this gets baked into the html + rootRouter.get(getRootSubpath() + '/meteor-runtime-config.js', async (ctx) => { + ctx.body = getExtendedMeteorRuntimeConfig() + }) + } koaApp.use(rootRouter.routes()).use(rootRouter.allowedMethods()) koaApp.use(async (ctx, next) => { if (ctx.method !== 'GET') return next() + // Ensure the path is scoped to the root subpath + const rootSubpath = getRootSubpath() + if (!ctx.path.startsWith(rootSubpath)) return next() + // Don't use the fallback for certain paths - if (ctx.path.startsWith('/assets/')) return next() + if (ctx.path.startsWith(rootSubpath + '/assets/')) return next() // Don't use the fallback for anything handled by another router // This does not feel efficient, but koa doesn't appear to have any shared state between the router handlers @@ -107,19 +112,56 @@ Meteor.startup(() => { if (ctx.path.startsWith(bindPath)) return next() } - // fallback to the root file - ctx.path = '/' - return webuiServer(ctx, next) + // fallback to serving html + return serveIndexHtml(ctx, next) }) }) +function getExtendedMeteorRuntimeConfig() { + const versionExtended: string = PackageInfo.versionExtended || PackageInfo.version // package version + + return `window.__meteor_runtime_config__ = (${JSON.stringify({ + // @ts-expect-error missing types for internal meteor detail + ...__meteor_runtime_config__, + sofieVersionExtended: versionExtended, + })})` +} + +async function serveIndexHtml(ctx: Koa.ParameterizedContext, next: Koa.Next) { + try { + // Read the file + const indexFileBuffer = await fs.readFile(public_dir + '/index.html', 'utf8') + const indexFileStr = indexFileBuffer.toString() + + const rootPath = getRootSubpath() + + // Perform various runtime modifications, to ensure paths have the correct absolute prefix + let modifiedFile = indexFileStr + modifiedFile = modifiedFile.replace( + // Replace the http load with injected js, to avoid risk of issues where this load fails and the app gets confused + '', + `` + ) + modifiedFile = modifiedFile.replaceAll('href="/', `href="${rootPath}/`) + modifiedFile = modifiedFile.replaceAll('href="./', `href="${rootPath}/`) + modifiedFile = modifiedFile.replaceAll('src="./', `src="${rootPath}/`) + + ctx.body = modifiedFile + } catch (e: unknown) { + logger.error(`error in serveIndexHtml: ${stringifyError(e)}`) + return next() + } +} + export function bindKoaRouter(koaRouter: KoaRouter, bindPath: string): void { + const bindPathWithPrefix = getRootSubpath() + bindPath + // Track this path as having a router - let bindPathFull = bindPath + let bindPathFull = bindPathWithPrefix if (!bindPathFull.endsWith('/')) bindPathFull += '/' boundRouterPaths.push(bindPathFull) - rootRouter.use(bindPath, koaRouter.routes()).use(bindPath, koaRouter.allowedMethods()) + rootRouter.use(bindPathWithPrefix, koaRouter.routes()).use(bindPathWithPrefix, koaRouter.allowedMethods()) } const REVERSE_PROXY_COUNT = process.env.HTTP_FORWARDED_COUNT ? parseInt(process.env.HTTP_FORWARDED_COUNT) : 0 diff --git a/meteor/server/api/rest/v0/index.ts b/meteor/server/api/rest/v0/index.ts index b1b007dbbe..1203e2a63a 100644 --- a/meteor/server/api/rest/v0/index.ts +++ b/meteor/server/api/rest/v0/index.ts @@ -4,7 +4,7 @@ * You should generally use the latest REST API for integrating with Sofie. */ -import * as _ from 'underscore' +import _ from 'underscore' import { Meteor } from 'meteor/meteor' import { MeteorMethodSignatures } from '../../../methods' import { MeteorPubSub } from '@sofie-automation/meteor-lib/dist/api/pubsub' @@ -41,7 +41,7 @@ function typeConvertUrlParameters(args: any[]) { let json: any = null try { json = JSON.parse(val) - } catch (e) { + } catch (_e) { // ignore } if (json) val = json diff --git a/meteor/server/api/rest/v1/blueprints.ts b/meteor/server/api/rest/v1/blueprints.ts index 3e5495474c..a4ddf15af7 100644 --- a/meteor/server/api/rest/v1/blueprints.ts +++ b/meteor/server/api/rest/v1/blueprints.ts @@ -32,8 +32,12 @@ class BlueprintsServerAPI implements BlueprintsRestAPI { const blueprint = await Blueprints.findOneAsync(blueprintId) if (!blueprint) { return ClientAPI.responseError( - UserError.from(new Error(`Blueprint ${blueprintId} not found`), UserErrorMessage.BlueprintNotFound), - 404 + UserError.from( + new Error(`Blueprint ${blueprintId} not found`), + UserErrorMessage.BlueprintNotFound, + undefined, + 404 + ) ) } diff --git a/meteor/server/api/rest/v1/buckets.ts b/meteor/server/api/rest/v1/buckets.ts index 8086ea5159..297f265346 100644 --- a/meteor/server/api/rest/v1/buckets.ts +++ b/meteor/server/api/rest/v1/buckets.ts @@ -37,8 +37,12 @@ export class BucketsServerAPI implements BucketsRestAPI { const bucket = await Buckets.findOneAsync(bucketId, { projection: { _id: 1, name: 1, studioId: 1 } }) if (!bucket) { return ClientAPI.responseError( - UserError.from(new Error(`Bucket ${bucketId} not found`), UserErrorMessage.BucketNotFound), - 404 + UserError.from( + new Error(`Bucket ${bucketId} not found`), + UserErrorMessage.BucketNotFound, + undefined, + 404 + ) ) } return ClientAPI.responseSuccess(APIBucketFrom(bucket)) diff --git a/meteor/server/api/rest/v1/devices.ts b/meteor/server/api/rest/v1/devices.ts index 915d424540..1ec375adb0 100644 --- a/meteor/server/api/rest/v1/devices.ts +++ b/meteor/server/api/rest/v1/devices.ts @@ -39,9 +39,10 @@ class DevicesServerAPI implements DevicesRestAPI { return ClientAPI.responseError( UserError.from( new Error(`Device ${deviceId} does not exist`), - UserErrorMessage.PeripheralDeviceNotFound - ), - 404 + UserErrorMessage.PeripheralDeviceNotFound, + undefined, + 404 + ) ) return ClientAPI.responseSuccess(APIPeripheralDeviceFrom(device)) } @@ -57,9 +58,10 @@ class DevicesServerAPI implements DevicesRestAPI { return ClientAPI.responseError( UserError.from( new Error(`Device ${deviceId} does not exist`), - UserErrorMessage.PeripheralDeviceNotFound - ), - 404 + UserErrorMessage.PeripheralDeviceNotFound, + undefined, + 404 + ) ) switch (action.type) { diff --git a/meteor/server/api/rest/v1/idempotencyService.ts b/meteor/server/api/rest/v1/idempotencyService.ts index 6fdb311abe..9aeb4a6a0e 100644 --- a/meteor/server/api/rest/v1/idempotencyService.ts +++ b/meteor/server/api/rest/v1/idempotencyService.ts @@ -1,7 +1,10 @@ export class IdempotencyService { private requestRecords: Map = new Map() - constructor(private idempotencyPeriodMs: number, private cleanupIntervalMs: number) { + constructor( + private idempotencyPeriodMs: number, + private cleanupIntervalMs: number + ) { this.scheduleCleanup() } diff --git a/meteor/server/api/rest/v1/index.ts b/meteor/server/api/rest/v1/index.ts index 2507b7e78c..87e8bdf1cf 100644 --- a/meteor/server/api/rest/v1/index.ts +++ b/meteor/server/api/rest/v1/index.ts @@ -20,6 +20,8 @@ import { registerRoutes as registerSystemRoutes } from './system' import { registerRoutes as registerBucketsRoutes } from './buckets' import { registerRoutes as registerSnapshotRoutes } from './snapshots' import { APIFactory, ServerAPIContext } from './types' +import { getSystemStatus } from '../../../systemStatus/systemStatus' +import { Component, ExternalStatus } from '@sofie-automation/meteor-lib/dist/api/systemStatus' function restAPIUserEvent( ctx: Koa.ParameterizedContext< @@ -48,8 +50,8 @@ koaRouter.use(bodyParser()) function extractErrorCode(e: unknown): number { if (ClientAPI.isClientResponseError(e)) { - return e.errorCode - } else if (UserError.isUserError(e)) { + return e.error.errorCode + } else if (UserError.isSerializedUserErrorObject(e) || e instanceof UserError) { return e.errorCode } else if ((e as Meteor.Error).error && typeof (e as Meteor.Error).error === 'number') { return (e as Meteor.Error).error as number @@ -58,11 +60,19 @@ function extractErrorCode(e: unknown): number { } } -function extractErrorMessage(e: unknown): string { +function validateUserError(e: unknown): UserError | undefined { + if (e instanceof UserError) { + return e + } else if (UserError.isSerializedUserErrorObject(e)) { + return UserError.fromUnknown(e) + } +} + +function extractErrorUserMessage(e: unknown): string { if (ClientAPI.isClientResponseError(e)) { - return translateMessage(e.error.message, interpollateTranslation) - } else if (UserError.isUserError(e)) { - return translateMessage(e.message, interpollateTranslation) + return translateMessage(e.error.userMessage, interpollateTranslation) + } else if (UserError.isSerializedUserErrorObject(e) || e instanceof UserError) { + return translateMessage(e.userMessage, interpollateTranslation) } else if ((e as Meteor.Error).reason && typeof (e as Meteor.Error).reason === 'string') { return (e as Meteor.Error).reason as string } else { @@ -117,7 +127,7 @@ interface APIRequestError { function sofieAPIRequest( method: 'get' | 'post' | 'put' | 'delete', route: string, - errMsgs: Map, + errMsgFallbacks: Map, serverAPIFactory: APIFactory, handler: ( serverAPI: API, @@ -138,27 +148,36 @@ function sofieAPIRequest( ctx.params as unknown as Params, ctx.request.body as unknown as Body ) - if (ClientAPI.isClientResponseError(response)) throw response + if (ClientAPI.isClientResponseError(response)) { + throw UserError.fromSerialized(response.error) + } ctx.body = JSON.stringify({ status: response.success, result: response.result }) ctx.status = response.success } catch (e) { + const userError = validateUserError(e) const errCode = extractErrorCode(e) - let errMsg = extractErrorMessage(e) - const msgs = errMsgs.get(errCode) - if (msgs) { + let errMsg = extractErrorUserMessage(e) + // Get the fallback messages of the endpoint + const fallbackMsgs = errMsgFallbacks.get(errCode) + + if (fallbackMsgs && (userError?.message === errMsg || userError?.message === '')) { + // If no detailed error message is provided then return the fallback error messages. const msgConcat = { - key: msgs - .map((msg) => UserError.create(msg, undefined, errCode).message.key) - .reduce((acc, msg) => acc + (acc.length ? ' or ' : '') + msg, ''), + key: fallbackMsgs + .map((msg) => UserError.create(msg, undefined, errCode).userMessage.key) + .reduce((acc, msg) => acc + (acc.length ? ' or ' : '') + msg, errMsg), } errMsg = translateMessage(msgConcat, interpollateTranslation) - } else { - logger.error( - `${method.toUpperCase()} for route ${route} returned unexpected error code ${errCode} - ${errMsg}` - ) + } else if (userError?.message) { + // If we have a detailed arbitrary error message then return that together with the standard error message. + errMsg = `${errMsg}${userError.message !== errMsg && userError.message !== '' ? ` - ${userError?.message}` : ''}` } - logger.error(`${method.toUpperCase()} failed for route ${route}: ${errCode} - ${errMsg}`) + // Log unknown error codes + logger.error( + `${method.toUpperCase()} failed for route ${route}:${!fallbackMsgs ? ' returned unexpected error code' : ''} ${errCode} - ${errMsg}` + ) + ctx.type = 'application/json' const bodyObj: APIRequestError = { status: errCode, message: errMsg } const details = extractErrorDetails(e) @@ -193,6 +212,82 @@ koaRouter.get('/', async (ctx, next) => { await next() }) +koaRouter.get('/health', async (ctx, next) => { + ctx.type = 'application/json' + const systemStatus = await getSystemStatus(null) + const coreVersion = systemStatus._internal.versions['core'] ?? 'unknown' + const blueprint = Object.keys(systemStatus._internal.versions).find((component) => + component.startsWith('blueprint') + ) + const blueprintsVersion = blueprint ? systemStatus._internal.versions[blueprint] : 'unknown' + + interface ComponentStatus { + name: string + updated: string + status: ExternalStatus + version?: string + components?: ComponentStatus[] + statusMessage?: string + } + + // Array of all devices that have a parentId + const subComponents = + systemStatus.components?.filter((c) => c.instanceId !== undefined && c.parentId !== undefined) ?? [] + + function mapComponents(components?: Component[]): ComponentStatus[] | undefined { + return ( + components?.map((c) => { + const version = c._internal.versions['_process'] + const children = subComponents.filter((sub) => sub.parentId === c.instanceId) + return { + name: c.name, + updated: c.updated, + status: c.status, + version: version ?? undefined, + components: children.length ? mapComponents(children) : undefined, + statusMessage: c.statusMessage?.length ? c.statusMessage : undefined, + } + }) ?? undefined + ) + } + + // Patch the component statusMessage to be from the _internal field if required + const allComponentsPatched = systemStatus.components?.map((c) => { + return { + ...c, + statusMessage: c.statusMessage ?? (c.status !== 'OK' ? c._internal.messages.join(', ') : undefined), + } + }) + + // Report status for all devices that are not children and any non-devices that are not OK + const componentStatus = + mapComponents( + allComponentsPatched?.filter( + (c) => (c.instanceId !== undefined || c.status !== 'OK') && c.parentId === undefined + ) + ) ?? [] + + const allStatusMessages = + allComponentsPatched // include children by not using componentStatus here + ?.filter((c) => c.statusMessage !== undefined) + .map((c) => `${c.name}: ${c.statusMessage}`) + .join('; ') ?? '' + + const response = ClientAPI.responseSuccess({ + name: systemStatus.name, + updated: systemStatus.updated, + status: systemStatus.status, + version: coreVersion, + blueprintsVersion: blueprintsVersion, + components: componentStatus, + statusMessage: allStatusMessages, + }) + + ctx.body = JSON.stringify({ status: response.success, result: response.result }) + ctx.status = response.success + await next() +}) + registerBlueprintsRoutes(sofieAPIRequest) registerDevicesRoutes(sofieAPIRequest) registerPlaylistsRoutes(sofieAPIRequest) diff --git a/meteor/server/api/rest/v1/playlists.ts b/meteor/server/api/rest/v1/playlists.ts index 60f0520579..2616f2e6f9 100644 --- a/meteor/server/api/rest/v1/playlists.ts +++ b/meteor/server/api/rest/v1/playlists.ts @@ -41,12 +41,16 @@ class PlaylistsServerAPI implements PlaylistsRestAPI { async getAllRundownPlaylists( _connection: Meteor.Connection, _event: string - ): Promise>> { - const rundownPlaylists = (await RundownPlaylists.findFetchAsync({}, { projection: { _id: 1 } })) as Array< - Pick - > + ): Promise>> { + const rundownPlaylists = (await RundownPlaylists.findFetchAsync( + {}, + { projection: { _id: 1, externalId: 1 } } + )) as Array> return ClientAPI.responseSuccess( - rundownPlaylists.map((rundownPlaylist) => ({ id: unprotectString(rundownPlaylist._id) })) + rundownPlaylists.map((rundownPlaylist) => ({ + id: unprotectString(rundownPlaylist._id), + externalId: rundownPlaylist.externalId, + })) ) } @@ -129,14 +133,19 @@ class PlaylistsServerAPI implements PlaylistsRestAPI { return ClientAPI.responseError( UserError.from( new Error(`Rundown playlist does not exist`), - UserErrorMessage.RundownPlaylistNotFound - ), - 404 + UserErrorMessage.RundownPlaylistNotFound, + undefined, + 404 + ) ) if (rundownPlaylist.currentPartInfo === null) return ClientAPI.responseError( - UserError.from(Error(`No active Part in ${rundownPlaylistId}`), UserErrorMessage.PartNotFound), - 412 + UserError.from( + Error(`No active Part in ${rundownPlaylistId}`), + UserErrorMessage.PartNotFound, + undefined, + 412 + ) ) const result = await ServerClientAPI.runUserActionInLogForPlaylistOnWorker( @@ -168,25 +177,28 @@ class PlaylistsServerAPI implements PlaylistsRestAPI { return ClientAPI.responseError( UserError.from( new Error(`Rundown playlist does not exist`), - UserErrorMessage.RundownPlaylistNotFound - ), - 404 + UserErrorMessage.RundownPlaylistNotFound, + undefined, + 404 + ) ) if (!rundownPlaylist.activationId) return ClientAPI.responseError( UserError.from( new Error(`Rundown playlist ${rundownPlaylistId} is not currently active`), - UserErrorMessage.InactiveRundown - ), - 412 + UserErrorMessage.InactiveRundown, + undefined, + 412 + ) ) if (!rundownPlaylist.currentPartInfo) return ClientAPI.responseError( UserError.from( new Error(`Rundown playlist ${rundownPlaylistId} must be playing`), - UserErrorMessage.NoCurrentPart - ), - 412 + UserErrorMessage.NoCurrentPart, + undefined, + 412 + ) ) return ServerClientAPI.runUserActionInLogForPlaylistOnWorker( @@ -210,8 +222,7 @@ class PlaylistsServerAPI implements PlaylistsRestAPI { ) } else { return ClientAPI.responseError( - UserError.from(new Error(`No adLib with Id ${adLibId}`), UserErrorMessage.AdlibNotFound), - 412 + UserError.from(new Error(`No adLib with Id ${adLibId}`), UserErrorMessage.AdlibNotFound, undefined, 412) ) } } @@ -238,17 +249,22 @@ class PlaylistsServerAPI implements PlaylistsRestAPI { ]) if (!bucket) { return ClientAPI.responseError( - UserError.from(new Error(`Bucket ${bucketId} not found`), UserErrorMessage.BucketNotFound), - 412 + UserError.from( + new Error(`Bucket ${bucketId} not found`), + UserErrorMessage.BucketNotFound, + undefined, + 412 + ) ) } if (!bucketAdlib && !bucketAdlibAction) { return ClientAPI.responseError( UserError.from( new Error(`No adLib with Id ${externalId}, in bucket ${bucketId}`), - UserErrorMessage.AdlibNotFound - ), - 412 + UserErrorMessage.AdlibNotFound, + undefined, + 412 + ) ) } @@ -473,17 +489,19 @@ class PlaylistsServerAPI implements PlaylistsRestAPI { return ClientAPI.responseError( UserError.from( Error(`Rundown playlist ${rundownPlaylistId} does not exist`), - UserErrorMessage.RundownPlaylistNotFound - ), - 412 + UserErrorMessage.RundownPlaylistNotFound, + undefined, + 412 + ) ) if (!rundownPlaylist.currentPartInfo?.partInstanceId || !rundownPlaylist.activationId) return ClientAPI.responseError( UserError.from( new Error(`Rundown playlist ${rundownPlaylistId} is not currently active`), - UserErrorMessage.InactiveRundown - ), - 412 + UserErrorMessage.InactiveRundown, + undefined, + 412 + ) ) return ServerClientAPI.runUserActionInLogForPlaylistOnWorker( @@ -816,7 +834,7 @@ export function registerRoutes(registerRoute: APIRegisterHook) logger.info(`API POST: clear-sourcelayers ${playlistId} ${sourceLayerIds}`) check(playlistId, String) - check(sourceLayerIds, Array) + check(sourceLayerIds, Array) return await serverAPI.clearSourceLayers(connection, event, playlistId, sourceLayerIds) } diff --git a/meteor/server/api/rest/v1/studios.ts b/meteor/server/api/rest/v1/studios.ts index 33d31e6df5..75e3f2a10a 100644 --- a/meteor/server/api/rest/v1/studios.ts +++ b/meteor/server/api/rest/v1/studios.ts @@ -256,24 +256,28 @@ class StudiosServerAPI implements StudiosRestAPI { const studio = await Studios.findOneAsync(studioId) if (!studio) return ClientAPI.responseError( - UserError.from(new Error(`Studio does not exist`), UserErrorMessage.StudioNotFound), - 404 + UserError.from(new Error(`Studio does not exist`), UserErrorMessage.StudioNotFound, undefined, 404) ) const device = await PeripheralDevices.findOneAsync(deviceId) if (!device) return ClientAPI.responseError( - UserError.from(new Error(`Studio does not exist`), UserErrorMessage.PeripheralDeviceNotFound), - 404 + UserError.from( + new Error(`Studio does not exist`), + UserErrorMessage.PeripheralDeviceNotFound, + undefined, + 404 + ) ) if (device.studioAndConfigId !== undefined && device.studioAndConfigId.studioId !== studio._id) { return ClientAPI.responseError( UserError.from( new Error(`Device already attached to studio`), - UserErrorMessage.DeviceAlreadyAttachedToStudio - ), - 412 + UserErrorMessage.DeviceAlreadyAttachedToStudio, + undefined, + 412 + ) ) } @@ -318,8 +322,7 @@ class StudiosServerAPI implements StudiosRestAPI { const studio = await Studios.findOneAsync(studioId) if (!studio) return ClientAPI.responseError( - UserError.from(new Error(`Studio does not exist`), UserErrorMessage.StudioNotFound), - 404 + UserError.from(new Error(`Studio does not exist`), UserErrorMessage.StudioNotFound, undefined, 404) ) await PeripheralDevices.updateAsync( { diff --git a/meteor/server/api/rest/v1/typeConversion.ts b/meteor/server/api/rest/v1/typeConversion.ts index 1d9585df44..be9332e14a 100644 --- a/meteor/server/api/rest/v1/typeConversion.ts +++ b/meteor/server/api/rest/v1/typeConversion.ts @@ -54,7 +54,7 @@ import { DEFAULT_MINIMUM_TAKE_SPAN, DEFAULT_FALLBACK_PART_DURATION, } from '@sofie-automation/shared-lib/dist/core/constants' -import { Bucket } from '@sofie-automation/meteor-lib/dist/collections/Buckets' +import { Bucket } from '@sofie-automation/corelib/dist/dataModel/Bucket' import { ForceQuickLoopAutoNext } from '@sofie-automation/shared-lib/dist/core/model/StudioSettings' import { PlaylistSnapshotOptions, SystemSnapshotOptions } from '@sofie-automation/meteor-lib/dist/api/shapshot' @@ -74,18 +74,24 @@ export async function showStyleBaseFrom( let showStyleBase: DBShowStyleBase | undefined if (existingId) showStyleBase = await ShowStyleBases.findOneAsync(existingId) - const newOutputLayers = apiShowStyleBase.outputLayers.reduce>((acc, op) => { - acc[op.id] = { _id: op.id, name: op.name, _rank: op.rank, isPGM: op.isPgm } - return acc - }, {} as Record) + const newOutputLayers = apiShowStyleBase.outputLayers.reduce>( + (acc, op) => { + acc[op.id] = { _id: op.id, name: op.name, _rank: op.rank, isPGM: op.isPgm } + return acc + }, + {} as Record + ) const outputLayers = showStyleBase ? updateOverrides(showStyleBase.outputLayersWithOverrides, newOutputLayers) : wrapDefaultObject({}) - const newSourceLayers = apiShowStyleBase.sourceLayers.reduce>((acc, op) => { - acc[op.id] = sourceLayerFrom(op) - return acc - }, {} as Record) + const newSourceLayers = apiShowStyleBase.sourceLayers.reduce>( + (acc, op) => { + acc[op.id] = sourceLayerFrom(op) + return acc + }, + {} as Record + ) const sourceLayers = showStyleBase ? updateOverrides(showStyleBase.sourceLayersWithOverrides, newSourceLayers) : wrapDefaultObject({}) @@ -101,7 +107,7 @@ export async function showStyleBaseFrom( ? updateOverrides( showStyleBase.blueprintConfigWithOverrides, await ShowStyleBaseBlueprintConfigFromAPI(apiShowStyleBase, blueprintManifest) - ) + ) : convertObjectIntoOverrides(await ShowStyleBaseBlueprintConfigFromAPI(apiShowStyleBase, blueprintManifest)) } @@ -318,7 +324,7 @@ export async function studioFrom(apiStudio: APIStudio, existingId?: StudioId): P ? updateOverrides( studio.blueprintConfigWithOverrides, await StudioBlueprintConfigFromAPI(apiStudio, blueprintManifest) - ) + ) : convertObjectIntoOverrides(await StudioBlueprintConfigFromAPI(apiStudio, blueprintManifest)) } @@ -378,6 +384,7 @@ export function studioSettingsFrom(apiStudioSettings: APIStudioSettings): Comple multiGatewayNowSafeLatency: apiStudioSettings.multiGatewayNowSafeLatency, allowRundownResetOnAir: apiStudioSettings.allowRundownResetOnAir, preserveOrphanedSegmentPositionInRundown: apiStudioSettings.preserveOrphanedSegmentPositionInRundown, + allowTestingAdlibsToPersist: apiStudioSettings.allowTestingAdlibsToPersist, minimumTakeSpan: apiStudioSettings.minimumTakeSpan ?? DEFAULT_MINIMUM_TAKE_SPAN, enableQuickLoop: apiStudioSettings.enableQuickLoop, forceQuickLoopAutoNext: forceQuickLoopAutoNextFrom(apiStudioSettings.forceQuickLoopAutoNext), @@ -388,6 +395,7 @@ export function studioSettingsFrom(apiStudioSettings: APIStudioSettings): Comple allowPieceDirectPlay: apiStudioSettings.allowPieceDirectPlay ?? true, // Backwards compatible enableBuckets: apiStudioSettings.enableBuckets ?? true, // Backwards compatible enableEvaluationForm: apiStudioSettings.enableEvaluationForm ?? true, // Backwards compatible + mockPieceContentStatus: apiStudioSettings.mockPieceContentStatus, } } @@ -409,10 +417,12 @@ export function APIStudioSettingsFrom(settings: IStudioSettings): Complete { const id: RundownLayoutId = getRandomId() await RundownLayouts.insertAsync( diff --git a/meteor/server/api/serviceMessages/api.ts b/meteor/server/api/serviceMessages/api.ts index d17ed9e5f7..3e431c5d1e 100644 --- a/meteor/server/api/serviceMessages/api.ts +++ b/meteor/server/api/serviceMessages/api.ts @@ -17,7 +17,7 @@ serviceMessagesRouter.get('/', async function getHandler(ctx) { const valuesArray = await readAllMessages() ctx.response.type = 'application/json;charset=utf8' ctx.body = JSON.stringify(valuesArray) - } catch (error) { + } catch (_error) { ctx.response.status = 500 ctx.body = 'Unable to list service messages' } @@ -38,7 +38,7 @@ serviceMessagesRouter.delete('/:id', async function deleteHandler(ctx) { ctx.response.status = 404 ctx.body = `Message with id ${id} can not be found` } - } catch (error) { + } catch (_error) { ctx.response.status = 500 ctx.body = `Unable to delete service message ${id}` } @@ -59,7 +59,7 @@ serviceMessagesRouter.delete('/:id', async function getMessageHandler(ctx) { ctx.response.status = 404 ctx.body = `Message with id ${id} can not be found` } - } catch (error) { + } catch (_error) { ctx.response.status = 500 ctx.body = `Unable to retrieve service message ${id}` } diff --git a/meteor/server/api/singleUseTokens.ts b/meteor/server/api/singleUseTokens.ts index 88fc57a45f..1884ca0ad2 100644 --- a/meteor/server/api/singleUseTokens.ts +++ b/meteor/server/api/singleUseTokens.ts @@ -49,9 +49,12 @@ export function verifyHashedToken(token: string, secret: string = TOKEN_SECRET, if (valid) { usedTokensShortTermMemory.set(token, timestamp) // we can forget that the token has been used after the validity window has passed, because it will be invalid anyway - setTimeout(() => { - usedTokensShortTermMemory.delete(token) - }, 3 * 1000 * VALIDITY_PERIOD) + setTimeout( + () => { + usedTokensShortTermMemory.delete(token) + }, + 3 * 1000 * VALIDITY_PERIOD + ) } return valid } diff --git a/meteor/server/api/snapshot.ts b/meteor/server/api/snapshot.ts index 89deb18edb..b51e45c7fe 100644 --- a/meteor/server/api/snapshot.ts +++ b/meteor/server/api/snapshot.ts @@ -1,6 +1,6 @@ import * as Path from 'path' import { Meteor } from 'meteor/meteor' -import * as _ from 'underscore' +import _ from 'underscore' import Koa from 'koa' import KoaRouter from '@koa/router' import bodyParser from 'koa-bodyparser' @@ -95,6 +95,7 @@ import { NrcsIngestDataCacheObjRundown, NrcsIngestDataCacheObjSegment, NrcsIngestDataCacheObjPart, + NrcsIngestCacheType, } from '@sofie-automation/corelib/dist/dataModel/NrcsIngestDataCache' import { UserPermissions } from '@sofie-automation/meteor-lib/dist/userPermissions' import { assertConnectionHasOneOfPermissions, RequestCredentials } from '../security/auth' @@ -542,9 +543,13 @@ async function ingestFromSnapshot( // Read the ingestData from the snapshot const ingestData = playlistSnapshot.ingestData - const rundownData = ingestData.filter((e) => e.type === 'rundown') as NrcsIngestDataCacheObjRundown[] - const segmentData = ingestData.filter((e) => e.type === 'segment') as NrcsIngestDataCacheObjSegment[] - const partData = ingestData.filter((e) => e.type === 'part') as NrcsIngestDataCacheObjPart[] + const rundownData = ingestData.filter( + (e) => e.type === NrcsIngestCacheType.RUNDOWN + ) as NrcsIngestDataCacheObjRundown[] + const segmentData = ingestData.filter( + (e) => e.type === NrcsIngestCacheType.SEGMENT + ) as NrcsIngestDataCacheObjSegment[] + const partData = ingestData.filter((e) => e.type === NrcsIngestCacheType.PART) as NrcsIngestDataCacheObjPart[] if (rundownData.length === 0) throw new Meteor.Error(402, `No rundowns found in ingestData`) diff --git a/meteor/server/api/studio/api.ts b/meteor/server/api/studio/api.ts index abcecbf8a6..f5f75b7fe7 100644 --- a/meteor/server/api/studio/api.ts +++ b/meteor/server/api/studio/api.ts @@ -83,11 +83,11 @@ async function removeStudio(context: MethodContext, studioId: StudioId): Promise if (!studio) throw new Meteor.Error(404, `Studio "${studioId}" not found`) // allowed to remove? - const rundown = await Rundowns.findOneAsync({ studioId: studio._id }, { fields: { _id: 1 } }) + const rundown = await Rundowns.findOneAsync({ studioId: studio._id }, { projection: { _id: 1 } }) if (rundown) throw new Meteor.Error(404, `Can't remove studio "${studioId}", because the rundown "${rundown._id}" is in it.`) - const playlist = await RundownPlaylists.findOneAsync({ studioId: studio._id }, { fields: { _id: 1 } }) + const playlist = await RundownPlaylists.findOneAsync({ studioId: studio._id }, { projection: { _id: 1 } }) if (playlist) throw new Meteor.Error( 404, @@ -96,7 +96,7 @@ async function removeStudio(context: MethodContext, studioId: StudioId): Promise const peripheralDevice = await PeripheralDevices.findOneAsync( { 'studioAndConfigId.studioId': studio._id }, - { fields: { _id: 1 } } + { projection: { _id: 1 } } ) if (peripheralDevice) throw new Meteor.Error( @@ -190,7 +190,7 @@ Meteor.startup(async () => { removed: triggerUpdateStudioMappingsHash, }, { - fields: { + projection: { mappingsWithOverrides: 1, routeSetsWithOverrides: 1, }, diff --git a/meteor/server/api/studio/lib.ts b/meteor/server/api/studio/lib.ts index 1262f11a41..dc0c161793 100644 --- a/meteor/server/api/studio/lib.ts +++ b/meteor/server/api/studio/lib.ts @@ -28,7 +28,7 @@ export async function getExpiredRemovedPackageInfos(): Promise { - const knownExpectedPackageIds = (await ExpectedPackages.findFetchAsync({}, { fields: { _id: 1 } })).map( + const knownExpectedPackageIds = (await ExpectedPackages.findFetchAsync({}, { projection: { _id: 1 } })).map( (pkg) => pkg._id ) @@ -49,7 +49,7 @@ export async function getOrphanedPackageInfos(): Promise removeTime: { $exists: false }, }, { - fields: { + projection: { _id: 1, }, } @@ -90,7 +90,7 @@ export async function getStudioIdFromDevice(peripheralDevice: PeripheralDevice): if (peripheralDevice.parentDeviceId) { // Also check the parent device: const parentDevice = (await PeripheralDevices.findOneAsync(peripheralDevice.parentDeviceId, { - fields: { + projection: { _id: 1, studioAndConfigId: 1, }, diff --git a/meteor/server/api/system.ts b/meteor/server/api/system.ts index 11b90ab3eb..4dcac3b674 100644 --- a/meteor/server/api/system.ts +++ b/meteor/server/api/system.ts @@ -1,4 +1,4 @@ -import * as _ from 'underscore' +import _ from 'underscore' import { Time } from '../lib/tempLib' import { sleep, getCurrentTime } from '../lib/lib' import { registerClassToMeteorMethods } from '../methods' diff --git a/meteor/server/api/systemTime/systemTime.ts b/meteor/server/api/systemTime/systemTime.ts index b322035983..62dbba4681 100644 --- a/meteor/server/api/systemTime/systemTime.ts +++ b/meteor/server/api/systemTime/systemTime.ts @@ -1,6 +1,6 @@ const ntpClient: NtpClient = require('ntp-client') import { DiffTimeResult } from '@sofie-automation/shared-lib/dist/peripheralDevice/peripheralDeviceAPI' -import { NtpClient } from '../../typings/ntp-client' +import type { NtpClient } from '../../typings/ntp-client' /** * Example usage: @@ -49,7 +49,7 @@ async function determineDiffTimeInner(config?: Config): Promise if (tryCount > minSampleCount) { resolve(results) } else { - reject('Max try count reached') + reject(new Error('Max try count reached')) } return } @@ -94,7 +94,7 @@ async function getServerTime(host: string, port: number, timeout?: number): Prom try { ntpClient.getNetworkTime(host, port, (err: any, date: Date) => { if (err) { - reject(err) + reject(err instanceof Error ? err : new Error(err)) return } else { const replyTime = Date.now() @@ -106,7 +106,7 @@ async function getServerTime(host: string, port: number, timeout?: number): Prom } }) } catch (e) { - reject(e) + reject(e instanceof Error ? e : new Error(`${e}`)) } }) } diff --git a/meteor/server/api/userActions.ts b/meteor/server/api/userActions.ts index 13718f52c1..e65c9bcb1e 100644 --- a/meteor/server/api/userActions.ts +++ b/meteor/server/api/userActions.ts @@ -10,12 +10,11 @@ import { storeRundownPlaylistSnapshot } from './snapshot' import { registerClassToMeteorMethods, ReplaceOptionalWithNullInMethodArguments } from '../methods' import { ServerRundownAPI } from './rundown' import { saveEvaluation } from './evaluations' -import * as MediaManagerAPI from './mediaManager' import { MOSDeviceActions } from './ingest/mosDevice/actions' import { MethodContextAPI } from './methodContext' import { ServerClientAPI } from './client' import { triggerWriteAccessBecauseNoCheckNecessary } from '../security/securityVerify' -import { Bucket } from '@sofie-automation/meteor-lib/dist/collections/Buckets' +import { Bucket } from '@sofie-automation/corelib/dist/dataModel/Bucket' import { BucketsAPI } from './buckets' import { BucketAdLib } from '@sofie-automation/corelib/dist/dataModel/BucketAdLibPiece' import { AdLibActionCommon } from '@sofie-automation/corelib/dist/dataModel/AdlibAction' @@ -25,8 +24,9 @@ import { ServerPeripheralDeviceAPI } from './peripheralDevice' import { StudioJobs } from '@sofie-automation/corelib/dist/worker/studio' import { AdLibActionId, + BucketAdLibActionId, + BucketAdLibId, BucketId, - MediaWorkFlowId, PartId, PartInstanceId, PeripheralDeviceId, @@ -399,7 +399,7 @@ class ServerUserActionAPI userEvent: string, eventTime: Time, rundownPlaylistId: RundownPlaylistId, - actionDocId: AdLibActionId | RundownBaselineAdLibActionId, + actionDocId: AdLibActionId | RundownBaselineAdLibActionId | BucketAdLibActionId, actionId: string, userData: ActionUserData, triggerMode: string | null @@ -559,7 +559,7 @@ class ServerUserActionAPI eventTime: Time, rundownPlaylistId: RundownPlaylistId, partInstanceId: PartInstanceId, - bucketAdlibId: PieceId, + bucketAdlibId: BucketAdLibId, queue: boolean | null ) { return ServerClientAPI.runUserActionInLogForPlaylistOnWorker( @@ -754,97 +754,6 @@ class ServerUserActionAPI } ) } - async mediaRestartWorkflow( - userEvent: string, - eventTime: Time, - deviceId: PeripheralDeviceId, - workflowId: MediaWorkFlowId - ) { - return ServerClientAPI.runUserActionInLog( - this, - userEvent, - eventTime, - 'mediaRestartWorkflow', - { deviceId, workflowId }, - async () => { - check(workflowId, String) - - assertConnectionHasOneOfPermissions(this.connection, ...PERMISSIONS_FOR_MEDIA_MANAGEMENT) - - return MediaManagerAPI.restartWorkflow(deviceId, workflowId) - } - ) - } - async mediaAbortWorkflow( - userEvent: string, - eventTime: Time, - deviceId: PeripheralDeviceId, - workflowId: MediaWorkFlowId - ) { - return ServerClientAPI.runUserActionInLog( - this, - userEvent, - eventTime, - 'mediaAbortWorkflow', - { deviceId, workflowId }, - async () => { - check(workflowId, String) - - assertConnectionHasOneOfPermissions(this.connection, ...PERMISSIONS_FOR_MEDIA_MANAGEMENT) - - return MediaManagerAPI.abortWorkflow(deviceId, workflowId) - } - ) - } - async mediaPrioritizeWorkflow( - userEvent: string, - eventTime: Time, - deviceId: PeripheralDeviceId, - workflowId: MediaWorkFlowId - ) { - return ServerClientAPI.runUserActionInLog( - this, - userEvent, - eventTime, - 'mediaPrioritizeWorkflow', - { deviceId, workflowId }, - async () => { - check(workflowId, String) - - assertConnectionHasOneOfPermissions(this.connection, ...PERMISSIONS_FOR_MEDIA_MANAGEMENT) - - return MediaManagerAPI.prioritizeWorkflow(deviceId, workflowId) - } - ) - } - async mediaRestartAllWorkflows(userEvent: string, eventTime: Time) { - return ServerClientAPI.runUserActionInLog( - this, - userEvent, - eventTime, - 'mediaRestartAllWorkflows', - {}, - async () => { - assertConnectionHasOneOfPermissions(this.connection, ...PERMISSIONS_FOR_MEDIA_MANAGEMENT) - - return MediaManagerAPI.restartAllWorkflows(null) - } - ) - } - async mediaAbortAllWorkflows(userEvent: string, eventTime: Time) { - return ServerClientAPI.runUserActionInLog( - this, - userEvent, - eventTime, - 'mediaAbortAllWorkflows', - {}, - async () => { - assertConnectionHasOneOfPermissions(this.connection, ...PERMISSIONS_FOR_MEDIA_MANAGEMENT) - - return MediaManagerAPI.abortAllWorkflows(null) - } - ) - } async packageManagerRestartExpectation( userEvent: string, eventTime: Time, @@ -959,7 +868,7 @@ class ServerUserActionAPI } setTimeout(() => { - // eslint-disable-next-line no-process-exit + // eslint-disable-next-line n/no-process-exit process.exit(0) }, 3000) return `Restarting Core in 3s.` @@ -1045,7 +954,7 @@ class ServerUserActionAPI } ) } - async bucketsRemoveBucketAdLib(userEvent: string, eventTime: Time, adlibId: PieceId) { + async bucketsRemoveBucketAdLib(userEvent: string, eventTime: Time, adlibId: BucketAdLibId) { check(adlibId, String) return ServerClientAPI.runUserActionInLog( @@ -1060,7 +969,7 @@ class ServerUserActionAPI } ) } - async bucketsRemoveBucketAdLibAction(userEvent: string, eventTime: Time, actionId: AdLibActionId) { + async bucketsRemoveBucketAdLibAction(userEvent: string, eventTime: Time, actionId: BucketAdLibActionId) { return ServerClientAPI.runUserActionInLog( this, userEvent, @@ -1078,7 +987,7 @@ class ServerUserActionAPI async bucketsModifyBucketAdLib( userEvent: string, eventTime: Time, - adlibId: PieceId, + adlibId: BucketAdLibId, adlibProps: Partial> ) { return ServerClientAPI.runUserActionInLog( @@ -1099,7 +1008,7 @@ class ServerUserActionAPI async bucketsModifyBucketAdLibAction( userEvent: string, eventTime: Time, - actionId: AdLibActionId, + actionId: BucketAdLibActionId, actionProps: Partial> ) { return ServerClientAPI.runUserActionInLog( diff --git a/meteor/server/collections/bucket.ts b/meteor/server/collections/bucket.ts index 5479fcfeef..8742f762ff 100644 --- a/meteor/server/collections/bucket.ts +++ b/meteor/server/collections/bucket.ts @@ -1,7 +1,7 @@ import { BucketAdLibAction } from '@sofie-automation/corelib/dist/dataModel/BucketAdLibAction' import { BucketAdLib } from '@sofie-automation/corelib/dist/dataModel/BucketAdLibPiece' import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' -import { Bucket } from '@sofie-automation/meteor-lib/dist/collections/Buckets' +import { Bucket } from '@sofie-automation/corelib/dist/dataModel/Bucket' import { createAsyncOnlyMongoCollection } from './collection' import { registerIndex } from './indices' diff --git a/meteor/server/collections/collection.ts b/meteor/server/collections/collection.ts index 8ae8aae4a8..bc623095e7 100644 --- a/meteor/server/collections/collection.ts +++ b/meteor/server/collections/collection.ts @@ -1,6 +1,5 @@ -import { UserId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { FindOptions, MongoModifier, MongoQuery } from '@sofie-automation/corelib/dist/mongo' -import { ProtectedString, protectString } from '@sofie-automation/corelib/dist/protectedString' +import { ProtectedString } from '@sofie-automation/corelib/dist/protectedString' import { Meteor } from 'meteor/meteor' import { Mongo } from 'meteor/mongo' import { NpmModuleMongodb } from 'meteor/npm-mongo' @@ -20,11 +19,13 @@ import { UpsertOptions, } from '@sofie-automation/meteor-lib/dist/collections/lib' import { MinimalMongoCursor } from './implementations/asyncCollection' +import { UserPermissions } from '@sofie-automation/meteor-lib/dist/userPermissions' -export interface MongoAllowRules { +export interface CustomMongoAllowRules { // insert?: (userId: UserId | null, doc: DBInterface) => Promise | boolean - update?: ( - userId: UserId | null, + requiredPermissions: Array + update: ( + permissions: UserPermissions, doc: DBInterface, fieldNames: FieldNames, modifier: MongoModifier @@ -32,6 +33,8 @@ export interface MongoAllowRules { // remove?: (userId: UserId | null, doc: DBInterface) => Promise | boolean } +export const collectionsAllowDenyCache = new Map>() + /** * Map of current collection objects. * Future: Could this weakly hold the collections? @@ -55,11 +58,16 @@ export function getOrCreateMongoCollection(name: string): Mongo.Collection */ export function createAsyncOnlyMongoCollection }>( name: CollectionName, - allowRules: MongoAllowRules | false + allowRules: CustomMongoAllowRules | false ): AsyncOnlyMongoCollection { const collection = getOrCreateMongoCollection(name) - setupCollectionAllowRules(collection, allowRules) + if (allowRules) { + if (allowRules.requiredPermissions.length === 0) + throw new Meteor.Error(403, `No permissions specified for collection "${name}"`) + + collectionsAllowDenyCache.set(name, allowRules as CustomMongoAllowRules) + } const wrappedCollection = wrapMeteorCollectionIntoAsyncCollection(collection, name) @@ -83,8 +91,6 @@ export function createAsyncOnlyReadOnlyMongoCollection }>( - collection: Mongo.Collection, - args: MongoAllowRules | false -) { - if (!args) { - // Mutations are disabled by default - return - } - - const { /* insert: origInsert,*/ update: origUpdate /*remove: origRemove*/ } = args - - // These methods behave weirdly, we need to mangle this a bit. - // See https://github.com/meteor/meteor/issues/13444 for a full explanation - const options: any /*Parameters['allow']>[0]*/ = { - update: () => false, - updateAsync: origUpdate - ? (userId: string | null, doc: DBInterface, fieldNames: string[], modifier: any) => - origUpdate(protectString(userId), doc, fieldNames as any, modifier) as any - : () => false, - } - - collection.allow(options) -} - /** * A minimal Async only wrapping around the base Mongo.Collection type */ @@ -221,7 +203,10 @@ export interface AsyncOnlyReadOnlyMongoCollection, options?: FindOptions): Promise> + findFetchAsync( + selector: MongoQuery, + options?: Omit, 'fields'> + ): Promise> /** * Find and return a document @@ -230,7 +215,7 @@ export interface AsyncOnlyReadOnlyMongoCollection | DBInterface['_id'], - options?: FindOptions + options?: Omit, 'fields'> ): Promise /** @@ -239,7 +224,7 @@ export interface AsyncOnlyReadOnlyMongoCollection | DBInterface['_id'], - options?: FindOptions + options?: Omit, 'fields'> ): Promise> /** @@ -249,7 +234,7 @@ export interface AsyncOnlyReadOnlyMongoCollection | DBInterface['_id'], callbacks: PromisifyCallbacks>, - options?: FindOptions + options?: Omit, 'fields'> ): Promise /** @@ -259,7 +244,7 @@ export interface AsyncOnlyReadOnlyMongoCollection | DBInterface['_id'], callbacks: PromisifyCallbacks>, - options?: FindOptions + options?: Omit, 'fields'> ): Promise /** diff --git a/meteor/server/collections/index.ts b/meteor/server/collections/index.ts index 7b975d0a43..3f45dc8905 100644 --- a/meteor/server/collections/index.ts +++ b/meteor/server/collections/index.ts @@ -32,7 +32,6 @@ import { createAsyncOnlyMongoCollection, createAsyncOnlyReadOnlyMongoCollection import { ObserveChangesForHash } from './lib' import { logger } from '../logging' import { allowOnlyFields, rejectFields } from '../security/allowDeny' -import { checkUserIdHasOneOfPermissions } from '../security/auth' import { DBNotificationObj } from '@sofie-automation/corelib/dist/dataModel/Notifications' export * from './bucket' @@ -40,9 +39,8 @@ export * from './packages-media' export * from './rundown' export const Blueprints = createAsyncOnlyMongoCollection(CollectionName.Blueprints, { - update(userId, doc, fields, _modifier) { - if (!checkUserIdHasOneOfPermissions(userId, CollectionName.Blueprints, 'configure')) return false - + requiredPermissions: ['configure'], + update(_permissions, doc, fields, _modifier) { return allowOnlyFields(doc, fields, ['name', 'disableVersionChecks']) }, }) @@ -51,9 +49,8 @@ registerIndex(Blueprints, { }) export const CoreSystem = createAsyncOnlyMongoCollection(CollectionName.CoreSystem, { - async update(userId, doc, fields, _modifier) { - if (!checkUserIdHasOneOfPermissions(userId, CollectionName.CoreSystem, 'configure')) return false - + requiredPermissions: ['configure'], + async update(_permissions, doc, fields, _modifier) { return allowOnlyFields(doc, fields, [ 'systemInfo', 'name', @@ -62,6 +59,7 @@ export const CoreSystem = createAsyncOnlyMongoCollection(Collection 'logo', 'blueprintId', 'settingsWithOverrides', + 'enableMonitorBlockedThread', ]) }, }) @@ -110,9 +108,8 @@ registerIndex(Notifications, { }) export const Organizations = createAsyncOnlyMongoCollection(CollectionName.Organizations, { - async update(userId, doc, fields, _modifier) { - if (!checkUserIdHasOneOfPermissions(userId, CollectionName.Organizations, 'configure')) return false - + requiredPermissions: ['configure'], + async update(_permissions, doc, fields, _modifier) { return allowOnlyFields(doc, fields, ['userRoles']) }, }) @@ -126,9 +123,8 @@ registerIndex(PeripheralDeviceCommands, { }) export const PeripheralDevices = createAsyncOnlyMongoCollection(CollectionName.PeripheralDevices, { - update(userId, doc, fields, _modifier) { - if (!checkUserIdHasOneOfPermissions(userId, CollectionName.PeripheralDevices, 'configure')) return false - + requiredPermissions: ['configure'], + update(_permissions, doc, fields, _modifier) { return allowOnlyFields(doc, fields, [ 'name', 'deviceName', @@ -151,9 +147,8 @@ registerIndex(PeripheralDevices, { }) export const RundownLayouts = createAsyncOnlyMongoCollection(CollectionName.RundownLayouts, { - async update(userId, doc, fields) { - if (!checkUserIdHasOneOfPermissions(userId, CollectionName.RundownLayouts, 'configure')) return false - + requiredPermissions: ['configure'], + async update(_permissions, doc, fields) { return rejectFields(doc, fields, ['_id', 'showStyleBaseId']) }, }) @@ -168,9 +163,8 @@ registerIndex(RundownLayouts, { }) export const ShowStyleBases = createAsyncOnlyMongoCollection(CollectionName.ShowStyleBases, { - async update(userId, doc, fields) { - if (!checkUserIdHasOneOfPermissions(userId, CollectionName.ShowStyleBases, 'configure')) return false - + requiredPermissions: ['configure'], + async update(_permissions, doc, fields) { return rejectFields(doc, fields, ['_id']) }, }) @@ -179,9 +173,8 @@ registerIndex(ShowStyleBases, { }) export const ShowStyleVariants = createAsyncOnlyMongoCollection(CollectionName.ShowStyleVariants, { - async update(userId, doc, fields) { - if (!checkUserIdHasOneOfPermissions(userId, CollectionName.ShowStyleVariants, 'configure')) return false - + requiredPermissions: ['configure'], + async update(_permissions, doc, fields) { return rejectFields(doc, fields, ['showStyleBaseId']) }, }) @@ -191,9 +184,8 @@ registerIndex(ShowStyleVariants, { }) export const Snapshots = createAsyncOnlyMongoCollection(CollectionName.Snapshots, { - update(userId, doc, fields, _modifier) { - if (!checkUserIdHasOneOfPermissions(userId, CollectionName.Snapshots, 'configure')) return false - + requiredPermissions: ['configure'], + update(_permissions, doc, fields, _modifier) { return allowOnlyFields(doc, fields, ['comment']) }, }) @@ -205,9 +197,8 @@ registerIndex(Snapshots, { }) export const Studios = createAsyncOnlyMongoCollection(CollectionName.Studios, { - async update(userId, doc, fields, _modifier) { - if (!checkUserIdHasOneOfPermissions(userId, CollectionName.Studios, 'configure')) return false - + requiredPermissions: ['configure'], + async update(_permissions, doc, fields, _modifier) { return rejectFields(doc, fields, ['_id']) }, }) @@ -234,9 +225,8 @@ export const TranslationsBundles = createAsyncOnlyMongoCollection(CollectionName.TriggeredActions, { - async update(userId, doc, fields) { - if (!checkUserIdHasOneOfPermissions(userId, CollectionName.TriggeredActions, 'configure')) return false - + requiredPermissions: ['configure'], + async update(_permissions, doc, fields) { return rejectFields(doc, fields, ['_id']) }, }) diff --git a/meteor/server/collections/lib.ts b/meteor/server/collections/lib.ts index 5d9d64d9fc..0797f6eaa1 100644 --- a/meteor/server/collections/lib.ts +++ b/meteor/server/collections/lib.ts @@ -97,7 +97,7 @@ export async function ObserveChangesHelper( - CollectionName.ExpectedMediaItems -) -registerIndex(ExpectedMediaItems, { - path: 1, -}) -registerIndex(ExpectedMediaItems, { - mediaFlowId: 1, - studioId: 1, -}) -registerIndex(ExpectedMediaItems, { - rundownId: 1, -}) - export const ExpectedPackages = createAsyncOnlyReadOnlyMongoCollection( CollectionName.ExpectedPackages ) @@ -81,32 +63,6 @@ registerIndex(MediaObjects, { mediaId: 1, }) -export const MediaWorkFlows = createAsyncOnlyMongoCollection(CollectionName.MediaWorkFlows, false) -registerIndex(MediaWorkFlows, { - // TODO: add deviceId: 1, - mediaObjectId: 1, -}) -registerIndex(MediaWorkFlows, { - finished: 1, - success: 1, - priority: 1, -}) - -export const MediaWorkFlowSteps = createAsyncOnlyMongoCollection( - CollectionName.MediaWorkFlowSteps, - false -) -registerIndex(MediaWorkFlowSteps, { - deviceId: 1, -}) -registerIndex(MediaWorkFlowSteps, { - workFlowId: 1, -}) -registerIndex(MediaWorkFlowSteps, { - status: 1, - priority: 1, -}) - export const PackageContainerPackageStatuses = createAsyncOnlyMongoCollection( CollectionName.PackageContainerPackageStatuses, false diff --git a/meteor/server/coreSystem/checkDatabaseVersions.ts b/meteor/server/coreSystem/checkDatabaseVersions.ts index 469b3e6914..0e693f680d 100644 --- a/meteor/server/coreSystem/checkDatabaseVersions.ts +++ b/meteor/server/coreSystem/checkDatabaseVersions.ts @@ -60,7 +60,7 @@ export function checkDatabaseVersions(): void { const blueprints = (await Blueprints.findFetchAsync( {}, { - fields: { + projection: { _id: 1, blueprintVersion: 1, databaseVersion: 1, diff --git a/meteor/server/coreSystem/index.ts b/meteor/server/coreSystem/index.ts index 85a2586745..5ad804e3fc 100644 --- a/meteor/server/coreSystem/index.ts +++ b/meteor/server/coreSystem/index.ts @@ -109,7 +109,7 @@ async function initializeCoreSystem() { changed: observeBlueprintChanges, removed: observeBlueprintChanges, }, - { fields: { code: 0 } } + { projection: { code: 0 } } ) checkDatabaseVersions() diff --git a/meteor/server/cronjobs.ts b/meteor/server/cronjobs.ts index 62014fe5b5..eba5011a24 100644 --- a/meteor/server/cronjobs.ts +++ b/meteor/server/cronjobs.ts @@ -31,9 +31,12 @@ import { StudioId } from '@sofie-automation/corelib/dist/dataModel/Ids' const lowPrioFcn = (fcn: () => any) => { // Do it at a random time in the future: - Meteor.setTimeout(() => { - fcn() - }, Math.random() * 10 * 1000) + Meteor.setTimeout( + () => { + fcn() + }, + Math.random() * 10 * 1000 + ) } /** Returns true if it is "low-season" (like during the night) when it is suitable to run cronjobs */ function isLowSeason() { diff --git a/meteor/server/lib.ts b/meteor/server/lib.ts index 1c944e58a2..b952c244b0 100644 --- a/meteor/server/lib.ts +++ b/meteor/server/lib.ts @@ -1,5 +1,5 @@ import process from 'process' -import * as _ from 'underscore' +import _ from 'underscore' import fs from 'fs' import path from 'path' import { logger } from './logging' @@ -11,6 +11,7 @@ export function getAbsolutePath(): string { const rootPath = path.resolve('.') return rootPath.split(`${path.sep}.meteor`)[0] } +// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type export function extractFunctionSignature(f: Function): string[] | undefined { if (f) { const str = f.toString() || '' @@ -31,7 +32,14 @@ export type Translations = Record export const public_dir = Meteor.isProduction ? path.join(process.cwd(), '../web.browser/app') : // In development, find the webui package and use its public directory - path.join(process.cwd(), '../../../../../../packages/webui/public') + path.join(process.cwd(), '../../../../../../packages/webui/public') + +export function getRootSubpath(): string { + // @ts-expect-error Untyped meteor export + const settings: any = __meteor_runtime_config__ + + return settings.ROOT_URL_PATH_PREFIX || '' +} /** * Get the i18next locale object for a given `languageCode`. If the translations file can not be found or it can't be diff --git a/meteor/server/lib/__tests__/lib.test.ts b/meteor/server/lib/__tests__/lib.test.ts index 61b68f5957..85a370ee83 100644 --- a/meteor/server/lib/__tests__/lib.test.ts +++ b/meteor/server/lib/__tests__/lib.test.ts @@ -42,6 +42,7 @@ describe('server/lib', () => { generated: 1234, timelineBlob: serializeTimelineBlob(mystudioObjs), generationVersions: {} as any, + regenerateTimelineToken: undefined, }) const mystudio2Objs: Array = [ @@ -62,6 +63,7 @@ describe('server/lib', () => { generated: 1234, timelineBlob: serializeTimelineBlob(mystudio2Objs), generationVersions: {} as any, + regenerateTimelineToken: undefined, }) const options: SaveIntoDbHooks = { diff --git a/meteor/server/lib/customPublication/__tests__/optimizedObserver.test.ts b/meteor/server/lib/customPublication/__tests__/optimizedObserver.test.ts index e2c4cafb1f..5161ed7270 100644 --- a/meteor/server/lib/customPublication/__tests__/optimizedObserver.test.ts +++ b/meteor/server/lib/customPublication/__tests__/optimizedObserver.test.ts @@ -46,7 +46,7 @@ describe('optimizedObserver base', () => { const receiver2 = CustomPublishMock.create() try { - let triggerUpdate: TriggerUpdate<{}> | undefined + let triggerUpdate: TriggerUpdate> | undefined const setupObservers = jest.fn(async (_args, triggerUpdate0) => { triggerUpdate = triggerUpdate0 return [] diff --git a/meteor/server/lib/customPublication/optimizedObserverArray.ts b/meteor/server/lib/customPublication/optimizedObserverArray.ts index 7a677cc0b7..ba5aa998f6 100644 --- a/meteor/server/lib/customPublication/optimizedObserverArray.ts +++ b/meteor/server/lib/customPublication/optimizedObserverArray.ts @@ -20,7 +20,7 @@ export async function setUpOptimizedObserverArray< PublicationDoc extends { _id: ProtectedString }, Args, State extends Record, - UpdateProps extends Record + UpdateProps extends Record, >( identifier: string, args0: ReadonlyDeep, diff --git a/meteor/server/lib/customPublication/optimizedObserverBase.ts b/meteor/server/lib/customPublication/optimizedObserverBase.ts index 077259ced4..aa139c7985 100644 --- a/meteor/server/lib/customPublication/optimizedObserverBase.ts +++ b/meteor/server/lib/customPublication/optimizedObserverBase.ts @@ -60,7 +60,7 @@ export async function setUpOptimizedObserverInner< PublicationDoc extends { _id: ProtectedString }, Args, State extends Record, - UpdateProps extends Record + UpdateProps extends Record, >( identifier: string, args0: ReadonlyDeep, @@ -180,7 +180,7 @@ async function createOptimizedObserverWorker< PublicationDoc extends { _id: ProtectedString }, Args, State extends Record, - UpdateProps extends Record + UpdateProps extends Record, >( identifier: string, thisObserverWrapper: OptimizedObserverWrapper, diff --git a/meteor/server/lib/customPublication/optimizedObserverCollection.ts b/meteor/server/lib/customPublication/optimizedObserverCollection.ts index 5cbd25801a..d607dc18f9 100644 --- a/meteor/server/lib/customPublication/optimizedObserverCollection.ts +++ b/meteor/server/lib/customPublication/optimizedObserverCollection.ts @@ -19,7 +19,7 @@ export async function setUpCollectionOptimizedObserver< PublicationDoc extends { _id: ProtectedString }, Args, State extends Record, - UpdateProps extends Record + UpdateProps extends Record, >( identifier: string, args0: ReadonlyDeep, diff --git a/meteor/server/lib/customPublication/publish.ts b/meteor/server/lib/customPublication/publish.ts index fb8622b516..368ea5024c 100644 --- a/meteor/server/lib/customPublication/publish.ts +++ b/meteor/server/lib/customPublication/publish.ts @@ -32,7 +32,10 @@ export class CustomPublishMeteor }> { #onStop: (() => void) | undefined #isReady = false - constructor(private _meteorSubscription: SubscriptionContext, private _collectionName: string) { + constructor( + private _meteorSubscription: SubscriptionContext, + private _collectionName: string + ) { this._meteorSubscription.onStop(() => { if (this.#onStop) this.#onStop() }) diff --git a/meteor/server/lib/rest/v1/devices.ts b/meteor/server/lib/rest/v1/devices.ts index 5c1c48fb67..4738fd196f 100644 --- a/meteor/server/lib/rest/v1/devices.ts +++ b/meteor/server/lib/rest/v1/devices.ts @@ -56,16 +56,7 @@ export interface APIPeripheralDevice { name: string status: 'unknown' | 'good' | 'warning_major' | 'marning_minor' | 'bad' | 'fatal' messages: string[] - deviceType: - | 'unknown' - | 'mos' - | 'spreadsheet' - | 'inews' - | 'playout' - | 'media_manager' - | 'package_manager' - | 'live_status' - | 'input' + deviceType: 'unknown' | 'mos' | 'spreadsheet' | 'inews' | 'playout' | 'package_manager' | 'live_status' | 'input' connected: boolean } diff --git a/meteor/server/lib/rest/v1/studios.ts b/meteor/server/lib/rest/v1/studios.ts index 75afef9c0b..54c6208e9a 100644 --- a/meteor/server/lib/rest/v1/studios.ts +++ b/meteor/server/lib/rest/v1/studios.ts @@ -218,8 +218,10 @@ export interface APIStudioSettings { fallbackPartDuration?: number enableUserEdits?: boolean allowAdlibTestingSegment?: boolean + allowTestingAdlibsToPersist?: boolean allowHold?: boolean allowPieceDirectPlay?: boolean enableBuckets?: boolean enableEvaluationForm?: boolean + mockPieceContentStatus?: boolean } diff --git a/meteor/server/lib/tic-toc.ts b/meteor/server/lib/tic-toc.ts index e19ec73624..8753868555 100644 --- a/meteor/server/lib/tic-toc.ts +++ b/meteor/server/lib/tic-toc.ts @@ -1,5 +1,3 @@ -import _ from 'underscore' - const ticCache: Record = {} /** * Performance debugging. tic() starts a timer, toc() traces the time since tic() @@ -9,8 +7,8 @@ export function tic(name = 'default'): void { ticCache[name] = Date.now() } export function toc(name = 'default', logStr?: string | Promise[]): number | undefined { - if (_.isArray(logStr)) { - _.each(logStr, (promise, i) => { + if (Array.isArray(logStr)) { + logStr.forEach((promise, i) => { promise .then((result) => { toc(name, 'Promise ' + i) diff --git a/meteor/server/logging.ts b/meteor/server/logging.ts index b8d082d2a5..eb6d86d912 100644 --- a/meteor/server/logging.ts +++ b/meteor/server/logging.ts @@ -4,13 +4,14 @@ import { getAbsolutePath } from './lib' import { LogLevel } from './lib/tempLib' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' import { Meteor } from 'meteor/meteor' -import * as _ from 'underscore' +import _ from 'underscore' import { LoggerInstanceFixed } from '@sofie-automation/corelib/dist/logging' export function getLogLevel(): LogLevel { return logger.level as LogLevel } export function setLogLevel(level: LogLevel, startup = false): void { + // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison if (logger.level !== level || startup) { logger.level = level if (transports.console) { diff --git a/meteor/server/main.ts b/meteor/server/main.ts index 06cb00b026..e3d603bcb6 100644 --- a/meteor/server/main.ts +++ b/meteor/server/main.ts @@ -18,7 +18,7 @@ import './api/heapSnapshot' import './api/ingest/debug' import './api/integration/expectedPackages' import './api/integration/media-scanner' -import './api/integration/mediaWorkFlows' +import './api/mongo' import './api/peripheralDevice' import './api/playout/api' import './api/rundown' @@ -36,6 +36,7 @@ import './migration/migrations' import './api/playout/debug' import './performanceMonitor' import './systemStatus/api' +import './systemStatus/prometheusHealthGauge' import './api/user' import './api/organizations' import './api/serviceMessages/api' diff --git a/meteor/server/methods.ts b/meteor/server/methods.ts index 3a3c1da46b..921c6bb544 100644 --- a/meteor/server/methods.ts +++ b/meteor/server/methods.ts @@ -1,5 +1,5 @@ import { Meteor } from 'meteor/meteor' -import * as _ from 'underscore' +import _ from 'underscore' import { logger } from './logging' import { extractFunctionSignature } from './lib' import { MethodContext, MethodContextAPI } from './api/methodContext' @@ -59,6 +59,7 @@ export function registerClassToMeteorMethods( methodEnum: any, orgClass: typeof MethodContextAPI, secret?: boolean, + // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type wrapper?: (methodContext: MethodContext, methodName: string, args: any[], fcn: Function) => any ): void { const methods: MethodsInner = {} @@ -121,6 +122,7 @@ function setMeteorMethods(orgMethods: MethodsInner, secret?: boolean): void { if (!_suppressExtraErrorLogging) { logger.error(stringifyError(err)) } + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors return Promise.reject(err) }) } else { diff --git a/meteor/server/migration/1_50_0.ts b/meteor/server/migration/1_50_0.ts index ee346d52b3..51afd1fe73 100644 --- a/meteor/server/migration/1_50_0.ts +++ b/meteor/server/migration/1_50_0.ts @@ -34,7 +34,13 @@ import { DEFAULT_MINIMUM_TAKE_SPAN } from '@sofie-automation/shared-lib/dist/cor import { PartId } from '@sofie-automation/shared-lib/dist/core/model/Ids' import { protectString } from '@sofie-automation/shared-lib/dist/lib/protectedString' import { ExpectedPackageDBType } from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages' -import { AdLibActionId, PieceId, RundownBaselineAdLibActionId } from '@sofie-automation/corelib/dist/dataModel/Ids' +import { + AdLibActionId, + BucketAdLibActionId, + BucketAdLibId, + PieceId, + RundownBaselineAdLibActionId, +} from '@sofie-automation/corelib/dist/dataModel/Ids' import { Piece } from '@sofie-automation/corelib/dist/dataModel/Piece' import { AdLibPiece } from '@sofie-automation/corelib/dist/dataModel/AdLibPiece' import { AdLibAction } from '@sofie-automation/corelib/dist/dataModel/AdlibAction' @@ -346,8 +352,6 @@ export const addSteps = addMigrationSteps('1.50.0', [ documentationUrl = 'https://github.com/SuperFlyTV/spreadsheet-gateway' } else if (device.type === PeripheralDeviceType.PLAYOUT) { documentationUrl = 'https://github.com/Sofie-Automation/sofie-core' - } else if (device.type === PeripheralDeviceType.MEDIA_MANAGER) { - documentationUrl = 'https://github.com/nrkno/sofie-media-management' } else if (device.type === PeripheralDeviceType.INEWS) { documentationUrl = 'https://github.com/olzzon/tv2-inews-ftp-gateway' } else if (device.type === PeripheralDeviceType.PACKAGE_MANAGER) { @@ -697,7 +701,7 @@ export const addSteps = addMigrationSteps('1.50.0', [ $set: playlist.nextPartInfo ? { 'nextPartInfo.manuallySelected': nextPartManual, - } + } : undefined, $unset: { nextPartManual: 1, @@ -876,9 +880,9 @@ export const addSteps = addMigrationSteps('1.50.0', [ partId: { $exists: false }, }) - const neededPieceIds: Array = _.compact( - objects.map((obj) => obj.pieceId) - ) + const neededPieceIds: Array< + PieceId | AdLibActionId | RundownBaselineAdLibActionId | BucketAdLibId | BucketAdLibActionId + > = _.compact(objects.map((obj) => obj.pieceId)) const [pieces, adlibPieces, adlibActions] = await Promise.all([ Pieces.findFetchAsync( { @@ -915,7 +919,10 @@ export const addSteps = addMigrationSteps('1.50.0', [ ) as Promise[]>, ]) - const partIdLookup = new Map() + const partIdLookup = new Map< + PieceId | AdLibActionId | RundownBaselineAdLibActionId | BucketAdLibId | BucketAdLibActionId, + PartId + >() for (const piece of pieces) { partIdLookup.set(piece._id, piece.startPartId) } diff --git a/meteor/server/migration/X_X_X.ts b/meteor/server/migration/X_X_X.ts index eb315e9ec4..9a1382d9d6 100644 --- a/meteor/server/migration/X_X_X.ts +++ b/meteor/server/migration/X_X_X.ts @@ -1,5 +1,6 @@ import { addMigrationSteps } from './databaseMigration' import { CURRENT_SYSTEM_VERSION } from './currentSystemVersion' +import { MongoInternals } from 'meteor/mongo' /* * ************************************************************************************** @@ -12,5 +13,35 @@ import { CURRENT_SYSTEM_VERSION } from './currentSystemVersion' */ export const addSteps = addMigrationSteps(CURRENT_SYSTEM_VERSION, [ - // Add your migration here + { + id: `Drop media manager collections`, + canBeRunAutomatically: true, + validate: async () => { + // If MongoInternals is not available, we are in a test environment + if (!MongoInternals) return false + + const existingCollections = await MongoInternals.defaultRemoteCollectionDriver() + .mongo.db.listCollections() + .toArray() + const collectionsToDrop = existingCollections.filter((c) => + ['expectedMediaItems', 'mediaWorkFlows', 'mediaWorkFlowSteps'].includes(c.name) + ) + if (collectionsToDrop.length > 0) { + return `There are ${collectionsToDrop.length} obsolete collections to be removed: ${collectionsToDrop.map((c) => c.name).join(', ')}` + } + + return false + }, + migrate: async () => { + const existingCollections = await MongoInternals.defaultRemoteCollectionDriver() + .mongo.db.listCollections() + .toArray() + const collectionsToDrop = existingCollections.filter((c) => + ['expectedMediaItems', 'mediaWorkFlows', 'mediaWorkFlowSteps'].includes(c.name) + ) + for (const c of collectionsToDrop) { + await MongoInternals.defaultRemoteCollectionDriver().mongo.db.dropCollection(c.name) + } + }, + }, ]) diff --git a/meteor/server/migration/__tests__/migrations.test.ts b/meteor/server/migration/__tests__/migrations.test.ts index 510d40c8ca..b4a0b38e5a 100644 --- a/meteor/server/migration/__tests__/migrations.test.ts +++ b/meteor/server/migration/__tests__/migrations.test.ts @@ -1,4 +1,4 @@ -import * as _ from 'underscore' +import _ from 'underscore' import { setupEmptyEnvironment } from '../../../__mocks__/helpers/database' import { ICoreSystem, GENESIS_SYSTEM_VERSION } from '@sofie-automation/meteor-lib/dist/collections/CoreSystem' import { clearMigrationSteps, addMigrationSteps, prepareMigration, PreparedMigration } from '../databaseMigration' diff --git a/meteor/server/migration/currentSystemVersion.ts b/meteor/server/migration/currentSystemVersion.ts index 6a2a3c3b0c..bb7d1be26c 100644 --- a/meteor/server/migration/currentSystemVersion.ts +++ b/meteor/server/migration/currentSystemVersion.ts @@ -51,7 +51,8 @@ * 1.50.0: Release 50 (2024-02-23) * 1.51.0: Release 51 (TBD) * 1.52.0: Release 52 (TBD) + * 1.53.0: Release 53 (TBD) */ // Note: Only set this to release versions, (ie X.Y.Z), not pre-releases (ie X.Y.Z-0-pre-release) -export const CURRENT_SYSTEM_VERSION = '1.52.0' +export const CURRENT_SYSTEM_VERSION = '1.53.0' diff --git a/meteor/server/migration/databaseMigration.ts b/meteor/server/migration/databaseMigration.ts index e7e8c806fb..dbcf9186dc 100644 --- a/meteor/server/migration/databaseMigration.ts +++ b/meteor/server/migration/databaseMigration.ts @@ -19,7 +19,7 @@ import { InputFunction, MigrationStepCore, } from '@sofie-automation/blueprints-integration' -import * as _ from 'underscore' +import _ from 'underscore' import { GetMigrationStatusResult, MigrationChunk, @@ -354,7 +354,7 @@ export async function prepareMigration(returnAllChunks?: boolean): Promise { return chunk._steps.length > 0 - }) + }) const hash = getHash(stepsHash.join(',')) const steps = Object.values(migrationSteps) diff --git a/meteor/server/migration/lib.ts b/meteor/server/migration/lib.ts index 93441a9cc8..39b2d3d9cb 100644 --- a/meteor/server/migration/lib.ts +++ b/meteor/server/migration/lib.ts @@ -1,4 +1,4 @@ -import * as _ from 'underscore' +import _ from 'underscore' import { MigrationStepCore } from '@sofie-automation/blueprints-integration' import { objectPathGet, ProtectedString } from '../lib/tempLib' import { Meteor } from 'meteor/meteor' diff --git a/meteor/server/migration/upgrades/showStyleBase.ts b/meteor/server/migration/upgrades/showStyleBase.ts index bcbe015617..23b4af58eb 100644 --- a/meteor/server/migration/upgrades/showStyleBase.ts +++ b/meteor/server/migration/upgrades/showStyleBase.ts @@ -147,7 +147,7 @@ export async function runUpgradeForShowStyleBase(showStyleBaseId: ShowStyleBaseI async function loadShowStyleAndBlueprint(showStyleBaseId: ShowStyleBaseId) { const showStyleBase = (await ShowStyleBases.findOneAsync(showStyleBaseId, { - fields: { + projection: { _id: 1, blueprintId: 1, blueprintConfigPresetId: 1, @@ -172,7 +172,7 @@ async function loadShowStyleAndBlueprint(showStyleBaseId: ShowStyleBaseId) { ? await Blueprints.findOneAsync({ _id: showStyleBase.blueprintId, blueprintType: BlueprintManifestType.SHOWSTYLE, - }) + }) : undefined if (!blueprint) throw new Meteor.Error(404, `Blueprint "${showStyleBase.blueprintId}" not found!`) diff --git a/meteor/server/migration/upgrades/studio.ts b/meteor/server/migration/upgrades/studio.ts index e52bcf1b77..77b22b3935 100644 --- a/meteor/server/migration/upgrades/studio.ts +++ b/meteor/server/migration/upgrades/studio.ts @@ -10,7 +10,7 @@ import { BlueprintFixUpConfigMessage } from '@sofie-automation/meteor-lib/dist/a async function getStudio(studioId: StudioId): Promise> { const studio = (await Studios.findOneAsync(studioId, { - fields: { + projection: { _id: 1, }, })) as Pick | undefined diff --git a/meteor/server/optimizations.ts b/meteor/server/optimizations.ts index e5e59ec4b6..abed3d0cfb 100644 --- a/meteor/server/optimizations.ts +++ b/meteor/server/optimizations.ts @@ -9,7 +9,7 @@ import { ShowStyleBases, Studios } from './collections' */ export async function fetchStudioLight(studioId: StudioId): Promise { return Studios.findOneAsync(studioId, { - fields: { + projection: { mappingsWithOverrides: 0, blueprintConfigWithOverrides: 0, }, @@ -18,7 +18,7 @@ export async function fetchStudioLight(studioId: StudioId): Promise): Promise { const studios = await Studios.findFetchAsync(selector, { - fields: { + projection: { _id: 1, }, }) @@ -29,7 +29,7 @@ export async function fetchStudioIds(selector: MongoQuery): Promise { const studio = await Studios.findOneAsync(studioId, { - fields: { + projection: { _id: 1, }, }) @@ -42,7 +42,7 @@ export async function checkStudioExists(studioId: StudioId): Promise { */ export async function fetchShowStyleBaseLight(showStyleId: ShowStyleBaseId): Promise { return ShowStyleBases.findOneAsync(showStyleId, { - fields: { + projection: { blueprintConfigWithOverrides: 0, outputLayersWithOverrides: 0, sourceLayersWithOverrides: 0, @@ -51,7 +51,7 @@ export async function fetchShowStyleBaseLight(showStyleId: ShowStyleBaseId): Pro } export async function fetchShowStyleBasesLight(selector: MongoQuery): Promise { return ShowStyleBases.findFetchAsync(selector, { - fields: { + projection: { blueprintConfigWithOverrides: 0, outputLayersWithOverrides: 0, sourceLayersWithOverrides: 0, diff --git a/meteor/server/performanceMonitor.ts b/meteor/server/performanceMonitor.ts index 50ad29cafa..db6e58a91d 100644 --- a/meteor/server/performanceMonitor.ts +++ b/meteor/server/performanceMonitor.ts @@ -1,5 +1,5 @@ import { Meteor } from 'meteor/meteor' -import * as _ from 'underscore' +import _ from 'underscore' import { getCoreSystemAsync } from './coreSystem/collection' import { logger } from './logging' import { getRunningMethods, resetRunningMethods } from './methods' diff --git a/meteor/server/publications/buckets.ts b/meteor/server/publications/buckets.ts index f5694d52d8..06e5dfe4aa 100644 --- a/meteor/server/publications/buckets.ts +++ b/meteor/server/publications/buckets.ts @@ -1,15 +1,17 @@ import { FindOptions } from '@sofie-automation/meteor-lib/dist/collections/lib' import { meteorPublish } from './lib/lib' -import { MeteorPubSub } from '@sofie-automation/meteor-lib/dist/api/pubsub' -import { Bucket } from '@sofie-automation/meteor-lib/dist/collections/Buckets' +import { Bucket } from '@sofie-automation/corelib/dist/dataModel/Bucket' import { BucketAdLibActions, BucketAdLibs, Buckets } from '../collections' import { check, Match } from 'meteor/check' import { StudioId, BucketId, ShowStyleVariantId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub' import { triggerWriteAccessBecauseNoCheckNecessary } from '../security/securityVerify' +import { MongoQuery } from '@sofie-automation/corelib/dist/mongo' +import { BucketAdLib } from '@sofie-automation/corelib/dist/dataModel/BucketAdLibPiece' +import { BucketAdLibAction } from '@sofie-automation/corelib/dist/dataModel/BucketAdLibAction' meteorPublish( - MeteorPubSub.buckets, + CorelibPubSub.buckets, async function (studioId: StudioId, bucketId: BucketId | null, _token: string | undefined) { check(studioId, String) check(bucketId, Match.Maybe(String)) @@ -17,73 +19,66 @@ meteorPublish( triggerWriteAccessBecauseNoCheckNecessary() const modifier: FindOptions = { - fields: {}, + projection: {}, } - return Buckets.findWithCursor( - bucketId - ? { - _id: bucketId, - studioId, - } - : { - studioId, - }, - modifier - ) + const selector: MongoQuery = { + studioId, + } + if (bucketId) selector._id = bucketId + + return Buckets.findWithCursor(selector, modifier) } ) meteorPublish( CorelibPubSub.bucketAdLibPieces, - async function (studioId: StudioId, bucketId: BucketId, showStyleVariantIds: ShowStyleVariantId[]) { + async function (studioId: StudioId, bucketId: BucketId | null, showStyleVariantIds: ShowStyleVariantId[]) { check(studioId, String) - check(bucketId, String) + check(bucketId, Match.Maybe(String)) check(showStyleVariantIds, Array) triggerWriteAccessBecauseNoCheckNecessary() - return BucketAdLibs.findWithCursor( - { - studioId: studioId, - bucketId: bucketId, - showStyleVariantId: { - $in: [null, ...showStyleVariantIds], // null = valid for all variants - }, + const selector: MongoQuery = { + studioId: studioId, + showStyleVariantId: { + $in: [null, ...showStyleVariantIds], // null = valid for all variants + }, + } + if (bucketId) selector.bucketId = bucketId + + return BucketAdLibs.findWithCursor(selector, { + projection: { + ingestInfo: 0, // This is a large blob, and is not of interest to the UI + privateData: 0, }, - { - fields: { - ingestInfo: 0, // This is a large blob, and is not of interest to the UI - privateData: 0, - }, - } - ) + }) } ) meteorPublish( CorelibPubSub.bucketAdLibActions, - async function (studioId: StudioId, bucketId: BucketId, showStyleVariantIds: ShowStyleVariantId[]) { + async function (studioId: StudioId, bucketId: BucketId | null, showStyleVariantIds: ShowStyleVariantId[]) { check(studioId, String) - check(bucketId, String) + check(bucketId, Match.Maybe(String)) check(showStyleVariantIds, Array) triggerWriteAccessBecauseNoCheckNecessary() - return BucketAdLibActions.findWithCursor( - { - studioId: studioId, - bucketId: bucketId, - showStyleVariantId: { - $in: [null, ...showStyleVariantIds], // null = valid for all variants - }, + const selector: MongoQuery = { + studioId: studioId, + showStyleVariantId: { + $in: [null, ...showStyleVariantIds], // null = valid for all variants + }, + } + if (bucketId) selector.bucketId = bucketId + + return BucketAdLibActions.findWithCursor(selector, { + projection: { + ingestInfo: 0, // This is a large blob, and is not of interest to the UI + privateData: 0, }, - { - fields: { - ingestInfo: 0, // This is a large blob, and is not of interest to the UI - privateData: 0, - }, - } - ) + }) } ) diff --git a/meteor/server/publications/deviceTriggersPreview.ts b/meteor/server/publications/deviceTriggersPreview.ts index d4cbbaeb7f..7f55a3b0af 100644 --- a/meteor/server/publications/deviceTriggersPreview.ts +++ b/meteor/server/publications/deviceTriggersPreview.ts @@ -98,8 +98,8 @@ async function createObserverForDeviceTriggersPreviewsPublication( return setUpOptimizedObserverArray< UIDeviceTriggerPreview, DeviceTriggersPreviewArgs, - DeviceTriggersUpdateProps, - {} + Record, + DeviceTriggersUpdateProps >( `pub_${observerId}_${studioId}`, { studioId }, @@ -112,7 +112,7 @@ async function createObserverForDeviceTriggersPreviewsPublication( async function manipulateMountedTriggersPublicationData( _args: ReadonlyDeep, - _state: Partial<{}>, + _state: Partial>, newProps: ReadonlyDeep | undefined> ): Promise { const triggers: UIDeviceTriggerPreview[] = Array.from(newProps?.triggers ?? []) diff --git a/meteor/server/publications/lib/ReactiveCacheCollection.ts b/meteor/server/publications/lib/ReactiveCacheCollection.ts index aedd2308a0..ab9f035dc2 100644 --- a/meteor/server/publications/lib/ReactiveCacheCollection.ts +++ b/meteor/server/publications/lib/ReactiveCacheCollection.ts @@ -13,7 +13,10 @@ export class ReactiveCacheCollection - constructor(public collectionName: string, private reaction?: Reaction) { + constructor( + public collectionName: string, + private reaction?: Reaction + ) { this.#collection = new Mongo.Collection(null) } diff --git a/meteor/server/publications/lib/lib.ts b/meteor/server/publications/lib/lib.ts index 2d9d9b92a2..87e8baa5d6 100644 --- a/meteor/server/publications/lib/lib.ts +++ b/meteor/server/publications/lib/lib.ts @@ -6,6 +6,7 @@ import { MetricsGauge } from '@sofie-automation/corelib/dist/prometheus' import { MinimalMongoCursor } from '../../collections/implementations/asyncCollection' export const MeteorPublicationSignatures: { [key: string]: string[] } = {} +// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type export const MeteorPublications: { [key: string]: Function } = {} const MeteorPublicationsGauge = new MetricsGauge({ @@ -42,11 +43,10 @@ export function meteorPublishUnsafe( }) } -export type PublishDocType = ReturnType< - AllPubSubTypes[K] -> extends keyof AllPubSubCollections - ? AllPubSubCollections[ReturnType] - : never +export type PublishDocType = + ReturnType extends keyof AllPubSubCollections + ? AllPubSubCollections[ReturnType] + : never /** * Wrapper around Meteor.publish with stricter typings diff --git a/meteor/server/publications/lib/observerChain.ts b/meteor/server/publications/lib/observerChain.ts index 76d73ed7b2..1605278997 100644 --- a/meteor/server/publications/lib/observerChain.ts +++ b/meteor/server/publications/lib/observerChain.ts @@ -25,7 +25,7 @@ type Link = { end: (complete: (state: T | null) => void) => Meteor.LiveQueryHandle } -export function observerChain(): Pick, 'next'> { +export function observerChain(): Pick, 'next'> { function createNextLink(baseCollectorObject: Record, liveQueryHandle: Meteor.LiveQueryHandle) { let mode: 'next' | 'end' | undefined let chainedCursor: (state: Record) => Promise | null> diff --git a/meteor/server/publications/lib/quickLoop.ts b/meteor/server/publications/lib/quickLoop.ts index 9b4bb08374..03e4aae116 100644 --- a/meteor/server/publications/lib/quickLoop.ts +++ b/meteor/server/publications/lib/quickLoop.ts @@ -29,17 +29,23 @@ export function findPartPosition( } export function stringsToIndexLookup(strings: string[]): Record { - return strings.reduce((result, str, index) => { - result[str] = index - return result - }, {} as Record) + return strings.reduce( + (result, str, index) => { + result[str] = index + return result + }, + {} as Record + ) } export function extractRanks(docs: { _id: ProtectedString; _rank: number }[]): Record { - return docs.reduce((result, doc) => { - result[doc._id as unknown as string] = doc._rank - return result - }, {} as Record) + return docs.reduce( + (result, doc) => { + result[doc._id as unknown as string] = doc._rank + return result + }, + {} as Record + ) } export function modifyPartForQuickLoop( @@ -117,22 +123,22 @@ export function modifyPartInstanceForQuickLoop( export function findMarkerPosition( marker: QuickLoopMarker, fallback: number, - segmentCache: ReadonlyObjectDeep>>, - partCache: - | { parts: ReadonlyObjectDeep>> } - | { partInstances: ReadonlyObjectDeep> }, + contentCache: { + segments: ReadonlyObjectDeep>> + parts: ReadonlyObjectDeep>> + partInstances?: ReadonlyObjectDeep> + }, rundownRanks: Record ): MarkerPosition { const part = marker.type === QuickLoopMarkerType.PART - ? 'parts' in partCache - ? partCache.parts.findOne(marker.id) - : partCache.partInstances.findOne({ 'part._id': marker.id })?.part + ? (contentCache.partInstances?.findOne({ 'part._id': marker.id })?.part ?? + contentCache.parts?.findOne(marker.id)) : undefined const partRank = part?._rank ?? fallback const segmentId = marker.type === QuickLoopMarkerType.SEGMENT ? marker.id : part?.segmentId - const segment = segmentId && segmentCache.findOne(segmentId) + const segment = segmentId && contentCache.segments.findOne(segmentId) const segmentRank = segment?._rank ?? fallback const rundownId = marker.type === QuickLoopMarkerType.RUNDOWN ? marker.id : segment?.rundownId diff --git a/meteor/server/publications/organization.ts b/meteor/server/publications/organization.ts index 489f3edc46..8368a819cc 100644 --- a/meteor/server/publications/organization.ts +++ b/meteor/server/publications/organization.ts @@ -25,7 +25,7 @@ meteorPublish( const selector: MongoQuery = { _id: organizationId } const modifier: FindOptions = { - fields: { + projection: { name: 1, applications: 1, broadcastMediums: 1, @@ -52,7 +52,7 @@ meteorPublish( if (blueprintIds) selector._id = { $in: blueprintIds } return Blueprints.findWithCursor(selector, { - fields: { + projection: { code: 0, }, }) diff --git a/meteor/server/publications/packageManager/expectedPackages/contentObserver.ts b/meteor/server/publications/packageManager/expectedPackages/contentObserver.ts index eb15f97ce7..6ff293fdee 100644 --- a/meteor/server/publications/packageManager/expectedPackages/contentObserver.ts +++ b/meteor/server/publications/packageManager/expectedPackages/contentObserver.ts @@ -72,7 +72,7 @@ export class ExpectedPackagesContentObserver implements Meteor.LiveQueryHandle { observer.updatePartInstanceIds() }), { - fields: rundownPlaylistFieldSpecifier, + projection: rundownPlaylistFieldSpecifier, } ), diff --git a/meteor/server/publications/packageManager/expectedPackages/publication.ts b/meteor/server/publications/packageManager/expectedPackages/publication.ts index c200a25d73..89e4bdf376 100644 --- a/meteor/server/publications/packageManager/expectedPackages/publication.ts +++ b/meteor/server/publications/packageManager/expectedPackages/publication.ts @@ -101,7 +101,7 @@ async function setupExpectedPackagesPublicationObservers( removed: () => triggerUpdate({ invalidateStudio: true }), }, { - fields: { + projection: { // mappingsHash gets updated when either of these omitted fields changes ...omit(studioFieldSpecifier, 'mappingsWithOverrides', 'routeSetsWithOverrides'), mappingsHash: 1, @@ -137,7 +137,7 @@ async function manipulateExpectedPackagesPublicationData( // Reload the studio, and the layerNameToDeviceIds lookup if (!updateProps || updateProps.invalidateStudio) { - state.studio = (await Studios.findOneAsync(args.studioId, { fields: studioFieldSpecifier })) as + state.studio = (await Studios.findOneAsync(args.studioId, { projection: studioFieldSpecifier })) as | Pick | undefined if (!state.studio) { diff --git a/meteor/server/publications/packageManager/packageContainers.ts b/meteor/server/publications/packageManager/packageContainers.ts index 0c41c5cf29..6c838a2959 100644 --- a/meteor/server/publications/packageManager/packageContainers.ts +++ b/meteor/server/publications/packageManager/packageContainers.ts @@ -52,7 +52,7 @@ async function setupExpectedPackagesPublicationObservers( removed: () => triggerUpdate({}), }, { - fields: studioFieldSpecifier, + projection: studioFieldSpecifier, } ), ] @@ -67,7 +67,7 @@ async function manipulateExpectedPackagesPublicationData( // Future: this may want to cache on the state, but with only a single observer there feels little point - const studio = (await Studios.findOneAsync(args.studioId, { fields: studioFieldSpecifier })) as + const studio = (await Studios.findOneAsync(args.studioId, { projection: studioFieldSpecifier })) as | Pick | undefined diff --git a/meteor/server/publications/packageManager/playoutContext.ts b/meteor/server/publications/packageManager/playoutContext.ts index 5959ae236e..99e22143fe 100644 --- a/meteor/server/publications/packageManager/playoutContext.ts +++ b/meteor/server/publications/packageManager/playoutContext.ts @@ -53,7 +53,7 @@ async function setupExpectedPackagesPublicationObservers( removed: () => triggerUpdate({}), }, { - fields: rundownPlaylistFieldSpecifier, + projection: rundownPlaylistFieldSpecifier, } ), ] @@ -73,7 +73,7 @@ async function manipulateExpectedPackagesPublicationData( studioId: args.studioId, activationId: { $exists: true }, }, - { fields: rundownPlaylistFieldSpecifier } + { projection: rundownPlaylistFieldSpecifier } )) as RundownPlaylistCompact | undefined const activeRundowns = activePlaylist @@ -82,9 +82,9 @@ async function manipulateExpectedPackagesPublicationData( playlistId: activePlaylist._id, }, { - fields: { _id: 1 }, + projection: { _id: 1 }, } - )) as Pick[]) + )) as Pick[]) : [] return literal([ @@ -95,7 +95,7 @@ async function manipulateExpectedPackagesPublicationData( _id: activePlaylist._id, active: !!activePlaylist.activationId, rehearsal: !!activePlaylist.rehearsal, - } + } : null, activeRundowns: activeRundowns.map((rundown) => { return { diff --git a/meteor/server/publications/partInstancesUI/publication.ts b/meteor/server/publications/partInstancesUI/publication.ts index ede1616f19..15ef24d707 100644 --- a/meteor/server/publications/partInstancesUI/publication.ts +++ b/meteor/server/publications/partInstancesUI/publication.ts @@ -158,8 +158,11 @@ export async function manipulateUIPartInstancesPublicationData( findMarkerPosition( playlist.quickLoop.start, -Infinity, - state.contentCache.Segments, - { partInstances: state.contentCache.PartInstances }, + { + segments: state.contentCache.Segments, + partInstances: state.contentCache.PartInstances, + parts: state.contentCache.Parts, + }, rundownRanks ) const quickLoopEndPosition = @@ -167,8 +170,11 @@ export async function manipulateUIPartInstancesPublicationData( findMarkerPosition( playlist.quickLoop.end, Infinity, - state.contentCache.Segments, - { partInstances: state.contentCache.PartInstances }, + { + segments: state.contentCache.Segments, + partInstances: state.contentCache.PartInstances, + parts: state.contentCache.Parts, + }, rundownRanks ) diff --git a/meteor/server/publications/partInstancesUI/reactiveContentCache.ts b/meteor/server/publications/partInstancesUI/reactiveContentCache.ts index a647ffd79c..66e1e0658e 100644 --- a/meteor/server/publications/partInstancesUI/reactiveContentCache.ts +++ b/meteor/server/publications/partInstancesUI/reactiveContentCache.ts @@ -6,6 +6,7 @@ import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/Rund import { DBStudio, IStudioSettings } from '@sofie-automation/corelib/dist/dataModel/Studio' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' import { StudioId } from '@sofie-automation/corelib/dist/dataModel/Ids' +import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' export type RundownPlaylistCompact = Pick export const rundownPlaylistFieldSpecifier = literal>({ @@ -22,6 +23,14 @@ export const segmentFieldSpecifier = literal>>({ + _id: 1, + _rank: 1, + segmentId: 1, + rundownId: 1, +}) + export type PartInstanceOmitedFields = 'part.privateData' export const partInstanceFieldSpecifier = literal>({ // @ts-expect-error Mongo typings aren't clever enough yet @@ -42,6 +51,7 @@ export interface StudioSettingsDoc { export interface ContentCache { StudioSettings: ReactiveCacheCollection Segments: ReactiveCacheCollection> + Parts: ReactiveCacheCollection> PartInstances: ReactiveCacheCollection> RundownPlaylists: ReactiveCacheCollection } @@ -50,6 +60,7 @@ export function createReactiveContentCache(): ContentCache { const cache: ContentCache = { StudioSettings: new ReactiveCacheCollection('studioSettings'), Segments: new ReactiveCacheCollection>('segments'), + Parts: new ReactiveCacheCollection>('parts'), PartInstances: new ReactiveCacheCollection>('partInstances'), RundownPlaylists: new ReactiveCacheCollection('rundownPlaylists'), } diff --git a/meteor/server/publications/partInstancesUI/rundownContentObserver.ts b/meteor/server/publications/partInstancesUI/rundownContentObserver.ts index bc6e06ebfd..2090b2291f 100644 --- a/meteor/server/publications/partInstancesUI/rundownContentObserver.ts +++ b/meteor/server/publications/partInstancesUI/rundownContentObserver.ts @@ -3,6 +3,7 @@ import { RundownId, RundownPlaylistActivationId, StudioId } from '@sofie-automat import { logger } from '../../logging' import { ContentCache, + partFieldSpecifier, partInstanceFieldSpecifier, rundownPlaylistFieldSpecifier, segmentFieldSpecifier, @@ -10,7 +11,7 @@ import { studioFieldSpecifier, StudioSettingsDoc, } from './reactiveContentCache' -import { PartInstances, RundownPlaylists, Segments, Studios } from '../../collections' +import { PartInstances, Parts, RundownPlaylists, Segments, Studios } from '../../collections' import { waitForAllObserversReady } from '../lib/lib' import { DBStudio } from '@sofie-automation/corelib/dist/dataModel/Studio' import { applyAndValidateOverrides } from '@sofie-automation/corelib/dist/settings/objectWithOverrides' @@ -59,7 +60,7 @@ export class RundownContentObserver { }, }, { - fields: studioFieldSpecifier, + projection: studioFieldSpecifier, } ), RundownPlaylists.observeChanges( @@ -68,7 +69,7 @@ export class RundownContentObserver { }, cache.RundownPlaylists.link(), { - fields: rundownPlaylistFieldSpecifier, + projection: rundownPlaylistFieldSpecifier, } ), Segments.observeChanges( @@ -82,6 +83,17 @@ export class RundownContentObserver { projection: segmentFieldSpecifier, } ), + Parts.observeChanges( + { + rundownId: { + $in: rundownIds, + }, + }, + cache.Parts.link(), + { + projection: partFieldSpecifier, + } + ), PartInstances.observeChanges( { rundownId: { diff --git a/meteor/server/publications/partsUI/publication.ts b/meteor/server/publications/partsUI/publication.ts index 24460ab13c..d2f1a100e3 100644 --- a/meteor/server/publications/partsUI/publication.ts +++ b/meteor/server/publications/partsUI/publication.ts @@ -144,8 +144,7 @@ export async function manipulateUIPartsPublicationData( findMarkerPosition( playlist.quickLoop.start, -Infinity, - state.contentCache.Segments, - { parts: state.contentCache.Parts }, + { segments: state.contentCache.Segments, parts: state.contentCache.Parts }, rundownRanks ) const quickLoopEndPosition = @@ -153,8 +152,7 @@ export async function manipulateUIPartsPublicationData( findMarkerPosition( playlist.quickLoop.end, Infinity, - state.contentCache.Segments, - { parts: state.contentCache.Parts }, + { segments: state.contentCache.Segments, parts: state.contentCache.Parts }, rundownRanks ) diff --git a/meteor/server/publications/partsUI/rundownContentObserver.ts b/meteor/server/publications/partsUI/rundownContentObserver.ts index 8a8032ecf5..4c0214ba2a 100644 --- a/meteor/server/publications/partsUI/rundownContentObserver.ts +++ b/meteor/server/publications/partsUI/rundownContentObserver.ts @@ -58,7 +58,7 @@ export class RundownContentObserver { }, }, { - fields: studioFieldSpecifier, + projection: studioFieldSpecifier, } ), RundownPlaylists.observeChanges( @@ -67,7 +67,7 @@ export class RundownContentObserver { }, cache.RundownPlaylists.link(), { - fields: rundownPlaylistFieldSpecifier, + projection: rundownPlaylistFieldSpecifier, } ), Segments.observeChanges( diff --git a/meteor/server/publications/peripheralDevice.ts b/meteor/server/publications/peripheralDevice.ts index 59bedc9eff..776c459171 100644 --- a/meteor/server/publications/peripheralDevice.ts +++ b/meteor/server/publications/peripheralDevice.ts @@ -1,10 +1,9 @@ import { check, Match } from '../lib/check' import { meteorPublish } from './lib/lib' -import { MeteorPubSub } from '@sofie-automation/meteor-lib/dist/api/pubsub' import { PeripheralDevice } from '@sofie-automation/corelib/dist/dataModel/PeripheralDevice' import { MongoFieldSpecifierZeroes, MongoQuery } from '@sofie-automation/corelib/dist/mongo' import { PeripheralDeviceId, StudioId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { MediaWorkFlows, MediaWorkFlowSteps, PeripheralDeviceCommands, PeripheralDevices } from '../collections' +import { PeripheralDeviceCommands, PeripheralDevices } from '../collections' import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub' import { PeripheralDevicePubSub } from '@sofie-automation/shared-lib/dist/pubsub/peripheralDevice' import { clone } from '@sofie-automation/corelib/dist/lib' @@ -15,7 +14,7 @@ import { checkAccessAndGetPeripheralDevice } from '../security/check' * This file contains publications for the peripheralDevices, such as playout-gateway, mos-gateway and package-manager */ -const peripheralDeviceFields: MongoFieldSpecifierZeroes = { +const peripheralDeviceProjection: MongoFieldSpecifierZeroes = { token: 0, secretSettings: 0, } @@ -34,13 +33,13 @@ meteorPublish( const selector: MongoQuery = {} if (peripheralDeviceIds) selector._id = { $in: peripheralDeviceIds } - const fields = clone(peripheralDeviceFields) + const projection = clone(peripheralDeviceProjection) if (selector._id && token) { // in this case, send the secretSettings: - delete fields.secretSettings + delete projection.secretSettings } return PeripheralDevices.findWithCursor(selector, { - fields, + projection, }) } ) @@ -67,7 +66,7 @@ meteorPublish(CorelibPubSub.peripheralDevicesAndSubDevices, async function (stud ], }, { - fields: peripheralDeviceFields, + projection: peripheralDeviceProjection, } ) }) @@ -79,13 +78,3 @@ meteorPublish( return PeripheralDeviceCommands.findWithCursor({ deviceId: deviceId }) } ) -meteorPublish(MeteorPubSub.mediaWorkFlows, async function (_token: string | undefined) { - triggerWriteAccessBecauseNoCheckNecessary() - - return MediaWorkFlows.findWithCursor({}) -}) -meteorPublish(MeteorPubSub.mediaWorkFlowSteps, async function (_token: string | undefined) { - triggerWriteAccessBecauseNoCheckNecessary() - - return MediaWorkFlowSteps.findWithCursor({}) -}) diff --git a/meteor/server/publications/peripheralDeviceForDevice.ts b/meteor/server/publications/peripheralDeviceForDevice.ts index 3c0e3a7b1e..525dfc2d01 100644 --- a/meteor/server/publications/peripheralDeviceForDevice.ts +++ b/meteor/server/publications/peripheralDeviceForDevice.ts @@ -106,7 +106,6 @@ export function convertPeripheralDeviceForGateway( break } - case PeripheralDeviceCategory.MEDIA_MANAGER: case PeripheralDeviceCategory.PACKAGE_MANAGER: case PeripheralDeviceCategory.LIVE_STATUS: // No subdevices to re-export @@ -136,7 +135,7 @@ async function setupPeripheralDevicePublicationObservers( ): Promise { const studioObserver = await ReactiveMongoObserverGroup(async () => { const peripheralDeviceCompact = (await PeripheralDevices.findOneAsync(args.deviceId, { - fields: { studioAndConfigId: 1 }, + projection: { studioAndConfigId: 1 }, })) as Pick | undefined if (peripheralDeviceCompact?.studioAndConfigId?.studioId) { @@ -149,7 +148,7 @@ async function setupPeripheralDevicePublicationObservers( removed: () => triggerUpdate({ invalidatePublication: true }), }, { - fields: studioFieldsSpecifier, + projection: studioFieldsSpecifier, } ), ] @@ -179,7 +178,7 @@ async function setupPeripheralDevicePublicationObservers( }, }, { - fields: peripheralDeviceFieldsSpecifier, + projection: peripheralDeviceFieldsSpecifier, } ), studioObserver, diff --git a/meteor/server/publications/pieceContentStatusUI/bucket/publication.ts b/meteor/server/publications/pieceContentStatusUI/bucket/publication.ts index 7bf8ceb153..9f27c904ea 100644 --- a/meteor/server/publications/pieceContentStatusUI/bucket/publication.ts +++ b/meteor/server/publications/pieceContentStatusUI/bucket/publication.ts @@ -22,7 +22,7 @@ import { SetupObserversResult, } from '../../../lib/customPublication' import { BucketContentCache, createReactiveContentCache } from './bucketContentCache' -import { Bucket } from '@sofie-automation/meteor-lib/dist/collections/Buckets' +import { Bucket } from '@sofie-automation/corelib/dist/dataModel/Bucket' import { addItemsWithDependenciesChangesToChangedSet, fetchStudio, diff --git a/meteor/server/publications/pieceContentStatusUI/checkPieceContentStatus.ts b/meteor/server/publications/pieceContentStatusUI/checkPieceContentStatus.ts index 205b05bcd7..3247c10a91 100644 --- a/meteor/server/publications/pieceContentStatusUI/checkPieceContentStatus.ts +++ b/meteor/server/publications/pieceContentStatusUI/checkPieceContentStatus.ts @@ -35,7 +35,6 @@ import { } from '@sofie-automation/meteor-lib/dist/collections/ExpectedPackages' import { getActiveRoutes, getRoutedMappings } from '@sofie-automation/meteor-lib/dist/collections/Studios' import { ensureHasTrailingSlash, unprotectString } from '../../lib/tempLib' -import { PieceContentStatusObj } from '@sofie-automation/meteor-lib/dist/api/pieceContentStatus' import { MediaObjects, PackageContainerPackageStatuses, PackageInfos } from '../../collections' import { mediaObjectFieldSpecifier, @@ -46,8 +45,10 @@ import { PackageInfoLight, PieceDependencies, } from './common' +import { PieceContentStatusObj } from '@sofie-automation/corelib/dist/dataModel/PieceContentStatus' import { PieceContentStatusMessageFactory, PieceContentStatusMessageRequiredArgs } from './messageFactory' import { PackageStatusMessage } from '@sofie-automation/shared-lib/dist/packageStatusMessages' +import { BucketAdLib } from '@sofie-automation/corelib/dist/dataModel/BucketAdLibPiece' const DEFAULT_MESSAGE_FACTORY = new PieceContentStatusMessageFactory(undefined) @@ -192,8 +193,15 @@ export function getMediaObjectMediaId( return undefined } -export type PieceContentStatusPiece = Pick & { +export type PieceContentStatusPiece = Pick< + PieceGeneric | BucketAdLib, + '_id' | 'content' | 'expectedPackages' | 'name' +> & { pieceInstanceId?: PieceInstanceId + /** + * If this is an infinite continuation, check the previous PieceInstance to fill the gap when package-manager has not processed an adlibbed part + */ + previousPieceInstanceId?: PieceInstanceId } export interface PieceContentStatusStudio extends Pick { @@ -221,6 +229,27 @@ export async function checkPieceContentStatusAndDependencies( packageContainerPackageStatuses: [], } + if (studio.settings.mockPieceContentStatus) { + return [ + { + status: PieceStatusCode.OK, + messages: [], + progress: undefined, + + freezes: [], + blacks: [], + scenes: [], + + thumbnailUrl: undefined, + previewUrl: '/dev/fakePreview.mp4', + + packageName: null, + contentDuration: 30 * 1000, + }, + pieceDependencies, + ] + } + const ignoreMediaStatus = piece.content && piece.content.ignoreMediaObjectStatus if (!ignoreMediaStatus) { if (piece.expectedPackages) { @@ -631,6 +660,13 @@ async function checkPieceContentExpectedPackageStatus( if (piece.pieceInstanceId) { // If this is a PieceInstance, try looking up the PieceInstance first expectedPackageIds.unshift(getExpectedPackageId(piece.pieceInstanceId, expectedPackage._id)) + + if (piece.previousPieceInstanceId) { + // Also try the previous PieceInstance, when this is an infinite continuation in case package-manager needs to catchup + expectedPackageIds.unshift( + getExpectedPackageId(piece.previousPieceInstanceId, expectedPackage._id) + ) + } } let warningMessage: ContentMessageLight | null = null diff --git a/meteor/server/publications/pieceContentStatusUI/rundown/publication.ts b/meteor/server/publications/pieceContentStatusUI/rundown/publication.ts index 3f06797d38..0103802d91 100644 --- a/meteor/server/publications/pieceContentStatusUI/rundown/publication.ts +++ b/meteor/server/publications/pieceContentStatusUI/rundown/publication.ts @@ -14,8 +14,7 @@ import { } from '@sofie-automation/corelib/dist/dataModel/Ids' import { MongoFieldSpecifierOnesStrict } from '@sofie-automation/corelib/dist/mongo' import { ReadonlyDeep } from 'type-fest' -import { CustomCollectionName, MeteorPubSub } from '@sofie-automation/meteor-lib/dist/api/pubsub' -import { UIPieceContentStatus } from '@sofie-automation/meteor-lib/dist/api/rundownNotifications' +import { UIPieceContentStatus } from '@sofie-automation/corelib/dist/dataModel/PieceContentStatus' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { MediaObjects, @@ -58,6 +57,8 @@ import { PieceContentStatusStudio } from '../checkPieceContentStatus' import { check, Match } from 'meteor/check' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' import { triggerWriteAccessBecauseNoCheckNecessary } from '../../../security/securityVerify' +import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub' +import { CustomCollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' import { PieceContentStatusMessageFactory } from '../messageFactory' interface UIPieceContentStatusesArgs { @@ -495,7 +496,7 @@ function updatePartAndSegmentInfoForExistingDocs( } meteorCustomPublish( - MeteorPubSub.uiPieceContentStatuses, + CorelibPubSub.uiPieceContentStatuses, CustomCollectionName.UIPieceContentStatuses, async function (pub, rundownPlaylistId: RundownPlaylistId | null) { check(rundownPlaylistId, Match.Maybe(String)) @@ -503,7 +504,7 @@ meteorCustomPublish( triggerWriteAccessBecauseNoCheckNecessary() if (!rundownPlaylistId) { - logger.info(`Pub.${CustomCollectionName.UISegmentPartNotes}: Not playlistId`) + logger.info(`Pub.${CustomCollectionName.UIPieceContentStatuses}: Not playlistId`) return } @@ -513,7 +514,7 @@ meteorCustomPublish( UIPieceContentStatusesState, UIPieceContentStatusesUpdateProps >( - `pub_${MeteorPubSub.uiPieceContentStatuses}_${rundownPlaylistId}`, + `pub_${CorelibPubSub.uiPieceContentStatuses}_${rundownPlaylistId}`, { rundownPlaylistId }, setupUIPieceContentStatusesPublicationObservers, manipulateUIPieceContentStatusesPublicationData, diff --git a/meteor/server/publications/pieceContentStatusUI/rundown/reactiveContentCache.ts b/meteor/server/publications/pieceContentStatusUI/rundown/reactiveContentCache.ts index 41adf64fcf..f3c1ea6033 100644 --- a/meteor/server/publications/pieceContentStatusUI/rundown/reactiveContentCache.ts +++ b/meteor/server/publications/pieceContentStatusUI/rundown/reactiveContentCache.ts @@ -64,7 +64,7 @@ export const partInstanceFieldSpecifier = literal< part: 1, // This could be stricter, but this is unlikely to be changed once the PartInstance is created }) -export type PieceInstanceFields = '_id' | 'rundownId' | 'partInstanceId' | 'piece' +export type PieceInstanceFields = '_id' | 'rundownId' | 'partInstanceId' | 'piece' | 'infinite' export const pieceInstanceFieldSpecifier = literal< MongoFieldSpecifierOnesStrict> >({ @@ -72,6 +72,7 @@ export const pieceInstanceFieldSpecifier = literal< rundownId: 1, partInstanceId: 1, piece: 1, // This could be stricter, but this is unlikely to be changed once the PieceInstance is created + infinite: 1, // This could be stricter, but this is temporary and should never change once set }) export type AdLibPieceFields = diff --git a/meteor/server/publications/pieceContentStatusUI/rundown/regenerateItems.ts b/meteor/server/publications/pieceContentStatusUI/rundown/regenerateItems.ts index 5b4e7ea6b1..078f91361b 100644 --- a/meteor/server/publications/pieceContentStatusUI/rundown/regenerateItems.ts +++ b/meteor/server/publications/pieceContentStatusUI/rundown/regenerateItems.ts @@ -7,7 +7,7 @@ import { RundownId, } from '@sofie-automation/corelib/dist/dataModel/Ids' import { ReadonlyDeep } from 'type-fest' -import { UIPieceContentStatus } from '@sofie-automation/meteor-lib/dist/api/rundownNotifications' +import { UIPieceContentStatus } from '@sofie-automation/corelib/dist/dataModel/PieceContentStatus' import { literal, protectString } from '../../../lib/tempLib' import { CustomPublishCollection } from '../../../lib/customPublication' import { ContentCache } from './reactiveContentCache' @@ -166,6 +166,18 @@ export async function regenerateForPieceInstanceIds( const sourceLayer = pieceDoc.piece.sourceLayerId && sourceLayersForRundown?.sourceLayers?.[pieceDoc.piece.sourceLayerId] + let previousPieceInstanceId: PieceInstanceId | undefined + if (pieceDoc.infinite) { + // Note: this is a temporary solution, until single packages can be owned by multiple PieceInstances + // This shouldn't need to be reactive upon this PieceInstance, as this is filling a brief gap until package-manager catches up. + // That assumption could be wrong, but trying to track this dependency will be messy so would be nice to avoid. + const previousPieceInstance = contentCache.PieceInstances.findOne({ + 'infinite.infiniteInstanceId': pieceDoc.infinite.infiniteInstanceId, + 'infinite.infiniteInstanceIndex': pieceDoc.infinite.infiniteInstanceIndex - 1, + }) + previousPieceInstanceId = previousPieceInstance?._id + } + if (partInstance && segment && sourceLayer) { const [status, dependencies] = await checkPieceContentStatusAndDependencies( uiStudio, @@ -173,6 +185,7 @@ export async function regenerateForPieceInstanceIds( { ...pieceDoc.piece, pieceInstanceId: pieceDoc._id, + previousPieceInstanceId, }, sourceLayer ) diff --git a/meteor/server/publications/rundown.ts b/meteor/server/publications/rundown.ts index 6e21b94956..6e4e578885 100644 --- a/meteor/server/publications/rundown.ts +++ b/meteor/server/publications/rundown.ts @@ -65,7 +65,7 @@ meteorPublish( studioId: studioId, }, { - fields: { + projection: { privateData: 0, }, } @@ -88,7 +88,7 @@ meteorPublish( } const modifier: FindOptions = { - fields: { + projection: { privateData: 0, }, } @@ -110,7 +110,7 @@ meteorPublish( } const modifier: FindOptions = { - fields: { + projection: { privateData: 0, }, } @@ -134,7 +134,7 @@ meteorPublish( if (filter?.omitHidden) selector.isHidden = { $ne: true } return Segments.findWithCursor(selector, { - fields: { + projection: { privateData: 0, }, }) @@ -153,7 +153,7 @@ meteorPublish( if (segmentIds && segmentIds.length === 0) return null const modifier: FindOptions = { - fields: { + projection: { privateData: 0, }, } @@ -182,7 +182,7 @@ meteorPublish( if (rundownIds.length === 0 || !playlistActivationId) return null const modifier: FindOptions = { - fields: { + projection: { // @ts-expect-error Mongo typings aren't clever enough yet 'part.privateData': 0, }, @@ -218,7 +218,7 @@ meteorPublish( if (playlistActivationId) selector.playlistActivationId = playlistActivationId return PartInstances.findWithCursor(selector, { - fields: literal>({ + projection: literal>({ // @ts-expect-error Mongo typings aren't clever enough yet 'part.privateData': 0, isTaken: 0, @@ -250,7 +250,7 @@ meteorPublish( if (partIds) selector.startPartId = { $in: partIds } return Pieces.findWithCursor(selector, { - fields: piecesSubFields, + projection: piecesSubFields, }) } ) @@ -293,7 +293,7 @@ meteorPublish( } return Pieces.findWithCursor(selector, { - fields: piecesSubFields, + projection: piecesSubFields, }) } ) @@ -315,7 +315,7 @@ meteorPublish(CorelibPubSub.adLibPieces, async function (rundownIds: RundownId[] } return AdLibPieces.findWithCursor(selector, { - fields: adlibPiecesSubFields, + projection: adlibPiecesSubFields, }) }) meteorPublish(MeteorPubSub.adLibPiecesForPart, async function (partId: PartId, sourceLayerIds: string[]) { @@ -330,7 +330,7 @@ meteorPublish(MeteorPubSub.adLibPiecesForPart, async function (partId: PartId, s sourceLayerId: { $in: sourceLayerIds }, }, { - fields: adlibPiecesSubFields, + projection: adlibPiecesSubFields, } ) }) @@ -407,7 +407,7 @@ meteorPublish( } return PieceInstances.findWithCursor(selector, { - fields: pieceInstanceFields, + projection: pieceInstanceFields, }) } ) @@ -433,7 +433,7 @@ meteorPublish( if (playlistActivationId) selector.playlistActivationId = playlistActivationId return PieceInstances.findWithCursor(selector, { - fields: literal>({ + projection: literal>({ ...pieceInstanceFields, plannedStartedPlayback: 0, plannedStoppedPlayback: 0, @@ -463,7 +463,7 @@ meteorPublish( if (!selector) throw new Meteor.Error(400, 'selector argument missing') const modifier: FindOptions = { - fields: {}, + projection: {}, } return NrcsIngestDataCache.findWithCursor(selector, modifier) @@ -483,7 +483,7 @@ meteorPublish( } return RundownBaselineAdLibPieces.findWithCursor(selector, { - fields: { + projection: { timelineObjectsString: 0, privateData: 0, }, @@ -507,7 +507,7 @@ meteorPublish(CorelibPubSub.adLibActions, async function (rundownIds: RundownId[ } return AdLibActions.findWithCursor(selector, { - fields: adlibActionSubFields, + projection: adlibActionSubFields, }) }) meteorPublish(MeteorPubSub.adLibActionsForPart, async function (partId: PartId, sourceLayerIds: string[]) { @@ -522,7 +522,7 @@ meteorPublish(MeteorPubSub.adLibActionsForPart, async function (partId: PartId, 'display.sourceLayerId': { $in: sourceLayerIds }, }, { - fields: adlibActionSubFields, + projection: adlibActionSubFields, } ) }) @@ -541,7 +541,7 @@ meteorPublish( } return RundownBaselineAdLibActions.findWithCursor(selector, { - fields: adlibActionSubFields, + projection: adlibActionSubFields, }) } ) diff --git a/meteor/server/publications/segmentPartNotesUI/rundownContentObserver.ts b/meteor/server/publications/segmentPartNotesUI/rundownContentObserver.ts index 214a5dac96..8beb78d1fe 100644 --- a/meteor/server/publications/segmentPartNotesUI/rundownContentObserver.ts +++ b/meteor/server/publications/segmentPartNotesUI/rundownContentObserver.ts @@ -60,7 +60,7 @@ export class RundownContentObserver { PartInstances.observeChanges( { rundownId: { $in: rundownIds }, reset: { $ne: true }, orphaned: 'deleted' }, cache.DeletedPartInstances.link(), - { fields: partInstanceFieldSpecifier } + { projection: partInstanceFieldSpecifier } ), ]) diff --git a/meteor/server/publications/showStyle.ts b/meteor/server/publications/showStyle.ts index ee3cbf0803..94f58aaabc 100644 --- a/meteor/server/publications/showStyle.ts +++ b/meteor/server/publications/showStyle.ts @@ -89,7 +89,7 @@ meteorPublish( showStyleBaseId: { $in: showStyleBaseIds }, }, ], - } + } : { showStyleBaseId: null } return TriggeredActions.findWithCursor(selector) diff --git a/meteor/server/publications/showStyleUI.ts b/meteor/server/publications/showStyleUI.ts index 2b6ce26ccc..43c41ea605 100644 --- a/meteor/server/publications/showStyleUI.ts +++ b/meteor/server/publications/showStyleUI.ts @@ -49,7 +49,7 @@ async function setupUIShowStyleBasePublicationObservers( removed: () => triggerUpdate({ invalidateShowStyle: true }), }, { - fields: fieldSpecifier, + projection: fieldSpecifier, } ), ] diff --git a/meteor/server/publications/studio.ts b/meteor/server/publications/studio.ts index 955d0ba8da..465b9ab9cb 100644 --- a/meteor/server/publications/studio.ts +++ b/meteor/server/publications/studio.ts @@ -164,7 +164,7 @@ async function setupMappingsPublicationObservers( removed: () => triggerUpdate({ invalidateStudio: true }), }, { - fields: { + projection: { // It should be enough to watch the mappingsHash, since that should change whenever there is a // change to the mappings or the routes mappingsHash: 1, diff --git a/meteor/server/publications/studioUI.ts b/meteor/server/publications/studioUI.ts index 4513f13797..57c22393ea 100644 --- a/meteor/server/publications/studioUI.ts +++ b/meteor/server/publications/studioUI.ts @@ -73,7 +73,7 @@ async function setupUIStudioPublicationObservers( changed: (id) => triggerUpdate(trackChange(id)), removed: (id) => triggerUpdate(trackChange(id)), }, - { fields: fieldSpecifier } + { projection: fieldSpecifier } ), ] } diff --git a/meteor/server/publications/system.ts b/meteor/server/publications/system.ts index 4c5e7b2002..306014f446 100644 --- a/meteor/server/publications/system.ts +++ b/meteor/server/publications/system.ts @@ -10,7 +10,7 @@ meteorPublish(MeteorPubSub.coreSystem, async function (_token: string | undefine triggerWriteAccessBecauseNoCheckNecessary() return CoreSystem.findWithCursor(SYSTEM_ID, { - fields: { + projection: { // Include only specific fields in the result documents: _id: 1, systemInfo: 1, @@ -21,6 +21,7 @@ meteorPublish(MeteorPubSub.coreSystem, async function (_token: string | undefine blueprintId: 1, logo: 1, settingsWithOverrides: 1, + enableMonitorBlockedThread: 1, }, }) }) diff --git a/meteor/server/publications/timeline.ts b/meteor/server/publications/timeline.ts index cbe91128f3..33839ac32c 100644 --- a/meteor/server/publications/timeline.ts +++ b/meteor/server/publications/timeline.ts @@ -128,7 +128,7 @@ async function setupTimelinePublicationObservers( removed: () => triggerUpdate({ invalidateStudio: true }), }, { - fields: { + projection: { // It should be enough to watch the mappingsHash, since that should change whenever there is a // change to the mappings or the routes mappingsHash: 1, diff --git a/meteor/server/publications/translationsBundles.ts b/meteor/server/publications/translationsBundles.ts index fbb2d625fd..8f04a3c9bd 100644 --- a/meteor/server/publications/translationsBundles.ts +++ b/meteor/server/publications/translationsBundles.ts @@ -11,7 +11,7 @@ meteorPublish(MeteorPubSub.translationsBundles, async (_token: string | undefine triggerWriteAccessBecauseNoCheckNecessary() return TranslationsBundles.findWithCursor(selector, { - fields: { + projection: { data: 0, }, }) diff --git a/meteor/server/security/auth.ts b/meteor/server/security/auth.ts index 60702838fa..aa4b62f2b0 100644 --- a/meteor/server/security/auth.ts +++ b/meteor/server/security/auth.ts @@ -7,8 +7,6 @@ import { Settings } from '../Settings' import { Meteor } from 'meteor/meteor' import Koa from 'koa' import { triggerWriteAccess } from './securityVerify' -import { UserId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { unprotectString } from '../lib/tempLib' import { logger } from '../logging' import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' @@ -62,8 +60,8 @@ export function assertConnectionHasOneOfPermissions( throw new Meteor.Error(403, 'Not authorized') } -export function checkUserIdHasOneOfPermissions( - userId: UserId | null, +export function checkHasOneOfPermissions( + permissions: UserPermissions, collectionName: CollectionName, ...allowedPermissions: Array ): boolean { @@ -74,9 +72,8 @@ export function checkUserIdHasOneOfPermissions( // Skip if auth is disabled if (!Settings.enableHeaderAuth) return true - if (!userId) throw new Meteor.Error(403, 'UserId is null') + if (!permissions) throw new Meteor.Error(403, 'Permissions is null') - const permissions: UserPermissions = JSON.parse(unprotectString(userId)) for (const permission of allowedPermissions) { if (permissions[permission]) return true } diff --git a/meteor/server/serverOptimisations.ts b/meteor/server/serverOptimisations.ts index 8942bc3cd2..306fc77dd1 100644 --- a/meteor/server/serverOptimisations.ts +++ b/meteor/server/serverOptimisations.ts @@ -10,7 +10,7 @@ import { Blueprints } from './collections' export async function fetchBlueprintLight(blueprintId: BlueprintId): Promise { return Blueprints.findOneAsync(blueprintId, { - fields: { + projection: { code: 0, }, }) diff --git a/meteor/server/systemStatus/blueprintVersions.ts b/meteor/server/systemStatus/blueprintVersions.ts index cf52d571e2..beee118437 100644 --- a/meteor/server/systemStatus/blueprintVersions.ts +++ b/meteor/server/systemStatus/blueprintVersions.ts @@ -27,7 +27,7 @@ export async function getBlueprintVersions(): Promise<{ const pStudios = Studios.findFetchAsync( { blueprintId: { $exists: true } }, { - fields: { + projection: { _id: 1, blueprintId: 1, }, @@ -37,7 +37,7 @@ export async function getBlueprintVersions(): Promise<{ const pShowStyleBases = ShowStyleBases.findFetchAsync( { blueprintId: { $exists: true } }, { - fields: { + projection: { _id: 1, blueprintId: 1, @@ -66,7 +66,7 @@ export async function getBlueprintVersions(): Promise<{ _id: { $in: blueprintIds }, }, { - fields: { + projection: { _id: 1, name: 1, blueprintVersion: 1, diff --git a/meteor/server/systemStatus/prometheusHealthGauge.ts b/meteor/server/systemStatus/prometheusHealthGauge.ts new file mode 100644 index 0000000000..2421358000 --- /dev/null +++ b/meteor/server/systemStatus/prometheusHealthGauge.ts @@ -0,0 +1,24 @@ +import { MetricsGauge } from '@sofie-automation/corelib/dist/prometheus' +import { getSystemStatus } from './systemStatus' + +export const healthGauge = new MetricsGauge({ + name: 'sofie_health_status', + help: 'Health status of Sofie application and its components', + labelNames: ['name', 'version'] as const, + async collect() { + const systemStatus = await getSystemStatus(null) + + const statusValues = { OK: 0, FAIL: 1, WARNING: 2, UNDEFINED: 3 } + this.labels({ + name: systemStatus.name, + version: systemStatus._internal.versions['core'], + }).set(statusValues[systemStatus.status]) + + systemStatus.components?.forEach((c) => { + this.labels({ + name: c.name, + version: c._internal.versions['_process'] ?? '', + }).set(statusValues[c.status]) + }) + }, +}) diff --git a/meteor/server/systemStatus/semverUtils.ts b/meteor/server/systemStatus/semverUtils.ts index 0baa9df44d..4b7f8e312b 100644 --- a/meteor/server/systemStatus/semverUtils.ts +++ b/meteor/server/systemStatus/semverUtils.ts @@ -20,7 +20,7 @@ export function stripVersion(v: string): string { return `${valid.major}.${valid.minor}.${valid.patch}` } } -export function parseRange(r: string | VersionRange | undefined): VersionRange { +export function parseRange(r: VersionRange | undefined): VersionRange { if (isReferenceOrUndefined(r)) { return '^0.0.0' // anything goes.. } @@ -28,7 +28,7 @@ export function parseRange(r: string | VersionRange | undefined): VersionRange { if (!range) throw new Meteor.Error(500, `Invalid range: "${r}"`) return range } -export function parseVersion(v: string | Version | undefined): Version { +export function parseVersion(v: Version | undefined): Version { if (isReferenceOrUndefined(v)) { return '0.0.0' // fallback } @@ -126,7 +126,7 @@ export function compareSemverVersions( } } // the expectedVersion may be a proper range, in which case the new semver.SemVer will throw an error, even though the semver.satisfies check would work. - } catch (e) { + } catch (_e) { const message = `Version mismatch: ${meName} version: "${currentVersion}" does not satisfy expected version range of ${theyName}: "${targetRange}"` + (fixMessage ? ` (${fixMessage})` : '') diff --git a/meteor/server/systemStatus/systemStatus.ts b/meteor/server/systemStatus/systemStatus.ts index 4049b22774..b13f2d73b4 100644 --- a/meteor/server/systemStatus/systemStatus.ts +++ b/meteor/server/systemStatus/systemStatus.ts @@ -34,7 +34,6 @@ const integrationVersionAllowPrerelease = isPrerelease(PackageInfo.version) // Any libraries that if a gateway uses should match a certain version const expectedLibraryVersions: { [libName: string]: string } = { 'superfly-timeline': stripVersion(require('superfly-timeline/package.json').version), - // eslint-disable-next-line node/no-extraneous-require '@mos-connection/helper': stripVersion(require('@mos-connection/helper/package.json').version), } @@ -138,6 +137,7 @@ function getSystemStatusForDevice(device: PeripheralDevice): StatusResponse { const so: StatusResponse = { name: device.name, instanceId: device._id, + parentId: device.parentDeviceId ?? undefined, status: 'UNDEFINED', updated: new Date(device.lastSeen).toISOString(), _status: deviceStatus, diff --git a/meteor/server/systemTime.ts b/meteor/server/systemTime.ts index 8e359a9cbe..74f6897d2b 100644 --- a/meteor/server/systemTime.ts +++ b/meteor/server/systemTime.ts @@ -11,7 +11,10 @@ export class TimeJumpDetector { private wallTime: number = TimeJumpDetector.getWallTime() private monotonicTime: number = TimeJumpDetector.getMonotonicTime() - constructor(private jumpCheckInterval: number, private onJumpDetected: (syncDiff: number) => void) {} + constructor( + private jumpCheckInterval: number, + private onJumpDetected: (syncDiff: number) => void + ) {} public start(): void { Meteor.setInterval(() => { diff --git a/meteor/server/webmanifest.ts b/meteor/server/webmanifest.ts index fa3f1a5dfa..7f24a0f646 100644 --- a/meteor/server/webmanifest.ts +++ b/meteor/server/webmanifest.ts @@ -8,7 +8,7 @@ import { logger } from './logging' import { MongoQuery } from '@sofie-automation/corelib/dist/mongo' import { DBStudio } from '@sofie-automation/corelib/dist/dataModel/Studio' import { RundownPlaylists, Rundowns, Studios } from './collections' -import { getLocale, Translations } from './lib' +import { getLocale, getRootSubpath, Translations } from './lib' import { generateTranslation } from './lib/tempLib' import { ITranslatableMessage } from '@sofie-automation/blueprints-integration' import { interpollateTranslation } from '@sofie-automation/corelib/dist/TranslatableMessage' @@ -21,20 +21,6 @@ import { bindKoaRouter } from './api/rest/koa' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' const appShortName = 'Sofie' -const SOFIE_DEFAULT_ICONS: ManifestImageResource[] = [ - { - src: '/icons/mstile-144x144.png', - sizes: '144x144', - purpose: 'monochrome', - type: 'image/png', - }, - { - src: '/icons/maskable-96x96.png', - sizes: '96x96', - purpose: 'maskable', - type: 'image/png', - }, -] const t = generateTranslation @@ -48,6 +34,21 @@ function getShortcutsForStudio( studio: Pick, studioCount: number ): ShortcutItem[] { + const SOFIE_DEFAULT_ICONS: ManifestImageResource[] = [ + { + src: getRootSubpath() + '/icons/mstile-144x144.png', + sizes: '144x144', + purpose: 'monochrome', + type: 'image/png', + }, + { + src: getRootSubpath() + '/icons/maskable-96x96.png', + sizes: '96x96', + purpose: 'maskable', + type: 'image/png', + }, + ] + const multiStudio = studioCount > 1 return [ { @@ -57,11 +58,11 @@ function getShortcutsForStudio( multiStudio ? t('{{studioName}}: Active Rundown', { studioName: studio.name, - }) + }) : t('Active Rundown') ), icons: SOFIE_DEFAULT_ICONS, - url: `/activeRundown/${studio._id}`, + url: getRootSubpath() + `/activeRundown/${studio._id}`, }, { id: `${studio._id}_prompter`, @@ -70,11 +71,11 @@ function getShortcutsForStudio( multiStudio ? t('{{studioName}}: Prompter', { studioName: studio.name, - }) + }) : t('Prompter') ), icons: SOFIE_DEFAULT_ICONS, - url: `/prompter/${studio._id}`, + url: getRootSubpath() + `/prompter/${studio._id}`, }, { id: `${studio._id}_countdowns`, @@ -83,7 +84,7 @@ function getShortcutsForStudio( multiStudio ? t('{{studioName}}: Presenter screen', { studioName: studio.name }) : t('Presenter screen') ), icons: SOFIE_DEFAULT_ICONS, - url: `/countdowns/${studio._id}/presenter`, + url: getRootSubpath() + `/countdowns/${studio._id}/presenter`, }, ] } @@ -111,31 +112,31 @@ async function getWebManifest(languageCode: string): Promise 0 ? shortcuts : undefined, protocol_handlers: [ { protocol: 'web+nrcs', - url: '/url/nrcs?q=%s', + url: getRootSubpath() + '/url/nrcs?q=%s', }, ], } @@ -261,14 +262,14 @@ async function webNrcsRundownRoute(ctx: Koa.ParameterizedContext, parsedUrl: URL // we couldn't find the External ID for Rundown/Rundown Playlist logger.debug(`NRCS URL: External ID not found "${externalId}"`) ctx.body = `Could not find requested object: "${externalId}", see the full list` - ctx.redirect('/') + ctx.redirect(`${getRootSubpath()}/`) ctx.response.status = 303 return } logger.debug(`NRCS URL: External ID found "${externalId}" in "${rundownPlaylist._id}"`) ctx.body = `Requested object found in Rundown Playlist "${rundownPlaylist._id}"` - ctx.redirect(`/rundown/${rundownPlaylist._id}`) + ctx.redirect(`${getRootSubpath()}/rundown/${rundownPlaylist._id}`) } Meteor.startup(() => { diff --git a/meteor/server/worker/worker.ts b/meteor/server/worker/worker.ts index cdc1bbbb6c..fcc165c7b7 100644 --- a/meteor/server/worker/worker.ts +++ b/meteor/server/worker/worker.ts @@ -22,6 +22,7 @@ import { MongoQuery } from '@sofie-automation/corelib/dist/mongo' import { UserActionsLog } from '../collections' import { MetricsCounter } from '@sofie-automation/corelib/dist/prometheus' import { isInTestWrite } from '../security/securityVerify' +import { UserError } from '@sofie-automation/corelib/dist/error' const FREEZE_LIMIT = 1000 // how long to wait for a response to a Ping const RESTART_TIMEOUT = 30000 // how long to wait for a restart to complete before throwing an error @@ -107,7 +108,8 @@ async function jobFinished( } if (job.completionHandler) { - job.completionHandler(startedTime, finishedTime, err, result) + const userError = err ? UserError.tryFromJSON(err) || new Error(err) : undefined + job.completionHandler(startedTime, finishedTime, userError, result) } } } @@ -128,7 +130,7 @@ async function waitForNextJob(queueName: string): Promise { try { // Notify the worker in the background oldNotify.manualReject(new Error('new workerThread, replacing the old')) - } catch (e) { + } catch (_e) { // Ignore } }) @@ -169,7 +171,7 @@ async function interruptJobStream(queueName: string): Promise { try { // Notify the worker in the background oldNotify.manualResolve() - } catch (e) { + } catch (_e) { // Ignore } }) @@ -264,12 +266,13 @@ async function logLine(msg: LogEntry): Promise { let worker: Promisify | undefined Meteor.startup(async () => { + if (Meteor.isTest) return // Don't start the worker + if (Meteor.isDevelopment) { // Ensure meteor restarts when the _force_restart file changes try { - // eslint-disable-next-line node/no-missing-require, node/no-unpublished-require require('../_force_restart') - } catch (e) { + } catch (_e) { // ignore } } diff --git a/meteor/tsconfig-base.json b/meteor/tsconfig-base.json index d57507f4db..d64f99faee 100644 --- a/meteor/tsconfig-base.json +++ b/meteor/tsconfig-base.json @@ -3,12 +3,12 @@ "compilerOptions": { /* At the time of writing we are not ready for stricter rules */ "strict": true, - + "target": "es2022", + "allowImportingTsExtensions": true, "skipLibCheck": true, "sourceMap": true, "allowJs": false, - "lib": ["dom", "es6", "dom.iterable", "scripthost", "es2017", "es2018", "es2019", "ES2020.Promise"], - + "lib": ["dom", "es2022", "dom.iterable", "scripthost"], "paths": { "meteor/*": [ // "./node_modules/@types/meteor/*", diff --git a/meteor/yarn.lock b/meteor/yarn.lock index 22f76248b2..86a71cc769 100644 --- a/meteor/yarn.lock +++ b/meteor/yarn.lock @@ -33,7 +33,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.2": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.2": version: 7.26.2 resolution: "@babel/code-frame@npm:7.26.2" dependencies: @@ -338,7 +338,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.17.2, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.22.5, @babel/runtime@npm:^7.26.7": +"@babel/runtime@npm:^7.17.2, @babel/runtime@npm:^7.22.5, @babel/runtime@npm:^7.26.7": version: 7.26.7 resolution: "@babel/runtime@npm:7.26.7" dependencies: @@ -424,45 +424,82 @@ __metadata: languageName: node linkType: hard -"@eslint-community/eslint-utils@npm:^4.2.0": - version: 4.4.0 - resolution: "@eslint-community/eslint-utils@npm:4.4.0" +"@eslint-community/eslint-utils@npm:^4.1.2, @eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0, @eslint-community/eslint-utils@npm:^4.4.1": + version: 4.4.1 + resolution: "@eslint-community/eslint-utils@npm:4.4.1" dependencies: - eslint-visitor-keys: "npm:^3.3.0" + eslint-visitor-keys: "npm:^3.4.3" peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 10/8d70bcdcd8cd279049183aca747d6c2ed7092a5cf0cf5916faac1ef37ffa74f0c245c2a3a3d3b9979d9dfdd4ca59257b4c5621db699d637b847a2c5e02f491c2 + checksum: 10/ae92a11412674329b4bd38422518601ec9ceae28e251104d1cad83715da9d38e321f68c817c39b64e66d0af7d98df6f9a10ad2dc638911254b47fb8932df00ef languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.4.0, @eslint-community/regexpp@npm:^4.6.1": - version: 4.8.1 - resolution: "@eslint-community/regexpp@npm:4.8.1" - checksum: 10/f8c99ca48d0027540cece1dfc1f99fb53fe5cd82bc3680036455e13bc7cdce8d174659f20ab7390ab072b1aa55ff47199d1f6a315bf326f13751c35b6d010886 +"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.11.0, @eslint-community/regexpp@npm:^4.12.1": + version: 4.12.1 + resolution: "@eslint-community/regexpp@npm:4.12.1" + checksum: 10/c08f1dd7dd18fbb60bdd0d85820656d1374dd898af9be7f82cb00451313402a22d5e30569c150315b4385907cdbca78c22389b2a72ab78883b3173be317620cc languageName: node linkType: hard -"@eslint/eslintrc@npm:^2.1.4": - version: 2.1.4 - resolution: "@eslint/eslintrc@npm:2.1.4" +"@eslint/config-array@npm:^0.19.0": + version: 0.19.2 + resolution: "@eslint/config-array@npm:0.19.2" + dependencies: + "@eslint/object-schema": "npm:^2.1.6" + debug: "npm:^4.3.1" + minimatch: "npm:^3.1.2" + checksum: 10/a6809720908f7dd8536e1a73b2369adf802fe61335536ed0592bca9543c476956e0c0a20fef8001885da8026e2445dc9bf3e471bb80d32c3be7bcdabb7628fd1 + languageName: node + linkType: hard + +"@eslint/core@npm:^0.10.0": + version: 0.10.0 + resolution: "@eslint/core@npm:0.10.0" + dependencies: + "@types/json-schema": "npm:^7.0.15" + checksum: 10/de41d7fa5dc468b70fb15c72829096939fc0217c41b8519af4620bc1089cb42539a15325c4c3ee3832facac1836c8c944c4a0c4d0cc8b33ffd8e95962278ae14 + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^3.2.0": + version: 3.2.0 + resolution: "@eslint/eslintrc@npm:3.2.0" dependencies: ajv: "npm:^6.12.4" debug: "npm:^4.3.2" - espree: "npm:^9.6.0" - globals: "npm:^13.19.0" + espree: "npm:^10.0.1" + globals: "npm:^14.0.0" ignore: "npm:^5.2.0" import-fresh: "npm:^3.2.1" js-yaml: "npm:^4.1.0" minimatch: "npm:^3.1.2" strip-json-comments: "npm:^3.1.1" - checksum: 10/7a3b14f4b40fc1a22624c3f84d9f467a3d9ea1ca6e9a372116cb92507e485260359465b58e25bcb6c9981b155416b98c9973ad9b796053fd7b3f776a6946bce8 + checksum: 10/b32dd90ce7da68e89b88cd729db46b27aac79a2e6cb1fa75d25a6b766d586b443bfbf59622489efbd3c6f696f147b51111e81ec7cd23d70f215c5d474cad0261 + languageName: node + linkType: hard + +"@eslint/js@npm:9.19.0": + version: 9.19.0 + resolution: "@eslint/js@npm:9.19.0" + checksum: 10/d8133a83330676d5f0827713af2e9bbf35530631a93520fb59ead6b827a325c54fdd7ad99f2158f895fb393c47bbc55dfdaa945998a647f3b9230f1d5324a626 + languageName: node + linkType: hard + +"@eslint/object-schema@npm:^2.1.6": + version: 2.1.6 + resolution: "@eslint/object-schema@npm:2.1.6" + checksum: 10/266085c8d3fa6cd99457fb6350dffb8ee39db9c6baf28dc2b86576657373c92a568aec4bae7d142978e798b74c271696672e103202d47a0c148da39154351ed6 languageName: node linkType: hard -"@eslint/js@npm:8.57.1": - version: 8.57.1 - resolution: "@eslint/js@npm:8.57.1" - checksum: 10/7562b21be10c2adbfa4aa5bb2eccec2cb9ac649a3569560742202c8d1cb6c931ce634937a2f0f551e078403a1c1285d6c2c0aa345dafc986149665cd69fe8b59 +"@eslint/plugin-kit@npm:^0.2.5": + version: 0.2.5 + resolution: "@eslint/plugin-kit@npm:0.2.5" + dependencies: + "@eslint/core": "npm:^0.10.0" + levn: "npm:^0.4.1" + checksum: 10/82d0142bc7054587bde4f75c2c517f477df7c320e4bdb47a4d5f766899a313ce65e9ce5d59428178d0be473a95292065053f69637042546b811ad89079781cbc languageName: node linkType: hard @@ -482,14 +519,20 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.13.0": - version: 0.13.0 - resolution: "@humanwhocodes/config-array@npm:0.13.0" +"@humanfs/core@npm:^0.19.1": + version: 0.19.1 + resolution: "@humanfs/core@npm:0.19.1" + checksum: 10/270d936be483ab5921702623bc74ce394bf12abbf57d9145a69e8a0d1c87eb1c768bd2d93af16c5705041e257e6d9cc7529311f63a1349f3678abc776fc28523 + languageName: node + linkType: hard + +"@humanfs/node@npm:^0.16.6": + version: 0.16.6 + resolution: "@humanfs/node@npm:0.16.6" dependencies: - "@humanwhocodes/object-schema": "npm:^2.0.3" - debug: "npm:^4.3.1" - minimatch: "npm:^3.0.5" - checksum: 10/524df31e61a85392a2433bf5d03164e03da26c03d009f27852e7dcfdafbc4a23f17f021dacf88e0a7a9fe04ca032017945d19b57a16e2676d9114c22a53a9d11 + "@humanfs/core": "npm:^0.19.1" + "@humanwhocodes/retry": "npm:^0.3.0" + checksum: 10/6d43c6727463772d05610aa05c83dab2bfbe78291022ee7a92cb50999910b8c720c76cc312822e2dea2b497aa1b3fef5fe9f68803fc45c9d4ed105874a65e339 languageName: node linkType: hard @@ -500,10 +543,17 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^2.0.3": - version: 2.0.3 - resolution: "@humanwhocodes/object-schema@npm:2.0.3" - checksum: 10/05bb99ed06c16408a45a833f03a732f59bf6184795d4efadd33238ff8699190a8c871ad1121241bb6501589a9598dc83bf25b99dcbcf41e155cdf36e35e937a3 +"@humanwhocodes/retry@npm:^0.3.0": + version: 0.3.1 + resolution: "@humanwhocodes/retry@npm:0.3.1" + checksum: 10/eb457f699529de7f07649679ec9e0353055eebe443c2efe71c6dd950258892475a038e13c6a8c5e13ed1fb538cdd0a8794faa96b24b6ffc4c87fb1fc9f70ad7f + languageName: node + linkType: hard + +"@humanwhocodes/retry@npm:^0.4.1": + version: 0.4.1 + resolution: "@humanwhocodes/retry@npm:0.4.1" + checksum: 10/39fafc7319e88f61befebd5e1b4f0136534ea6a9bd10d74366698187bd63544210ec5d79a87ed4d91297f1cc64c4c53d45fb0077a2abfdce212cf0d3862d5f04 languageName: node linkType: hard @@ -925,7 +975,7 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": +"@nodelib/fs.walk@npm:^1.2.3": version: 1.2.8 resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: @@ -1021,6 +1071,13 @@ __metadata: languageName: node linkType: hard +"@pkgr/core@npm:^0.1.0": + version: 0.1.1 + resolution: "@pkgr/core@npm:0.1.1" + checksum: 10/6f25fd2e3008f259c77207ac9915b02f1628420403b2630c92a07ff963129238c9262afc9e84344c7a23b5cc1f3965e2cd17e3798219f5fd78a63d144d3cceba + languageName: node + linkType: hard + "@shopify/jest-koa-mocks@npm:^5.3.1": version: 5.3.1 resolution: "@shopify/jest-koa-mocks@npm:5.3.1" @@ -1078,40 +1135,35 @@ __metadata: version: 0.0.0-use.local resolution: "@sofie-automation/blueprints-integration@portal:../packages/blueprints-integration::locator=automation-core%40workspace%3A." dependencies: - "@sofie-automation/shared-lib": "npm:1.52.0" + "@sofie-automation/shared-lib": "npm:1.53.0-in-development" tslib: "npm:^2.8.1" type-fest: "npm:^4.33.0" languageName: node linkType: soft -"@sofie-automation/code-standard-preset@npm:~2.4.7": - version: 2.4.7 - resolution: "@sofie-automation/code-standard-preset@npm:2.4.7" - dependencies: - "@sofie-automation/eslint-plugin": "npm:^0.1.1" - "@typescript-eslint/eslint-plugin": "npm:^5.59.1" - "@typescript-eslint/parser": "npm:^5.59.1" - "@typescript-eslint/utils": "npm:^5.59.1" - date-fns: "npm:^2.29.3" - eslint: "npm:^8.39.0" - eslint-config-prettier: "npm:^8.8.0" - eslint-plugin-jest: "npm:^27.2.1" - eslint-plugin-node: "npm:^11.1.0" - eslint-plugin-prettier: "npm:^4.2.1" - husky: "npm:^8.0.3" +"@sofie-automation/code-standard-preset@npm:^3.0.0": + version: 3.0.0 + resolution: "@sofie-automation/code-standard-preset@npm:3.0.0" + dependencies: + "@sofie-automation/eslint-plugin": "npm:0.2.0" + date-fns: "npm:^4.1.0" + eslint-config-prettier: "npm:^10.0.1" + eslint-plugin-jest: "npm:^28.11.0" + eslint-plugin-n: "npm:^17.15.1" + eslint-plugin-prettier: "npm:^5.2.3" license-checker: "npm:^25.0.1" - lint-staged: "npm:^13.2.2" - meow: "npm:^11.0.0" - prettier: "npm:^2.8.8" - read-pkg-up: "npm:^9.1.0" - semver: "npm:^7.5.0" - shelljs: "npm:^0.8.5" + meow: "npm:^13.2.0" + read-package-up: "npm:^11.0.0" + semver: "npm:^7.6.3" + typescript-eslint: "npm:^8.21.0" peerDependencies: - typescript: ~4.9 + eslint: ^9 + prettier: ^3 + typescript: ~5.7 bin: sofie-licensecheck: ./bin/checkLicenses.mjs sofie-version: ./bin/updateVersion.mjs - checksum: 10/c201dae2d8a44a6120deb9f1b6ccbb2287895ffaad6b369fd8e129f652a4f56a958b4c5e71168f3abb6faceaf76504e39dd312fa6ec451bc9ffbf9bb33855dff + checksum: 10/fa61dc1f90377ad2196f2e6c33dea9988bbe9cfd6eb8b277a083ae1147c00e83e526b7520bb5548d4935fb91b7f9f1d8f9b701db419da760488c318ea42a243f languageName: node linkType: hard @@ -1119,8 +1171,8 @@ __metadata: version: 0.0.0-use.local resolution: "@sofie-automation/corelib@portal:../packages/corelib::locator=automation-core%40workspace%3A." dependencies: - "@sofie-automation/blueprints-integration": "npm:1.52.0" - "@sofie-automation/shared-lib": "npm:1.52.0" + "@sofie-automation/blueprints-integration": "npm:1.53.0-in-development" + "@sofie-automation/shared-lib": "npm:1.53.0-in-development" fast-clone: "npm:^1.5.13" i18next: "npm:^21.10.0" influx: "npm:^5.9.7" @@ -1132,17 +1184,18 @@ __metadata: type-fest: "npm:^4.33.0" underscore: "npm:^1.13.7" peerDependencies: - mongodb: ^5.5.0 + mongodb: ^6.12.0 languageName: node linkType: soft -"@sofie-automation/eslint-plugin@npm:^0.1.1": - version: 0.1.1 - resolution: "@sofie-automation/eslint-plugin@npm:0.1.1" +"@sofie-automation/eslint-plugin@npm:0.2.0": + version: 0.2.0 + resolution: "@sofie-automation/eslint-plugin@npm:0.2.0" + dependencies: + "@typescript-eslint/utils": "npm:^8.21.0" peerDependencies: - "@typescript-eslint/utils": ^5.54.1 - eslint: ">=8" - checksum: 10/2d05d905bdc59c5bb04c0233d9e04d8f8faaf99d22b9d2da3445d7fdacb64bab45eff1557003893f7586a3094902c5d53a0adc43b9e6980e5060ec60c92ab6fc + eslint: ^9 + checksum: 10/7d2898cab2d89fcab727597a7a8ff49dacb030166f390d4b20ec27fbb53f8e330a2a034090484611f1cb0fe98bd4a1bc961e0cc6e77236d5c84065ae830fa1ad languageName: node linkType: hard @@ -1151,9 +1204,9 @@ __metadata: resolution: "@sofie-automation/job-worker@portal:../packages/job-worker::locator=automation-core%40workspace%3A." dependencies: "@slack/webhook": "npm:^7.0.4" - "@sofie-automation/blueprints-integration": "npm:1.52.0" - "@sofie-automation/corelib": "npm:1.52.0" - "@sofie-automation/shared-lib": "npm:1.52.0" + "@sofie-automation/blueprints-integration": "npm:1.53.0-in-development" + "@sofie-automation/corelib": "npm:1.53.0-in-development" + "@sofie-automation/shared-lib": "npm:1.53.0-in-development" amqplib: "npm:^0.10.5" deepmerge: "npm:^4.3.1" elastic-apm-node: "npm:^4.11.0" @@ -1173,16 +1226,16 @@ __metadata: resolution: "@sofie-automation/meteor-lib@portal:../packages/meteor-lib::locator=automation-core%40workspace%3A." dependencies: "@mos-connection/helper": "npm:^4.2.2" - "@sofie-automation/blueprints-integration": "npm:1.52.0" - "@sofie-automation/corelib": "npm:1.52.0" - "@sofie-automation/shared-lib": "npm:1.52.0" + "@sofie-automation/blueprints-integration": "npm:1.53.0-in-development" + "@sofie-automation/corelib": "npm:1.53.0-in-development" + "@sofie-automation/shared-lib": "npm:1.53.0-in-development" deep-extend: "npm:0.6.0" semver: "npm:^7.6.3" type-fest: "npm:^4.33.0" underscore: "npm:^1.13.7" peerDependencies: i18next: ^21.10.0 - mongodb: ^5.5.0 + mongodb: ^6.12.0 languageName: node linkType: soft @@ -1191,7 +1244,7 @@ __metadata: resolution: "@sofie-automation/shared-lib@portal:../packages/shared-lib::locator=automation-core%40workspace%3A." dependencies: "@mos-connection/model": "npm:^4.2.2" - timeline-state-resolver-types: "npm:9.3.0" + timeline-state-resolver-types: "npm:9.4.0-nightly-release53-20250730-145840-ce6dce9c1.0" tslib: "npm:^2.8.1" type-fest: "npm:^4.33.0" languageName: node @@ -1320,6 +1373,13 @@ __metadata: languageName: node linkType: hard +"@types/estree@npm:^1.0.6": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 10/9d35d475095199c23e05b431bcdd1f6fec7380612aed068b14b2a08aa70494de8a9026765a5a91b1073f636fb0368f6d8973f518a31391d519e20c59388ed88d + languageName: node + linkType: hard + "@types/express-serve-static-core@npm:^4.17.33": version: 4.17.36 resolution: "@types/express-serve-static-core@npm:4.17.36" @@ -1402,10 +1462,10 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:^7.0.9": - version: 7.0.13 - resolution: "@types/json-schema@npm:7.0.13" - checksum: 10/24000f93d34b3848053b8eb36bbbcfb6b465f691d61186ddac9596b6f1fb105ae84a8be63c0c0f3b6d8f7eb6f891f6cdf3c34910aefc756a1971164c4262de1a +"@types/json-schema@npm:^7.0.15": + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 10/1a3c3e06236e4c4aab89499c428d585527ce50c24fe8259e8b3926d3df4cfbbbcf306cfc73ddfb66cbafc973116efd15967020b0f738f63e09e64c7d260519e7 languageName: node linkType: hard @@ -1434,6 +1494,15 @@ __metadata: languageName: node linkType: hard +"@types/koa-mount@npm:^4": + version: 4.0.5 + resolution: "@types/koa-mount@npm:4.0.5" + dependencies: + "@types/koa": "npm:*" + checksum: 10/2b794f618b44e5a6810a829fd6fc29c17dd6b7adde81d26f270215197c01184434922db7078502947f48144344471129f533a3db2b0d86b836c60fddc32e2a3c + languageName: node + linkType: hard + "@types/koa-send@npm:*": version: 4.1.6 resolution: "@types/koa-send@npm:4.1.6" @@ -1501,7 +1570,7 @@ __metadata: languageName: node linkType: hard -"@types/minimist@npm:^1.2.0, @types/minimist@npm:^1.2.2": +"@types/minimist@npm:^1.2.0": version: 1.2.2 resolution: "@types/minimist@npm:1.2.2" checksum: 10/b8da83c66eb4aac0440e64674b19564d9d86c80ae273144db9681e5eeff66f238ade9515f5006ffbfa955ceff8b89ad2bd8ec577d7caee74ba101431fb07045d @@ -1517,10 +1586,10 @@ __metadata: languageName: node linkType: hard -"@types/normalize-package-data@npm:^2.4.0, @types/normalize-package-data@npm:^2.4.1": - version: 2.4.1 - resolution: "@types/normalize-package-data@npm:2.4.1" - checksum: 10/e87bccbf11f95035c89a132b52b79ce69a1e3652fe55962363063c9c0dae0fe2477ebc585e03a9652adc6f381d24ba5589cc5e51849df4ced3d3e004a7d40ed5 +"@types/normalize-package-data@npm:^2.4.0, @types/normalize-package-data@npm:^2.4.3": + version: 2.4.4 + resolution: "@types/normalize-package-data@npm:2.4.4" + checksum: 10/65dff72b543997b7be8b0265eca7ace0e34b75c3e5fee31de11179d08fa7124a7a5587265d53d0409532ecb7f7fba662c2012807963e1f9b059653ec2c83ee05 languageName: node linkType: hard @@ -1550,7 +1619,7 @@ __metadata: languageName: node linkType: hard -"@types/semver@npm:^7.3.12, @types/semver@npm:^7.5.8": +"@types/semver@npm:^7.5.8": version: 7.5.8 resolution: "@types/semver@npm:7.5.8" checksum: 10/3496808818ddb36deabfe4974fd343a78101fa242c4690044ccdc3b95dcf8785b494f5d628f2f47f38a702f8db9c53c67f47d7818f2be1b79f2efb09692e1178 @@ -1638,131 +1707,115 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^5.59.1, @typescript-eslint/eslint-plugin@npm:^5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/eslint-plugin@npm:5.62.0" +"@typescript-eslint/eslint-plugin@npm:8.23.0": + version: 8.23.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.23.0" dependencies: - "@eslint-community/regexpp": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:5.62.0" - "@typescript-eslint/type-utils": "npm:5.62.0" - "@typescript-eslint/utils": "npm:5.62.0" - debug: "npm:^4.3.4" + "@eslint-community/regexpp": "npm:^4.10.0" + "@typescript-eslint/scope-manager": "npm:8.23.0" + "@typescript-eslint/type-utils": "npm:8.23.0" + "@typescript-eslint/utils": "npm:8.23.0" + "@typescript-eslint/visitor-keys": "npm:8.23.0" graphemer: "npm:^1.4.0" - ignore: "npm:^5.2.0" - natural-compare-lite: "npm:^1.4.0" - semver: "npm:^7.3.7" - tsutils: "npm:^3.21.0" + ignore: "npm:^5.3.1" + natural-compare: "npm:^1.4.0" + ts-api-utils: "npm:^2.0.1" peerDependencies: - "@typescript-eslint/parser": ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 10/9cc8319c6fd8a21938f5b69476974a7e778c283a55ef9fad183c850995b9adcb0087d57cea7b2ac6b9449570eee983aad39491d14cdd2e52d6b4b0485e7b2482 + "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.8.0" + checksum: 10/3900a86f6edf9fee496e8814ed4c8d405f9331808174f4bca0d3af2541a947e872c9f7519a2549644ba5aae1dc06a63308bda9d8da00ef7c62f685be05502d5e languageName: node linkType: hard -"@typescript-eslint/parser@npm:^5.59.1, @typescript-eslint/parser@npm:^5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/parser@npm:5.62.0" +"@typescript-eslint/parser@npm:8.23.0": + version: 8.23.0 + resolution: "@typescript-eslint/parser@npm:8.23.0" dependencies: - "@typescript-eslint/scope-manager": "npm:5.62.0" - "@typescript-eslint/types": "npm:5.62.0" - "@typescript-eslint/typescript-estree": "npm:5.62.0" + "@typescript-eslint/scope-manager": "npm:8.23.0" + "@typescript-eslint/types": "npm:8.23.0" + "@typescript-eslint/typescript-estree": "npm:8.23.0" + "@typescript-eslint/visitor-keys": "npm:8.23.0" debug: "npm:^4.3.4" peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 10/b6ca629d8f4e6283ff124501731cc886703eb4ce2c7d38b3e4110322ea21452b9d9392faf25be6bd72f54b89de7ffc72a40d9b159083ac54345a3d04b4fa5394 + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.8.0" + checksum: 10/7c3ae38665effc7a730d455657ca535c1553ab154d3b983ed4df2bc5b87291b69f4b90245356d8fc5a414d6dca36b34780d9408a45ac272d4bc390b8f03bda4d languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/scope-manager@npm:5.62.0" +"@typescript-eslint/scope-manager@npm:8.23.0": + version: 8.23.0 + resolution: "@typescript-eslint/scope-manager@npm:8.23.0" dependencies: - "@typescript-eslint/types": "npm:5.62.0" - "@typescript-eslint/visitor-keys": "npm:5.62.0" - checksum: 10/e827770baa202223bc0387e2fd24f630690809e460435b7dc9af336c77322290a770d62bd5284260fa881c86074d6a9fd6c97b07382520b115f6786b8ed499da + "@typescript-eslint/types": "npm:8.23.0" + "@typescript-eslint/visitor-keys": "npm:8.23.0" + checksum: 10/eb4624ccd907c21ca49c4600dec0c447349d7e987cda21181c008dc5ce855590e311efabe73b79b15da0948ce5f63ce0c33613ab4a39ea95578b099b724392e3 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/type-utils@npm:5.62.0" +"@typescript-eslint/type-utils@npm:8.23.0": + version: 8.23.0 + resolution: "@typescript-eslint/type-utils@npm:8.23.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:5.62.0" - "@typescript-eslint/utils": "npm:5.62.0" + "@typescript-eslint/typescript-estree": "npm:8.23.0" + "@typescript-eslint/utils": "npm:8.23.0" debug: "npm:^4.3.4" - tsutils: "npm:^3.21.0" + ts-api-utils: "npm:^2.0.1" peerDependencies: - eslint: "*" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10/f9a4398d6d2aae09e3e765eff04cf4ab364376a87868031ac5c6a64c9bbb555cb1a7f99b07b3d1017e7422725b5f0bbee537f13b82ab2d930f161c987b3dece0 + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.8.0" + checksum: 10/b036a48c5eacef10ed42aef02c859011b11b52938eab4857cfa267730820b90fd29d978a28d43174605b6b7966f095c813d9107e9f0995b92231b53983b12092 languageName: node linkType: hard -"@typescript-eslint/types@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/types@npm:5.62.0" - checksum: 10/24e8443177be84823242d6729d56af2c4b47bfc664dd411a1d730506abf2150d6c31bdefbbc6d97c8f91043e3a50e0c698239dcb145b79bb6b0c34469aaf6c45 +"@typescript-eslint/types@npm:8.23.0": + version: 8.23.0 + resolution: "@typescript-eslint/types@npm:8.23.0" + checksum: 10/e2a68bc6e89226e47e495a91e0614aa5c3c4580b11f7fd99ac6728c1fce92f10755b0d7ade3cf6d3eb1209cd9cd0f29bd742f8dddc394b28bcead7025394eaa2 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/typescript-estree@npm:5.62.0" +"@typescript-eslint/typescript-estree@npm:8.23.0": + version: 8.23.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.23.0" dependencies: - "@typescript-eslint/types": "npm:5.62.0" - "@typescript-eslint/visitor-keys": "npm:5.62.0" + "@typescript-eslint/types": "npm:8.23.0" + "@typescript-eslint/visitor-keys": "npm:8.23.0" debug: "npm:^4.3.4" - globby: "npm:^11.1.0" + fast-glob: "npm:^3.3.2" is-glob: "npm:^4.0.3" - semver: "npm:^7.3.7" - tsutils: "npm:^3.21.0" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10/06c975eb5f44b43bd19fadc2e1023c50cf87038fe4c0dd989d4331c67b3ff509b17fa60a3251896668ab4d7322bdc56162a9926971218d2e1a1874d2bef9a52e + minimatch: "npm:^9.0.4" + semver: "npm:^7.6.0" + ts-api-utils: "npm:^2.0.1" + peerDependencies: + typescript: ">=4.8.4 <5.8.0" + checksum: 10/ddc9790d460bea065eeed3760759c034aef307e72c51b5ec7d869fdc77f18c28354c9e35841b44eebbdc54241bab4154809ae8213d33593a9bff20dc3b247fc3 languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.62.0, @typescript-eslint/utils@npm:^5.10.0, @typescript-eslint/utils@npm:^5.59.1, @typescript-eslint/utils@npm:^5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/utils@npm:5.62.0" +"@typescript-eslint/utils@npm:8.23.0, @typescript-eslint/utils@npm:^6.0.0 || ^7.0.0 || ^8.0.0, @typescript-eslint/utils@npm:^8.21.0": + version: 8.23.0 + resolution: "@typescript-eslint/utils@npm:8.23.0" dependencies: - "@eslint-community/eslint-utils": "npm:^4.2.0" - "@types/json-schema": "npm:^7.0.9" - "@types/semver": "npm:^7.3.12" - "@typescript-eslint/scope-manager": "npm:5.62.0" - "@typescript-eslint/types": "npm:5.62.0" - "@typescript-eslint/typescript-estree": "npm:5.62.0" - eslint-scope: "npm:^5.1.1" - semver: "npm:^7.3.7" + "@eslint-community/eslint-utils": "npm:^4.4.0" + "@typescript-eslint/scope-manager": "npm:8.23.0" + "@typescript-eslint/types": "npm:8.23.0" + "@typescript-eslint/typescript-estree": "npm:8.23.0" peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 10/15ef13e43998a082b15f85db979f8d3ceb1f9ce4467b8016c267b1738d5e7cdb12aa90faf4b4e6dd6486c236cf9d33c463200465cf25ff997dbc0f12358550a1 + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.8.0" + checksum: 10/72588d617ee5b1fa1020d008a7ff714a4a1e0fc1167aa9ff4b8ae71a37b25f43b2d40bca3380c56bb84d4092b6cac8d5d14d74e290e80217175ccf8237faf22a languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.62.0" +"@typescript-eslint/visitor-keys@npm:8.23.0": + version: 8.23.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.23.0" dependencies: - "@typescript-eslint/types": "npm:5.62.0" - eslint-visitor-keys: "npm:^3.3.0" - checksum: 10/dc613ab7569df9bbe0b2ca677635eb91839dfb2ca2c6fa47870a5da4f160db0b436f7ec0764362e756d4164e9445d49d5eb1ff0b87f4c058946ae9d8c92eb388 - languageName: node - linkType: hard - -"@ungap/structured-clone@npm:^1.2.0": - version: 1.2.0 - resolution: "@ungap/structured-clone@npm:1.2.0" - checksum: 10/c6fe89a505e513a7592e1438280db1c075764793a2397877ff1351721fe8792a966a5359769e30242b3cd023f2efb9e63ca2ca88019d73b564488cc20e3eab12 + "@typescript-eslint/types": "npm:8.23.0" + eslint-visitor-keys: "npm:^4.2.0" + checksum: 10/fd473849b85e564e31aec64feb3417a4e16e48bf21f1959fbab56258e19c21ef47bbdb523c64a8921cdc82a5083735418890b6f74b564fd1ece305c977a0f7a6 languageName: node linkType: hard @@ -1884,12 +1937,12 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.0.4, acorn@npm:^8.8.2, acorn@npm:^8.9.0": - version: 8.10.0 - resolution: "acorn@npm:8.10.0" +"acorn@npm:^8.0.4, acorn@npm:^8.14.0, acorn@npm:^8.8.2": + version: 8.14.0 + resolution: "acorn@npm:8.14.0" bin: acorn: bin/acorn - checksum: 10/522310c20fdc3c271caed3caf0f06c51d61cb42267279566edd1d58e83dbc12eebdafaab666a0f0be1b7ad04af9c6bc2a6f478690a9e6391c3c8b165ada917dd + checksum: 10/6df29c35556782ca9e632db461a7f97947772c6c1d5438a81f0c873a3da3a792487e83e404d1c6c25f70513e91aa18745f6eafb1fcc3a43ecd1920b21dd173d2 languageName: node linkType: hard @@ -1967,15 +2020,6 @@ __metadata: languageName: node linkType: hard -"ansi-escapes@npm:^5.0.0": - version: 5.0.0 - resolution: "ansi-escapes@npm:5.0.0" - dependencies: - type-fest: "npm:^1.0.2" - checksum: 10/cbfb95f9f6d8a1ffc89f50fcda3313effae2d9ac2f357f89f626815b4d95fdc3f10f74e0887614ff850d01f805b7505eb1e7ebfdd26144bbfc26c5de08e19195 - languageName: node - linkType: hard - "ansi-regex@npm:^5.0.1": version: 5.0.1 resolution: "ansi-regex@npm:5.0.1" @@ -2015,7 +2059,7 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^6.0.0, ansi-styles@npm:^6.1.0": +"ansi-styles@npm:^6.1.0": version: 6.2.1 resolution: "ansi-styles@npm:6.2.1" checksum: 10/70fdf883b704d17a5dfc9cde206e698c16bcd74e7f196ab821511651aee4f9f76c9514bdfa6ca3a27b5e49138b89cb222a28caf3afe4567570139577f991df32 @@ -2106,13 +2150,6 @@ __metadata: languageName: node linkType: hard -"array-union@npm:^2.1.0": - version: 2.1.0 - resolution: "array-union@npm:2.1.0" - checksum: 10/5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d - languageName: node - linkType: hard - "arraybuffer.prototype.slice@npm:^1.0.2": version: 1.0.2 resolution: "arraybuffer.prototype.slice@npm:1.0.2" @@ -2223,9 +2260,8 @@ __metadata: "@shopify/jest-koa-mocks": "npm:^5.3.1" "@slack/webhook": "npm:^7.0.4" "@sofie-automation/blueprints-integration": "portal:../packages/blueprints-integration" - "@sofie-automation/code-standard-preset": "npm:~2.4.7" + "@sofie-automation/code-standard-preset": "npm:^3.0.0" "@sofie-automation/corelib": "portal:../packages/corelib" - "@sofie-automation/eslint-plugin": "npm:^0.1.1" "@sofie-automation/job-worker": "portal:../packages/job-worker" "@sofie-automation/meteor-lib": "portal:../packages/meteor-lib" "@sofie-automation/shared-lib": "portal:../packages/shared-lib" @@ -2235,6 +2271,7 @@ __metadata: "@types/jest": "npm:^29.5.14" "@types/koa": "npm:^2.15.0" "@types/koa-bodyparser": "npm:^4.3.12" + "@types/koa-mount": "npm:^4" "@types/koa-static": "npm:^4.0.4" "@types/koa__cors": "npm:^5.0.0" "@types/koa__router": "npm:^12.0.4" @@ -2242,9 +2279,6 @@ __metadata: "@types/request": "npm:^2.48.12" "@types/semver": "npm:^7.5.8" "@types/underscore": "npm:^1.13.0" - "@typescript-eslint/eslint-plugin": "npm:^5.62.0" - "@typescript-eslint/parser": "npm:^5.62.0" - "@typescript-eslint/utils": "npm:^5.62.0" app-root-path: "npm:^3.1.0" babel-jest: "npm:^29.7.0" bcrypt: "npm:^5.1.1" @@ -2253,13 +2287,9 @@ __metadata: deepmerge: "npm:^4.3.1" ejson: "npm:^2.2.3" elastic-apm-node: "npm:^4.11.0" - eslint: "npm:^8.57.1" - eslint-config-prettier: "npm:^8.10.0" - eslint-plugin-jest: "npm:^27.9.0" - eslint-plugin-node: "npm:^11.1.0" - eslint-plugin-prettier: "npm:^4.2.1" + eslint: "npm:^9.18.0" fast-clone: "npm:^1.5.13" - glob: "npm:^8.1.0" + glob: "npm:^11.0.1" i18next: "npm:^21.10.0" i18next-conv: "npm:^10.2.0" i18next-scanner: "npm:^4.6.0" @@ -2267,6 +2297,7 @@ __metadata: jest: "npm:^29.7.0" koa: "npm:^2.15.3" koa-bodyparser: "npm:^4.4.1" + koa-mount: "npm:^4.0.0" koa-static: "npm:^5.0.0" legally: "npm:^3.5.10" meteor-node-stubs: "npm:^1.2.12" @@ -2277,7 +2308,7 @@ __metadata: object-path: "npm:^0.11.8" open-cli: "npm:^8.0.0" p-lazy: "npm:^3.1.0" - prettier: "npm:^2.8.8" + prettier: "npm:^3.4.2" semver: "npm:^7.6.3" standard-version: "npm:^9.5.0" superfly-timeline: "npm:9.1.2" @@ -2285,7 +2316,7 @@ __metadata: timecode: "npm:0.0.4" ts-jest: "npm:^29.2.5" type-fest: "npm:^4.33.0" - typescript: "npm:~5.1.6" + typescript: "npm:~5.7.3" underscore: "npm:^1.13.7" winston: "npm:^3.17.0" yargs: "npm:^17.7.2" @@ -2504,12 +2535,12 @@ __metadata: languageName: node linkType: hard -"braces@npm:^3.0.2": - version: 3.0.2 - resolution: "braces@npm:3.0.2" +"braces@npm:^3.0.3": + version: 3.0.3 + resolution: "braces@npm:3.0.3" dependencies: - fill-range: "npm:^7.0.1" - checksum: 10/966b1fb48d193b9d155f810e5efd1790962f2c4e0829f8440b8ad236ba009222c501f70185ef732fef17a4c490bb33a03b90dab0631feafbdf447da91e8165b1 + fill-range: "npm:^7.1.1" + checksum: 10/fad11a0d4697a27162840b02b1fad249c1683cbc510cd5bf1a471f2f8085c046d41094308c577a50a03a579dd99d5a6b3724c4b5e8b14df2c4443844cfcda2c6 languageName: node linkType: hard @@ -2811,18 +2842,6 @@ __metadata: languageName: node linkType: hard -"camelcase-keys@npm:^8.0.2": - version: 8.0.2 - resolution: "camelcase-keys@npm:8.0.2" - dependencies: - camelcase: "npm:^7.0.0" - map-obj: "npm:^4.3.0" - quick-lru: "npm:^6.1.1" - type-fest: "npm:^2.13.0" - checksum: 10/19ec7ecabc1656137bbf761c30febb89c6a033bfba073b8971aafa961e6092e8905d4e0851244ba16ad02ac5fa55ad330c4547c5c8d2dc796131c0f7975f92d3 - languageName: node - linkType: hard - "camelcase@npm:^5.3.1": version: 5.3.1 resolution: "camelcase@npm:5.3.1" @@ -2837,13 +2856,6 @@ __metadata: languageName: node linkType: hard -"camelcase@npm:^7.0.0": - version: 7.0.1 - resolution: "camelcase@npm:7.0.1" - checksum: 10/86ab8f3ebf08bcdbe605a211a242f00ed30d8bfb77dab4ebb744dd36efbc84432d1c4adb28975ba87a1b8be40a80fbd1e60e2f06565315918fa7350011a26d3d - languageName: node - linkType: hard - "caniuse-lite@npm:^1.0.30001688": version: 1.0.30001697 resolution: "caniuse-lite@npm:1.0.30001697" @@ -2851,13 +2863,6 @@ __metadata: languageName: node linkType: hard -"chalk@npm:5.3.0": - version: 5.3.0 - resolution: "chalk@npm:5.3.0" - checksum: 10/6373caaab21bd64c405bfc4bd9672b145647fc9482657b5ea1d549b3b2765054e9d3d928870cdf764fb4aad67555f5061538ff247b8310f110c5c888d92397ea - languageName: node - linkType: hard - "chalk@npm:^2.4.1, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -2924,25 +2929,6 @@ __metadata: languageName: node linkType: hard -"cli-cursor@npm:^4.0.0": - version: 4.0.0 - resolution: "cli-cursor@npm:4.0.0" - dependencies: - restore-cursor: "npm:^4.0.0" - checksum: 10/ab3f3ea2076e2176a1da29f9d64f72ec3efad51c0960898b56c8a17671365c26e67b735920530eaf7328d61f8bd41c27f46b9cf6e4e10fe2fa44b5e8c0e392cc - languageName: node - linkType: hard - -"cli-truncate@npm:^3.1.0": - version: 3.1.0 - resolution: "cli-truncate@npm:3.1.0" - dependencies: - slice-ansi: "npm:^5.0.0" - string-width: "npm:^5.0.0" - checksum: 10/c3243e41974445691c63f8b405df1d5a24049dc33d324fe448dc572e561a7b772ae982692900b1a5960901cc4fc7def25a629b9c69a4208ee89d12ab3332617a - languageName: node - linkType: hard - "cliui@npm:^7.0.2": version: 7.0.4 resolution: "cliui@npm:7.0.4" @@ -3077,13 +3063,6 @@ __metadata: languageName: node linkType: hard -"colorette@npm:^2.0.20": - version: 2.0.20 - resolution: "colorette@npm:2.0.20" - checksum: 10/0b8de48bfa5d10afc160b8eaa2b9938f34a892530b2f7d7897e0458d9535a066e3998b49da9d21161c78225b272df19ae3a64d6df28b4c9734c0e55bbd02406f - languageName: node - linkType: hard - "colorspace@npm:1.1.x": version: 1.1.4 resolution: "colorspace@npm:1.1.4" @@ -3103,13 +3082,6 @@ __metadata: languageName: node linkType: hard -"commander@npm:11.0.0": - version: 11.0.0 - resolution: "commander@npm:11.0.0" - checksum: 10/71cf453771c15d4e94afdd76a1e9bb31597dbc5f33130a1d399a4a7bc14eac765ebca7f0e077f347e5119087f6faa0017fd5e3cb6e4fc5c453853334c26162bc - languageName: node - linkType: hard - "commander@npm:^5.1.0": version: 5.1.0 resolution: "commander@npm:5.1.0" @@ -3499,14 +3471,14 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" dependencies: path-key: "npm:^3.1.0" shebang-command: "npm:^2.0.0" which: "npm:^2.0.1" - checksum: 10/e1a13869d2f57d974de0d9ef7acbf69dc6937db20b918525a01dacb5032129bd552d290d886d981e99f1b624cb03657084cc87bd40f115c07ecf376821c729ce + checksum: 10/0d52657d7ae36eb130999dffff1168ec348687b48dd38e2ff59992ed916c88d328cf1d07ff4a4a10bc78de5e1c23f04b306d569e42f7a2293915c081e4dfee86 languageName: node linkType: hard @@ -3526,12 +3498,10 @@ __metadata: languageName: node linkType: hard -"date-fns@npm:^2.29.3": - version: 2.30.0 - resolution: "date-fns@npm:2.30.0" - dependencies: - "@babel/runtime": "npm:^7.21.0" - checksum: 10/70b3e8ea7aaaaeaa2cd80bd889622a4bcb5d8028b4de9162cbcda359db06e16ff6e9309e54eead5341e71031818497f19aaf9839c87d1aba1e27bb4796e758a9 +"date-fns@npm:^4.1.0": + version: 4.1.0 + resolution: "date-fns@npm:4.1.0" + checksum: 10/d5f6e9de5bbc52310f786099e18609289ed5e30af60a71e0646784c8185ddd1d0eebcf7c96b7faaaefc4a8366f3a3a4244d099b6d0866ee2bec80d1361e64342 languageName: node linkType: hard @@ -3551,7 +3521,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:4.3.4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -3572,6 +3542,18 @@ __metadata: languageName: node linkType: hard +"debug@npm:^4.0.1": + version: 4.4.0 + resolution: "debug@npm:4.4.0" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10/1847944c2e3c2c732514b93d11886575625686056cd765336212dc15de2d2b29612b6cd80e1afba767bb8e1803b778caf9973e98169ef1a24a7a7009e1820367 + languageName: node + linkType: hard + "debuglog@npm:^1.0.1": version: 1.0.1 resolution: "debuglog@npm:1.0.1" @@ -3596,13 +3578,6 @@ __metadata: languageName: node linkType: hard -"decamelize@npm:^6.0.0": - version: 6.0.0 - resolution: "decamelize@npm:6.0.0" - checksum: 10/0066bc30798ec11e01adf0c19ad975caef86545d4bb6f70cfb90b7eb8e3cbf7974cf774ac2e6ea2586e4e07b1f654bfecc4e772c42128a79a89f8584fc546753 - languageName: node - linkType: hard - "dedent@npm:^1.0.0": version: 1.5.1 resolution: "dedent@npm:1.5.1" @@ -3783,24 +3758,6 @@ __metadata: languageName: node linkType: hard -"dir-glob@npm:^3.0.1": - version: 3.0.1 - resolution: "dir-glob@npm:3.0.1" - dependencies: - path-type: "npm:^4.0.0" - checksum: 10/fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 - languageName: node - linkType: hard - -"doctrine@npm:^3.0.0": - version: 3.0.0 - resolution: "doctrine@npm:3.0.0" - dependencies: - esutils: "npm:^2.0.2" - checksum: 10/b4b28f1df5c563f7d876e7461254a4597b8cabe915abe94d7c5d1633fed263fcf9a85e8d3836591fc2d040108e822b0d32758e5ec1fe31c590dc7e08086e3e48 - languageName: node - linkType: hard - "domain-browser@npm:^4.23.0": version: 4.23.0 resolution: "domain-browser@npm:4.23.0" @@ -3990,6 +3947,16 @@ __metadata: languageName: node linkType: hard +"enhanced-resolve@npm:^5.17.1": + version: 5.18.0 + resolution: "enhanced-resolve@npm:5.18.0" + dependencies: + graceful-fs: "npm:^4.2.4" + tapable: "npm:^2.2.0" + checksum: 10/e88463ef97b68d40d0da0cd0c572e23f43dba0be622d6d44eae5cafed05f0c5dac43e463a83a86c4f70186d029357f82b56d9e1e47e8fc91dce3d6602f8bd6ce + languageName: node + linkType: hard + "ensure-type@npm:^1.5.0": version: 1.5.1 resolution: "ensure-type@npm:1.5.1" @@ -4170,177 +4137,178 @@ __metadata: languageName: node linkType: hard -"eslint-config-prettier@npm:^8.10.0, eslint-config-prettier@npm:^8.8.0": - version: 8.10.0 - resolution: "eslint-config-prettier@npm:8.10.0" +"eslint-compat-utils@npm:^0.5.1": + version: 0.5.1 + resolution: "eslint-compat-utils@npm:0.5.1" + dependencies: + semver: "npm:^7.5.4" + peerDependencies: + eslint: ">=6.0.0" + checksum: 10/ac65ac1c6107cf19f63f5fc17cea361c9cb1336be7356f23dbb0fac10979974b4622e13e950be43cbf431801f2c07f7dab448573181ccf6edc0b86d5b5304511 + languageName: node + linkType: hard + +"eslint-config-prettier@npm:^10.0.1": + version: 10.0.1 + resolution: "eslint-config-prettier@npm:10.0.1" peerDependencies: eslint: ">=7.0.0" bin: - eslint-config-prettier: bin/cli.js - checksum: 10/0a51ab1417cbf80fabcf7a406960a142663539c8140fdb0a187b78f3d708b9d137a62a4bc4e689150e290b667750ddabd1740a516623b0cb4adb6cc1962cfe2c + eslint-config-prettier: build/bin/cli.js + checksum: 10/ba6875df0fc4fd3c7c6e2ec9c2e6a224462f7afc662f4cf849775c598a3571c1be136a9b683b12971653b3dcf3f31472aaede3076524b46ec9a77582630158e5 languageName: node linkType: hard -"eslint-plugin-es@npm:^3.0.0": - version: 3.0.1 - resolution: "eslint-plugin-es@npm:3.0.1" +"eslint-plugin-es-x@npm:^7.8.0": + version: 7.8.0 + resolution: "eslint-plugin-es-x@npm:7.8.0" dependencies: - eslint-utils: "npm:^2.0.0" - regexpp: "npm:^3.0.0" + "@eslint-community/eslint-utils": "npm:^4.1.2" + "@eslint-community/regexpp": "npm:^4.11.0" + eslint-compat-utils: "npm:^0.5.1" peerDependencies: - eslint: ">=4.19.1" - checksum: 10/9814e6305183edfdff7d99cbc0f95f0aed1446045cbd1d4f28e7be0903d0013880f0aaf04486a27de96bfb2f5a746bea97cbb238f9b0035cb378d48d179a0a1b + eslint: ">=8" + checksum: 10/1df8d52c4fadc06854ce801af05b05f2642aa2deb918fb7d37738596eabd70b7f21a22b150b78ec9104bac6a1b6b4fb796adea2364ede91b01d20964849ce5f7 languageName: node linkType: hard -"eslint-plugin-jest@npm:^27.2.1, eslint-plugin-jest@npm:^27.9.0": - version: 27.9.0 - resolution: "eslint-plugin-jest@npm:27.9.0" +"eslint-plugin-jest@npm:^28.11.0": + version: 28.11.0 + resolution: "eslint-plugin-jest@npm:28.11.0" dependencies: - "@typescript-eslint/utils": "npm:^5.10.0" + "@typescript-eslint/utils": "npm:^6.0.0 || ^7.0.0 || ^8.0.0" peerDependencies: - "@typescript-eslint/eslint-plugin": ^5.0.0 || ^6.0.0 || ^7.0.0 - eslint: ^7.0.0 || ^8.0.0 + "@typescript-eslint/eslint-plugin": ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 jest: "*" peerDependenciesMeta: "@typescript-eslint/eslint-plugin": optional: true jest: optional: true - checksum: 10/bca54347280c06c56516faea76042134dd74355c2de6c23361ba0e8736ecc01c62b144eea7eda7570ea4f4ee511c583bb8dab00d7153a1bd1740eb77b0038fd4 + checksum: 10/7f3896ec2dc03110688bb9f359a7aa1ba1a6d9a60ffbc3642361c4aaf55afcba9ce36b6609b20b1507028c2170ffe29b0f3e9cc9b7fe12fdd233740a2f9ce0a1 languageName: node linkType: hard -"eslint-plugin-node@npm:^11.1.0": - version: 11.1.0 - resolution: "eslint-plugin-node@npm:11.1.0" +"eslint-plugin-n@npm:^17.15.1": + version: 17.15.1 + resolution: "eslint-plugin-n@npm:17.15.1" dependencies: - eslint-plugin-es: "npm:^3.0.0" - eslint-utils: "npm:^2.0.0" - ignore: "npm:^5.1.1" - minimatch: "npm:^3.0.4" - resolve: "npm:^1.10.1" - semver: "npm:^6.1.0" + "@eslint-community/eslint-utils": "npm:^4.4.1" + enhanced-resolve: "npm:^5.17.1" + eslint-plugin-es-x: "npm:^7.8.0" + get-tsconfig: "npm:^4.8.1" + globals: "npm:^15.11.0" + ignore: "npm:^5.3.2" + minimatch: "npm:^9.0.5" + semver: "npm:^7.6.3" peerDependencies: - eslint: ">=5.16.0" - checksum: 10/bda540f390a84d835989f21f56743f3aa8f41fd9b53359d635c116632c86af92d70d8e6449ddd18860e6241f9cef04fc90c37eb192a9047c3c3a46de6145c30c + eslint: ">=8.23.0" + checksum: 10/43fc161949fa0346ac7063a30580cd0db27e216b8e6a48d73d0bf4f10b88e9b65f263399843b3fe2087f766f264d16f0cbe8f2f898591516842201dc115a2d21 languageName: node linkType: hard -"eslint-plugin-prettier@npm:^4.2.1": - version: 4.2.1 - resolution: "eslint-plugin-prettier@npm:4.2.1" +"eslint-plugin-prettier@npm:^5.2.3": + version: 5.2.3 + resolution: "eslint-plugin-prettier@npm:5.2.3" dependencies: prettier-linter-helpers: "npm:^1.0.0" + synckit: "npm:^0.9.1" peerDependencies: - eslint: ">=7.28.0" - prettier: ">=2.0.0" + "@types/eslint": ">=8.0.0" + eslint: ">=8.0.0" + eslint-config-prettier: "*" + prettier: ">=3.0.0" peerDependenciesMeta: + "@types/eslint": + optional: true eslint-config-prettier: optional: true - checksum: 10/d387f85dd1bfcb6bc6b794845fee6afb9ebb2375653de6bcde6e615892fb97f85121a7c012a4651b181fc09953bdf54c9bc70cab7ad297019d89ae87dd007e28 - languageName: node - linkType: hard - -"eslint-scope@npm:^5.1.1": - version: 5.1.1 - resolution: "eslint-scope@npm:5.1.1" - dependencies: - esrecurse: "npm:^4.3.0" - estraverse: "npm:^4.1.1" - checksum: 10/c541ef384c92eb5c999b7d3443d80195fcafb3da335500946f6db76539b87d5826c8f2e1d23bf6afc3154ba8cd7c8e566f8dc00f1eea25fdf3afc8fb9c87b238 + checksum: 10/6444a0b89f3e2a6b38adce69761133f8539487d797f1655b3fa24f93a398be132c4f68f87041a14740b79202368d5782aa1dffd2bd7a3ea659f263d6796acf15 languageName: node linkType: hard -"eslint-scope@npm:^7.2.2": - version: 7.2.2 - resolution: "eslint-scope@npm:7.2.2" +"eslint-scope@npm:^8.2.0": + version: 8.2.0 + resolution: "eslint-scope@npm:8.2.0" dependencies: esrecurse: "npm:^4.3.0" estraverse: "npm:^5.2.0" - checksum: 10/5c660fb905d5883ad018a6fea2b49f3cb5b1cbf2cd4bd08e98646e9864f9bc2c74c0839bed2d292e90a4a328833accc197c8f0baed89cbe8d605d6f918465491 - languageName: node - linkType: hard - -"eslint-utils@npm:^2.0.0": - version: 2.1.0 - resolution: "eslint-utils@npm:2.1.0" - dependencies: - eslint-visitor-keys: "npm:^1.1.0" - checksum: 10/a7e43a5154a16a90c021cabeb160c3668cccbcf6474ccb2a7d7762698582398f3b938c5330909b858ef7c21182edfc9786dbf89ed7b294f51b7659a378bf7cec - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^1.1.0": - version: 1.3.0 - resolution: "eslint-visitor-keys@npm:1.3.0" - checksum: 10/595ab230e0fcb52f86ba0986a9a473b9fcae120f3729b43f1157f88f27f8addb1e545c4e3d444185f2980e281ca15be5ada6f65b4599eec227cf30e41233b762 + checksum: 10/cd9ab60d5a68f3a0fcac04d1cff5a7383d0f331964d5f1c446259123caec5b3ccc542284d07846e4f4d1389da77750821cc9a6e1ce18558c674977351666f9a6 languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": +"eslint-visitor-keys@npm:^3.4.3": version: 3.4.3 resolution: "eslint-visitor-keys@npm:3.4.3" checksum: 10/3f357c554a9ea794b094a09bd4187e5eacd1bc0d0653c3adeb87962c548e6a1ab8f982b86963ae1337f5d976004146536dcee5d0e2806665b193fbfbf1a9231b languageName: node linkType: hard -"eslint@npm:^8.39.0, eslint@npm:^8.57.1": - version: 8.57.1 - resolution: "eslint@npm:8.57.1" +"eslint-visitor-keys@npm:^4.2.0": + version: 4.2.0 + resolution: "eslint-visitor-keys@npm:4.2.0" + checksum: 10/9651b3356b01760e586b4c631c5268c0e1a85236e3292bf754f0472f465bf9a856c0ddc261fceace155334118c0151778effafbab981413dbf9288349343fa25 + languageName: node + linkType: hard + +"eslint@npm:^9.18.0": + version: 9.19.0 + resolution: "eslint@npm:9.19.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" - "@eslint-community/regexpp": "npm:^4.6.1" - "@eslint/eslintrc": "npm:^2.1.4" - "@eslint/js": "npm:8.57.1" - "@humanwhocodes/config-array": "npm:^0.13.0" + "@eslint-community/regexpp": "npm:^4.12.1" + "@eslint/config-array": "npm:^0.19.0" + "@eslint/core": "npm:^0.10.0" + "@eslint/eslintrc": "npm:^3.2.0" + "@eslint/js": "npm:9.19.0" + "@eslint/plugin-kit": "npm:^0.2.5" + "@humanfs/node": "npm:^0.16.6" "@humanwhocodes/module-importer": "npm:^1.0.1" - "@nodelib/fs.walk": "npm:^1.2.8" - "@ungap/structured-clone": "npm:^1.2.0" + "@humanwhocodes/retry": "npm:^0.4.1" + "@types/estree": "npm:^1.0.6" + "@types/json-schema": "npm:^7.0.15" ajv: "npm:^6.12.4" chalk: "npm:^4.0.0" - cross-spawn: "npm:^7.0.2" + cross-spawn: "npm:^7.0.6" debug: "npm:^4.3.2" - doctrine: "npm:^3.0.0" escape-string-regexp: "npm:^4.0.0" - eslint-scope: "npm:^7.2.2" - eslint-visitor-keys: "npm:^3.4.3" - espree: "npm:^9.6.1" - esquery: "npm:^1.4.2" + eslint-scope: "npm:^8.2.0" + eslint-visitor-keys: "npm:^4.2.0" + espree: "npm:^10.3.0" + esquery: "npm:^1.5.0" esutils: "npm:^2.0.2" fast-deep-equal: "npm:^3.1.3" - file-entry-cache: "npm:^6.0.1" + file-entry-cache: "npm:^8.0.0" find-up: "npm:^5.0.0" glob-parent: "npm:^6.0.2" - globals: "npm:^13.19.0" - graphemer: "npm:^1.4.0" ignore: "npm:^5.2.0" imurmurhash: "npm:^0.1.4" is-glob: "npm:^4.0.0" - is-path-inside: "npm:^3.0.3" - js-yaml: "npm:^4.1.0" json-stable-stringify-without-jsonify: "npm:^1.0.1" - levn: "npm:^0.4.1" lodash.merge: "npm:^4.6.2" minimatch: "npm:^3.1.2" natural-compare: "npm:^1.4.0" optionator: "npm:^0.9.3" - strip-ansi: "npm:^6.0.1" - text-table: "npm:^0.2.0" + peerDependencies: + jiti: "*" + peerDependenciesMeta: + jiti: + optional: true bin: eslint: bin/eslint.js - checksum: 10/5504fa24879afdd9f9929b2fbfc2ee9b9441a3d464efd9790fbda5f05738858530182029f13323add68d19fec749d3ab4a70320ded091ca4432b1e9cc4ed104c + checksum: 10/850d19fd6a34702d1e3d9bdad6aef84a20a5c2de006a8fa6380843384b13944b180232ddd74b8725ffcdf8f296399037f0e8eb4783d5f7393f13c059112b843d languageName: node linkType: hard -"espree@npm:^9.6.0, espree@npm:^9.6.1": - version: 9.6.1 - resolution: "espree@npm:9.6.1" +"espree@npm:^10.0.1, espree@npm:^10.3.0": + version: 10.3.0 + resolution: "espree@npm:10.3.0" dependencies: - acorn: "npm:^8.9.0" + acorn: "npm:^8.14.0" acorn-jsx: "npm:^5.3.2" - eslint-visitor-keys: "npm:^3.4.1" - checksum: 10/255ab260f0d711a54096bdeda93adff0eadf02a6f9b92f02b323e83a2b7fc258797919437ad331efec3930475feb0142c5ecaaf3cdab4befebd336d47d3f3134 + eslint-visitor-keys: "npm:^4.2.0" + checksum: 10/3412d44d4204c9e29d6b5dd0277400cfa0cd68495dc09eae1b9ce79d0c8985c1c5cc09cb9ba32a1cd963f48a49b0c46bdb7736afe395a300aa6bb1c0d86837e8 languageName: node linkType: hard @@ -4364,12 +4332,12 @@ __metadata: languageName: node linkType: hard -"esquery@npm:^1.4.2": - version: 1.5.0 - resolution: "esquery@npm:1.5.0" +"esquery@npm:^1.5.0": + version: 1.6.0 + resolution: "esquery@npm:1.6.0" dependencies: estraverse: "npm:^5.1.0" - checksum: 10/e65fcdfc1e0ff5effbf50fb4f31ea20143ae5df92bb2e4953653d8d40aa4bc148e0d06117a592ce4ea53eeab1dafdfded7ea7e22a5be87e82d73757329a1b01d + checksum: 10/c587fb8ec9ed83f2b1bc97cf2f6854cc30bf784a79d62ba08c6e358bf22280d69aee12827521cf38e69ae9761d23fb7fde593ce315610f85655c139d99b05e5a languageName: node linkType: hard @@ -4382,13 +4350,6 @@ __metadata: languageName: node linkType: hard -"estraverse@npm:^4.1.1": - version: 4.3.0 - resolution: "estraverse@npm:4.3.0" - checksum: 10/3f67ad02b6dbfaddd9ea459cf2b6ef4ecff9a6082a7af9d22e445b9abc082ad9ca47e1825557b293fcdae477f4714e561123e30bb6a5b2f184fb2bad4a9497eb - languageName: node - linkType: hard - "estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": version: 5.3.0 resolution: "estraverse@npm:5.3.0" @@ -4417,13 +4378,6 @@ __metadata: languageName: node linkType: hard -"eventemitter3@npm:^5.0.1": - version: 5.0.1 - resolution: "eventemitter3@npm:5.0.1" - checksum: 10/ac6423ec31124629c84c7077eed1e6987f6d66c31cf43c6fcbf6c87791d56317ce808d9ead483652436df171b526fc7220eccdc9f3225df334e81582c3cf7dd5 - languageName: node - linkType: hard - "events@npm:^3.3.0": version: 3.3.0 resolution: "events@npm:3.3.0" @@ -4442,23 +4396,6 @@ __metadata: languageName: node linkType: hard -"execa@npm:7.2.0": - version: 7.2.0 - resolution: "execa@npm:7.2.0" - dependencies: - cross-spawn: "npm:^7.0.3" - get-stream: "npm:^6.0.1" - human-signals: "npm:^4.3.0" - is-stream: "npm:^3.0.0" - merge-stream: "npm:^2.0.0" - npm-run-path: "npm:^5.1.0" - onetime: "npm:^6.0.0" - signal-exit: "npm:^3.0.7" - strip-final-newline: "npm:^3.0.0" - checksum: 10/473feff60f9d4dbe799225948de48b5158c1723021d19c4b982afe37bcd111ae84e1b4c9dfe967fae5101b0894b1a62e4dd564a286dfa3e46d7b0cfdbf7fe62b - languageName: node - linkType: hard - "execa@npm:^5.0.0": version: 5.1.1 resolution: "execa@npm:5.1.1" @@ -4531,16 +4468,16 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.9": - version: 3.3.1 - resolution: "fast-glob@npm:3.3.1" +"fast-glob@npm:^3.3.2": + version: 3.3.3 + resolution: "fast-glob@npm:3.3.3" dependencies: "@nodelib/fs.stat": "npm:^2.0.2" "@nodelib/fs.walk": "npm:^1.2.3" glob-parent: "npm:^5.1.2" merge2: "npm:^1.3.0" - micromatch: "npm:^4.0.4" - checksum: 10/51bcd15472879dfe51d4b01c5b70bbc7652724d39cdd082ba11276dbd7d84db0f6b33757e1938af8b2768a4bf485d9be0c89153beae24ee8331d6dcc7550379f + micromatch: "npm:^4.0.8" + checksum: 10/dcc6432b269762dd47381d8b8358bf964d8f4f60286ac6aa41c01ade70bda459ff2001b516690b96d5365f68a49242966112b5d5cc9cd82395fa8f9d017c90ad languageName: node linkType: hard @@ -4615,12 +4552,12 @@ __metadata: languageName: node linkType: hard -"file-entry-cache@npm:^6.0.1": - version: 6.0.1 - resolution: "file-entry-cache@npm:6.0.1" +"file-entry-cache@npm:^8.0.0": + version: 8.0.0 + resolution: "file-entry-cache@npm:8.0.0" dependencies: - flat-cache: "npm:^3.0.4" - checksum: 10/099bb9d4ab332cb93c48b14807a6918a1da87c45dce91d4b61fd40e6505d56d0697da060cb901c729c90487067d93c9243f5da3dc9c41f0358483bfdebca736b + flat-cache: "npm:^4.0.0" + checksum: 10/afe55c4de4e0d226a23c1eae62a7219aafb390859122608a89fa4df6addf55c7fd3f1a2da6f5b41e7cdff496e4cf28bbd215d53eab5c817afa96d2b40c81bfb0 languageName: node linkType: hard @@ -4644,12 +4581,19 @@ __metadata: languageName: node linkType: hard -"fill-range@npm:^7.0.1": - version: 7.0.1 - resolution: "fill-range@npm:7.0.1" +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" dependencies: to-regex-range: "npm:^5.0.1" - checksum: 10/e260f7592fd196b4421504d3597cc76f4a1ca7a9488260d533b611fc3cefd61e9a9be1417cb82d3b01ad9f9c0ff2dbf258e1026d2445e26b0cf5148ff4250429 + checksum: 10/a7095cb39e5bc32fada2aa7c7249d3f6b01bd1ce461a61b0adabacccabd9198500c6fb1f68a7c851a657e273fce2233ba869638897f3d7ed2e87a2d89b4436ea + languageName: node + linkType: hard + +"find-up-simple@npm:^1.0.0": + version: 1.0.0 + resolution: "find-up-simple@npm:1.0.0" + checksum: 10/91c3d51c1111b5eb4e6e6d71d21438f6571a37a69dc288d4222b98996756e2f472fa5393a4dddb5e1a84929405d87e86f4bdce798ba84ee513b79854960ec140 languageName: node linkType: hard @@ -4691,31 +4635,20 @@ __metadata: languageName: node linkType: hard -"find-up@npm:^6.3.0": - version: 6.3.0 - resolution: "find-up@npm:6.3.0" - dependencies: - locate-path: "npm:^7.1.0" - path-exists: "npm:^5.0.0" - checksum: 10/4f3bdc30d41778c647e53f4923e72de5e5fb055157031f34501c5b36c2eb59f77b997edf9cb00165c6060cda7eaa2e3da82cb6be2e61d68ad3e07c4bc4cce67e - languageName: node - linkType: hard - -"flat-cache@npm:^3.0.4": - version: 3.1.0 - resolution: "flat-cache@npm:3.1.0" +"flat-cache@npm:^4.0.0": + version: 4.0.1 + resolution: "flat-cache@npm:4.0.1" dependencies: - flatted: "npm:^3.2.7" - keyv: "npm:^4.5.3" - rimraf: "npm:^3.0.2" - checksum: 10/0367e6dbe0684e4b723d9aeb603d3dd225776638ed64fba6d089dc9b107aa03fb9248f1b9a128f32299a0067d6b8c7640219063b34f84c5318d06211e863a83a + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.4" + checksum: 10/58ce851d9045fffc7871ce2bd718bc485ad7e777bf748c054904b87c351ff1080c2c11da00788d78738bfb51b71e4d5ea12d13b98eb36e3358851ffe495b62dc languageName: node linkType: hard -"flatted@npm:^3.2.7": - version: 3.2.9 - resolution: "flatted@npm:3.2.9" - checksum: 10/dc2b89e46a2ebde487199de5a4fcb79e8c46f984043fea5c41dbf4661eb881fefac1c939b5bdcd8a09d7f960ec364f516970c7ec44e58ff451239c07fd3d419b +"flatted@npm:^3.2.9": + version: 3.3.2 + resolution: "flatted@npm:3.3.2" + checksum: 10/ac3c159742e01d0e860a861164bcfd35bb567ccbebb8a0dd041e61cf3c64a435b917dd1e7ed1c380c2ebca85735fb16644485ec33665bc6aafc3b316aa1eed44 languageName: node linkType: hard @@ -4974,7 +4907,7 @@ __metadata: languageName: node linkType: hard -"get-stream@npm:^6.0.0, get-stream@npm:^6.0.1": +"get-stream@npm:^6.0.0": version: 6.0.1 resolution: "get-stream@npm:6.0.1" checksum: 10/781266d29725f35c59f1d214aedc92b0ae855800a980800e2923b3fbc4e56b3cb6e462c42e09a1cf1a00c64e056a78fa407cbe06c7c92b7e5cd49b4b85c2a497 @@ -4991,6 +4924,15 @@ __metadata: languageName: node linkType: hard +"get-tsconfig@npm:^4.8.1": + version: 4.10.0 + resolution: "get-tsconfig@npm:4.10.0" + dependencies: + resolve-pkg-maps: "npm:^1.0.0" + checksum: 10/5259b5c99a1957114337d9d0603b4a305ec9e29fa6cac7d2fbf634ba6754a0cc88bfd281a02416ce64e604b637d3cb239185381a79a5842b17fb55c097b38c4b + languageName: node + linkType: hard + "gettext-parser@npm:^4.0.3": version: 4.2.0 resolution: "gettext-parser@npm:4.2.0" @@ -5098,7 +5040,23 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.0.0, glob@npm:^7.1.1, glob@npm:^7.1.3, glob@npm:^7.1.4": +"glob@npm:^11.0.1": + version: 11.0.1 + resolution: "glob@npm:11.0.1" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^4.0.1" + minimatch: "npm:^10.0.0" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^2.0.0" + bin: + glob: dist/esm/bin.mjs + checksum: 10/57b12a05cc25f1c38f3b24cf6ea7a8bacef11e782c4b9a8c5b0bef3e6c5bcb8c4548cb31eb4115592e0490a024c1bde7359c470565608dd061d3b21179740457 + languageName: node + linkType: hard + +"glob@npm:^7.1.1, glob@npm:^7.1.3, glob@npm:^7.1.4": version: 7.2.3 resolution: "glob@npm:7.2.3" dependencies: @@ -5112,7 +5070,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^8.0.1, glob@npm:^8.1.0": +"glob@npm:^8.0.1": version: 8.1.0 resolution: "glob@npm:8.1.0" dependencies: @@ -5132,12 +5090,17 @@ __metadata: languageName: node linkType: hard -"globals@npm:^13.19.0": - version: 13.21.0 - resolution: "globals@npm:13.21.0" - dependencies: - type-fest: "npm:^0.20.2" - checksum: 10/98ce947dc413e6c8feed236f980dee4bc8d9f4b29790e27bccb277d385fac5d77146e1f9c244c6609aca1d109101642e663caf88c0ba6bff0b069ea82d571441 +"globals@npm:^14.0.0": + version: 14.0.0 + resolution: "globals@npm:14.0.0" + checksum: 10/03939c8af95c6df5014b137cac83aa909090c3a3985caef06ee9a5a669790877af8698ab38007e4c0186873adc14c0b13764acc754b16a754c216cc56aa5f021 + languageName: node + linkType: hard + +"globals@npm:^15.11.0": + version: 15.14.0 + resolution: "globals@npm:15.14.0" + checksum: 10/e35ffbdbc024d6381efca906f67211a7bbf935db2af8c14a65155785479e28b3e475950e5933bb6b296eed54b6dcd924e25b26dbc8579b1bde9d5d25916e1c5f languageName: node linkType: hard @@ -5150,20 +5113,6 @@ __metadata: languageName: node linkType: hard -"globby@npm:^11.1.0": - version: 11.1.0 - resolution: "globby@npm:11.1.0" - dependencies: - array-union: "npm:^2.1.0" - dir-glob: "npm:^3.0.1" - fast-glob: "npm:^3.2.9" - ignore: "npm:^5.2.0" - merge2: "npm:^1.4.1" - slash: "npm:^3.0.0" - checksum: 10/288e95e310227bbe037076ea81b7c2598ccbc3122d87abc6dab39e1eec309aa14f0e366a98cdc45237ffcfcbad3db597778c0068217dcb1950fef6249104e1b1 - languageName: node - linkType: hard - "gopd@npm:^1.0.1, gopd@npm:^1.2.0": version: 1.2.0 resolution: "gopd@npm:1.2.0" @@ -5171,7 +5120,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.10, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.8, graceful-fs@npm:^4.2.9": +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.10, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.8, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10/bf152d0ed1dc159239db1ba1f74fdbc40cb02f626770dcd5815c427ce0688c2635a06ed69af364396da4636d0408fcf7d4afdf7881724c3307e46aff30ca49e2 @@ -5355,12 +5304,12 @@ __metadata: languageName: node linkType: hard -"hosted-git-info@npm:^5.0.0": - version: 5.2.1 - resolution: "hosted-git-info@npm:5.2.1" +"hosted-git-info@npm:^7.0.0": + version: 7.0.2 + resolution: "hosted-git-info@npm:7.0.2" dependencies: - lru-cache: "npm:^7.5.1" - checksum: 10/f0cb6527162b61a65ac350a4d11f55f16629278a19ca61bf421f272c22531b9a1bad34e874b980db6be512130f189c81d1eb9b481b60eeda293b6dc8d35d2aec + lru-cache: "npm:^10.0.1" + checksum: 10/8f085df8a4a637d995f357f48b1e3f6fc1f9f92e82b33fb406415b5741834ed431a510a09141071001e8deea2eee43ce72786463e2aa5e5a70db8648c0eedeab languageName: node linkType: hard @@ -5470,13 +5419,6 @@ __metadata: languageName: node linkType: hard -"human-signals@npm:^4.3.0": - version: 4.3.1 - resolution: "human-signals@npm:4.3.1" - checksum: 10/fa59894c358fe9f2b5549be2fb083661d5e1dff618d3ac70a49ca73495a72e873fbf6c0878561478e521e17d498292746ee391791db95ffe5747bfb5aef8765b - languageName: node - linkType: hard - "humanize-ms@npm:^1.2.1": version: 1.2.1 resolution: "humanize-ms@npm:1.2.1" @@ -5486,15 +5428,6 @@ __metadata: languageName: node linkType: hard -"husky@npm:^8.0.3": - version: 8.0.3 - resolution: "husky@npm:8.0.3" - bin: - husky: lib/bin.js - checksum: 10/b754cf70fdc97c3b60fec5b80056b9c11436464953b1691bf2b5dcf0081fb6685d2c5f47abb8b2b1c49f504aabea5321fdd6496f8b755d9f6e7525a493406abb - languageName: node - linkType: hard - "i18next-conv@npm:^10.2.0": version: 10.2.0 resolution: "i18next-conv@npm:10.2.0" @@ -5583,10 +5516,10 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^5.1.1, ignore@npm:^5.2.0": - version: 5.2.4 - resolution: "ignore@npm:5.2.4" - checksum: 10/4f7caf5d2005da21a382d4bd1d2aa741a3bed51de185c8562dd7f899a81a620ac4fd0619b06f7029a38ae79e4e4c134399db3bd0192c703c3ef54bb82df3086c +"ignore@npm:^5.2.0, ignore@npm:^5.3.1, ignore@npm:^5.3.2": + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 10/cceb6a457000f8f6a50e1196429750d782afce5680dd878aa4221bd79972d68b3a55b4b1458fc682be978f4d3c6a249046aa0880637367216444ab7b014cfc98 languageName: node linkType: hard @@ -5638,10 +5571,10 @@ __metadata: languageName: node linkType: hard -"indent-string@npm:^5.0.0": - version: 5.0.0 - resolution: "indent-string@npm:5.0.0" - checksum: 10/e466c27b6373440e6d84fbc19e750219ce25865cb82d578e41a6053d727e5520dc5725217d6eb1cc76005a1bb1696a0f106d84ce7ebda3033b963a38583fb3b3 +"index-to-position@npm:^0.1.2": + version: 0.1.2 + resolution: "index-to-position@npm:0.1.2" + checksum: 10/ae8e2304ed7c959bc6d1121712e9f625634ed884e32ef93fc0795c6aab1131b10198929a50c7d16d470dab37be7438eccb0afe021d79f69116273d500898daee languageName: node linkType: hard @@ -5715,13 +5648,6 @@ __metadata: languageName: node linkType: hard -"interpret@npm:^1.0.0": - version: 1.4.0 - resolution: "interpret@npm:1.4.0" - checksum: 10/5beec568d3f60543d0f61f2c5969d44dffcb1a372fe5abcdb8013968114d4e4aaac06bc971a4c9f5bd52d150881d8ebad72a8c60686b1361f5f0522f39c0e1a3 - languageName: node - linkType: hard - "ip@npm:^2.0.0": version: 2.0.0 resolution: "ip@npm:2.0.0" @@ -5790,7 +5716,7 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.13.0, is-core-module@npm:^2.5.0, is-core-module@npm:^2.8.1": +"is-core-module@npm:^2.13.0, is-core-module@npm:^2.5.0": version: 2.13.0 resolution: "is-core-module@npm:2.13.0" dependencies: @@ -5838,13 +5764,6 @@ __metadata: languageName: node linkType: hard -"is-fullwidth-code-point@npm:^4.0.0": - version: 4.0.0 - resolution: "is-fullwidth-code-point@npm:4.0.0" - checksum: 10/8ae89bf5057bdf4f57b346fb6c55e9c3dd2549983d54191d722d5c739397a903012cc41a04ee3403fd872e811243ef91a7c5196da7b5841dc6b6aae31a264a8d - languageName: node - linkType: hard - "is-generator-fn@npm:^2.0.0": version: 2.1.0 resolution: "is-generator-fn@npm:2.1.0" @@ -5944,13 +5863,6 @@ __metadata: languageName: node linkType: hard -"is-path-inside@npm:^3.0.3": - version: 3.0.3 - resolution: "is-path-inside@npm:3.0.3" - checksum: 10/abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 - languageName: node - linkType: hard - "is-plain-obj@npm:^1.1.0": version: 1.1.0 resolution: "is-plain-obj@npm:1.1.0" @@ -6174,6 +6086,15 @@ __metadata: languageName: node linkType: hard +"jackspeak@npm:^4.0.1": + version: 4.0.2 + resolution: "jackspeak@npm:4.0.2" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + checksum: 10/d9722f0e55f6c322c57aedf094c405f4201b834204629817187953988075521cfddb23df83e2a7b845723ca7eb0555068c5ce1556732e9c275d32a531881efa8 + languageName: node + linkType: hard + "jake@npm:^10.8.5": version: 10.9.2 resolution: "jake@npm:10.9.2" @@ -6742,12 +6663,12 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^4.5.3": - version: 4.5.3 - resolution: "keyv@npm:4.5.3" +"keyv@npm:^4.5.4": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" dependencies: json-buffer: "npm:3.0.1" - checksum: 10/2c96e345ecee2c7bf8876b368190b0067308b8da080c1462486fbe71a5b863242c350f1507ddad8f373c5d886b302c42f491de4d3be725071c6743a2f1188ff2 + checksum: 10/167eb6ef64cc84b6fa0780ee50c9de456b422a1e18802209234f7c2cf7eae648c7741f32e50d7e24ccb22b24c13154070b01563d642755b156c357431a191e75 languageName: node linkType: hard @@ -6793,6 +6714,16 @@ __metadata: languageName: node linkType: hard +"koa-mount@npm:^4.0.0": + version: 4.0.0 + resolution: "koa-mount@npm:4.0.0" + dependencies: + debug: "npm:^4.0.1" + koa-compose: "npm:^4.1.0" + checksum: 10/c7e8c5cca4d2ccc4742e63c81b86b44f0290075148897b5d633acdd137e90f554c60c232fbc62e843eaedb913b67c5a49367c1142e290b8cfd9c28eb4a0480ec + languageName: node + linkType: hard + "koa-send@npm:^5.0.0": version: 5.0.1 resolution: "koa-send@npm:5.0.1" @@ -6905,13 +6836,6 @@ __metadata: languageName: node linkType: hard -"lilconfig@npm:2.1.0": - version: 2.1.0 - resolution: "lilconfig@npm:2.1.0" - checksum: 10/b1314a2e55319013d5e7d7d08be39015829d2764a1eaee130129545d40388499d81b1c31b0f9b3417d4db12775a88008b72ec33dd06e0184cf7503b32ca7cc0b - languageName: node - linkType: hard - "lines-and-columns@npm:^1.1.6": version: 1.2.4 resolution: "lines-and-columns@npm:1.2.4" @@ -6919,45 +6843,6 @@ __metadata: languageName: node linkType: hard -"lint-staged@npm:^13.2.2": - version: 13.3.0 - resolution: "lint-staged@npm:13.3.0" - dependencies: - chalk: "npm:5.3.0" - commander: "npm:11.0.0" - debug: "npm:4.3.4" - execa: "npm:7.2.0" - lilconfig: "npm:2.1.0" - listr2: "npm:6.6.1" - micromatch: "npm:4.0.5" - pidtree: "npm:0.6.0" - string-argv: "npm:0.3.2" - yaml: "npm:2.3.1" - bin: - lint-staged: bin/lint-staged.js - checksum: 10/6620f70a0ea1060c5b153ae521a1fb5b6e7a36c81188600cda767961b52c6729e8caddba96e5209195c223fe6343c245afb602fdde4f2678827441430aba54fe - languageName: node - linkType: hard - -"listr2@npm:6.6.1": - version: 6.6.1 - resolution: "listr2@npm:6.6.1" - dependencies: - cli-truncate: "npm:^3.1.0" - colorette: "npm:^2.0.20" - eventemitter3: "npm:^5.0.1" - log-update: "npm:^5.0.1" - rfdc: "npm:^1.3.0" - wrap-ansi: "npm:^8.1.0" - peerDependencies: - enquirer: ">= 2.3.0 < 3" - peerDependenciesMeta: - enquirer: - optional: true - checksum: 10/3cc618d9dee0d6a6bd22053db33268db3d09373f3fc64838ada011ac20920a79be52e7adfcc1276ac6be1f6b692c70196a75375002a6fcdd56c9ab51a2cec877 - languageName: node - linkType: hard - "load-json-file@npm:^4.0.0": version: 4.0.0 resolution: "load-json-file@npm:4.0.0" @@ -7008,15 +6893,6 @@ __metadata: languageName: node linkType: hard -"locate-path@npm:^7.1.0": - version: 7.2.0 - resolution: "locate-path@npm:7.2.0" - dependencies: - p-locate: "npm:^6.0.0" - checksum: 10/1c6d269d4efec555937081be964e8a9b4a136319c79ca1d45ac6382212a8466113c75bd89e44521ca8ecd1c47fb08523b56eee5c0712bc7d14fec5f729deeb42 - languageName: node - linkType: hard - "lodash.get@npm:^4.4.2": version: 4.4.2 resolution: "lodash.get@npm:4.4.2" @@ -7059,19 +6935,6 @@ __metadata: languageName: node linkType: hard -"log-update@npm:^5.0.1": - version: 5.0.1 - resolution: "log-update@npm:5.0.1" - dependencies: - ansi-escapes: "npm:^5.0.0" - cli-cursor: "npm:^4.0.0" - slice-ansi: "npm:^5.0.0" - strip-ansi: "npm:^7.0.1" - wrap-ansi: "npm:^8.0.1" - checksum: 10/0e154e46744125b6d20c30289e90091794d58b83c2f01d7676da2afa2411c6ec2c3ee2c99753b9c6b896b9ee496a9a403a563330a2d5914a3bdb30e836f17cfb - languageName: node - linkType: hard - "logform@npm:^2.7.0": version: 2.7.0 resolution: "logform@npm:2.7.0" @@ -7086,13 +6949,27 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:10.2.0, lru-cache@npm:^9.1.1 || ^10.0.0": +"lru-cache@npm:10.2.0": version: 10.2.0 resolution: "lru-cache@npm:10.2.0" checksum: 10/502ec42c3309c0eae1ce41afca471f831c278566d45a5273a0c51102dee31e0e250a62fa9029c3370988df33a14188a38e682c16143b794de78668de3643e302 languageName: node linkType: hard +"lru-cache@npm:^10.0.1, lru-cache@npm:^9.1.1 || ^10.0.0": + version: 10.4.3 + resolution: "lru-cache@npm:10.4.3" + checksum: 10/e6e90267360476720fa8e83cc168aa2bf0311f3f2eea20a6ba78b90a885ae72071d9db132f40fda4129c803e7dcec3a6b6a6fbb44ca90b081630b810b5d6a41a + languageName: node + linkType: hard + +"lru-cache@npm:^11.0.0": + version: 11.0.2 + resolution: "lru-cache@npm:11.0.2" + checksum: 10/25fcb66e9d91eaf17227c6abfe526a7bed5903de74f93bfde380eb8a13410c5e8d3f14fe447293f3f322a7493adf6f9f015c6f1df7a235ff24ec30f366e1c058 + languageName: node + linkType: hard + "lru-cache@npm:^5.1.1": version: 5.1.1 resolution: "lru-cache@npm:5.1.1" @@ -7111,7 +6988,7 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^7.5.1, lru-cache@npm:^7.7.1": +"lru-cache@npm:^7.7.1": version: 7.18.3 resolution: "lru-cache@npm:7.18.3" checksum: 10/6029ca5aba3aacb554e919d7ef804fffd4adfc4c83db00fac8248c7c78811fb6d4b6f70f7fd9d55032b3823446546a007edaa66ad1f2377ae833bd983fac5d98 @@ -7206,7 +7083,7 @@ __metadata: languageName: node linkType: hard -"map-obj@npm:^4.0.0, map-obj@npm:^4.3.0": +"map-obj@npm:^4.0.0": version: 4.3.0 resolution: "map-obj@npm:4.3.0" checksum: 10/fbc554934d1a27a1910e842bc87b177b1a556609dd803747c85ece420692380827c6ae94a95cce4407c054fa0964be3bf8226f7f2cb2e9eeee432c7c1985684e @@ -7274,26 +7151,6 @@ __metadata: languageName: node linkType: hard -"meow@npm:^11.0.0": - version: 11.0.0 - resolution: "meow@npm:11.0.0" - dependencies: - "@types/minimist": "npm:^1.2.2" - camelcase-keys: "npm:^8.0.2" - decamelize: "npm:^6.0.0" - decamelize-keys: "npm:^1.1.0" - hard-rejection: "npm:^2.1.0" - minimist-options: "npm:4.1.0" - normalize-package-data: "npm:^4.0.1" - read-pkg-up: "npm:^9.1.0" - redent: "npm:^4.0.0" - trim-newlines: "npm:^4.0.2" - type-fest: "npm:^3.1.0" - yargs-parser: "npm:^21.1.1" - checksum: 10/09eb03f3f903177b3459d22c9e738f2cafefbb944bb510c56949b895aff80d38a63cd0caf27b1c2da570b2ce8e6ca5333f53566a0aa31bf32651e557916ce355 - languageName: node - linkType: hard - "meow@npm:^12.1.1": version: 12.1.1 resolution: "meow@npm:12.1.1" @@ -7301,6 +7158,13 @@ __metadata: languageName: node linkType: hard +"meow@npm:^13.2.0": + version: 13.2.0 + resolution: "meow@npm:13.2.0" + checksum: 10/4eff5bc921fed0b8a471ad79069d741a0210036d717547d0c7f36fdaf84ef7a3036225f38b6a53830d84dc9cbf8b944b097fde62381b8b5b215119e735ce1063 + languageName: node + linkType: hard + "meow@npm:^8.0.0": version: 8.1.2 resolution: "meow@npm:8.1.2" @@ -7334,7 +7198,7 @@ __metadata: languageName: node linkType: hard -"merge2@npm:^1.3.0, merge2@npm:^1.4.1": +"merge2@npm:^1.3.0": version: 1.4.1 resolution: "merge2@npm:1.4.1" checksum: 10/7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 @@ -7380,13 +7244,13 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:4.0.5, micromatch@npm:^4.0.4": - version: 4.0.5 - resolution: "micromatch@npm:4.0.5" +"micromatch@npm:^4.0.4, micromatch@npm:^4.0.8": + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" dependencies: - braces: "npm:^3.0.2" + braces: "npm:^3.0.3" picomatch: "npm:^2.3.1" - checksum: 10/a749888789fc15cac0e03273844dbd749f9f8e8d64e70c564bcf06a033129554c789bb9e30d7566d7ff6596611a08e58ac12cf2a05f6e3c9c47c50c4c7e12fa2 + checksum: 10/6bf2a01672e7965eb9941d1f02044fad2bd12486b5553dc1116ff24c09a8723157601dc992e74c911d896175918448762df3b3fd0a6b61037dd1a9766ddfbf58 languageName: node linkType: hard @@ -7434,14 +7298,7 @@ __metadata: languageName: node linkType: hard -"mimic-fn@npm:^4.0.0": - version: 4.0.0 - resolution: "mimic-fn@npm:4.0.0" - checksum: 10/995dcece15ee29aa16e188de6633d43a3db4611bcf93620e7e62109ec41c79c0f34277165b8ce5e361205049766e371851264c21ac64ca35499acb5421c2ba56 - languageName: node - linkType: hard - -"min-indent@npm:^1.0.0, min-indent@npm:^1.0.1": +"min-indent@npm:^1.0.0": version: 1.0.1 resolution: "min-indent@npm:1.0.1" checksum: 10/bfc6dd03c5eaf623a4963ebd94d087f6f4bbbfd8c41329a7f09706b0cb66969c4ddd336abeb587bc44bc6f08e13bf90f0b374f9d71f9f01e04adc2cd6f083ef1 @@ -7462,7 +7319,16 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"minimatch@npm:^10.0.0": + version: 10.0.1 + resolution: "minimatch@npm:10.0.1" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10/082e7ccbc090d5f8c4e4e029255d5a1d1e3af37bda837da2b8b0085b1503a1210c91ac90d9ebfe741d8a5f286ece820a1abb4f61dc1f82ce602a055d461d93f3 + languageName: node + linkType: hard + +"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -7480,12 +7346,12 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.1": - version: 9.0.3 - resolution: "minimatch@npm:9.0.3" +"minimatch@npm:^9.0.1, minimatch@npm:^9.0.4, minimatch@npm:^9.0.5": + version: 9.0.5 + resolution: "minimatch@npm:9.0.5" dependencies: brace-expansion: "npm:^2.0.1" - checksum: 10/c81b47d28153e77521877649f4bab48348d10938df9e8147a58111fe00ef89559a2938de9f6632910c4f7bf7bb5cd81191a546167e58d357f0cfb1e18cecc1c5 + checksum: 10/dd6a8927b063aca6d910b119e1f2df6d2ce7d36eab91de83167dd136bb85e1ebff97b0d3de1cb08bd1f7e018ca170b4962479fefab5b2a69e2ae12cb2edc8348 languageName: node linkType: hard @@ -7596,6 +7462,13 @@ __metadata: languageName: node linkType: hard +"minipass@npm:^7.1.2": + version: 7.1.2 + resolution: "minipass@npm:7.1.2" + checksum: 10/c25f0ee8196d8e6036661104bacd743785b2599a21de5c516b32b3fa2b83113ac89a2358465bc04956baab37ffb956ae43be679b2262bf7be15fce467ccd7950 + languageName: node + linkType: hard + "minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": version: 2.1.2 resolution: "minizlib@npm:2.1.2" @@ -7712,7 +7585,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:^2.0.0, ms@npm:^2.1.1": +"ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: 10/aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -7728,13 +7601,6 @@ __metadata: languageName: node linkType: hard -"natural-compare-lite@npm:^1.4.0": - version: 1.4.0 - resolution: "natural-compare-lite@npm:1.4.0" - checksum: 10/5222ac3986a2b78dd6069ac62cbb52a7bf8ffc90d972ab76dfe7b01892485d229530ed20d0c62e79a6b363a663b273db3bde195a1358ce9e5f779d4453887225 - languageName: node - linkType: hard - "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" @@ -7915,7 +7781,7 @@ __metadata: languageName: node linkType: hard -"normalize-package-data@npm:^3.0.0, normalize-package-data@npm:^3.0.2": +"normalize-package-data@npm:^3.0.0": version: 3.0.3 resolution: "normalize-package-data@npm:3.0.3" dependencies: @@ -7927,15 +7793,14 @@ __metadata: languageName: node linkType: hard -"normalize-package-data@npm:^4.0.1": - version: 4.0.1 - resolution: "normalize-package-data@npm:4.0.1" +"normalize-package-data@npm:^6.0.0": + version: 6.0.2 + resolution: "normalize-package-data@npm:6.0.2" dependencies: - hosted-git-info: "npm:^5.0.0" - is-core-module: "npm:^2.8.1" + hosted-git-info: "npm:^7.0.0" semver: "npm:^7.3.5" validate-npm-package-license: "npm:^3.0.4" - checksum: 10/4fdc904a6974137a92c4d782e9c0a767371f50fcc727f664e74d130eb5dda223383c3052ae2e1e9146f718b215de923baca73c488eec4e8c8f0bfd09a8990c23 + checksum: 10/7c4216a2426aa76c0197f8372f06b23a0484d62b3518fb5c0f6ebccb16376bdfab29ceba96f95c75f60506473198f1337fe337b945c8df0541fe32b8049ab4c9 languageName: node linkType: hard @@ -7971,15 +7836,6 @@ __metadata: languageName: node linkType: hard -"npm-run-path@npm:^5.1.0": - version: 5.1.0 - resolution: "npm-run-path@npm:5.1.0" - dependencies: - path-key: "npm:^4.0.0" - checksum: 10/dc184eb5ec239d6a2b990b43236845332ef12f4e0beaa9701de724aa797fe40b6bbd0157fb7639d24d3ab13f5d5cf22d223a19c6300846b8126f335f788bee66 - languageName: node - linkType: hard - "npmlog@npm:^5.0.1": version: 5.0.1 resolution: "npmlog@npm:5.0.1" @@ -8124,7 +7980,7 @@ __metadata: languageName: node linkType: hard -"onetime@npm:^5.1.0, onetime@npm:^5.1.2": +"onetime@npm:^5.1.2": version: 5.1.2 resolution: "onetime@npm:5.1.2" dependencies: @@ -8133,15 +7989,6 @@ __metadata: languageName: node linkType: hard -"onetime@npm:^6.0.0": - version: 6.0.0 - resolution: "onetime@npm:6.0.0" - dependencies: - mimic-fn: "npm:^4.0.0" - checksum: 10/0846ce78e440841335d4e9182ef69d5762e9f38aa7499b19f42ea1c4cd40f0b4446094c455c713f9adac3f4ae86f613bb5e30c99e52652764d06a89f709b3788 - languageName: node - linkType: hard - "only@npm:~0.0.2": version: 0.0.2 resolution: "only@npm:0.0.2" @@ -8271,15 +8118,6 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^4.0.0": - version: 4.0.0 - resolution: "p-limit@npm:4.0.0" - dependencies: - yocto-queue: "npm:^1.0.0" - checksum: 10/01d9d70695187788f984226e16c903475ec6a947ee7b21948d6f597bed788e3112cc7ec2e171c1d37125057a5f45f3da21d8653e04a3a793589e12e9e80e756b - languageName: node - linkType: hard - "p-locate@npm:^2.0.0": version: 2.0.0 resolution: "p-locate@npm:2.0.0" @@ -8316,15 +8154,6 @@ __metadata: languageName: node linkType: hard -"p-locate@npm:^6.0.0": - version: 6.0.0 - resolution: "p-locate@npm:6.0.0" - dependencies: - p-limit: "npm:^4.0.0" - checksum: 10/2bfe5234efa5e7a4e74b30a5479a193fdd9236f8f6b4d2f3f69e3d286d9a7d7ab0c118a2a50142efcf4e41625def635bd9332d6cbf9cc65d85eb0718c579ab38 - languageName: node - linkType: hard - "p-map@npm:^4.0.0": version: 4.0.0 resolution: "p-map@npm:4.0.0" @@ -8355,6 +8184,13 @@ __metadata: languageName: node linkType: hard +"package-json-from-dist@npm:^1.0.0": + version: 1.0.1 + resolution: "package-json-from-dist@npm:1.0.1" + checksum: 10/58ee9538f2f762988433da00e26acc788036914d57c71c246bf0be1b60cdbd77dd60b6a3e1a30465f0b248aeb80079e0b34cb6050b1dfa18c06953bb1cbc7602 + languageName: node + linkType: hard + "pako@npm:~1.0.5": version: 1.0.11 resolution: "pako@npm:1.0.11" @@ -8407,6 +8243,17 @@ __metadata: languageName: node linkType: hard +"parse-json@npm:^8.0.0": + version: 8.1.0 + resolution: "parse-json@npm:8.1.0" + dependencies: + "@babel/code-frame": "npm:^7.22.13" + index-to-position: "npm:^0.1.2" + type-fest: "npm:^4.7.1" + checksum: 10/efc4256c91e835b1340e2b4f535272247f174fcba85eead15ff938be23b3ca2d521a04c76e564d1dc2f61c0c9ebcb6157d5433d459c7e736c81d014b49577b31 + languageName: node + linkType: hard + "parse5@npm:^6.0.0": version: 6.0.1 resolution: "parse5@npm:6.0.1" @@ -8442,13 +8289,6 @@ __metadata: languageName: node linkType: hard -"path-exists@npm:^5.0.0": - version: 5.0.0 - resolution: "path-exists@npm:5.0.0" - checksum: 10/8ca842868cab09423994596eb2c5ec2a971c17d1a3cb36dbf060592c730c725cd524b9067d7d2a1e031fef9ba7bd2ac6dc5ec9fb92aa693265f7be3987045254 - languageName: node - linkType: hard - "path-is-absolute@npm:1.0.1, path-is-absolute@npm:^1.0.0": version: 1.0.1 resolution: "path-is-absolute@npm:1.0.1" @@ -8463,13 +8303,6 @@ __metadata: languageName: node linkType: hard -"path-key@npm:^4.0.0": - version: 4.0.0 - resolution: "path-key@npm:4.0.0" - checksum: 10/8e6c314ae6d16b83e93032c61020129f6f4484590a777eed709c4a01b50e498822b00f76ceaf94bc64dbd90b327df56ceadce27da3d83393790f1219e07721d7 - languageName: node - linkType: hard - "path-parse@npm:^1.0.7": version: 1.0.7 resolution: "path-parse@npm:1.0.7" @@ -8487,6 +8320,16 @@ __metadata: languageName: node linkType: hard +"path-scurry@npm:^2.0.0": + version: 2.0.0 + resolution: "path-scurry@npm:2.0.0" + dependencies: + lru-cache: "npm:^11.0.0" + minipass: "npm:^7.1.2" + checksum: 10/285ae0c2d6c34ae91dc1d5378ede21981c9a2f6de1ea9ca5a88b5a270ce9763b83dbadc7a324d512211d8d36b0c540427d3d0817030849d97a60fa840a2c59ec + languageName: node + linkType: hard + "path-to-regexp@npm:^6.3.0": version: 6.3.0 resolution: "path-to-regexp@npm:6.3.0" @@ -8503,13 +8346,6 @@ __metadata: languageName: node linkType: hard -"path-type@npm:^4.0.0": - version: 4.0.0 - resolution: "path-type@npm:4.0.0" - checksum: 10/5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 - languageName: node - linkType: hard - "pbkdf2@npm:^3.1.2": version: 3.1.2 resolution: "pbkdf2@npm:3.1.2" @@ -8544,15 +8380,6 @@ __metadata: languageName: node linkType: hard -"pidtree@npm:0.6.0": - version: 0.6.0 - resolution: "pidtree@npm:0.6.0" - bin: - pidtree: bin/pidtree.js - checksum: 10/ea67fb3159e170fd069020e0108ba7712df9f0fd13c8db9b2286762856ddce414fb33932e08df4bfe36e91fe860b51852aee49a6f56eb4714b69634343add5df - languageName: node - linkType: hard - "pify@npm:^2.3.0": version: 2.3.0 resolution: "pify@npm:2.3.0" @@ -8637,12 +8464,12 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^2.8.8": - version: 2.8.8 - resolution: "prettier@npm:2.8.8" +"prettier@npm:^3.4.2": + version: 3.4.2 + resolution: "prettier@npm:3.4.2" bin: - prettier: bin-prettier.js - checksum: 10/00cdb6ab0281f98306cd1847425c24cbaaa48a5ff03633945ab4c701901b8e96ad558eb0777364ffc312f437af9b5a07d0f45346266e8245beaf6247b9c62b24 + prettier: bin/prettier.cjs + checksum: 10/a3e806fb0b635818964d472d35d27e21a4e17150c679047f5501e1f23bd4aa806adf660f0c0d35214a210d5d440da6896c2e86156da55f221a57938278dc326e languageName: node linkType: hard @@ -8824,13 +8651,6 @@ __metadata: languageName: node linkType: hard -"quick-lru@npm:^6.1.1": - version: 6.1.2 - resolution: "quick-lru@npm:6.1.2" - checksum: 10/93e6f13bc038b619646792e240a8e2630be0aaeaf877bdda6e9357359314ddef04255876f981a4b6c01a22156bc40282b26f0ea5f81633423093db3c290679f1 - languageName: node - linkType: hard - "randombytes@npm:^2.0.0, randombytes@npm:^2.0.1, randombytes@npm:^2.0.5, randombytes@npm:^2.1.0": version: 2.1.0 resolution: "randombytes@npm:2.1.0" @@ -8906,6 +8726,17 @@ __metadata: languageName: node linkType: hard +"read-package-up@npm:^11.0.0": + version: 11.0.0 + resolution: "read-package-up@npm:11.0.0" + dependencies: + find-up-simple: "npm:^1.0.0" + read-pkg: "npm:^9.0.0" + type-fest: "npm:^4.6.0" + checksum: 10/535b7554d47fae5fb5c2e7aceebd48b5de4142cdfe7b21f942fa9a0f56db03d3b53cce298e19438e1149292279c285e6ba6722eca741d590fd242519c4bdbc17 + languageName: node + linkType: hard + "read-pkg-up@npm:^3.0.0": version: 3.0.0 resolution: "read-pkg-up@npm:3.0.0" @@ -8927,17 +8758,6 @@ __metadata: languageName: node linkType: hard -"read-pkg-up@npm:^9.1.0": - version: 9.1.0 - resolution: "read-pkg-up@npm:9.1.0" - dependencies: - find-up: "npm:^6.3.0" - read-pkg: "npm:^7.1.0" - type-fest: "npm:^2.5.0" - checksum: 10/41b8ba4bdb7c1e914aa6ce2d36a7c1651e9086938977fa12f058f6fca51ee15315634af648ca4ef70dd074e575e854616b39032ad0b376e9e97d61a9d0867afe - languageName: node - linkType: hard - "read-pkg@npm:^3.0.0": version: 3.0.0 resolution: "read-pkg@npm:3.0.0" @@ -8961,15 +8781,16 @@ __metadata: languageName: node linkType: hard -"read-pkg@npm:^7.1.0": - version: 7.1.0 - resolution: "read-pkg@npm:7.1.0" +"read-pkg@npm:^9.0.0": + version: 9.0.1 + resolution: "read-pkg@npm:9.0.1" dependencies: - "@types/normalize-package-data": "npm:^2.4.1" - normalize-package-data: "npm:^3.0.2" - parse-json: "npm:^5.2.0" - type-fest: "npm:^2.0.0" - checksum: 10/20d11c59be3ae1fc79d4b9c8594dabeaec58105f9dfd710570ef9690ec2ac929247006e79ca114257683228663199735d60f149948dbc5f34fcd2d28883ab5f7 + "@types/normalize-package-data": "npm:^2.4.3" + normalize-package-data: "npm:^6.0.0" + parse-json: "npm:^8.0.0" + type-fest: "npm:^4.6.0" + unicorn-magic: "npm:^0.1.0" + checksum: 10/5544bea2a58c6e5706db49a96137e8f0768c69395f25363f934064fbba00bdcdaa326fcd2f4281741df38cf81dbf27b76138240dc6de0ed718cf650475e0de3c languageName: node linkType: hard @@ -9040,15 +8861,6 @@ __metadata: languageName: node linkType: hard -"rechoir@npm:^0.6.2": - version: 0.6.2 - resolution: "rechoir@npm:0.6.2" - dependencies: - resolve: "npm:^1.1.6" - checksum: 10/fe76bf9c21875ac16e235defedd7cbd34f333c02a92546142b7911a0f7c7059d2e16f441fe6fb9ae203f459c05a31b2bcf26202896d89e390eda7514d5d2702b - languageName: node - linkType: hard - "redent@npm:^3.0.0": version: 3.0.0 resolution: "redent@npm:3.0.0" @@ -9059,16 +8871,6 @@ __metadata: languageName: node linkType: hard -"redent@npm:^4.0.0": - version: 4.0.0 - resolution: "redent@npm:4.0.0" - dependencies: - indent-string: "npm:^5.0.0" - strip-indent: "npm:^4.0.0" - checksum: 10/6944e7b1d8f3fd28c2515f5c605b9f7f0ea0f4edddf41890bbbdd4d9ee35abb7540c3b278f03ff827bd278bb6ff4a5bd8692ca406b748c5c1c3ce7355e9fbf8f - languageName: node - linkType: hard - "regenerator-runtime@npm:^0.14.0": version: 0.14.0 resolution: "regenerator-runtime@npm:0.14.0" @@ -9087,13 +8889,6 @@ __metadata: languageName: node linkType: hard -"regexpp@npm:^3.0.0": - version: 3.2.0 - resolution: "regexpp@npm:3.2.0" - checksum: 10/3310010895a906873262f4b494fc99bcef1e71ef6720a0532c5999ca586498cbd4a284c8e3c2423f9d1d37512fd08d6064b7564e0e59508cf938f76dd15ace84 - languageName: node - linkType: hard - "relative-microtime@npm:^2.0.0": version: 2.0.0 resolution: "relative-microtime@npm:2.0.0" @@ -9182,6 +8977,13 @@ __metadata: languageName: node linkType: hard +"resolve-pkg-maps@npm:^1.0.0": + version: 1.0.0 + resolution: "resolve-pkg-maps@npm:1.0.0" + checksum: 10/0763150adf303040c304009231314d1e84c6e5ebfa2d82b7d94e96a6e82bacd1dcc0b58ae257315f3c8adb89a91d8d0f12928241cba2df1680fbe6f60bf99b0e + languageName: node + linkType: hard + "resolve.exports@npm:^2.0.0": version: 2.0.2 resolution: "resolve.exports@npm:2.0.2" @@ -9189,7 +8991,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.10.1, resolve@npm:^1.20.0, resolve@npm:^1.22.1": +"resolve@npm:^1.10.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1": version: 1.22.6 resolution: "resolve@npm:1.22.6" dependencies: @@ -9202,7 +9004,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.1.6#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.10.1#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin": +"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin": version: 1.22.6 resolution: "resolve@patch:resolve@npm%3A1.22.6#optional!builtin::version=1.22.6&hash=c3c19d" dependencies: @@ -9215,16 +9017,6 @@ __metadata: languageName: node linkType: hard -"restore-cursor@npm:^4.0.0": - version: 4.0.0 - resolution: "restore-cursor@npm:4.0.0" - dependencies: - onetime: "npm:^5.1.0" - signal-exit: "npm:^3.0.2" - checksum: 10/5b675c5a59763bf26e604289eab35711525f11388d77f409453904e1e69c0d37ae5889295706b2c81d23bd780165084d040f9b68fffc32cc921519031c4fa4af - languageName: node - linkType: hard - "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" @@ -9239,13 +9031,6 @@ __metadata: languageName: node linkType: hard -"rfdc@npm:^1.3.0": - version: 1.3.0 - resolution: "rfdc@npm:1.3.0" - checksum: 10/76dedd9700cdf132947fde7ce1a8838c9cbb7f3e8f9188af0aaf97194cce745f42094dd2cf547426934cc83252ee2c0e432b2e0222a4415ab0db32de82665c69 - languageName: node - linkType: hard - "rimraf@npm:^3.0.2": version: 3.0.2 resolution: "rimraf@npm:3.0.2" @@ -9350,7 +9135,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^6.0.0, semver@npm:^6.1.0, semver@npm:^6.3.0, semver@npm:^6.3.1": +"semver@npm:^6.0.0, semver@npm:^6.3.0, semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" bin: @@ -9359,7 +9144,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.1.1, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.0, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.3": +"semver@npm:^7.1.1, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.3": version: 7.7.1 resolution: "semver@npm:7.7.1" bin: @@ -9451,19 +9236,6 @@ __metadata: languageName: node linkType: hard -"shelljs@npm:^0.8.5": - version: 0.8.5 - resolution: "shelljs@npm:0.8.5" - dependencies: - glob: "npm:^7.0.0" - interpret: "npm:^1.0.0" - rechoir: "npm:^0.6.2" - bin: - shjs: bin/shjs - checksum: 10/f2178274b97b44332bbe9ddb78161137054f55ecf701c7a99db9552cb5478fe279ad5f5131d8a7c2f0730e01ccf0c629d01094143f0541962ce1a3d0243d23f7 - languageName: node - linkType: hard - "side-channel-list@npm:^1.0.0": version: 1.0.0 resolution: "side-channel-list@npm:1.0.0" @@ -9512,7 +9284,7 @@ __metadata: languageName: node linkType: hard -"signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": +"signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" checksum: 10/a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 @@ -9549,16 +9321,6 @@ __metadata: languageName: node linkType: hard -"slice-ansi@npm:^5.0.0": - version: 5.0.0 - resolution: "slice-ansi@npm:5.0.0" - dependencies: - ansi-styles: "npm:^6.0.0" - is-fullwidth-code-point: "npm:^4.0.0" - checksum: 10/7e600a2a55e333a21ef5214b987c8358fe28bfb03c2867ff2cbf919d62143d1812ac27b4297a077fdaf27a03da3678e49551c93e35f9498a3d90221908a1180e - languageName: node - linkType: hard - "slide@npm:~1.1.3": version: 1.1.6 resolution: "slide@npm:1.1.6" @@ -9876,13 +9638,6 @@ __metadata: languageName: node linkType: hard -"string-argv@npm:0.3.2": - version: 0.3.2 - resolution: "string-argv@npm:0.3.2" - checksum: 10/f9d3addf887026b4b5f997a271149e93bf71efc8692e7dc0816e8807f960b18bcb9787b45beedf0f97ff459575ee389af3f189d8b649834cac602f2e857e75af - languageName: node - linkType: hard - "string-length@npm:^4.0.1": version: 4.0.2 resolution: "string-length@npm:4.0.2" @@ -9904,7 +9659,7 @@ __metadata: languageName: node linkType: hard -"string-width@npm:^5.0.0, string-width@npm:^5.0.1, string-width@npm:^5.1.2": +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": version: 5.1.2 resolution: "string-width@npm:5.1.2" dependencies: @@ -10012,13 +9767,6 @@ __metadata: languageName: node linkType: hard -"strip-final-newline@npm:^3.0.0": - version: 3.0.0 - resolution: "strip-final-newline@npm:3.0.0" - checksum: 10/23ee263adfa2070cd0f23d1ac14e2ed2f000c9b44229aec9c799f1367ec001478469560abefd00c5c99ee6f0b31c137d53ec6029c53e9f32a93804e18c201050 - languageName: node - linkType: hard - "strip-indent@npm:^3.0.0": version: 3.0.0 resolution: "strip-indent@npm:3.0.0" @@ -10028,15 +9776,6 @@ __metadata: languageName: node linkType: hard -"strip-indent@npm:^4.0.0": - version: 4.0.0 - resolution: "strip-indent@npm:4.0.0" - dependencies: - min-indent: "npm:^1.0.1" - checksum: 10/06cbcd93da721c46bc13caeb1c00af93a9b18146a1c95927672d2decab6a25ad83662772417cea9317a2507fb143253ecc23c4415b64f5828cef9b638a744598 - languageName: node - linkType: hard - "strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" @@ -10097,6 +9836,23 @@ __metadata: languageName: node linkType: hard +"synckit@npm:^0.9.1": + version: 0.9.2 + resolution: "synckit@npm:0.9.2" + dependencies: + "@pkgr/core": "npm:^0.1.0" + tslib: "npm:^2.6.2" + checksum: 10/d45c4288be9c0232343650643892a7edafb79152c0c08d7ae5d33ca2c296b67a0e15f8cb5c9153969612c4ea5cd5686297542384aab977db23cfa6653fe02027 + languageName: node + linkType: hard + +"tapable@npm:^2.2.0": + version: 2.2.1 + resolution: "tapable@npm:2.2.1" + checksum: 10/1769336dd21481ae6347611ca5fca47add0962fd8e80466515032125eca0084a4f0ede11e65341b9c0018ef4e1cf1ad820adbb0fba7cc99865c6005734000b0a + languageName: node + linkType: hard + "tar@npm:^6.1.11, tar@npm:^6.1.2": version: 6.2.0 resolution: "tar@npm:6.2.0" @@ -10173,13 +9929,6 @@ __metadata: languageName: node linkType: hard -"text-table@npm:^0.2.0": - version: 0.2.0 - resolution: "text-table@npm:0.2.0" - checksum: 10/4383b5baaeffa9bb4cda2ac33a4aa2e6d1f8aaf811848bf73513a9b88fd76372dc461f6fd6d2e9cb5100f48b473be32c6f95bd983509b7d92bb4d92c10747452 - languageName: node - linkType: hard - "thread-stream@npm:^2.6.0": version: 2.7.0 resolution: "thread-stream@npm:2.7.0" @@ -10234,12 +9983,12 @@ __metadata: languageName: node linkType: hard -"timeline-state-resolver-types@npm:9.3.0": - version: 9.3.0 - resolution: "timeline-state-resolver-types@npm:9.3.0" +"timeline-state-resolver-types@npm:9.4.0-nightly-release53-20250730-145840-ce6dce9c1.0": + version: 9.4.0-nightly-release53-20250730-145840-ce6dce9c1.0 + resolution: "timeline-state-resolver-types@npm:9.4.0-nightly-release53-20250730-145840-ce6dce9c1.0" dependencies: tslib: "npm:^2.6.3" - checksum: 10/2193715a9a3acd89134b6dd102aa8a0adc3386a286744255788d44343e9e820a4cec293609397139a1506d326f0689599e8cc0ca50868c05ad4e78b90f5324ec + checksum: 10/15c09f1d9ff815506471a1d1ee0405d39c6565d6fd8cf8478a9dac92c34004360d22f77b3d06371fa69b283b14a75d15c31b65b91185c9df6c5ca82ca285eebe languageName: node linkType: hard @@ -10333,13 +10082,6 @@ __metadata: languageName: node linkType: hard -"trim-newlines@npm:^4.0.2": - version: 4.1.1 - resolution: "trim-newlines@npm:4.1.1" - checksum: 10/5b09f8e329e8f33c1111ef26906332ba7ba7248cde3e26fc054bb3d69f2858bf5feedca9559c572ff91f33e52977c28e0d41c387df6a02a633cbb8c2d8238627 - languageName: node - linkType: hard - "triple-beam@npm:^1.3.0": version: 1.4.1 resolution: "triple-beam@npm:1.4.1" @@ -10347,6 +10089,15 @@ __metadata: languageName: node linkType: hard +"ts-api-utils@npm:^2.0.1": + version: 2.0.1 + resolution: "ts-api-utils@npm:2.0.1" + peerDependencies: + typescript: ">=4.8.4" + checksum: 10/2e68938cd5acad6b5157744215ce10cd097f9f667fd36b5fdd5efdd4b0c51063e855459d835f94f6777bb8a0f334916b6eb5c1eedab8c325feb34baa39238898 + languageName: node + linkType: hard + "ts-jest@npm:^29.2.5": version: 29.2.5 resolution: "ts-jest@npm:29.2.5" @@ -10384,14 +10135,14 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^1.13.0, tslib@npm:^1.8.1": +"tslib@npm:^1.13.0": version: 1.14.1 resolution: "tslib@npm:1.14.1" checksum: 10/7dbf34e6f55c6492637adb81b555af5e3b4f9cc6b998fb440dac82d3b42bdc91560a35a5fb75e20e24a076c651438234da6743d139e4feabf0783f3cdfe1dddb languageName: node linkType: hard -"tslib@npm:^2.5.3, tslib@npm:^2.6.0, tslib@npm:^2.6.3, tslib@npm:^2.8.1": +"tslib@npm:^2.5.3, tslib@npm:^2.6.0, tslib@npm:^2.6.2, tslib@npm:^2.6.3, tslib@npm:^2.8.1": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10/3e2e043d5c2316461cb54e5c7fe02c30ef6dccb3384717ca22ae5c6b5bc95232a6241df19c622d9c73b809bea33b187f6dbc73030963e29950c2141bc32a79f7 @@ -10405,17 +10156,6 @@ __metadata: languageName: node linkType: hard -"tsutils@npm:^3.21.0": - version: 3.21.0 - resolution: "tsutils@npm:3.21.0" - dependencies: - tslib: "npm:^1.8.1" - peerDependencies: - typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - checksum: 10/ea036bec1dd024e309939ffd49fda7a351c0e87a1b8eb049570dd119d447250e2c56e0e6c00554e8205760e7417793fdebff752a46e573fbe07d4f375502a5b2 - languageName: node - linkType: hard - "tty-browserify@npm:0.0.1": version: 0.0.1 resolution: "tty-browserify@npm:0.0.1" @@ -10446,13 +10186,6 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^0.20.2": - version: 0.20.2 - resolution: "type-fest@npm:0.20.2" - checksum: 10/8907e16284b2d6cfa4f4817e93520121941baba36b39219ea36acfe64c86b9dbc10c9941af450bd60832c8f43464974d51c0957f9858bc66b952b66b6914cbb9 - languageName: node - linkType: hard - "type-fest@npm:^0.21.3": version: 0.21.3 resolution: "type-fest@npm:0.21.3" @@ -10474,28 +10207,21 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^1.0.1, type-fest@npm:^1.0.2": +"type-fest@npm:^1.0.1": version: 1.4.0 resolution: "type-fest@npm:1.4.0" checksum: 10/89875c247564601c2650bacad5ff80b859007fbdb6c9e43713ae3ffa3f584552eea60f33711dd762e16496a1ab4debd409822627be14097d9a17e39c49db591a languageName: node linkType: hard -"type-fest@npm:^2.0.0, type-fest@npm:^2.12.2, type-fest@npm:^2.13.0, type-fest@npm:^2.5.0": +"type-fest@npm:^2.12.2": version: 2.19.0 resolution: "type-fest@npm:2.19.0" checksum: 10/7bf9e8fdf34f92c8bb364c0af14ca875fac7e0183f2985498b77be129dc1b3b1ad0a6b3281580f19e48c6105c037fb966ad9934520c69c6434d17fd0af4eed78 languageName: node linkType: hard -"type-fest@npm:^3.1.0": - version: 3.13.1 - resolution: "type-fest@npm:3.13.1" - checksum: 10/9a8a2359ada34c9b3affcaf3a8f73ee14c52779e89950db337ce66fb74c3399776c697c99f2532e9b16e10e61cfdba3b1c19daffb93b338b742f0acd0117ce12 - languageName: node - linkType: hard - -"type-fest@npm:^4.33.0": +"type-fest@npm:^4.33.0, type-fest@npm:^4.6.0, type-fest@npm:^4.7.1": version: 4.33.0 resolution: "type-fest@npm:4.33.0" checksum: 10/0d179e66fa765bd0a25a785b12dc797f90f2f92bdb8c9c8a789f3fd8e5a4492444e7ef83551b3b8463aeab24fd6195761e26b03174722de636b4b75aa5726fb7 @@ -10566,23 +10292,37 @@ __metadata: languageName: node linkType: hard -"typescript@npm:~5.1.6": - version: 5.1.6 - resolution: "typescript@npm:5.1.6" +"typescript-eslint@npm:^8.21.0": + version: 8.23.0 + resolution: "typescript-eslint@npm:8.23.0" + dependencies: + "@typescript-eslint/eslint-plugin": "npm:8.23.0" + "@typescript-eslint/parser": "npm:8.23.0" + "@typescript-eslint/utils": "npm:8.23.0" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.8.0" + checksum: 10/c7a8b95129e944dd54a3f9312c14fbd9f589d863c30f45c8f3cf6001bb98398cf6ff41b5d51aa84d413853021d35ae703e8d0c067b409afa5acdc6bfc8bb1982 + languageName: node + linkType: hard + +"typescript@npm:~5.7.3": + version: 5.7.3 + resolution: "typescript@npm:5.7.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/f347cde665cf43dc4c1c7d9821c7d9bbec3c3914f4bdd82ee490e9fb9f6d99036ed8666463b6a192dd005eeef333c5087d5931bdd51ec853436ff9a670a7417e + checksum: 10/6a7e556de91db3d34dc51cd2600e8e91f4c312acd8e52792f243c7818dfadb27bae677175fad6947f9c81efb6c57eb6b2d0c736f196a6ee2f1f7d57b74fc92fa languageName: node linkType: hard -"typescript@patch:typescript@npm%3A~5.1.6#optional!builtin": - version: 5.1.6 - resolution: "typescript@patch:typescript@npm%3A5.1.6#optional!builtin::version=5.1.6&hash=5da071" +"typescript@patch:typescript@npm%3A~5.7.3#optional!builtin": + version: 5.7.3 + resolution: "typescript@patch:typescript@npm%3A5.7.3#optional!builtin::version=5.7.3&hash=5786d5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/f5481fa3ba0eee8970f46708d13c05650a865ad093b586fc9573f425c64c57ca97e3308e110bb528deb3ccebe83f6fd7b5a8ac90018038da96326a9ccdf8e77c + checksum: 10/dc58d777eb4c01973f7fbf1fd808aad49a0efdf545528dab9b07d94fdcb65b8751742804c3057e9619a4627f2d9cc85547fdd49d9f4326992ad0181b49e61d81 languageName: node linkType: hard @@ -10638,6 +10378,13 @@ __metadata: languageName: node linkType: hard +"unicorn-magic@npm:^0.1.0": + version: 0.1.0 + resolution: "unicorn-magic@npm:0.1.0" + checksum: 10/9b4d0e9809807823dc91d0920a4a4c0cff2de3ebc54ee87ac1ee9bc75eafd609b09d1f14495e0173aef26e01118706196b6ab06a75fe0841028b3983a8af313f + languageName: node + linkType: hard + "unique-filename@npm:^2.0.0": version: 2.0.1 resolution: "unique-filename@npm:2.0.1" @@ -11016,7 +10763,7 @@ __metadata: languageName: node linkType: hard -"wrap-ansi@npm:^8.0.1, wrap-ansi@npm:^8.1.0": +"wrap-ansi@npm:^8.1.0": version: 8.1.0 resolution: "wrap-ansi@npm:8.1.0" dependencies: @@ -11090,13 +10837,6 @@ __metadata: languageName: node linkType: hard -"yaml@npm:2.3.1": - version: 2.3.1 - resolution: "yaml@npm:2.3.1" - checksum: 10/66501d597e43766eb94dc175d28ec8b2c63087d6a78783e59b4218eee32b9172740f9f27d54b7bc0ca8af61422f7134929f9974faeaac99d583787e793852fd2 - languageName: node - linkType: hard - "yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3": version: 20.2.9 resolution: "yargs-parser@npm:20.2.9" @@ -11154,10 +10894,3 @@ __metadata: checksum: 10/f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 languageName: node linkType: hard - -"yocto-queue@npm:^1.0.0": - version: 1.0.0 - resolution: "yocto-queue@npm:1.0.0" - checksum: 10/2cac84540f65c64ccc1683c267edce396b26b1e931aa429660aefac8fbe0188167b7aee815a3c22fa59a28a58d898d1a2b1825048f834d8d629f4c2a5d443801 - languageName: node - linkType: hard diff --git a/package.json b/package.json index 2e6a756f25..47831cab67 100644 --- a/package.json +++ b/package.json @@ -4,11 +4,12 @@ "license": "MIT", "private": true, "engines": { - "node": ">=22.11" + "node": ">=22.13.1" }, "scripts": { + "prepare": "husky", "postinstall": "run install:packages && run install:meteor", - "install:meteor": "cd meteor && meteor --version && meteor npm install -g yarn && node ../scripts/fix-windows-yarn.js && yarn install", + "install:meteor": "yarn restart:meteor && cd meteor && meteor --version && meteor npm install -g yarn && node ../scripts/fix-windows-yarn.js && yarn install", "install:packages": "cd packages && yarn install", "start": "yarn install && run install-and-build && run dev", "install-and-build": "node ./scripts/install-and-build.mjs", @@ -36,6 +37,7 @@ }, "devDependencies": { "concurrently": "^9.1.2", + "husky": "^9.1.7", "lint-staged": "^15.4.1", "rimraf": "^6.0.1", "semver": "^7.6.3", diff --git a/packages/.yarn/patches/@hyperjump-json-pointer-npm-0.9.8-edc0d22296.patch b/packages/.yarn/patches/@hyperjump-json-pointer-npm-0.9.8-edc0d22296.patch new file mode 100644 index 0000000000..310d545ef9 --- /dev/null +++ b/packages/.yarn/patches/@hyperjump-json-pointer-npm-0.9.8-edc0d22296.patch @@ -0,0 +1,14 @@ +diff --git a/package.json b/package.json +index 27333686efcd8abbe22f5f51f25c411c2541593d..4a435faae7e1a5de8cce767036fb4ce8e4bd7f1e 100644 +--- a/package.json ++++ b/package.json +@@ -12,8 +12,7 @@ + "lint": "eslint lib", + "test": "mocha --require ts-node/register 'lib/**/*.spec.ts'", + "build": "rollup --config rollup.config.js", +- "prepublishOnly": "npm run build", +- "postinstall": "node -e \"require('fs').rmSync('dist', { recursive: true })\"" ++ "prepublishOnly": "npm run build" + }, + "repository": "github:hyperjump-io/json-pointer", + "keywords": [ diff --git a/packages/.yarn/patches/@hyperjump-json-schema-core-npm-0.28.5-e8b590eb0d.patch b/packages/.yarn/patches/@hyperjump-json-schema-core-npm-0.28.5-e8b590eb0d.patch new file mode 100644 index 0000000000..4b7548360b --- /dev/null +++ b/packages/.yarn/patches/@hyperjump-json-schema-core-npm-0.28.5-e8b590eb0d.patch @@ -0,0 +1,14 @@ +diff --git a/package.json b/package.json +index b096ad62306dd5a18b8750b5087e3363b2a377fd..33a88927bcc50a7d72ea3f1ea4f55bfb31764bce 100644 +--- a/package.json ++++ b/package.json +@@ -15,8 +15,7 @@ + "lint": "eslint lib", + "test": "mocha --require ts-node/register 'lib/**/*.spec.ts'", + "build": "rollup --config rollup.config.js", +- "prepublishOnly": "npm run build", +- "postinstall": "node -e \"require('fs').rmSync('dist', { recursive: true })\"" ++ "prepublishOnly": "npm run build" + }, + "repository": "github:hyperjump-io/json-schema-core", + "keywords": [ diff --git a/packages/.yarn/patches/@hyperjump-pact-npm-0.2.5-a816d03fba.patch b/packages/.yarn/patches/@hyperjump-pact-npm-0.2.5-a816d03fba.patch new file mode 100644 index 0000000000..9620b0811a --- /dev/null +++ b/packages/.yarn/patches/@hyperjump-pact-npm-0.2.5-a816d03fba.patch @@ -0,0 +1,14 @@ +diff --git a/package.json b/package.json +index 84163d39aceca9a127cd07253a6880748bd70348..3b4ae6153884a7a715c987024edb8cf80414e389 100644 +--- a/package.json ++++ b/package.json +@@ -12,8 +12,7 @@ + "lint": "eslint lib", + "test": "mocha --require ts-node/register 'lib/**/*.spec.ts'", + "build": "rollup --config rollup.config.js", +- "prepublishOnly": "npm run build", +- "postinstall": "node -e \"require('fs').rmSync('dist', { recursive: true })\"" ++ "prepublishOnly": "npm run build" + }, + "repository": "github:hyperjump-io/hyperjump-pact", + "keywords": [ diff --git a/packages/.yarn/patches/@sofie-automation-sorensen-npm-1.5.8-7b99076666.patch b/packages/.yarn/patches/@sofie-automation-sorensen-npm-1.5.8-7b99076666.patch new file mode 100644 index 0000000000..0551942375 --- /dev/null +++ b/packages/.yarn/patches/@sofie-automation-sorensen-npm-1.5.8-7b99076666.patch @@ -0,0 +1,12 @@ +diff --git a/dist/index.d.ts b/dist/index.d.ts +index d5722b1ac530aac3965f1e77e4673e3b4a7e2b1b..1745642ed6b36ad1d4c9a4dfb70e6068402ba86d 100644 +--- a/dist/index.d.ts ++++ b/dist/index.d.ts +@@ -1,6 +1,6 @@ + type Note = string[]; + type ComboChord = Note[]; +-interface EnchancedKeyboardEvent extends KeyboardEvent { ++export interface EnchancedKeyboardEvent extends KeyboardEvent { + comboChordCodes: ComboChord; + comboCodes: Note; + tag: any | undefined; diff --git a/packages/.yarnrc.yml b/packages/.yarnrc.yml index 3186f3f079..91b1101f52 100644 --- a/packages/.yarnrc.yml +++ b/packages/.yarnrc.yml @@ -1 +1,5 @@ +compressionLevel: mixed + +enableGlobalCache: false + nodeLinker: node-modules diff --git a/packages/blueprints-integration/CHANGELOG-legacy.md b/packages/blueprints-integration/CHANGELOG-legacy.md index c212ce909a..c30c29ab76 100644 --- a/packages/blueprints-integration/CHANGELOG-legacy.md +++ b/packages/blueprints-integration/CHANGELOG-legacy.md @@ -4,51 +4,46 @@ All notable changes to this project will be documented in this file. See [standa ## [2.5.0](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/compare/2.4.0...2.5.0) (2020-12-08) - ### Features -* api for blueprints to manage ab player sessions with partInstance awareness ([#82](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/issues/82)) [publish] ([666b18c](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/666b18c52d250ff4f6af8f51a5d8ce2f48e117e6)) +- api for blueprints to manage ab player sessions with partInstance awareness ([#82](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/issues/82)) [publish] ([666b18c](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/666b18c52d250ff4f6af8f51a5d8ce2f48e117e6)) ## [2.4.0](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/compare/2.3.1...2.4.0) (2020-11-10) - ### Features -* add property description to Rundown ([1c5c81e](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/1c5c81e638e6ad3dafe74900b4b8d266c6c7ece5)) -* update policies ([#80](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/issues/80)) ([5f600de](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/5f600dea6cd4b286b06d49d541ba802cd0abd78c)) +- add property description to Rundown ([1c5c81e](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/1c5c81e638e6ad3dafe74900b4b8d266c6c7ece5)) +- update policies ([#80](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/issues/80)) ([5f600de](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/5f600dea6cd4b286b06d49d541ba802cd0abd78c)) ### [2.3.1](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/compare/2.3.0...2.3.1) (2020-09-30) ## [2.3.0](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/compare/2.2.1...2.3.0) (2020-09-30) - ### Features -* add TimelineEventContext for use in onTimelineGenerate, to allow the current and next part to be provided (if they are set) [publish] ([e8ed966](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/e8ed9664aee1c3b9562ae85e07fa1259e6ca19a3)) -* Allow adlib actions to call take ([e5b1008](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/e5b10087a2e726005062e337bfa829436ecf89a9)) -* move playout properties from Part to PartInstance [publish] ([6edbee3](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/6edbee33520ab44a75ab2ca70e0b81f6f51614c6)) -* replace some key-value interfaces with unknown [publish] ([7346f2f](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/7346f2fa61104ba03aa550f8ed780d3c4e5452f7)) -* Tally tags ([#74](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/issues/74)) ([a0fc99b](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/a0fc99b9e299e67f6c4b252cd97db907384dc04d)) +- add TimelineEventContext for use in onTimelineGenerate, to allow the current and next part to be provided (if they are set) [publish] ([e8ed966](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/e8ed9664aee1c3b9562ae85e07fa1259e6ca19a3)) +- Allow adlib actions to call take ([e5b1008](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/e5b10087a2e726005062e337bfa829436ecf89a9)) +- move playout properties from Part to PartInstance [publish] ([6edbee3](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/6edbee33520ab44a75ab2ca70e0b81f6f51614c6)) +- replace some key-value interfaces with unknown [publish] ([7346f2f](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/7346f2fa61104ba03aa550f8ed780d3c4e5452f7)) +- Tally tags ([#74](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/issues/74)) ([a0fc99b](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/a0fc99b9e299e67f6c4b252cd97db907384dc04d)) ### [2.2.1](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/compare/2.2.0...2.2.1) (2020-09-28) ## [2.2.0](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/compare/2.1.0...2.2.0) (2020-09-28) - ### Features -* Add JSON entry type ([0a27dee](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/0a27dee5887521f513eeea35b217baa30de05d79)) -* add parseConfig callback to blueprint manifests ([133e238](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/133e238ab77fe1a06453e49aa25781697e68750c)) -* expose more functions to adlib-actions ([#68](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/issues/68)) ([0e4f14d](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/0e4f14d0ca43516bc9c821c7692aa9b7acaacd8d)) -* Multiline strings ([83498fb](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/83498fb0cb6aa1addb0cf3163ce79424eb2c940e)) -* remove runtime arguments api [publish] ([d49f7dd](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/d49f7dd943612eb73868fea1728efa00339eb07e)) -* use PieceInstance._id in timeline piece group ids ([88f8e83](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/88f8e83cba6a98dc44e723244c1fce078e3d3b2f)) - +- Add JSON entry type ([0a27dee](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/0a27dee5887521f513eeea35b217baa30de05d79)) +- add parseConfig callback to blueprint manifests ([133e238](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/133e238ab77fe1a06453e49aa25781697e68750c)) +- expose more functions to adlib-actions ([#68](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/issues/68)) ([0e4f14d](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/0e4f14d0ca43516bc9c821c7692aa9b7acaacd8d)) +- Multiline strings ([83498fb](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/83498fb0cb6aa1addb0cf3163ce79424eb2c940e)) +- remove runtime arguments api [publish] ([d49f7dd](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/d49f7dd943612eb73868fea1728efa00339eb07e)) +- use PieceInstance.\_id in timeline piece group ids ([88f8e83](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/88f8e83cba6a98dc44e723244c1fce078e3d3b2f)) ### Bug Fixes -* change any to unknown for better types ([80239dc](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/80239dc6a677f396069074e01f9edc960526ee20)) -* return configs as unknown ([07a0431](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/07a0431a939cd25916f799aa2c8851178e0b514d)) +- change any to unknown for better types ([80239dc](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/80239dc6a677f396069074e01f9edc960526ee20)) +- return configs as unknown ([07a0431](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/commit/07a0431a939cd25916f799aa2c8851178e0b514d)) ## [2.1.0](https://github.com/nrkno/tv-automation-sofie-blueprints-integration/compare/2.0.0...2.1.0) (2020-08-17) diff --git a/packages/blueprints-integration/CHANGELOG.md b/packages/blueprints-integration/CHANGELOG.md index f7d18b4eda..ffe54d1390 100644 --- a/packages/blueprints-integration/CHANGELOG.md +++ b/packages/blueprints-integration/CHANGELOG.md @@ -55,176 +55,106 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [1.52.0-in-testing.0](https://github.com/nrkno/sofie-core/compare/v1.51.6...v1.52.0-in-testing.0) (2025-02-04) - ### Bug Fixes -* review comments ([752a30a](https://github.com/nrkno/sofie-core/commit/752a30a69ea4a864239a438b278c3b53d06a12a2)) - +- review comments ([752a30a](https://github.com/nrkno/sofie-core/commit/752a30a69ea4a864239a438b278c3b53d06a12a2)) ### Features -* add in-out words to the VT type ([7bec461](https://github.com/nrkno/sofie-core/commit/7bec4619836cb92ab85331afe130d0ed54ca976e)) -* add RemoteSpeak source layer type ([a9b98e7](https://github.com/nrkno/sofie-core/commit/a9b98e7a544f5dab90c6cc17713abbdc5b930744)) -* add segment timing countdownType ([9aaa2dd](https://github.com/nrkno/sofie-core/commit/9aaa2dd48e841177f32a8d16a2e6c37706c6c2ae)) -* allow adlib-actions to remove pieces from the current partInstance ([902e7ff](https://github.com/nrkno/sofie-core/commit/902e7fffe6cc23c48f7bd86e23595d83f74d84fa)) -* allow drag from mos-plugin to part ([d51ba2f](https://github.com/nrkno/sofie-core/commit/d51ba2fe8b8effa6037f379534b357d5320cc3c7)) -* config package manager from blueprints ([685364d](https://github.com/nrkno/sofie-core/commit/685364d5fd4af690a55292ba99ff8ecff386f893)) -* configure Core system/studio settings via blueprints ([ef14c8f](https://github.com/nrkno/sofie-core/commit/ef14c8f4f139be273ce8a8a3c21e6cc0f580d297)) -* configure peripheral device settings from blueprints ([878214b](https://github.com/nrkno/sofie-core/commit/878214bf983ed12fe82822b47b9c629727d4c20d)) -* customizable package status messages ([2ac7cb1](https://github.com/nrkno/sofie-core/commit/2ac7cb1eb95edc8f901168066396110b2cd71faa)) -* exclude pieces from part keepalive ([74bea6c](https://github.com/nrkno/sofie-core/commit/74bea6cf3a978410bc5e79b325a6fe8b0b190ba9)) -* list routesets from blueprints adlib action ([c228251](https://github.com/nrkno/sofie-core/commit/c22825130793c843f7290d3ee844b805bf2788f1)) -* meteor 3.0.4 ([8670727](https://github.com/nrkno/sofie-core/commit/8670727bba5ac9cffe0e5d36b4bd45d6664482be)) -* modify datastore in `onRundownActivate` SOFIE-3310 ([#1240](https://github.com/nrkno/sofie-core/issues/1240)) ([8a0759f](https://github.com/nrkno/sofie-core/commit/8a0759f610497e37493e8a798aa0dd13f4f57119)) -* move next part should respect quickloop bounds ([8f0153e](https://github.com/nrkno/sofie-core/commit/8f0153e294a4f4842e333cc3c4e2bacbf6c4c236)) -* processIngestData & userEditOperations ([e69a4fc](https://github.com/nrkno/sofie-core/commit/e69a4fc2f4e3d1e6c6b287e34a3b2f55080ce0c4)) -* quickloop improvements ([f1f77fa](https://github.com/nrkno/sofie-core/commit/f1f77fa11b50fe93afc50631988d7c2aa6306f13)) -* routeset config defined in blueprints ([e839b97](https://github.com/nrkno/sofie-core/commit/e839b97c0205df38e5bc7ab816a9c79406a7d767)) -* update meteor to 3.1 and node to 22 ([61b6854](https://github.com/nrkno/sofie-core/commit/61b6854261a03f04e81416b9d37ee995e3a10108)) - +- add in-out words to the VT type ([7bec461](https://github.com/nrkno/sofie-core/commit/7bec4619836cb92ab85331afe130d0ed54ca976e)) +- add RemoteSpeak source layer type ([a9b98e7](https://github.com/nrkno/sofie-core/commit/a9b98e7a544f5dab90c6cc17713abbdc5b930744)) +- add segment timing countdownType ([9aaa2dd](https://github.com/nrkno/sofie-core/commit/9aaa2dd48e841177f32a8d16a2e6c37706c6c2ae)) +- allow adlib-actions to remove pieces from the current partInstance ([902e7ff](https://github.com/nrkno/sofie-core/commit/902e7fffe6cc23c48f7bd86e23595d83f74d84fa)) +- allow drag from mos-plugin to part ([d51ba2f](https://github.com/nrkno/sofie-core/commit/d51ba2fe8b8effa6037f379534b357d5320cc3c7)) +- config package manager from blueprints ([685364d](https://github.com/nrkno/sofie-core/commit/685364d5fd4af690a55292ba99ff8ecff386f893)) +- configure Core system/studio settings via blueprints ([ef14c8f](https://github.com/nrkno/sofie-core/commit/ef14c8f4f139be273ce8a8a3c21e6cc0f580d297)) +- configure peripheral device settings from blueprints ([878214b](https://github.com/nrkno/sofie-core/commit/878214bf983ed12fe82822b47b9c629727d4c20d)) +- customizable package status messages ([2ac7cb1](https://github.com/nrkno/sofie-core/commit/2ac7cb1eb95edc8f901168066396110b2cd71faa)) +- exclude pieces from part keepalive ([74bea6c](https://github.com/nrkno/sofie-core/commit/74bea6cf3a978410bc5e79b325a6fe8b0b190ba9)) +- list routesets from blueprints adlib action ([c228251](https://github.com/nrkno/sofie-core/commit/c22825130793c843f7290d3ee844b805bf2788f1)) +- meteor 3.0.4 ([8670727](https://github.com/nrkno/sofie-core/commit/8670727bba5ac9cffe0e5d36b4bd45d6664482be)) +- modify datastore in `onRundownActivate` SOFIE-3310 ([#1240](https://github.com/nrkno/sofie-core/issues/1240)) ([8a0759f](https://github.com/nrkno/sofie-core/commit/8a0759f610497e37493e8a798aa0dd13f4f57119)) +- move next part should respect quickloop bounds ([8f0153e](https://github.com/nrkno/sofie-core/commit/8f0153e294a4f4842e333cc3c4e2bacbf6c4c236)) +- processIngestData & userEditOperations ([e69a4fc](https://github.com/nrkno/sofie-core/commit/e69a4fc2f4e3d1e6c6b287e34a3b2f55080ce0c4)) +- quickloop improvements ([f1f77fa](https://github.com/nrkno/sofie-core/commit/f1f77fa11b50fe93afc50631988d7c2aa6306f13)) +- routeset config defined in blueprints ([e839b97](https://github.com/nrkno/sofie-core/commit/e839b97c0205df38e5bc7ab816a9c79406a7d767)) +- update meteor to 3.1 and node to 22 ([61b6854](https://github.com/nrkno/sofie-core/commit/61b6854261a03f04e81416b9d37ee995e3a10108)) ## [1.51.7](https://github.com/nrkno/sofie-core/compare/v1.51.6...v1.51.7) (2025-05-06) **Note:** Version bump only for package @sofie-automation/blueprints-integration - - - - ## [1.51.6](https://github.com/nrkno/sofie-core/compare/v1.51.5...v1.51.6) (2025-01-14) **Note:** Version bump only for package @sofie-automation/blueprints-integration - - - - ## [1.51.5](https://github.com/nrkno/sofie-core/compare/v1.51.4...v1.51.5) (2025-01-07) **Note:** Version bump only for package @sofie-automation/blueprints-integration - - - - ## [1.51.4](https://github.com/nrkno/sofie-core/compare/v1.51.3...v1.51.4) (2024-12-04) **Note:** Version bump only for package @sofie-automation/blueprints-integration - - - - ## [1.51.3](https://github.com/nrkno/sofie-core/compare/v1.51.2...v1.51.3) (2024-11-21) **Note:** Version bump only for package @sofie-automation/blueprints-integration - - - - ## [1.51.2](https://github.com/nrkno/sofie-core/compare/v1.51.1...v1.51.2) (2024-11-21) **Note:** Version bump only for package @sofie-automation/blueprints-integration - - - - ## [1.51.1](https://github.com/nrkno/sofie-core/compare/v1.51.1-2...v1.51.1) (2024-11-13) **Note:** Version bump only for package @sofie-automation/blueprints-integration - - - - ## [1.51.1-2](https://github.com/nrkno/sofie-core/compare/v1.51.1-1...v1.51.1-2) (2024-10-24) **Note:** Version bump only for package @sofie-automation/blueprints-integration - - - - ## [1.51.1-2](https://github.com/nrkno/sofie-core/compare/v1.51.1-1...v1.51.1-2) (2024-10-24) **Note:** Version bump only for package @sofie-automation/blueprints-integration - - - - ## [1.51.1-1](https://github.com/nrkno/sofie-core/compare/v1.51.1-0...v1.51.1-1) (2024-10-18) **Note:** Version bump only for package @sofie-automation/blueprints-integration - - - - ## [1.51.1-0](https://github.com/nrkno/sofie-core/compare/v1.51.0...v1.51.1-0) (2024-10-18) **Note:** Version bump only for package @sofie-automation/blueprints-integration - - - - ## [1.51.1-0](https://github.com/nrkno/sofie-core/compare/v1.51.0...v1.51.1-0) (2024-10-18) **Note:** Version bump only for package @sofie-automation/blueprints-integration - - - - # [1.51.0](https://github.com/nrkno/sofie-core/compare/v1.51.0-in-testing.3...v1.51.0) (2024-10-07) **Note:** Version bump only for package @sofie-automation/blueprints-integration - - - - # [1.51.0](https://github.com/nrkno/sofie-core/compare/v1.51.0-in-testing.3...v1.51.0) (2024-10-07) **Note:** Version bump only for package @sofie-automation/blueprints-integration - - - - # [1.51.0-in-testing.3](https://github.com/nrkno/sofie-core/compare/v1.51.0-in-testing.2...v1.51.0-in-testing.3) (2024-09-25) **Note:** Version bump only for package @sofie-automation/blueprints-integration - - - - # [1.51.0-in-testing.2](https://github.com/nrkno/sofie-core/compare/v1.51.0-in-testing.1...v1.51.0-in-testing.2) (2024-09-24) **Note:** Version bump only for package @sofie-automation/blueprints-integration - - - - # [1.51.0-in-testing.1](https://github.com/nrkno/sofie-core/compare/v1.51.0-in-testing.0...v1.51.0-in-testing.1) (2024-09-06) - ### Features -* stringify piece NoraContent payload SOFIE-3398 ([#1248](https://github.com/nrkno/sofie-core/issues/1248)) ([0613f74](https://github.com/nrkno/sofie-core/commit/0613f740c1e2f740d7d9c39bc72178e301f5f72f)) +- stringify piece NoraContent payload SOFIE-3398 ([#1248](https://github.com/nrkno/sofie-core/issues/1248)) ([0613f74](https://github.com/nrkno/sofie-core/commit/0613f740c1e2f740d7d9c39bc72178e301f5f72f)) # [1.51.0-in-testing.1](https://github.com/nrkno/sofie-core/compare/v1.51.0-in-testing.0...v1.51.0-in-testing.1) (2024-09-06) - ### Features -* stringify piece NoraContent payload SOFIE-3398 ([#1248](https://github.com/nrkno/sofie-core/issues/1248)) ([0613f74](https://github.com/nrkno/sofie-core/commit/0613f740c1e2f740d7d9c39bc72178e301f5f72f)) - +- stringify piece NoraContent payload SOFIE-3398 ([#1248](https://github.com/nrkno/sofie-core/issues/1248)) ([0613f74](https://github.com/nrkno/sofie-core/commit/0613f740c1e2f740d7d9c39bc72178e301f5f72f)) # [1.51.0-in-testing.0](https://github.com/nrkno/sofie-core/compare/v1.50.4...v1.51.0-in-testing.0) (2024-08-19) @@ -294,7 +224,6 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - typed publications in gateways/peripheraldevices SOFIE-1183 ([#1056](https://github.com/nrkno/sofie-core/issues/1056)) ([0c3c1bf](https://github.com/nrkno/sofie-core/commit/0c3c1bfd2bb779034976dc34e49aa6e664ea874b)) - update meteor to 2.12 SOFIE-2368 ([#931](https://github.com/nrkno/sofie-core/issues/931)) ([d7dfb71](https://github.com/nrkno/sofie-core/commit/d7dfb71d19405267cab5e2abc39794a80acb30b1)) - ## [1.50.5](https://github.com/nrkno/tv-automation-server-core/compare/v1.50.4...v1.50.5) (2024-09-19) **Note:** Version bump only for package @sofie-automation/blueprints-integration diff --git a/packages/blueprints-integration/eslint.config.mjs b/packages/blueprints-integration/eslint.config.mjs new file mode 100644 index 0000000000..b9e5a88fd8 --- /dev/null +++ b/packages/blueprints-integration/eslint.config.mjs @@ -0,0 +1,3 @@ +import { generateEslintConfig } from '@sofie-automation/code-standard-preset/eslint/main.mjs' + +export default generateEslintConfig({}) diff --git a/packages/blueprints-integration/jest.config.js b/packages/blueprints-integration/jest.config.js index 7d0311374f..3c2898390e 100644 --- a/packages/blueprints-integration/jest.config.js +++ b/packages/blueprints-integration/jest.config.js @@ -9,6 +9,9 @@ module.exports = { }, ], }, + moduleNameMapper: { + '(.+)\\.js$': '$1', + }, testMatch: ['**/__tests__/**/*.spec.(ts|js)'], testPathIgnorePatterns: ['integrationTests'], testEnvironment: 'node', diff --git a/packages/blueprints-integration/package.json b/packages/blueprints-integration/package.json index bf5bc02774..60dfeca17d 100644 --- a/packages/blueprints-integration/package.json +++ b/packages/blueprints-integration/package.json @@ -1,6 +1,6 @@ { "name": "@sofie-automation/blueprints-integration", - "version": "1.52.0", + "version": "1.53.0-in-development", "description": "Library to define the interaction between core and the blueprints.", "main": "dist/index.js", "typings": "dist/index.d.ts", @@ -17,7 +17,7 @@ "scripts": { "build": "run -T rimraf dist && run build:main", "build:main": "run -T tsc -p tsconfig.build.json", - "lint:raw": "run -T eslint --ext .ts --ext .js --ignore-pattern dist", + "lint:raw": "run -T eslint", "lint": "run lint:raw .", "unit": "run -T jest", "test": "run lint && run unit", @@ -29,7 +29,7 @@ "license-validate": "run -T sofie-licensecheck" }, "engines": { - "node": ">=22.11" + "node": ">=22.13.1" }, "files": [ "/dist", @@ -38,7 +38,7 @@ "/LICENSE" ], "dependencies": { - "@sofie-automation/shared-lib": "1.52.0", + "@sofie-automation/shared-lib": "1.53.0-in-development", "tslib": "^2.8.1", "type-fest": "^4.33.0" }, diff --git a/packages/blueprints-integration/src/__tests__/context.spec.ts b/packages/blueprints-integration/src/__tests__/context.spec.ts index ecce66cee9..a99b9dd30f 100644 --- a/packages/blueprints-integration/src/__tests__/context.spec.ts +++ b/packages/blueprints-integration/src/__tests__/context.spec.ts @@ -1,4 +1,4 @@ -import { isCommonContext, isUserNotesContext } from '../context' +import { isCommonContext, isUserNotesContext } from '../context/index.js' describe('Context', () => { const validCommonContext = { diff --git a/packages/blueprints-integration/src/__tests__/util.spec.ts b/packages/blueprints-integration/src/__tests__/util.spec.ts index e12d89edff..27402c5d30 100644 --- a/packages/blueprints-integration/src/__tests__/util.spec.ts +++ b/packages/blueprints-integration/src/__tests__/util.spec.ts @@ -1,4 +1,4 @@ -import { iterateDeeply, iterateDeeplyAsync, iterateDeeplyEnum } from '../util' +import { iterateDeeply, iterateDeeplyAsync, iterateDeeplyEnum } from '../util.js' describe('Util', () => { test('iterateDeeply', () => { diff --git a/packages/blueprints-integration/src/abPlayback.ts b/packages/blueprints-integration/src/abPlayback.ts index 1cf6943a1b..636d3d91c0 100644 --- a/packages/blueprints-integration/src/abPlayback.ts +++ b/packages/blueprints-integration/src/abPlayback.ts @@ -1,6 +1,6 @@ import type { TimelineObjectAbSessionInfo } from '@sofie-automation/shared-lib/dist/core/model/Timeline' -import type { ICommonContext } from './context' -import type { OnGenerateTimelineObj, TSR } from './timeline' +import type { ICommonContext } from './context/index.js' +import type { OnGenerateTimelineObj, TSR } from './timeline.js' import type { AbPlayerId } from '@sofie-automation/shared-lib/dist/core/model/StudioRouteSet' export type { AbPlayerId } diff --git a/packages/blueprints-integration/src/action.ts b/packages/blueprints-integration/src/action.ts index be134514be..209fa98385 100644 --- a/packages/blueprints-integration/src/action.ts +++ b/packages/blueprints-integration/src/action.ts @@ -1,7 +1,7 @@ -import { ExpectedPackage } from './package' -import { SomeContent } from './content' -import { ITranslatableMessage } from './translations' -import { ExpectedPlayoutItemGeneric } from './documents' +import { ExpectedPackage } from './package.js' +import { SomeContent } from './content.js' +import { ITranslatableMessage } from './translations.js' +import { ExpectedPlayoutItemGeneric } from './documents/index.js' import { JSONBlob } from '@sofie-automation/shared-lib/dist/lib/JSONBlob' import { JSONSchema } from '@sofie-automation/shared-lib/dist/lib/JSONSchemaTypes' @@ -64,6 +64,11 @@ export interface IBlueprintActionTriggerMode { label: ITranslatableMessage /** An optional, longer description that will not be immediately visible to the user */ description?: ITranslatableMessage + /** An icon to be displayed to the user next to the label + * + * This can either be a relative URL to an image in the Blueprints assets or a `data:` URL + */ + icon?: string } } diff --git a/packages/blueprints-integration/src/api/base.ts b/packages/blueprints-integration/src/api/base.ts index 16591880a6..8703e3ce5c 100644 --- a/packages/blueprints-integration/src/api/base.ts +++ b/packages/blueprints-integration/src/api/base.ts @@ -1,5 +1,5 @@ -import type { NoteSeverity } from '../lib' -import type { ITranslatableMessage } from '../translations' +import type { NoteSeverity } from '../lib.js' +import type { ITranslatableMessage } from '../translations.js' export enum BlueprintManifestType { SYSTEM = 'system', diff --git a/packages/blueprints-integration/src/api/index.ts b/packages/blueprints-integration/src/api/index.ts index f3a11b1aeb..ee15b77ef8 100644 --- a/packages/blueprints-integration/src/api/index.ts +++ b/packages/blueprints-integration/src/api/index.ts @@ -1,11 +1,11 @@ -import type { SystemBlueprintManifest } from './system' -import type { StudioBlueprintManifest } from './studio' -import type { ShowStyleBlueprintManifest } from './showStyle' +import type { SystemBlueprintManifest } from './system.js' +import type { StudioBlueprintManifest } from './studio.js' +import type { ShowStyleBlueprintManifest } from './showStyle.js' -export * from './base' -export * from './showStyle' -export * from './studio' -export * from './system' +export * from './base.js' +export * from './showStyle.js' +export * from './studio.js' +export * from './system.js' export interface BlueprintManifestSet { blueprints: { diff --git a/packages/blueprints-integration/src/api/showStyle.ts b/packages/blueprints-integration/src/api/showStyle.ts index b9bd2c9d74..61ad4d8a87 100644 --- a/packages/blueprints-integration/src/api/showStyle.ts +++ b/packages/blueprints-integration/src/api/showStyle.ts @@ -1,4 +1,4 @@ -import type { ActionUserData, IBlueprintActionManifest } from '../action' +import type { ActionUserData, IBlueprintActionManifest } from '../action.js' import type { IActionExecutionContext, ISyncIngestUpdateToPartInstanceContext, @@ -18,10 +18,10 @@ import type { IFixUpConfigContext, IOnTakeContext, IOnSetAsNextContext, -} from '../context' -import type { IngestAdlib, ExtendedIngestRundown, IngestRundown } from '../ingest' -import type { IBlueprintExternalMessageQueueObj } from '../message' -import type {} from '../migrations' +} from '../context/index.js' +import type { IngestAdlib, ExtendedIngestRundown, IngestRundown } from '../ingest.js' +import type { IBlueprintExternalMessageQueueObj } from '../message.js' +import type {} from '../migrations.js' import type { IBlueprintAdLibPiece, IBlueprintResolvedPieceInstance, @@ -35,19 +35,20 @@ import type { IBlueprintSegment, IBlueprintPiece, IBlueprintPart, -} from '../documents' -import type { IBlueprintShowStyleVariant, IOutputLayer, ISourceLayer } from '../showStyle' -import type { TSR, OnGenerateTimelineObj, TimelineObjectCoreExt } from '../timeline' -import type { IBlueprintConfig } from '../common' +} from '../documents/index.js' +import type { IBlueprintShowStyleVariant, IOutputLayer, ISourceLayer } from '../showStyle.js' +import type { TSR, OnGenerateTimelineObj, TimelineObjectCoreExt } from '../timeline.js' +import type { IBlueprintConfig } from '../common.js' import type { ReadonlyDeep } from 'type-fest' import type { JSONSchema } from '@sofie-automation/shared-lib/dist/lib/JSONSchemaTypes' import type { JSONBlob } from '@sofie-automation/shared-lib/dist/lib/JSONBlob' -import type { BlueprintConfigCoreConfig, BlueprintManifestBase, BlueprintManifestType, IConfigMessage } from './base' -import type { IBlueprintTriggeredActions } from '../triggers' -import type { ExpectedPackage } from '../package' -import type { ABResolverConfiguration } from '../abPlayback' -import type { SofieIngestSegment } from '../ingest-types' +import type { BlueprintConfigCoreConfig, BlueprintManifestBase, BlueprintManifestType, IConfigMessage } from './base.js' +import type { IBlueprintTriggeredActions } from '../triggers.js' +import type { ExpectedPackage } from '../package.js' +import type { ABResolverConfiguration } from '../abPlayback.js' +import type { SofieIngestSegment } from '../ingest-types.js' import { PackageStatusMessage } from '@sofie-automation/shared-lib/dist/packageStatusMessages' +import { BlueprintPlayoutPersistentStore } from '../context/playoutStore.js' export { PackageStatusMessage } @@ -111,7 +112,6 @@ export interface ShowStyleBlueprintManifest void @@ -130,12 +130,13 @@ export interface ShowStyleBlueprintManifest, actionId: string, userData: ActionUserData, triggerMode: string | undefined, - privateData?: unknown, - publicData?: unknown, - actionOptions?: { [key: string]: any } + privateData: unknown | undefined, + publicData: unknown | undefined, + actionOptions: { [key: string]: any } | undefined ) => Promise<{ validationErrors: any } | void> /** Generate adlib piece from ingest data */ @@ -204,7 +205,10 @@ export interface ShowStyleBlueprintManifest Promise + onTake?: ( + context: IOnTakeContext, + playoutPersistentState: BlueprintPlayoutPersistentStore + ) => Promise /** Called after a Take action */ onPostTake?: (context: IPartEventContext) => Promise @@ -212,13 +216,16 @@ export interface ShowStyleBlueprintManifest Promise + onSetAsNext?: ( + context: IOnSetAsNextContext, + playoutPersistentState: BlueprintPlayoutPersistentStore + ) => Promise /** Called after the timeline has been generated, used to manipulate the timeline */ onTimelineGenerate?: ( context: ITimelineEventContext, timeline: OnGenerateTimelineObj[], - previousPersistentState: TimelinePersistentState | undefined, + playoutPersistentState: BlueprintPlayoutPersistentStore, previousPartEndState: PartEndState | undefined, resolvedPieces: IBlueprintResolvedPieceInstance[] ) => Promise @@ -229,7 +236,7 @@ export interface ShowStyleBlueprintManifest, partInstance: IBlueprintPartInstance, resolvedPieces: IBlueprintResolvedPieceInstance[], time: number @@ -249,7 +256,6 @@ export interface ShowStyleBlueprintManifest[] - persistentState: TimelinePersistentState } export interface BlueprintResultBaseline { timelineObjects: TimelineObjectCoreExt[] diff --git a/packages/blueprints-integration/src/api/studio.ts b/packages/blueprints-integration/src/api/studio.ts index 32031f9d65..a2e4c268c6 100644 --- a/packages/blueprints-integration/src/api/studio.ts +++ b/packages/blueprints-integration/src/api/studio.ts @@ -1,6 +1,6 @@ -import type { IBlueprintConfig } from '../common' +import type { IBlueprintConfig } from '../common.js' import type { ReadonlyDeep } from 'type-fest' -import type { BlueprintConfigCoreConfig, BlueprintManifestBase, BlueprintManifestType, IConfigMessage } from './base' +import type { BlueprintConfigCoreConfig, BlueprintManifestBase, BlueprintManifestType, IConfigMessage } from './base.js' import type { JSONSchema } from '@sofie-automation/shared-lib/dist/lib/JSONSchemaTypes' import type { JSONBlob } from '@sofie-automation/shared-lib/dist/lib/JSONBlob' import type { @@ -9,25 +9,33 @@ import type { IStudioBaselineContext, IStudioUserContext, IProcessIngestDataContext, -} from '../context' -import type { IBlueprintShowStyleBase } from '../showStyle' +} from '../context/index.js' +import type { IBlueprintShowStyleBase } from '../showStyle.js' import type { ExtendedIngestRundown, NrcsIngestChangeDetails, IngestRundown, MutableIngestRundown, UserOperationChange, -} from '../ingest' -import type { ExpectedPlayoutItemGeneric, IBlueprintResultRundownPlaylist, IBlueprintRundownDB } from '../documents' -import type { BlueprintMappings } from '../studio' -import type { TimelineObjectCoreExt, TSR } from '../timeline' -import type { ExpectedPackage } from '../package' +} from '../ingest.js' +import type { + ExpectedPlayoutItemGeneric, + IBlueprintResultRundownPlaylist, + IBlueprintRundownDB, +} from '../documents/index.js' +import type { BlueprintMappings } from '../studio.js' +import type { TimelineObjectCoreExt, TSR } from '../timeline.js' +import type { ExpectedPackage } from '../package.js' import type { StudioRouteSet, StudioRouteSetExclusivityGroup, } from '@sofie-automation/shared-lib/dist/core/model/StudioRouteSet' import type { StudioPackageContainer } from '@sofie-automation/shared-lib/dist/core/model/PackageContainer' import type { IStudioSettings } from '@sofie-automation/shared-lib/dist/core/model/StudioSettings' +import type { MosDeviceConfig } from '@sofie-automation/shared-lib/dist/generated/MosGatewayDevicesTypes' +import type { MosGatewayConfig } from '@sofie-automation/shared-lib/dist/generated/MosGatewayOptionsTypes' +import type { PlayoutGatewayConfig } from '@sofie-automation/shared-lib/dist/generated/PlayoutGatewayConfigTypes' +import type { LiveStatusGatewayConfig } from '@sofie-automation/shared-lib/dist/generated/LiveStatusGatewayOptionsTypes' export interface StudioBlueprintManifest extends BlueprintManifestBase { @@ -147,11 +155,11 @@ export interface BlueprintResultApplyStudioConfig { /** Parent device settings */ parentDevices: Record /** Playout-gateway subdevices */ - playoutDevices: Record + playoutDevices: Record /** Ingest-gateway subdevices, the types here depend on the gateway you use */ - ingestDevices: Record + ingestDevices: Record /** Input-gateway subdevices */ - inputDevices: Record + inputDevices: Record /** Route Sets */ routeSets?: Record /** Route Set Exclusivity Groups */ @@ -170,6 +178,14 @@ export interface BlueprintParentDeviceSettings { options: Record } +export type BlueprintMosGatewayConfig = MosGatewayConfig + +export type BlueprintMosDeviceConfig = MosDeviceConfig + +export type BlueprintPlayoutGatewayConfig = PlayoutGatewayConfig + +export type BlueprintLiveStatusGatewayConfig = LiveStatusGatewayConfig + export interface IStudioConfigPreset { name: string diff --git a/packages/blueprints-integration/src/api/system.ts b/packages/blueprints-integration/src/api/system.ts index a4c544d571..f052c4e1b1 100644 --- a/packages/blueprints-integration/src/api/system.ts +++ b/packages/blueprints-integration/src/api/system.ts @@ -1,7 +1,7 @@ -import type { IBlueprintTriggeredActions } from '../triggers' -import type { MigrationStepSystem } from '../migrations' -import type { BlueprintManifestBase, BlueprintManifestType } from './base' -import type { ICoreSystemApplyConfigContext } from '../context/systemApplyConfigContext' +import type { IBlueprintTriggeredActions } from '../triggers.js' +import type { MigrationStepSystem } from '../migrations.js' +import type { BlueprintManifestBase, BlueprintManifestType } from './base.js' +import type { ICoreSystemApplyConfigContext } from '../context/systemApplyConfigContext.js' import type { ICoreSystemSettings } from '@sofie-automation/shared-lib/dist/core/model/CoreSystemSettings' export interface SystemBlueprintManifest extends BlueprintManifestBase { diff --git a/packages/blueprints-integration/src/content.ts b/packages/blueprints-integration/src/content.ts index 3eac27aec6..71c6058969 100644 --- a/packages/blueprints-integration/src/content.ts +++ b/packages/blueprints-integration/src/content.ts @@ -1,7 +1,8 @@ import { JSONBlob } from '@sofie-automation/shared-lib/dist/lib/JSONBlob' -import { Time } from './common' -import { TSR, TimelineObjectCoreExt } from './timeline' +import { Time } from './common.js' +import { TSR, TimelineObjectCoreExt } from './timeline.js' import { SourceLayerType } from '@sofie-automation/shared-lib/dist/core/model/ShowStyle' +import { PopupPreview } from './previews.js' export type WithTimeline = T & { timelineObjects: TimelineObjectCoreExt[] @@ -19,9 +20,14 @@ export interface BaseContent { ignoreBlackFrames?: boolean ignoreFreezeFrame?: boolean ignoreAudioFormat?: boolean + + /** + * Overwrite any default hover previews in Sofie + */ + popUpPreview?: PopupPreview } -// eslint-disable-next-line @typescript-eslint/no-empty-interface +// eslint-disable-next-line @typescript-eslint/no-empty-object-type export interface BaseEditableParameters {} export interface VTEditableParameters extends BaseEditableParameters { @@ -37,12 +43,15 @@ export type SomeContent = | ScriptContent | NoraContent | SplitsContent + // eslint-disable-next-line @typescript-eslint/no-duplicate-type-constituents | LiveSpeakContent | TransitionContent | GraphicsContent | UnknownContent | EvsContent + // eslint-disable-next-line @typescript-eslint/no-duplicate-type-constituents | RemoteSpeakContent + // eslint-disable-next-line @typescript-eslint/no-duplicate-type-constituents | LightingContent export type UnknownContent = BaseContent @@ -50,9 +59,6 @@ export type UnknownContent = BaseContent export interface VTContent extends BaseContent { fileName: string path: string - /** Frame that media manager should grab for thumbnail preview */ - previewFrame?: number - mediaFlowIds?: string[] seek?: number /** Duration of extra content past sourceDuration. Not planned to play back but present on the media and playable. */ postrollDuration?: number @@ -66,24 +72,26 @@ export interface VTContent extends BaseContent { export interface GraphicsContent extends BaseContent { fileName: string path: string - mediaFlowIds?: string[] thumbnail?: string templateData?: Record } export interface CameraContent extends BaseContent { studioLabel: string + studioLabelShort?: string switcherInput: number | string } export interface RemoteContent extends BaseContent { studioLabel: string + studioLabelShort?: string switcherInput: number | string } /** Content description for the EVS variant of a LOCAL source */ export interface EvsContent extends BaseContent { studioLabel: string + studioLabelShort?: string /** Switcher input for the EVS channel */ switcherInput: number | string /** Name of the EVS channel as used in the studio */ @@ -161,6 +169,7 @@ export interface NoraContent extends BaseContent { export interface SplitsContentBoxProperties { type: SourceLayerType studioLabel: string + studioLabelShort?: string switcherInput: number | string /** Geometry information for a given box item in the Split. X,Y are relative to center of Box, Scale is 0...1, where 1 is Full-Screen */ geometry?: { diff --git a/packages/blueprints-integration/src/context/adlibActionContext.ts b/packages/blueprints-integration/src/context/adlibActionContext.ts index 50c28fcf44..4435d76b41 100644 --- a/packages/blueprints-integration/src/context/adlibActionContext.ts +++ b/packages/blueprints-integration/src/context/adlibActionContext.ts @@ -1,10 +1,10 @@ -import type { DatastorePersistenceMode, Time } from '../common' -import type { IEventContext } from '.' -import type { IShowStyleUserContext } from './showStyleContext' -import { IPartAndPieceActionContext } from './partsAndPieceActionContext' -import { IExecuteTSRActionsContext } from './executeTsrActionContext' -import { IBlueprintPart, IBlueprintPartInstance, IBlueprintPiece } from '..' -import { IRouteSetMethods } from './routeSetContext' +import type { DatastorePersistenceMode, Time } from '../common.js' +import type { IEventContext } from './index.js' +import type { IShowStyleUserContext } from './showStyleContext.js' +import { IPartAndPieceActionContext } from './partsAndPieceActionContext.js' +import { IExecuteTSRActionsContext } from './executeTsrActionContext.js' +import { IBlueprintPart, IBlueprintPartInstance, IBlueprintPiece } from '../index.js' +import { IRouteSetMethods } from './routeSetContext.js' /** Actions */ export interface IDataStoreMethods { diff --git a/packages/blueprints-integration/src/context/eventContext.ts b/packages/blueprints-integration/src/context/eventContext.ts index e5fe6e234d..d2deec38a7 100644 --- a/packages/blueprints-integration/src/context/eventContext.ts +++ b/packages/blueprints-integration/src/context/eventContext.ts @@ -1,8 +1,8 @@ -import type { OnGenerateTimelineObj, TSR } from '../timeline' -import type { IBlueprintPartInstance, IBlueprintPieceInstance, IBlueprintSegmentDB } from '../documents' -import type { IRundownContext } from './rundownContext' -import type { IBlueprintExternalMessageQueueObj } from '../message' -import { BlueprintQuickLookInfo } from './quickLoopInfo' +import type { OnGenerateTimelineObj, TSR } from '../timeline.js' +import type { IBlueprintPartInstance, IBlueprintPieceInstance, IBlueprintSegmentDB } from '../documents/index.js' +import type { IRundownContext } from './rundownContext.js' +import type { IBlueprintExternalMessageQueueObj } from '../message.js' +import { BlueprintQuickLookInfo } from './quickLoopInfo.js' export interface IEventContext { getCurrentTime(): number diff --git a/packages/blueprints-integration/src/context/executeTsrActionContext.ts b/packages/blueprints-integration/src/context/executeTsrActionContext.ts index 4cd7e9dcc2..a18fa45c82 100644 --- a/packages/blueprints-integration/src/context/executeTsrActionContext.ts +++ b/packages/blueprints-integration/src/context/executeTsrActionContext.ts @@ -1,5 +1,5 @@ import { PeripheralDeviceId } from '@sofie-automation/shared-lib/dist/core/model/Ids' -import { IBlueprintPlayoutDevice, TSR } from '..' +import { IBlueprintPlayoutDevice, TSR } from '../index.js' export interface IExecuteTSRActionsContext { /** Returns a list of the PeripheralDevices */ diff --git a/packages/blueprints-integration/src/context/fixUpConfigContext.ts b/packages/blueprints-integration/src/context/fixUpConfigContext.ts index b8a8cbce1f..83ef8e64d7 100644 --- a/packages/blueprints-integration/src/context/fixUpConfigContext.ts +++ b/packages/blueprints-integration/src/context/fixUpConfigContext.ts @@ -1,6 +1,6 @@ -import type { IBlueprintConfig } from '../common' -import type { ITranslatableMessage } from '../translations' -import type { ICommonContext } from './baseContext' +import type { IBlueprintConfig } from '../common.js' +import type { ITranslatableMessage } from '../translations.js' +import type { ICommonContext } from './baseContext.js' export interface IFixUpConfigContext extends ICommonContext { /** diff --git a/packages/blueprints-integration/src/context/index.ts b/packages/blueprints-integration/src/context/index.ts index 843436ddd8..a1cba0ab9f 100644 --- a/packages/blueprints-integration/src/context/index.ts +++ b/packages/blueprints-integration/src/context/index.ts @@ -1,12 +1,13 @@ -export * from './adlibActionContext' -export * from './baseContext' -export * from './eventContext' -export * from './fixUpConfigContext' -export * from './onSetAsNextContext' -export * from './onTakeContext' -export * from './packageInfoContext' -export * from './processIngestDataContext' -export * from './rundownContext' -export * from './showStyleContext' -export * from './studioContext' -export * from './syncIngestChangesContext' +export * from './adlibActionContext.js' +export * from './baseContext.js' +export * from './eventContext.js' +export * from './fixUpConfigContext.js' +export * from './onSetAsNextContext.js' +export * from './onTakeContext.js' +export * from './packageInfoContext.js' +export * from './playoutStore.js' +export * from './processIngestDataContext.js' +export * from './rundownContext.js' +export * from './showStyleContext.js' +export * from './studioContext.js' +export * from './syncIngestChangesContext.js' diff --git a/packages/blueprints-integration/src/context/onSetAsNextContext.ts b/packages/blueprints-integration/src/context/onSetAsNextContext.ts index c0aa830068..cf8a7c55a0 100644 --- a/packages/blueprints-integration/src/context/onSetAsNextContext.ts +++ b/packages/blueprints-integration/src/context/onSetAsNextContext.ts @@ -6,10 +6,11 @@ import { IBlueprintPieceDB, IBlueprintPieceInstance, IBlueprintResolvedPieceInstance, + IBlueprintSegment, IEventContext, IShowStyleUserContext, -} from '..' -import { BlueprintQuickLookInfo } from './quickLoopInfo' +} from '../index.js' +import { BlueprintQuickLookInfo } from './quickLoopInfo.js' /** * Context in which 'current' is the part currently on air, and 'next' is the partInstance being set as Next @@ -19,6 +20,9 @@ export interface IOnSetAsNextContext extends IShowStyleUserContext, IEventContex /** Information about the current loop, if there is one */ readonly quickLoopInfo: BlueprintQuickLookInfo | null + /** Whether the part being set as next was selected as a result of user's actions */ + readonly manuallySelected: boolean + /** * Data fetching */ @@ -49,6 +53,8 @@ export interface IOnSetAsNextContext extends IShowStyleUserContext, IEventContex getPartInstanceForPreviousPiece(piece: IBlueprintPieceInstance): Promise /** Gets the Part for a Piece retrieved from findLastScriptedPieceOnLayer. This primarily allows for accessing metadata of the Part */ getPartForPreviousPiece(piece: IBlueprintPieceDB): Promise + /** Gets the Segment. This primarily allows for accessing metadata */ + getSegment(segment: 'current' | 'next'): Promise /** * Creative actions diff --git a/packages/blueprints-integration/src/context/onTakeContext.ts b/packages/blueprints-integration/src/context/onTakeContext.ts index 77085a39a9..3918bdd7ee 100644 --- a/packages/blueprints-integration/src/context/onTakeContext.ts +++ b/packages/blueprints-integration/src/context/onTakeContext.ts @@ -1,6 +1,6 @@ -import { IEventContext, IShowStyleUserContext, Time } from '..' -import { IPartAndPieceActionContext } from './partsAndPieceActionContext' -import { IExecuteTSRActionsContext } from './executeTsrActionContext' +import { IEventContext, IShowStyleUserContext, Time } from '../index.js' +import { IPartAndPieceActionContext } from './partsAndPieceActionContext.js' +import { IExecuteTSRActionsContext } from './executeTsrActionContext.js' /** * Context in which 'current' is the partInstance we're leaving, and 'next' is the partInstance we're taking diff --git a/packages/blueprints-integration/src/context/packageInfoContext.ts b/packages/blueprints-integration/src/context/packageInfoContext.ts index fd96343be7..52e213e4d2 100644 --- a/packages/blueprints-integration/src/context/packageInfoContext.ts +++ b/packages/blueprints-integration/src/context/packageInfoContext.ts @@ -1,4 +1,4 @@ -import type { PackageInfo } from '../packageInfo' +import type { PackageInfo } from '../packageInfo.js' export interface IPackageInfoContext { /** diff --git a/packages/blueprints-integration/src/context/partsAndPieceActionContext.ts b/packages/blueprints-integration/src/context/partsAndPieceActionContext.ts index e2f3b43e39..b14601908a 100644 --- a/packages/blueprints-integration/src/context/partsAndPieceActionContext.ts +++ b/packages/blueprints-integration/src/context/partsAndPieceActionContext.ts @@ -6,9 +6,10 @@ import { IBlueprintPieceDB, IBlueprintPieceInstance, IBlueprintResolvedPieceInstance, + IBlueprintSegment, Time, -} from '..' -import { BlueprintQuickLookInfo } from './quickLoopInfo' +} from '../index.js' +import { BlueprintQuickLookInfo } from './quickLoopInfo.js' export interface IPartAndPieceActionContext { /** Information about the current loop, if there is one */ @@ -44,6 +45,8 @@ export interface IPartAndPieceActionContext { getPartInstanceForPreviousPiece(piece: IBlueprintPieceInstance): Promise /** Gets the Part for a Piece retrieved from findLastScriptedPieceOnLayer. This primarily allows for accessing metadata of the Part */ getPartForPreviousPiece(piece: IBlueprintPieceDB): Promise + /** Gets the Segment. This primarily allows for accessing metadata */ + getSegment(segment: 'current' | 'next'): Promise /** * Creative actions diff --git a/packages/blueprints-integration/src/context/playoutStore.ts b/packages/blueprints-integration/src/context/playoutStore.ts new file mode 100644 index 0000000000..8ecb499fd4 --- /dev/null +++ b/packages/blueprints-integration/src/context/playoutStore.ts @@ -0,0 +1,26 @@ +/** + * A store for persisting playout state between bluerpint method calls + * This belongs to the Playlist and will be discarded when the Playlist is reset + */ +export interface BlueprintPlayoutPersistentStore { + /** + * Get all the data in the store + */ + getAll(): Partial + /** + * Retrieve a key of data from the store + * @param k The key to retrieve + */ + getKey(k: K): T[K] | undefined + /** + * Update a key of data in the store + * @param k The key to update + * @param v The value to set + */ + setKey(k: K, v: T[K]): void + /** + * Replace all the data in the store + * @param obj The new data + */ + setAll(obj: T): void +} diff --git a/packages/blueprints-integration/src/context/processIngestDataContext.ts b/packages/blueprints-integration/src/context/processIngestDataContext.ts index 480732d753..8c2dfba90f 100644 --- a/packages/blueprints-integration/src/context/processIngestDataContext.ts +++ b/packages/blueprints-integration/src/context/processIngestDataContext.ts @@ -1,6 +1,6 @@ import type { IngestRundown, IngestSegment } from '@sofie-automation/shared-lib/dist/peripheralDevice/ingest' -import type { IStudioContext } from './studioContext' -import type { IngestDefaultChangesOptions, MutableIngestRundown, NrcsIngestChangeDetails } from '../ingest' +import type { IStudioContext } from './studioContext.js' +import type { IngestDefaultChangesOptions, MutableIngestRundown, NrcsIngestChangeDetails } from '../ingest.js' export interface IProcessIngestDataContext extends IStudioContext { /** @@ -64,7 +64,7 @@ export interface IProcessIngestDataContext extends IStudioContext { export interface GroupPartsInMosRundownAndChangesResult< TRundownPayload = unknown, TSegmentPayload = unknown, - TPartPayload = unknown + TPartPayload = unknown, > { nrcsIngestRundown: IngestRundown ingestChanges: NrcsIngestChangeDetails diff --git a/packages/blueprints-integration/src/context/rundownContext.ts b/packages/blueprints-integration/src/context/rundownContext.ts index fca5c599d8..9faf667fa3 100644 --- a/packages/blueprints-integration/src/context/rundownContext.ts +++ b/packages/blueprints-integration/src/context/rundownContext.ts @@ -1,9 +1,9 @@ -import type { IBlueprintSegmentRundown } from '../documents' -import type { IUserNotesContext } from './baseContext' -import type { IPackageInfoContext } from './packageInfoContext' -import type { IShowStyleContext } from './showStyleContext' -import type { IExecuteTSRActionsContext } from './executeTsrActionContext' -import type { IDataStoreMethods } from './adlibActionContext' +import type { IBlueprintSegmentRundown } from '../documents/index.js' +import type { IUserNotesContext } from './baseContext.js' +import type { IPackageInfoContext } from './packageInfoContext.js' +import type { IShowStyleContext } from './showStyleContext.js' +import type { IExecuteTSRActionsContext } from './executeTsrActionContext.js' +import type { IDataStoreMethods } from './adlibActionContext.js' export interface IRundownContext extends IShowStyleContext { readonly rundownId: string diff --git a/packages/blueprints-integration/src/context/showStyleContext.ts b/packages/blueprints-integration/src/context/showStyleContext.ts index 96197d0076..a182e3b507 100644 --- a/packages/blueprints-integration/src/context/showStyleContext.ts +++ b/packages/blueprints-integration/src/context/showStyleContext.ts @@ -1,8 +1,8 @@ -import type { IOutputLayer, ISourceLayer } from '../showStyle' -import type { IBlueprintRundownPlaylist } from '../documents' -import type { ICommonContext, IUserNotesContext } from './baseContext' -import type { IPackageInfoContext } from './packageInfoContext' -import type { IStudioContext } from './studioContext' +import type { IOutputLayer, ISourceLayer } from '../showStyle.js' +import type { IBlueprintRundownPlaylist } from '../documents/index.js' +import type { ICommonContext, IUserNotesContext } from './baseContext.js' +import type { IPackageInfoContext } from './packageInfoContext.js' +import type { IStudioContext } from './studioContext.js' export interface IShowStyleContext extends ICommonContext, IStudioContext { /** Returns a ShowStyle blueprint config. If ShowStyleBlueprintManifest.preprocessConfig is provided, a config preprocessed by that function is returned, otherwise it is returned unprocessed */ diff --git a/packages/blueprints-integration/src/context/studioContext.ts b/packages/blueprints-integration/src/context/studioContext.ts index 5ec53adbc6..30a24e4d60 100644 --- a/packages/blueprints-integration/src/context/studioContext.ts +++ b/packages/blueprints-integration/src/context/studioContext.ts @@ -1,6 +1,6 @@ import type { BlueprintMappings } from '@sofie-automation/shared-lib/dist/core/model/Timeline' -import type { ICommonContext, IUserNotesContext } from './baseContext' -import type { IPackageInfoContext } from './packageInfoContext' +import type { ICommonContext, IUserNotesContext } from './baseContext.js' +import type { IPackageInfoContext } from './packageInfoContext.js' export interface IStudioContext extends ICommonContext { /** The id of the studio */ diff --git a/packages/blueprints-integration/src/context/syncIngestChangesContext.ts b/packages/blueprints-integration/src/context/syncIngestChangesContext.ts index 090bb61366..e6917d443b 100644 --- a/packages/blueprints-integration/src/context/syncIngestChangesContext.ts +++ b/packages/blueprints-integration/src/context/syncIngestChangesContext.ts @@ -1,11 +1,11 @@ -import type { IRundownUserContext } from './rundownContext' +import type { IRundownUserContext } from './rundownContext.js' import type { IBlueprintMutatablePart, IBlueprintPartInstance, IBlueprintPiece, IBlueprintPieceInstance, -} from '../documents' -import type { IEventContext } from './eventContext' +} from '../documents/index.js' +import type { IEventContext } from './eventContext.js' export interface ISyncIngestUpdateToPartInstanceContext extends IRundownUserContext, IEventContext { /** Sync a pieceInstance. Inserts the pieceInstance if new, updates if existing. Optionally pass in a mutated Piece, to override the content of the instance */ diff --git a/packages/blueprints-integration/src/context/systemApplyConfigContext.ts b/packages/blueprints-integration/src/context/systemApplyConfigContext.ts index c1878ed75c..58d8f0ec19 100644 --- a/packages/blueprints-integration/src/context/systemApplyConfigContext.ts +++ b/packages/blueprints-integration/src/context/systemApplyConfigContext.ts @@ -1,5 +1,5 @@ -import type { IBlueprintDefaultCoreSystemTriggers } from '../triggers' -import type { ICommonContext } from './baseContext' +import type { IBlueprintDefaultCoreSystemTriggers } from '../triggers.js' +import type { ICommonContext } from './baseContext.js' export interface ICoreSystemApplyConfigContext extends ICommonContext { getDefaultSystemActionTriggers(): IBlueprintDefaultCoreSystemTriggers diff --git a/packages/blueprints-integration/src/documents/adlibPiece.ts b/packages/blueprints-integration/src/documents/adlibPiece.ts index a01d53f18a..148d668e15 100644 --- a/packages/blueprints-integration/src/documents/adlibPiece.ts +++ b/packages/blueprints-integration/src/documents/adlibPiece.ts @@ -1,4 +1,4 @@ -import type { IBlueprintPieceGeneric } from './pieceGeneric' +import type { IBlueprintPieceGeneric } from './pieceGeneric.js' export interface IBlueprintAdLibPiece extends IBlueprintPieceGeneric { diff --git a/packages/blueprints-integration/src/documents/index.ts b/packages/blueprints-integration/src/documents/index.ts index acd254dedb..d635e43be4 100644 --- a/packages/blueprints-integration/src/documents/index.ts +++ b/packages/blueprints-integration/src/documents/index.ts @@ -1,11 +1,11 @@ -export * from './adlibPiece' -export * from './expectedPlayoutItem' -export * from './part' -export * from './partInstance' -export * from './piece' -export * from './pieceInstance' -export * from './pieceGeneric' -export * from './playlistTiming' -export * from './rundown' -export * from './rundownPlaylist' -export * from './segment' +export * from './adlibPiece.js' +export * from './expectedPlayoutItem.js' +export * from './part.js' +export * from './partInstance.js' +export * from './piece.js' +export * from './pieceInstance.js' +export * from './pieceGeneric.js' +export * from './playlistTiming.js' +export * from './rundown.js' +export * from './rundownPlaylist.js' +export * from './segment.js' diff --git a/packages/blueprints-integration/src/documents/part.ts b/packages/blueprints-integration/src/documents/part.ts index 31b030869b..a45a5f8310 100644 --- a/packages/blueprints-integration/src/documents/part.ts +++ b/packages/blueprints-integration/src/documents/part.ts @@ -1,6 +1,6 @@ -import { UserEditingDefinition, UserEditingProperties } from '../userEditing' -import type { NoteSeverity } from '../lib' -import type { ITranslatableMessage } from '../translations' +import { UserEditingDefinition, UserEditingProperties } from '../userEditing.js' +import type { NoteSeverity } from '../lib.js' +import type { ITranslatableMessage } from '../translations.js' /** Timings for the inTransition, when supported and allowed */ export interface IBlueprintPartInTransition { diff --git a/packages/blueprints-integration/src/documents/partInstance.ts b/packages/blueprints-integration/src/documents/partInstance.ts index b9851ea3dc..d217e690f8 100644 --- a/packages/blueprints-integration/src/documents/partInstance.ts +++ b/packages/blueprints-integration/src/documents/partInstance.ts @@ -1,5 +1,5 @@ -import type { Time } from '../common' -import type { IBlueprintPartDB } from './part' +import type { Time } from '../common.js' +import type { IBlueprintPartDB } from './part.js' export type PartEndState = unknown diff --git a/packages/blueprints-integration/src/documents/piece.ts b/packages/blueprints-integration/src/documents/piece.ts index 274d796bd0..7880931b67 100644 --- a/packages/blueprints-integration/src/documents/piece.ts +++ b/packages/blueprints-integration/src/documents/piece.ts @@ -1,5 +1,5 @@ -import { UserEditingDefinition, UserEditingProperties } from '../userEditing' -import type { IBlueprintPieceGeneric } from './pieceGeneric' +import { UserEditingDefinition, UserEditingProperties } from '../userEditing.js' +import type { IBlueprintPieceGeneric } from './pieceGeneric.js' /** Special types of pieces. Some are not always used in all circumstances */ export enum IBlueprintPieceType { diff --git a/packages/blueprints-integration/src/documents/pieceGeneric.ts b/packages/blueprints-integration/src/documents/pieceGeneric.ts index 32161577c3..10384ce440 100644 --- a/packages/blueprints-integration/src/documents/pieceGeneric.ts +++ b/packages/blueprints-integration/src/documents/pieceGeneric.ts @@ -1,9 +1,9 @@ import { PieceLifespan } from '@sofie-automation/shared-lib/dist/core/model/Rundown' -import type { PieceAbSessionInfo } from '../abPlayback' -import type { ActionUserData } from '../action' -import type { SomeContent, WithTimeline } from '../content' -import type { ExpectedPackage } from '../package' -import type { ExpectedPlayoutItemGeneric } from './expectedPlayoutItem' +import type { PieceAbSessionInfo } from '../abPlayback.js' +import type { ActionUserData } from '../action.js' +import type { SomeContent, WithTimeline } from '../content.js' +import type { ExpectedPackage } from '../package.js' +import type { ExpectedPlayoutItemGeneric } from './expectedPlayoutItem.js' export { PieceLifespan } @@ -34,6 +34,7 @@ export interface IBlueprintPieceGeneric { _id: string diff --git a/packages/blueprints-integration/src/documents/playlistTiming.ts b/packages/blueprints-integration/src/documents/playlistTiming.ts index 5be9df3eee..8df93b68d2 100644 --- a/packages/blueprints-integration/src/documents/playlistTiming.ts +++ b/packages/blueprints-integration/src/documents/playlistTiming.ts @@ -1,4 +1,4 @@ -import { Time } from '../common' +import { Time } from '../common.js' export enum PlaylistTimingType { None = 'none', diff --git a/packages/blueprints-integration/src/documents/rundown.ts b/packages/blueprints-integration/src/documents/rundown.ts index 8abd22f33c..361efe22d0 100644 --- a/packages/blueprints-integration/src/documents/rundown.ts +++ b/packages/blueprints-integration/src/documents/rundown.ts @@ -1,5 +1,5 @@ -import type { UserEditingDefinition } from '../userEditing' -import type { RundownPlaylistTiming } from './playlistTiming' +import type { UserEditingDefinition } from '../userEditing.js' +import type { RundownPlaylistTiming } from './playlistTiming.js' /** The Rundown generated from Blueprint */ diff --git a/packages/blueprints-integration/src/documents/rundownPlaylist.ts b/packages/blueprints-integration/src/documents/rundownPlaylist.ts index b4199dbc8d..2efcea1e3b 100644 --- a/packages/blueprints-integration/src/documents/rundownPlaylist.ts +++ b/packages/blueprints-integration/src/documents/rundownPlaylist.ts @@ -1,5 +1,5 @@ -import type { Time } from '../common' -import type { RundownPlaylistTiming } from './playlistTiming' +import type { Time } from '../common.js' +import type { RundownPlaylistTiming } from './playlistTiming.js' /** Playlist, as generated from Blueprints */ diff --git a/packages/blueprints-integration/src/documents/segment.ts b/packages/blueprints-integration/src/documents/segment.ts index 36502a893a..0a929cd223 100644 --- a/packages/blueprints-integration/src/documents/segment.ts +++ b/packages/blueprints-integration/src/documents/segment.ts @@ -1,4 +1,4 @@ -import { UserEditingDefinition, UserEditingProperties } from '../userEditing' +import { UserEditingDefinition, UserEditingProperties } from '../userEditing.js' export enum SegmentDisplayMode { Timeline = 'timeline', diff --git a/packages/blueprints-integration/src/index.ts b/packages/blueprints-integration/src/index.ts index 4eb1fa41a5..f4eb7bf06f 100644 --- a/packages/blueprints-integration/src/index.ts +++ b/packages/blueprints-integration/src/index.ts @@ -1,26 +1,27 @@ -export * from './abPlayback' -export * from './action' -export * from './api' -export * from './common' -export * from './content' -export * from './context' -export * from './documents' -export * from './ingest' -export * from './ingest-types' -export * from './lib' -export * from './message' -export * from './migrations' -export * from './package' -export * from './packageInfo' -export * from './documents' -export * from './showStyle' -export * from './status' -export * from './studio' -export * from './timeline' -export * from './util' -export * from './translations' -export * from './triggers' -export * from './userEditing' +export * from './abPlayback.js' +export * from './action.js' +export * from './api/index.js' +export * from './common.js' +export * from './content.js' +export * from './context/index.js' +export * from './documents/index.js' +export * from './ingest.js' +export * from './ingest-types.js' +export * from './lib.js' +export * from './message.js' +export * from './migrations.js' +export * from './package.js' +export * from './packageInfo.js' +export * from './documents/index.js' +export * from './showStyle.js' +export * from './status.js' +export * from './studio.js' +export * from './timeline.js' +export * from './util.js' +export * from './translations.js' +export * from './triggers.js' +export * from './userEditing.js' +export * from './previews.js' export { MOS } from '@sofie-automation/shared-lib/dist/mos' diff --git a/packages/blueprints-integration/src/ingest-types.ts b/packages/blueprints-integration/src/ingest-types.ts index 0e7a27aa97..716c747200 100644 --- a/packages/blueprints-integration/src/ingest-types.ts +++ b/packages/blueprints-integration/src/ingest-types.ts @@ -1,4 +1,4 @@ -import { IngestPart, IngestPlaylist, IngestRundown, IngestSegment } from './ingest' +import { IngestPart, IngestPlaylist, IngestRundown, IngestSegment } from './ingest.js' export interface SofieIngestPlaylist extends IngestPlaylist { /** Ingest cache of rundowns in this playlist. */ diff --git a/packages/blueprints-integration/src/ingest.ts b/packages/blueprints-integration/src/ingest.ts index 6051082eb4..5a96109936 100644 --- a/packages/blueprints-integration/src/ingest.ts +++ b/packages/blueprints-integration/src/ingest.ts @@ -1,7 +1,7 @@ import { IngestPart, IngestSegment } from '@sofie-automation/shared-lib/dist/peripheralDevice/ingest' -import { IBlueprintRundownDBData } from './documents' +import { IBlueprintRundownDBData } from './documents/index.js' import { ReadonlyDeep } from 'type-fest' -import { SofieIngestRundown } from './ingest-types' +import { SofieIngestRundown } from './ingest-types.js' export { IngestPart, @@ -443,7 +443,7 @@ export type TransformPayloadFunction = (payload: any, oldPayload: ReadonlyDee export interface IngestDefaultChangesOptions< TRundownPayload = unknown, TSegmentPayload = unknown, - TPartPayload = unknown + TPartPayload = unknown, > { /** * A custom transform for the payload of a Rundown. diff --git a/packages/blueprints-integration/src/lib.ts b/packages/blueprints-integration/src/lib.ts index 32808e1838..363050bf5f 100644 --- a/packages/blueprints-integration/src/lib.ts +++ b/packages/blueprints-integration/src/lib.ts @@ -1,6 +1,6 @@ import { PeripheralDeviceId } from '@sofie-automation/shared-lib/dist/core/model/Ids' import { SubdeviceAction } from '@sofie-automation/shared-lib/dist/core/deviceConfigManifest' -import { TSR } from './timeline' +import { TSR } from './timeline.js' export type Omit = Pick> diff --git a/packages/blueprints-integration/src/message.ts b/packages/blueprints-integration/src/message.ts index 74c7841e6a..399a1de7b7 100644 --- a/packages/blueprints-integration/src/message.ts +++ b/packages/blueprints-integration/src/message.ts @@ -1,4 +1,4 @@ -import { Time } from './common' +import { Time } from './common.js' export interface IBlueprintExternalMessageQueueObj { /** If set, the message references an existing message (that is to be overrritten) */ diff --git a/packages/blueprints-integration/src/migrations.ts b/packages/blueprints-integration/src/migrations.ts index 62d3d4913f..19824af1d9 100644 --- a/packages/blueprints-integration/src/migrations.ts +++ b/packages/blueprints-integration/src/migrations.ts @@ -1,4 +1,4 @@ -import { IBlueprintTriggeredActions } from './triggers' +import { IBlueprintTriggeredActions } from './triggers.js' export interface MigrationStepInput { stepId?: string // automatically filled in later @@ -49,7 +49,7 @@ export type MigrationContextSystem = MigrationContextWithTriggeredActions export interface MigrationStepBase< TValidate extends ValidateFunction, TMigrate extends MigrateFunction, - TInput extends InputFunction + TInput extends InputFunction, > { /** Unique id for this step */ id: string @@ -82,7 +82,7 @@ export interface MigrationStepBase< export interface MigrationStep< TValidate extends ValidateFunction, TMigrate extends MigrateFunction, - TInput extends InputFunction + TInput extends InputFunction, > extends MigrationStepBase { /** The version this Step applies to */ version: string diff --git a/packages/blueprints-integration/src/packageInfo.ts b/packages/blueprints-integration/src/packageInfo.ts index f1fd84bce4..b791c80e9d 100644 --- a/packages/blueprints-integration/src/packageInfo.ts +++ b/packages/blueprints-integration/src/packageInfo.ts @@ -1,2 +1 @@ -// eslint-disable-next-line @typescript-eslint/no-namespace export * from '@sofie-automation/shared-lib/dist/package-manager/packageInfo' diff --git a/packages/blueprints-integration/src/previews.ts b/packages/blueprints-integration/src/previews.ts new file mode 100644 index 0000000000..038461a359 --- /dev/null +++ b/packages/blueprints-integration/src/previews.ts @@ -0,0 +1,78 @@ +import { SplitsContentBoxContent, SplitsContentBoxProperties } from './content.js' +import { NoteSeverity } from './lib.js' +import { ITranslatableMessage } from './translations.js' + +export interface PopupPreview

{ + name?: string + preview?: P + warnings?: InvalidPreview[] +} +export type Previews = TablePreview | ScriptPreview | HTMLPreview | SplitPreview | VTPreview | BlueprintImagePreview + +export enum PreviewType { + Invalid = 'invalid', + Table = 'table', + Script = 'script', + HTML = 'html', + Split = 'split', + VT = 'vt', + BlueprintImage = 'blueprintImage', +} + +interface PreviewBase { + type: PreviewType +} + +export interface InvalidPreview extends PreviewBase { + type: PreviewType.Invalid + + severity: NoteSeverity + reason: ITranslatableMessage +} +export interface TablePreview extends PreviewBase { + type: PreviewType.Table + + entries: { key: string; value: string }[] + displayTiming: boolean +} +export interface ScriptPreview extends PreviewBase { + type: PreviewType.Script + + fullText?: string + lastWords?: string + comment?: string + lastModified?: number +} +export interface HTMLPreview extends PreviewBase { + // todo - expose if and how steps can be controlled + type: PreviewType.HTML + + name?: string + + previewUrl: string + previewDimension?: { width: number; height: number } + + postMessageOnLoad?: any + + steps?: { current: number; total: number } +} +export interface SplitPreview extends PreviewBase { + type: PreviewType.Split + + background?: string // file asset upload? + boxes: (SplitsContentBoxContent & SplitsContentBoxProperties)[] +} +export interface VTPreview extends PreviewBase { + type: PreviewType.VT + + // note: the info required for the preview follows from package manager so there's nothing for blueprins here + // note: if we want to allow a preview for different media than saved on the piece (because perhaps the media is in a non-primary piece) should we allow to specifiy the package to preview? + + inWords?: string // note - only displayed if outWords are present + outWords?: string +} +export interface BlueprintImagePreview extends PreviewBase { + type: PreviewType.BlueprintImage + + image: string // to be put in as asset +} diff --git a/packages/blueprints-integration/src/showStyle.ts b/packages/blueprints-integration/src/showStyle.ts index 64e8feda69..17b9aeacdd 100644 --- a/packages/blueprints-integration/src/showStyle.ts +++ b/packages/blueprints-integration/src/showStyle.ts @@ -1,5 +1,5 @@ import { ISourceLayer, IOutputLayer } from '@sofie-automation/shared-lib/dist/core/model/ShowStyle' -import { IBlueprintConfig } from './common' +import { IBlueprintConfig } from './common.js' export interface IBlueprintShowStyleBase { _id: string diff --git a/packages/blueprints-integration/src/timeline.ts b/packages/blueprints-integration/src/timeline.ts index 91ffd1d80c..501caea005 100644 --- a/packages/blueprints-integration/src/timeline.ts +++ b/packages/blueprints-integration/src/timeline.ts @@ -20,7 +20,7 @@ export enum TimelineObjClassesCore { export interface OnGenerateTimelineObj< TContent extends { deviceType: TSR.DeviceType }, TMetadata = unknown, - TKeyframeMetadata = unknown + TKeyframeMetadata = unknown, > extends TimelineObjectCoreExt { pieceInstanceId?: string } diff --git a/packages/blueprints-integration/src/triggers.ts b/packages/blueprints-integration/src/triggers.ts index faca7a2847..22691a309b 100644 --- a/packages/blueprints-integration/src/triggers.ts +++ b/packages/blueprints-integration/src/triggers.ts @@ -1,5 +1,5 @@ -import { SourceLayerType } from './content' -import { ITranslatableMessage } from './translations' +import { SourceLayerType } from './content.js' +import { ITranslatableMessage } from './translations.js' import { SomeActionIdentifier, ClientActions, diff --git a/packages/blueprints-integration/src/userEditing.ts b/packages/blueprints-integration/src/userEditing.ts index e8799d0c97..4bed37db8d 100644 --- a/packages/blueprints-integration/src/userEditing.ts +++ b/packages/blueprints-integration/src/userEditing.ts @@ -1,8 +1,8 @@ import type { JSONBlob } from '@sofie-automation/shared-lib/dist/lib/JSONBlob' -import type { ITranslatableMessage } from './translations' +import type { ITranslatableMessage } from './translations.js' import { JSONSchema } from '@sofie-automation/shared-lib/dist/lib/JSONSchemaTypes' -import { SourceLayerType } from './content' -import { DefaultUserOperationsTypes } from './ingest' +import { SourceLayerType } from './content.js' +import { DefaultUserOperationsTypes } from './ingest.js' /** * Description of a user performed editing operation allowed on an document @@ -21,10 +21,16 @@ export interface UserEditingDefinitionAction { id: string /** Label to show to the user for this operation */ label: ITranslatableMessage - /** Icon to show when this action is 'active' */ - svgIcon?: string - /** Icon to show when this action is 'disabled' */ - svgIconInactive?: string + /** Icon to show when this action is 'active' + * + * This can either be a relative URL to an image in the Blueprints assets or a `data:` URL + */ + icon?: string + /** Icon to show when this action is 'disabled' + * + * This can either be a relative URL to an image in the Blueprints assets or a `data:` URL + */ + iconInactive?: string /** Whether this action should be indicated as being active */ isActive?: boolean } diff --git a/packages/corelib/.eslintrc.json b/packages/corelib/.eslintrc.json deleted file mode 100644 index 3b809efa88..0000000000 --- a/packages/corelib/.eslintrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "../node_modules/@sofie-automation/code-standard-preset/eslint/main" -} diff --git a/packages/corelib/eslint.config.mjs b/packages/corelib/eslint.config.mjs new file mode 100644 index 0000000000..b9e5a88fd8 --- /dev/null +++ b/packages/corelib/eslint.config.mjs @@ -0,0 +1,3 @@ +import { generateEslintConfig } from '@sofie-automation/code-standard-preset/eslint/main.mjs' + +export default generateEslintConfig({}) diff --git a/packages/corelib/jest.config.js b/packages/corelib/jest.config.js index 2fe89196ee..76ff2b14f1 100644 --- a/packages/corelib/jest.config.js +++ b/packages/corelib/jest.config.js @@ -9,6 +9,9 @@ module.exports = { }, ], }, + moduleNameMapper: { + '(.+)\\.js$': '$1', + }, testMatch: ['**/__tests__/**/*.(spec|test).(ts|js)'], testPathIgnorePatterns: ['integrationTests'], testEnvironment: 'node', diff --git a/packages/corelib/package.json b/packages/corelib/package.json index 74acc20030..135d3920b6 100644 --- a/packages/corelib/package.json +++ b/packages/corelib/package.json @@ -1,6 +1,6 @@ { "name": "@sofie-automation/corelib", - "version": "1.52.0", + "version": "1.53.0-in-development", "private": true, "description": "Internal library for some types shared by core and workers", "main": "dist/index.js", @@ -18,7 +18,7 @@ "scripts": { "build": "run -T rimraf dist && run build:main", "build:main": "run -T tsc -p tsconfig.build.json", - "lint:raw": "run -T eslint --ext .ts --ext .js --ignore-pattern dist", + "lint:raw": "run -T eslint", "lint": "run lint:raw .", "unit": "run -T jest", "test": "run lint && run unit", @@ -30,7 +30,7 @@ "license-validate": "run -T sofie-licensecheck" }, "engines": { - "node": ">=22.11" + "node": ">=22.13.1" }, "files": [ "/dist", @@ -39,8 +39,8 @@ "/LICENSE" ], "dependencies": { - "@sofie-automation/blueprints-integration": "1.52.0", - "@sofie-automation/shared-lib": "1.52.0", + "@sofie-automation/blueprints-integration": "1.53.0-in-development", + "@sofie-automation/shared-lib": "1.53.0-in-development", "fast-clone": "^1.5.13", "i18next": "^21.10.0", "influx": "^5.9.7", @@ -53,7 +53,7 @@ "underscore": "^1.13.7" }, "peerDependencies": { - "mongodb": "^5.5.0" + "mongodb": "^6.12.0" }, "prettier": "@sofie-automation/code-standard-preset/.prettierrc.json", "lint-staged": { diff --git a/packages/corelib/src/TranslatableMessage.ts b/packages/corelib/src/TranslatableMessage.ts index fcf3f8d007..b3a905b777 100644 --- a/packages/corelib/src/TranslatableMessage.ts +++ b/packages/corelib/src/TranslatableMessage.ts @@ -1,7 +1,7 @@ import { ITranslatableMessage as IBlueprintTranslatableMessage } from '@sofie-automation/blueprints-integration' import { TFunction } from 'i18next' import { ReadonlyDeep } from 'type-fest' -import { BlueprintId } from './dataModel/Ids' +import { BlueprintId } from './dataModel/Ids.js' /** * @enum - A translatable message (i18next) @@ -44,6 +44,7 @@ export function interpollateTranslation(key: unknown, ...args: any[]): string { } if (typeof args[0] === 'string') { + // eslint-disable-next-line @typescript-eslint/no-base-to-string return String(key || args[0]) } @@ -117,7 +118,7 @@ export function wrapTranslatableMessageFromBlueprintsIfNotString( : { ...message, namespaces: blueprintIds.map((id) => `blueprint_${id}`), - } + } } function checkArgs(args: any): args is { [key: string]: any } { diff --git a/packages/corelib/src/__tests__/error.spec.ts b/packages/corelib/src/__tests__/error.spec.ts index 1116728509..9bc4a3e1f6 100644 --- a/packages/corelib/src/__tests__/error.spec.ts +++ b/packages/corelib/src/__tests__/error.spec.ts @@ -1,5 +1,5 @@ import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' -import { UserError, UserErrorMessage } from '../error' +import { UserError, UserErrorMessage } from '../error.js' describe('UserError', () => { test('stringifyError', () => { @@ -8,18 +8,24 @@ describe('UserError', () => { const userError = UserError.from(rawError, UserErrorMessage.PartNotFound, { key: 'translatable message' }) expect(stringifyError(userError)).toEqual( - 'UserError: ' + - JSON.stringify({ - rawError: 'Error: raw, mock stack', - message: { - key: 'The selected part does not exist', - args: { - key: 'translatable message', + expect.stringContaining( + 'UserError: ' + + JSON.stringify({ + rawError: { + name: 'UserError', + message: 'raw', + stack: 'mock stack', }, - }, - key: 25, - errorCode: 500, - }) + userMessage: { + key: 'The selected part does not exist', + args: { + key: 'translatable message', + }, + }, + key: 25, + errorCode: 500, + }) + ) ) // serialized and restored diff --git a/packages/corelib/src/__tests__/lib.spec.ts b/packages/corelib/src/__tests__/lib.spec.ts index 6c2afc73df..a2d17cdcbe 100644 --- a/packages/corelib/src/__tests__/lib.spec.ts +++ b/packages/corelib/src/__tests__/lib.spec.ts @@ -1,5 +1,5 @@ import { TSR } from '@sofie-automation/blueprints-integration' -import { TimelineObjGeneric, TimelineObjType } from '../dataModel/Timeline' +import { TimelineObjGeneric, TimelineObjType } from '../dataModel/Timeline.js' import { formatDateAsTimecode, formatDurationAsTimecode, @@ -10,8 +10,8 @@ import { objectPathSet, removeNullyProperties, stringifyObjects, -} from '../lib' -import { UserError, UserErrorMessage } from '../error' +} from '../lib.js' +import { UserError, UserErrorMessage } from '../error.js' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' describe('Lib', () => { @@ -138,14 +138,22 @@ describe('Lib', () => { // The stringification should trigger .toString() -> .toJSON() in UserError: const str = stringifyError(userError) expect(str).toMatch(/^UserError: /) - expect(JSON.parse(str.replace('UserError: ', ''))).toMatchObject({ + + // This trim is not nice, but necessary to strip off some of the error wrapping. This shouldn't be done anywhere else, but we need to for this test + let strTrimmed = str.slice('UserError: '.length) + strTrimmed = strTrimmed.slice(0, strTrimmed.indexOf('}, Error:') + 1) + expect(JSON.parse(strTrimmed)).toMatchObject({ errorCode: 42, key: UserErrorMessage.ValidationFailed, - message: { + userMessage: { key: 'Validation failed!', args: {}, }, - rawError: expect.stringMatching(/Error: Hello/), + rawError: { + name: expect.stringContaining('Error'), + message: 'Hello', + stack: expect.stringContaining('Error: Hello'), + }, }) // Array of stuff: diff --git a/packages/corelib/src/__tests__/mongo.spec.ts b/packages/corelib/src/__tests__/mongo.spec.ts index 5bea16192c..aad4a23658 100644 --- a/packages/corelib/src/__tests__/mongo.spec.ts +++ b/packages/corelib/src/__tests__/mongo.spec.ts @@ -1,5 +1,5 @@ -import { protectString, ProtectedString } from '../protectedString' -import { FindOptions, mongoFindOptions, MongoQuery, mongoWhere } from '../mongo' +import { protectString, ProtectedString } from '../protectedString.js' +import { FindOptions, mongoFindOptions, MongoQuery, mongoWhere } from '../mongo.js' describe('mongoFindOptions', () => { const rawDocs = ['1', '2', '3', '4', '5', '6', '7'].map((s) => ({ _id: protectString(s) })) diff --git a/packages/corelib/src/dataModel/AdLibPiece.ts b/packages/corelib/src/dataModel/AdLibPiece.ts index 1c21e5a61a..93dcbf6ca3 100644 --- a/packages/corelib/src/dataModel/AdLibPiece.ts +++ b/packages/corelib/src/dataModel/AdLibPiece.ts @@ -1,6 +1,6 @@ import { IBlueprintAdLibPiece, SomeContent } from '@sofie-automation/blueprints-integration' -import { RundownId, PartId } from './Ids' -import { PieceGeneric } from './Piece' +import { RundownId, PartId } from './Ids.js' +import { PieceGeneric } from './Piece.js' export interface AdLibPiece extends PieceGeneric, Omit { /** Rundown this AdLib belongs to */ diff --git a/packages/corelib/src/dataModel/AdlibAction.ts b/packages/corelib/src/dataModel/AdlibAction.ts index 86a05c9734..5932a40143 100644 --- a/packages/corelib/src/dataModel/AdlibAction.ts +++ b/packages/corelib/src/dataModel/AdlibAction.ts @@ -1,8 +1,8 @@ import { IBlueprintActionManifest } from '@sofie-automation/blueprints-integration' -import { ArrayElement } from '../lib' -import { ITranslatableMessage } from '../TranslatableMessage' -import { ProtectedStringProperties } from '../protectedString' -import { RundownId, AdLibActionId, PartId } from './Ids' +import { ArrayElement } from '../lib.js' +import { ITranslatableMessage } from '../TranslatableMessage.js' +import { ProtectedStringProperties } from '../protectedString.js' +import { RundownId, AdLibActionId, PartId } from './Ids.js' /** The following extended interface allows assigning namespace information to the actions as they are stored in the * database after being emitted from the blueprints diff --git a/packages/corelib/src/dataModel/Blueprint.ts b/packages/corelib/src/dataModel/Blueprint.ts index acd7442399..ed3e2cbfbf 100644 --- a/packages/corelib/src/dataModel/Blueprint.ts +++ b/packages/corelib/src/dataModel/Blueprint.ts @@ -6,8 +6,8 @@ import { } from '@sofie-automation/blueprints-integration' import { JSONBlob } from '@sofie-automation/shared-lib/dist/lib/JSONBlob' import { JSONSchema } from '@sofie-automation/shared-lib/dist/lib/JSONSchemaTypes' -import { ProtectedString } from '../protectedString' -import { BlueprintId, OrganizationId } from './Ids' +import { ProtectedString } from '../protectedString.js' +import { BlueprintId, OrganizationId } from './Ids.js' import type { PackageStatusMessage } from '@sofie-automation/shared-lib/dist/packageStatusMessages' export type BlueprintHash = ProtectedString<'BlueprintHash'> diff --git a/packages/meteor-lib/src/collections/Buckets.ts b/packages/corelib/src/dataModel/Bucket.ts similarity index 90% rename from packages/meteor-lib/src/collections/Buckets.ts rename to packages/corelib/src/dataModel/Bucket.ts index 72750e7507..72d84885e7 100644 --- a/packages/meteor-lib/src/collections/Buckets.ts +++ b/packages/corelib/src/dataModel/Bucket.ts @@ -1,4 +1,4 @@ -import { BucketId, StudioId } from '@sofie-automation/corelib/dist/dataModel/Ids' +import { BucketId, StudioId } from './Ids.js' /** * A Bucket is an container for AdLib pieces that do not come from a MOS gateway and are diff --git a/packages/corelib/src/dataModel/BucketAdLibAction.ts b/packages/corelib/src/dataModel/BucketAdLibAction.ts index 7fc0313871..d997550042 100644 --- a/packages/corelib/src/dataModel/BucketAdLibAction.ts +++ b/packages/corelib/src/dataModel/BucketAdLibAction.ts @@ -1,7 +1,7 @@ -import { BucketAdLibActionId, BucketId, StudioId, ShowStyleVariantId, ShowStyleBaseId } from './Ids' -import { RundownImportVersions } from './Rundown' -import { AdLibActionCommon } from './AdlibAction' -import { BucketAdLibIngestInfo } from './BucketAdLibPiece' +import { BucketAdLibActionId, BucketId, StudioId, ShowStyleVariantId, ShowStyleBaseId } from './Ids.js' +import { RundownImportVersions } from './Rundown.js' +import { AdLibActionCommon } from './AdlibAction.js' +import { BucketAdLibIngestInfo } from './BucketAdLibPiece.js' export interface BucketAdLibAction extends Omit { _id: BucketAdLibActionId diff --git a/packages/corelib/src/dataModel/BucketAdLibPiece.ts b/packages/corelib/src/dataModel/BucketAdLibPiece.ts index 8af1a4fbeb..33df647efa 100644 --- a/packages/corelib/src/dataModel/BucketAdLibPiece.ts +++ b/packages/corelib/src/dataModel/BucketAdLibPiece.ts @@ -1,7 +1,7 @@ import { IBlueprintAdLibPiece, IngestAdlib, SomeContent } from '@sofie-automation/blueprints-integration' -import { BucketAdLibId, BucketId, StudioId, ShowStyleVariantId, ShowStyleBaseId } from './Ids' -import { PieceTimelineObjectsBlob } from './Piece' -import { RundownImportVersions } from './Rundown' +import { BucketAdLibId, BucketId, StudioId, ShowStyleVariantId, ShowStyleBaseId } from './Ids.js' +import { PieceTimelineObjectsBlob } from './Piece.js' +import { RundownImportVersions } from './Rundown.js' /** * Information used to 'ingest' a Bucket Adlib item diff --git a/packages/corelib/src/dataModel/Collections.ts b/packages/corelib/src/dataModel/Collections.ts index 8f2dd0f5fc..7eb49491ee 100644 --- a/packages/corelib/src/dataModel/Collections.ts +++ b/packages/corelib/src/dataModel/Collections.ts @@ -8,7 +8,6 @@ export enum CollectionName { Buckets = 'buckets', CoreSystem = 'coreSystem', Evaluations = 'evaluations', - ExpectedMediaItems = 'expectedMediaItems', ExpectedPackages = 'expectedPackages', ExpectedPackageWorkStatuses = 'expectedPackageWorkStatuses', ExpectedPlayoutItems = 'expectedPlayoutItems', @@ -16,8 +15,6 @@ export enum CollectionName { NrcsIngestDataCache = 'ingestDataCache', // Future: this could be renamed to nrcsIngestDataCache SofieIngestDataCache = 'sofieIngestDataCache', MediaObjects = 'mediaObjects', - MediaWorkFlows = 'mediaWorkFlows', - MediaWorkFlowSteps = 'mediaWorkFlowSteps', Notifications = 'notifications', Organizations = 'organizations', PartInstances = 'partInstances', @@ -48,3 +45,10 @@ export enum CollectionName { Workers = 'workers', WorkerThreads = 'workersThreads', } + +/** + * Ids of possible Custom collections, populated by DDP subscriptions + */ +export enum CustomCollectionName { + UIPieceContentStatuses = 'uiPieceContentStatuses', +} diff --git a/packages/corelib/src/dataModel/ExpectedMediaItem.ts b/packages/corelib/src/dataModel/ExpectedMediaItem.ts deleted file mode 100644 index ea22040f9f..0000000000 --- a/packages/corelib/src/dataModel/ExpectedMediaItem.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { Time } from '@sofie-automation/blueprints-integration' -import { ExpectedMediaItemId, StudioId, RundownId, PartId, BucketId, PieceId, AdLibActionId } from './Ids' - -/** @deprecated */ -export interface ExpectedMediaItemBase { - _id: ExpectedMediaItemId - - /** Source label that can be used to identify the EMI */ - label?: string - - /** Local path to the media object */ - path: string - - /** Global path to the media object */ - url: string - - /** The studio installation this ExpectedMediaItem was generated in */ - studioId: StudioId - - /** True if the media item has been marked as possibly unavailable */ - disabled: boolean - - /** A label defining a pool of resources */ - mediaFlowId: string - - /** The last time the object was seen / used in Core */ - lastSeen: Time - - /** Time to wait before removing file */ - lingerTime?: number - - /** Frame that media manager should grab for thumbnail preview */ - previewFrame?: number -} -/** @deprecated */ -export interface ExpectedMediaItemRundown extends ExpectedMediaItemBase { - /** The rundown id that is the source of this MediaItem */ - rundownId: RundownId - - /** The part id that is the source of this Media Item */ - partId: PartId | undefined -} -/** @deprecated */ -export interface ExpectedMediaItemBucketPiece extends ExpectedMediaItemBase { - /** The bucket id that is the source of this Media Item */ - bucketId: BucketId - - /** The bucked adLib piece that is the source of this Media Item */ - bucketAdLibPieceId: PieceId -} -/** @deprecated */ -export interface ExpectedMediaItemBucketAction extends ExpectedMediaItemBase { - /** The bucket id that is the source of this Media Item */ - bucketId: BucketId - - /** The bucked adLib piece that is the source of this Media Item */ - bucketAdLibActionId: AdLibActionId -} -/** @deprecated */ -export type ExpectedMediaItem = ExpectedMediaItemRundown | ExpectedMediaItemBucketPiece | ExpectedMediaItemBucketAction diff --git a/packages/corelib/src/dataModel/ExpectedPackageWorkStatuses.ts b/packages/corelib/src/dataModel/ExpectedPackageWorkStatuses.ts index e222424f69..68f682ebdf 100644 --- a/packages/corelib/src/dataModel/ExpectedPackageWorkStatuses.ts +++ b/packages/corelib/src/dataModel/ExpectedPackageWorkStatuses.ts @@ -1,6 +1,6 @@ import { ExpectedPackageStatusAPI, Time } from '@sofie-automation/blueprints-integration' -import { ExpectedPackageDBBase } from './ExpectedPackages' -import { ExpectedPackageWorkStatusId, PeripheralDeviceId } from './Ids' +import { ExpectedPackageDBBase } from './ExpectedPackages.js' +import { ExpectedPackageWorkStatusId, PeripheralDeviceId } from './Ids.js' /** * ExpectedPackageWorkStatus contains statuses about Work that is being performed on expected packages diff --git a/packages/corelib/src/dataModel/ExpectedPackages.ts b/packages/corelib/src/dataModel/ExpectedPackages.ts index 404fd2bfdd..1597ed1d45 100644 --- a/packages/corelib/src/dataModel/ExpectedPackages.ts +++ b/packages/corelib/src/dataModel/ExpectedPackages.ts @@ -1,6 +1,6 @@ import { ExpectedPackage, Time } from '@sofie-automation/blueprints-integration' -import { protectString } from '../protectedString' -import { getHash, hashObj } from '../lib' +import { protectString } from '../protectedString.js' +import { getHash, hashObj } from '../lib.js' import { AdLibActionId, BucketAdLibActionId, @@ -14,7 +14,7 @@ import { RundownId, SegmentId, StudioId, -} from './Ids' +} from './Ids.js' import { ReadonlyDeep } from 'type-fest' /* diff --git a/packages/corelib/src/dataModel/ExpectedPlayoutItem.ts b/packages/corelib/src/dataModel/ExpectedPlayoutItem.ts index a2a3d9ecc1..efd410356e 100644 --- a/packages/corelib/src/dataModel/ExpectedPlayoutItem.ts +++ b/packages/corelib/src/dataModel/ExpectedPlayoutItem.ts @@ -1,5 +1,5 @@ import { ExpectedPlayoutItemGeneric } from '@sofie-automation/blueprints-integration' -import { ExpectedPlayoutItemId, StudioId, RundownId, PartId } from './Ids' +import { ExpectedPlayoutItemId, StudioId, RundownId, PartId } from './Ids.js' export interface ExpectedPlayoutItemBase extends ExpectedPlayoutItemGeneric { /** Globally unique id of the item */ diff --git a/packages/corelib/src/dataModel/ExternalMessageQueue.ts b/packages/corelib/src/dataModel/ExternalMessageQueue.ts index d84fbd08f1..6f1021776d 100644 --- a/packages/corelib/src/dataModel/ExternalMessageQueue.ts +++ b/packages/corelib/src/dataModel/ExternalMessageQueue.ts @@ -3,8 +3,8 @@ import { Time, IBlueprintExternalMessageQueueType, } from '@sofie-automation/blueprints-integration' -import { ProtectedStringProperties } from '../protectedString' -import { ExternalMessageQueueObjId, StudioId, RundownId } from './Ids' +import { ProtectedStringProperties } from '../protectedString.js' +import { ExternalMessageQueueObjId, StudioId, RundownId } from './Ids.js' export interface ExternalMessageQueueObj extends ProtectedStringProperties { _id: ExternalMessageQueueObjId diff --git a/packages/corelib/src/dataModel/Ids.ts b/packages/corelib/src/dataModel/Ids.ts index 37d77d3bf8..ca94063e40 100644 --- a/packages/corelib/src/dataModel/Ids.ts +++ b/packages/corelib/src/dataModel/Ids.ts @@ -1,4 +1,4 @@ -import { ProtectedString } from '../protectedString' +import { ProtectedString } from '../protectedString.js' /** A string, identifying an activation of a playlist */ export type ActiveInstanceId = ProtectedString<'ActiveInstanceId'> @@ -15,8 +15,8 @@ export type AdLibActionId = ProtectedString<'AdLibActionId'> export type BlueprintId = ProtectedString<'BlueprintId'> export type BucketId = ProtectedString<'BucketId'> -export type BucketAdLibId = PieceId -export type BucketAdLibActionId = AdLibActionId +export type BucketAdLibId = ProtectedString<'BucketAdLibId'> +export type BucketAdLibActionId = ProtectedString<'BucketAdLibActionId'> /** A string, identifying a CoreSystem */ export type CoreSystemId = ProtectedString<'CoreSystemId'> @@ -24,11 +24,6 @@ export type CoreSystemId = ProtectedString<'CoreSystemId'> /** A string, identifying a Evaluation */ export type EvaluationId = ProtectedString<'EvaluationId'> -/** A string, identifying a ExpectedMediaItem - * @deprecated - */ -export type ExpectedMediaItemId = ProtectedString<'ExpectedMediaItemId'> - /** A string, identifying a Rundown */ export type ExpectedPlayoutItemId = ProtectedString<'ExpectedPlayoutItemId'> diff --git a/packages/corelib/src/dataModel/MediaObjects.ts b/packages/corelib/src/dataModel/MediaObjects.ts index 63a030ab06..d8343981ba 100644 --- a/packages/corelib/src/dataModel/MediaObjects.ts +++ b/packages/corelib/src/dataModel/MediaObjects.ts @@ -1,4 +1,4 @@ -import { ProtectedString } from '../protectedString' +import { ProtectedString } from '../protectedString.js' export interface MediaObjects { _id: ProtectedString<'MediaObjId'> diff --git a/packages/corelib/src/dataModel/Notes.ts b/packages/corelib/src/dataModel/Notes.ts index 7d097323b2..a763aea0b6 100644 --- a/packages/corelib/src/dataModel/Notes.ts +++ b/packages/corelib/src/dataModel/Notes.ts @@ -1,6 +1,6 @@ import { NoteSeverity } from '@sofie-automation/blueprints-integration' -import { ITranslatableMessage } from '../TranslatableMessage' -import { RundownId, SegmentId, PartId, PieceId } from './Ids' +import { ITranslatableMessage } from '../TranslatableMessage.js' +import { RundownId, SegmentId, PartId, PieceId } from './Ids.js' export interface INoteBase { type: NoteSeverity diff --git a/packages/corelib/src/dataModel/Notifications.ts b/packages/corelib/src/dataModel/Notifications.ts index da6d9c1157..b552bfa64e 100644 --- a/packages/corelib/src/dataModel/Notifications.ts +++ b/packages/corelib/src/dataModel/Notifications.ts @@ -1,6 +1,6 @@ import type { NoteSeverity } from '@sofie-automation/blueprints-integration' -import type { NotificationId, PartInstanceId, PieceInstanceId, RundownId, RundownPlaylistId, StudioId } from './Ids' -import type { ITranslatableMessage } from '../TranslatableMessage' +import type { NotificationId, PartInstanceId, PieceInstanceId, RundownId, RundownPlaylistId, StudioId } from './Ids.js' +import type { ITranslatableMessage } from '../TranslatableMessage.js' /** * This describes a notification that should be shown to a user diff --git a/packages/corelib/src/dataModel/NrcsIngestDataCache.ts b/packages/corelib/src/dataModel/NrcsIngestDataCache.ts index 25f3bce1d6..b828720595 100644 --- a/packages/corelib/src/dataModel/NrcsIngestDataCache.ts +++ b/packages/corelib/src/dataModel/NrcsIngestDataCache.ts @@ -1,6 +1,6 @@ import { IngestRundown, IngestSegment, IngestPart } from '@sofie-automation/blueprints-integration' -import { NrcsIngestDataCacheObjId, RundownId, SegmentId, PartId } from './Ids' -import { RundownSource } from './Rundown' +import { NrcsIngestDataCacheObjId, RundownId, SegmentId, PartId } from './Ids.js' +import { RundownSource } from './Rundown.js' /* The NRCSIngestDataCache collection is used to store raw data that comes from an NRCS. diff --git a/packages/corelib/src/dataModel/PackageContainerPackageStatus.ts b/packages/corelib/src/dataModel/PackageContainerPackageStatus.ts index 68775826d8..87303af854 100644 --- a/packages/corelib/src/dataModel/PackageContainerPackageStatus.ts +++ b/packages/corelib/src/dataModel/PackageContainerPackageStatus.ts @@ -1,6 +1,6 @@ import { ExpectedPackageStatusAPI, Time } from '@sofie-automation/blueprints-integration' -import { protectString } from '../protectedString' -import { ExpectedPackageId, PackageContainerPackageId, PeripheralDeviceId, StudioId } from './Ids' +import { protectString } from '../protectedString.js' +import { ExpectedPackageId, PackageContainerPackageId, PeripheralDeviceId, StudioId } from './Ids.js' /** * The PackageContainerPackageStatuses-collection contains statuses about "a Package on a specific PackageContainer" diff --git a/packages/corelib/src/dataModel/PackageContainerStatus.ts b/packages/corelib/src/dataModel/PackageContainerStatus.ts index 9df421612e..4a215a2da8 100644 --- a/packages/corelib/src/dataModel/PackageContainerStatus.ts +++ b/packages/corelib/src/dataModel/PackageContainerStatus.ts @@ -8,8 +8,8 @@ */ import { ExpectedPackageStatusAPI, Time } from '@sofie-automation/blueprints-integration' -import { protectString } from '../protectedString' -import { StudioId, PeripheralDeviceId, PackageContainerId } from './Ids' +import { protectString } from '../protectedString.js' +import { StudioId, PeripheralDeviceId, PackageContainerId } from './Ids.js' export interface PackageContainerStatusDB { _id: PackageContainerId // unique id, see getPackageContainerId() diff --git a/packages/corelib/src/dataModel/PackageInfos.ts b/packages/corelib/src/dataModel/PackageInfos.ts index ae078ad319..879875be8a 100644 --- a/packages/corelib/src/dataModel/PackageInfos.ts +++ b/packages/corelib/src/dataModel/PackageInfos.ts @@ -1,7 +1,7 @@ import { PackageInfo, Time } from '@sofie-automation/blueprints-integration' -import { protectString } from '../protectedString' -import { ExpectedPackageDB } from './ExpectedPackages' -import { ExpectedPackageId, PackageInfoId, PeripheralDeviceId, StudioId } from './Ids' +import { protectString } from '../protectedString.js' +import { ExpectedPackageDB } from './ExpectedPackages.js' +import { ExpectedPackageId, PackageInfoId, PeripheralDeviceId, StudioId } from './Ids.js' /** * The PackageInfos collection contains information related to Packages. diff --git a/packages/corelib/src/dataModel/Part.ts b/packages/corelib/src/dataModel/Part.ts index 9712dbe43d..a1f571a4dd 100644 --- a/packages/corelib/src/dataModel/Part.ts +++ b/packages/corelib/src/dataModel/Part.ts @@ -1,9 +1,9 @@ import { IBlueprintPart, NoteSeverity } from '@sofie-automation/blueprints-integration' -import { ITranslatableMessage } from '../TranslatableMessage' -import { PartId, RundownId, SegmentId } from './Ids' -import { PartNote } from './Notes' +import { ITranslatableMessage } from '../TranslatableMessage.js' +import { PartId, RundownId, SegmentId } from './Ids.js' +import { PartNote } from './Notes.js' import { ReadonlyDeep } from 'type-fest' -import { CoreUserEditingDefinition, CoreUserEditingProperties } from './UserEditingDefinitions' +import { CoreUserEditingDefinition, CoreUserEditingProperties } from './UserEditingDefinitions.js' export interface PartInvalidReason { message: ITranslatableMessage diff --git a/packages/corelib/src/dataModel/PartInstance.ts b/packages/corelib/src/dataModel/PartInstance.ts index 543b2ca404..8c40e66e2f 100644 --- a/packages/corelib/src/dataModel/PartInstance.ts +++ b/packages/corelib/src/dataModel/PartInstance.ts @@ -1,7 +1,7 @@ import { PartEndState, Time } from '@sofie-automation/blueprints-integration' -import { PartCalculatedTimings } from '../playout/timings' -import { PartInstanceId, RundownId, RundownPlaylistActivationId, SegmentId, SegmentPlayoutId } from './Ids' -import { DBPart } from './Part' +import { PartCalculatedTimings } from '../playout/timings.js' +import { PartInstanceId, RundownId, RundownPlaylistActivationId, SegmentId, SegmentPlayoutId } from './Ids.js' +import { DBPart } from './Part.js' export interface DBPartInstance { _id: PartInstanceId diff --git a/packages/corelib/src/dataModel/PeripheralDevice.ts b/packages/corelib/src/dataModel/PeripheralDevice.ts index 40c7ca2bb0..4a6112f03d 100644 --- a/packages/corelib/src/dataModel/PeripheralDevice.ts +++ b/packages/corelib/src/dataModel/PeripheralDevice.ts @@ -1,6 +1,6 @@ import { Time } from '@sofie-automation/blueprints-integration' -import { DeviceConfigManifest } from '../deviceConfig' -import { OrganizationId, PeripheralDeviceId, StudioId } from './Ids' +import { DeviceConfigManifest } from '../deviceConfig.js' +import { OrganizationId, PeripheralDeviceId, StudioId } from './Ids.js' import type { IngestDeviceSecretSettings, IngestDeviceSecretSettingsStatus, @@ -79,7 +79,10 @@ export interface PeripheralDevice { /** Ignore this device when computing status in the GUI (other status reports are unaffected) */ ignore?: boolean - configManifest: DeviceConfigManifest + /** + * If this device is a parent-device, the config manifest for the device + */ + configManifest: DeviceConfigManifest | undefined /** If this is an ingest gateway, the last tiem data was received */ lastDataReceived?: Time diff --git a/packages/corelib/src/dataModel/Piece.ts b/packages/corelib/src/dataModel/Piece.ts index 17a864341b..6afc05519f 100644 --- a/packages/corelib/src/dataModel/Piece.ts +++ b/packages/corelib/src/dataModel/Piece.ts @@ -5,9 +5,9 @@ import { TimelineObjectCoreExt, SomeContent, } from '@sofie-automation/blueprints-integration' -import { ProtectedString, protectString, unprotectString } from '../protectedString' -import { PieceId, RundownId, SegmentId, PartId } from './Ids' -import { CoreUserEditingDefinition, CoreUserEditingProperties } from './UserEditingDefinitions' +import { ProtectedString, protectString, unprotectString } from '../protectedString.js' +import { PieceId, RundownId, SegmentId, PartId } from './Ids.js' +import { CoreUserEditingDefinition, CoreUserEditingProperties } from './UserEditingDefinitions.js' /** A generic list of playback availability statuses for a Piece */ export enum PieceStatusCode { diff --git a/packages/corelib/src/dataModel/PieceContentStatus.ts b/packages/corelib/src/dataModel/PieceContentStatus.ts new file mode 100644 index 0000000000..d294ed3dca --- /dev/null +++ b/packages/corelib/src/dataModel/PieceContentStatus.ts @@ -0,0 +1,50 @@ +import { ITranslatableMessage, PackageInfo } from '@sofie-automation/blueprints-integration' +import { ProtectedString } from '../protectedString.js' +import { + RundownId, + PartId, + SegmentId, + PieceId, + AdLibActionId, + RundownBaselineAdLibActionId, + PieceInstanceId, +} from './Ids.js' +import { PieceStatusCode } from './Piece.js' + +export type UIPieceContentStatusId = ProtectedString<'UIPieceContentStatus'> +export interface UIPieceContentStatus { + _id: UIPieceContentStatusId + + segmentRank: number + partRank: number + + rundownId: RundownId + partId: PartId | undefined + segmentId: SegmentId | undefined + + pieceId: PieceId | AdLibActionId | RundownBaselineAdLibActionId | PieceInstanceId + isPieceInstance: boolean + + name: string | ITranslatableMessage + segmentName: string | undefined + + status: PieceContentStatusObj +} + +export interface PieceContentStatusObj { + status: PieceStatusCode + messages: ITranslatableMessage[] + + freezes: Array + blacks: Array + scenes: Array + + thumbnailUrl: string | undefined + previewUrl: string | undefined + + packageName: string | null + + contentDuration: number | undefined + + progress: number | undefined +} diff --git a/packages/corelib/src/dataModel/PieceInstance.ts b/packages/corelib/src/dataModel/PieceInstance.ts index fc8f3f9db8..c21d3716ca 100644 --- a/packages/corelib/src/dataModel/PieceInstance.ts +++ b/packages/corelib/src/dataModel/PieceInstance.ts @@ -1,5 +1,5 @@ import { Time } from '@sofie-automation/blueprints-integration' -import { protectString } from '../protectedString' +import { protectString } from '../protectedString.js' import { PieceInstanceInfiniteId, RundownPlaylistActivationId, @@ -7,9 +7,9 @@ import { RundownId, PartInstanceId, PieceId, -} from './Ids' -import { Piece } from './Piece' -import { omit } from '../lib' +} from './Ids.js' +import { Piece } from './Piece.js' +import { omit } from '../lib.js' import { ReadonlyDeep } from 'type-fest' export type PieceInstancePiece = Omit diff --git a/packages/corelib/src/dataModel/Rundown.ts b/packages/corelib/src/dataModel/Rundown.ts index 2359297f15..61b1159eb9 100644 --- a/packages/corelib/src/dataModel/Rundown.ts +++ b/packages/corelib/src/dataModel/Rundown.ts @@ -7,10 +7,10 @@ import { PeripheralDeviceId, RundownPlaylistId, ShowStyleVariantId, -} from './Ids' -import { RundownNote } from './Notes' +} from './Ids.js' +import { RundownNote } from './Notes.js' import { ReadonlyDeep } from 'type-fest' -import { CoreUserEditingDefinition } from './UserEditingDefinitions' +import { CoreUserEditingDefinition } from './UserEditingDefinitions.js' export enum RundownOrphanedReason { /** Rundown is deleted from the source but we still need it */ diff --git a/packages/corelib/src/dataModel/RundownBaselineAdLibAction.ts b/packages/corelib/src/dataModel/RundownBaselineAdLibAction.ts index c0fcce1d18..292d1ec806 100644 --- a/packages/corelib/src/dataModel/RundownBaselineAdLibAction.ts +++ b/packages/corelib/src/dataModel/RundownBaselineAdLibAction.ts @@ -1,5 +1,5 @@ -import { AdLibActionCommon } from './AdlibAction' -import { RundownBaselineAdLibActionId } from './Ids' +import { AdLibActionCommon } from './AdlibAction.js' +import { RundownBaselineAdLibActionId } from './Ids.js' export interface RundownBaselineAdLibAction extends AdLibActionCommon { _id: RundownBaselineAdLibActionId diff --git a/packages/corelib/src/dataModel/RundownBaselineAdLibPiece.ts b/packages/corelib/src/dataModel/RundownBaselineAdLibPiece.ts index 928d522c02..5060c18130 100644 --- a/packages/corelib/src/dataModel/RundownBaselineAdLibPiece.ts +++ b/packages/corelib/src/dataModel/RundownBaselineAdLibPiece.ts @@ -1,3 +1,3 @@ -import { AdLibPiece } from './AdLibPiece' +import { AdLibPiece } from './AdLibPiece.js' export type RundownBaselineAdLibItem = AdLibPiece diff --git a/packages/corelib/src/dataModel/RundownBaselineObj.ts b/packages/corelib/src/dataModel/RundownBaselineObj.ts index b175d97d51..be3d2ae89c 100644 --- a/packages/corelib/src/dataModel/RundownBaselineObj.ts +++ b/packages/corelib/src/dataModel/RundownBaselineObj.ts @@ -1,5 +1,5 @@ -import { RundownBaselineObjId, RundownId } from './Ids' -import { PieceTimelineObjectsBlob } from './Piece' +import { RundownBaselineObjId, RundownId } from './Ids.js' +import { PieceTimelineObjectsBlob } from './Piece.js' export interface RundownBaselineObj { _id: RundownBaselineObjId diff --git a/packages/corelib/src/dataModel/RundownPlaylist.ts b/packages/corelib/src/dataModel/RundownPlaylist.ts index f9ff938c02..4e1e52d4cd 100644 --- a/packages/corelib/src/dataModel/RundownPlaylist.ts +++ b/packages/corelib/src/dataModel/RundownPlaylist.ts @@ -9,8 +9,8 @@ import { RundownPlaylistId, StudioId, RundownId, -} from './Ids' -import { RundownPlaylistNote } from './Notes' +} from './Ids.js' +import { RundownPlaylistNote } from './Notes.js' import { ForceQuickLoopAutoNext } from '@sofie-automation/shared-lib/dist/core/model/StudioSettings' /** Details of an ab-session requested by the blueprints in onTimelineGenerate */ @@ -31,6 +31,7 @@ export interface ABSessionInfo { export interface ABSessionAssignment { sessionId: string + sessionName: string playerId: number | string lookahead: boolean // purely informational for debugging } @@ -169,7 +170,10 @@ export interface DBRundownPlaylist { /** If the order of rundowns in this playlist has ben set manually by a user/blueprints in Sofie */ rundownIdsInOrder: RundownId[] - /** Previous state persisted from ShowStyleBlueprint.onTimelineGenerate */ + /** + * Persistent state belong to blueprint playout methods + * This can be accessed and modified by the blueprints in various methods + */ previousPersistentState?: TimelinePersistentState /** AB playback sessions calculated in the last timeline genertaion */ trackedAbSessions?: ABSessionInfo[] diff --git a/packages/corelib/src/dataModel/Segment.ts b/packages/corelib/src/dataModel/Segment.ts index f07e59706d..7f2ab5dc97 100644 --- a/packages/corelib/src/dataModel/Segment.ts +++ b/packages/corelib/src/dataModel/Segment.ts @@ -1,7 +1,7 @@ import { SegmentDisplayMode, SegmentTimingInfo } from '@sofie-automation/blueprints-integration' -import { SegmentId, RundownId } from './Ids' -import { SegmentNote } from './Notes' -import { CoreUserEditingDefinition, CoreUserEditingProperties } from './UserEditingDefinitions' +import { SegmentId, RundownId } from './Ids.js' +import { SegmentNote } from './Notes.js' +import { CoreUserEditingDefinition, CoreUserEditingProperties } from './UserEditingDefinitions.js' export enum SegmentOrphanedReason { /** Segment is deleted from the NRCS but we still need it */ diff --git a/packages/corelib/src/dataModel/ShowStyleBase.ts b/packages/corelib/src/dataModel/ShowStyleBase.ts index 03a19d7d46..120abe4da5 100644 --- a/packages/corelib/src/dataModel/ShowStyleBase.ts +++ b/packages/corelib/src/dataModel/ShowStyleBase.ts @@ -1,7 +1,7 @@ import { IBlueprintConfig, IOutputLayer, ISourceLayer, SourceLayerType } from '@sofie-automation/blueprints-integration' -import { ObjectWithOverrides } from '../settings/objectWithOverrides' -import { BlueprintHash, LastBlueprintConfig } from './Blueprint' -import { BlueprintId, OrganizationId, ShowStyleBaseId } from './Ids' +import { ObjectWithOverrides } from '../settings/objectWithOverrides.js' +import { BlueprintHash, LastBlueprintConfig } from './Blueprint.js' +import { BlueprintId, OrganizationId, ShowStyleBaseId } from './Ids.js' export interface HotkeyDefinition { _id: string diff --git a/packages/corelib/src/dataModel/ShowStyleVariant.ts b/packages/corelib/src/dataModel/ShowStyleVariant.ts index 8a072b9250..8e91dfac6d 100644 --- a/packages/corelib/src/dataModel/ShowStyleVariant.ts +++ b/packages/corelib/src/dataModel/ShowStyleVariant.ts @@ -1,6 +1,6 @@ import { IBlueprintConfig } from '@sofie-automation/blueprints-integration' -import { ObjectWithOverrides } from '../settings/objectWithOverrides' -import { ShowStyleVariantId, ShowStyleBaseId } from './Ids' +import { ObjectWithOverrides } from '../settings/objectWithOverrides.js' +import { ShowStyleVariantId, ShowStyleBaseId } from './Ids.js' export interface DBShowStyleVariant { _id: ShowStyleVariantId diff --git a/packages/corelib/src/dataModel/SofieIngestDataCache.ts b/packages/corelib/src/dataModel/SofieIngestDataCache.ts index eb41e03838..8b0a1496b1 100644 --- a/packages/corelib/src/dataModel/SofieIngestDataCache.ts +++ b/packages/corelib/src/dataModel/SofieIngestDataCache.ts @@ -1,6 +1,6 @@ import { SofieIngestRundown, SofieIngestSegment, SofieIngestPart } from '@sofie-automation/blueprints-integration' -import { SofieIngestDataCacheObjId, RundownId, SegmentId, PartId } from './Ids' -import { RundownSource } from './Rundown' +import { SofieIngestDataCacheObjId, RundownId, SegmentId, PartId } from './Ids.js' +import { RundownSource } from './Rundown.js' /* The SofieIngestDataCache collection is used to store data that comes from an NRCS and has been modified by Sofie. @@ -17,7 +17,7 @@ export type SofieIngestCacheData = SofieIngestRundown | SofieIngestSegment | Sof export interface SofieIngestRundownWithSource< TRundownPayload = unknown, TSegmentPayload = unknown, - TPartPayload = unknown + TPartPayload = unknown, > extends SofieIngestRundown { rundownSource: RundownSource } diff --git a/packages/corelib/src/dataModel/Studio.ts b/packages/corelib/src/dataModel/Studio.ts index dad72ea2ea..fc620107e2 100644 --- a/packages/corelib/src/dataModel/Studio.ts +++ b/packages/corelib/src/dataModel/Studio.ts @@ -1,7 +1,7 @@ import { IBlueprintConfig, TSR } from '@sofie-automation/blueprints-integration' -import { ObjectWithOverrides } from '../settings/objectWithOverrides' -import { StudioId, OrganizationId, BlueprintId, ShowStyleBaseId, MappingsHash, PeripheralDeviceId } from './Ids' -import { BlueprintHash, LastBlueprintConfig } from './Blueprint' +import { ObjectWithOverrides } from '../settings/objectWithOverrides.js' +import { StudioId, OrganizationId, BlueprintId, ShowStyleBaseId, MappingsHash, PeripheralDeviceId } from './Ids.js' +import { BlueprintHash, LastBlueprintConfig } from './Blueprint.js' import { MappingsExt, MappingExt } from '@sofie-automation/shared-lib/dist/core/model/Timeline' import { ResultingMappingRoute, diff --git a/packages/corelib/src/dataModel/Timeline.ts b/packages/corelib/src/dataModel/Timeline.ts index 376b731683..6372e08eb0 100644 --- a/packages/corelib/src/dataModel/Timeline.ts +++ b/packages/corelib/src/dataModel/Timeline.ts @@ -5,7 +5,7 @@ import { TimelineEnableExt, } from '@sofie-automation/shared-lib/dist/core/model/Timeline' import { SetRequired } from 'type-fest' -import { PartInstanceId, PieceInstanceInfiniteId, BlueprintId, StudioId } from './Ids' +import { PartInstanceId, PieceInstanceInfiniteId, BlueprintId, StudioId } from './Ids.js' export { deserializeTimelineBlob, @@ -18,6 +18,7 @@ import { PartPlaybackCallbackData, PiecePlaybackCallbackData, PlayoutChangedType, + TriggerRegenerationCallbackData, } from '@sofie-automation/shared-lib/dist/peripheralDevice/peripheralDeviceAPI' export { PartPlaybackCallbackData, PiecePlaybackCallbackData } @@ -74,6 +75,16 @@ export interface TimelineObjPieceAbstract extends Omit /** The UserErrorMessage key (for matching certain error) */ readonly key: UserErrorMessage /** The translatable string for the key */ - readonly message: ITranslatableMessage + readonly userMessage: ITranslatableMessage } -export class UserError implements UserErrorObj { +export class UserError extends Error { public readonly errorCode: number private constructor( /** The raw Error that was thrown */ - public readonly rawError: Error, + rawError: SerializedUserError['rawError'], /** The UserErrorMessage key (for matching certain error) */ public readonly key: UserErrorMessage, /** The translatable string for the key */ - public readonly message: ITranslatableMessage, + public readonly userMessage: ITranslatableMessage, /** Appropriate HTTP status code. Defaults to 500 for generic internal error. */ errorCode: number | undefined ) { - this.errorCode = errorCode ?? 500 - } + super() - public toString(): string { - return UserError.toJSON(this) + // Populate the error properties: + this.message = rawError.message + this.stack = rawError.stack + this.name = 'UserError' + + this.errorCode = errorCode ?? 500 } /** Create a UserError with a custom error for the log */ static from(err: Error, key: UserErrorMessage, args?: { [k: string]: any }, errCode?: number): UserError { return new UserError(err, key, { key: UserErrorMessagesTranslations[key], args }, errCode) } + /** Create a UserError duplicating the same error for the log */ + static create(key: UserErrorMessage, args?: { [k: string]: any }, errorCode?: number): UserError { + return UserError.from( + new Error(translateMessage({ key: UserErrorMessagesTranslations[key], args }, interpollateTranslation)), + key, + args, + errorCode + ) + } + static fromSerialized(o: SerializedUserError): UserError { + return new UserError(o.rawError, o.key, o.userMessage, o.errorCode) + } /** Create a UserError from an unknown possibly error input */ static fromUnknown(err: unknown, errorCode?: number): UserError { if (err instanceof UserError) return err - if (this.isUserError(err)) - return new UserError(new Error(err.rawError.toString()), err.key, err.message, err.errorCode) + if (this.isSerializedUserErrorObject(err)) { + return new UserError(err.rawError, err.key, err.userMessage, err.errorCode) + } else if (typeof err === 'string') { + const errorFromJson = this.tryFromJSON(err) + if (errorFromJson) { + return errorFromJson + } + } const err2 = err instanceof Error ? err : new Error(stringifyError(err)) return new UserError( err2, @@ -176,38 +197,65 @@ export class UserError implements UserErrorObj { ) } - /** Create a UserError duplicating the same error for the log */ - static create(key: UserErrorMessage, args?: { [k: string]: any }, errorCode?: number): UserError { - return UserError.from(new Error(UserErrorMessagesTranslations[key]), key, args, errorCode) - } - static tryFromJSON(str: string): UserError | undefined { + let p: SerializedUserError | undefined try { - const p = JSON.parse(str) - if (UserError.isUserError(p)) { - return new UserError(new Error(p.rawError.toString()), p.key, p.message, p.errorCode) - } else { - return undefined - } - } catch (e: any) { + p = UserError.fromJSON(str) + if (!p) return undefined + } catch (_e: any) { + // Ignore JSON parsing error + return undefined + } + + if (this.isSerializedUserErrorObject(p)) { + return new UserError(p.rawError, p.key, p.userMessage, p.errorCode) + } else { return undefined } } - static toJSON(e: UserErrorObj): string { - return JSON.stringify({ - rawError: stringifyError(e.rawError), - message: e.message, + static serialize(e: UserError): SerializedUserError { + const o: SerializedUserError = { + rawError: { + name: e.name, + message: e.message, + stack: e.stack, + }, + userMessage: e.userMessage, key: e.key, errorCode: e.errorCode, - }) + } + return o + } + static toJSON(e: UserError): string { + return JSON.stringify(this.serialize(e)) } + static fromJSON(str: string): SerializedUserError | undefined { + const o = JSON.parse(str) + if (this.isSerializedUserErrorObject(o)) return o + return undefined + } + static isSerializedUserErrorObject(o: unknown): o is SerializedUserError { + if (!o || typeof o !== 'object') return false + const errorObject = o as SerializedUserError - static isUserError(e: unknown): e is UserErrorObj { - return !(e instanceof Error) && !!e && typeof e === 'object' && 'rawError' in e && 'message' in e && 'key' in e + return ( + 'rawError' in errorObject && + !!errorObject.rawError && + typeof errorObject.rawError === 'object' && + errorObject.rawError && + typeof errorObject.rawError.message === 'string' && + isTranslatableMessage(errorObject.userMessage) && + typeof errorObject.errorCode === 'number' && + typeof errorObject.key === 'number' + ) } toErrorString(): string { - return `${translateMessage(this.message, interpollateTranslation)}\n${stringifyError(this.rawError)}` + return `${translateMessage(this.userMessage, interpollateTranslation)}\n${stringifyError(this)}` + } + + toString(): string { + return UserError.toJSON(this) } } diff --git a/packages/corelib/src/fixUpBlueprintConfig/__tests__/context.spec.ts b/packages/corelib/src/fixUpBlueprintConfig/__tests__/context.spec.ts index ef98ba05dc..8ceeb9d575 100644 --- a/packages/corelib/src/fixUpBlueprintConfig/__tests__/context.spec.ts +++ b/packages/corelib/src/fixUpBlueprintConfig/__tests__/context.spec.ts @@ -3,9 +3,9 @@ import { ObjectOverrideSetOp, ObjectWithOverrides, wrapDefaultObject, -} from '../../settings/objectWithOverrides' -import { literal } from '../../lib' -import { FixUpBlueprintConfigContext } from '../context' +} from '../../settings/objectWithOverrides.js' +import { literal } from '../../lib.js' +import { FixUpBlueprintConfigContext } from '../context.js' import { ICommonContext, JSONSchema } from '@sofie-automation/blueprints-integration' function createSimpleConfigBlob() { diff --git a/packages/corelib/src/fixUpBlueprintConfig/context.ts b/packages/corelib/src/fixUpBlueprintConfig/context.ts index cfa60872f1..ce9fef732f 100644 --- a/packages/corelib/src/fixUpBlueprintConfig/context.ts +++ b/packages/corelib/src/fixUpBlueprintConfig/context.ts @@ -5,9 +5,9 @@ import { ITranslatableMessage, JSONSchema, } from '@sofie-automation/blueprints-integration' -import objectPath = require('object-path') +import * as objectPath from 'object-path' import { ReadonlyDeep } from 'type-fest' -import { literal, objectPathGet, objectPathSet, clone } from '../lib' +import { literal, objectPathGet, objectPathSet, clone } from '../lib.js' import { applyAndValidateOverrides, filterOverrideOpsForPrefix, @@ -16,7 +16,7 @@ import { ObjectOverrideSetOp, ObjectWithOverrides, SomeObjectOverrideOp, -} from '../settings/objectWithOverrides' +} from '../settings/objectWithOverrides.js' interface MatchedSchemaEntry { path: string diff --git a/packages/corelib/src/lib.ts b/packages/corelib/src/lib.ts index 399db4fead..4ff692165d 100644 --- a/packages/corelib/src/lib.ts +++ b/packages/corelib/src/lib.ts @@ -1,13 +1,14 @@ -import * as _ from 'underscore' +import _ from 'underscore' import { ReadonlyDeep } from 'type-fest' -import fastClone = require('fast-clone') -import { ProtectedString, protectString } from './protectedString' +import fastClone from 'fast-clone' +import { ProtectedString, protectString } from './protectedString.js' import * as objectPath from 'object-path' import { Timecode } from 'timecode' import { iterateDeeply, iterateDeeplyEnum, Time } from '@sofie-automation/blueprints-integration' -import { IStudioSettings } from './dataModel/Studio' +import { IStudioSettings } from './dataModel/Studio.js' import { customAlphabet as createNanoid } from 'nanoid' -import type { ITranslatableMessage } from './TranslatableMessage' +import type { ITranslatableMessage } from './TranslatableMessage.js' +import { ReadonlyObjectDeep } from 'type-fest/source/readonly-deep' /** * Limited character set to use for id generation @@ -20,7 +21,7 @@ const UNMISTAKABLE_CHARS = '23456789ABCDEFGHJKLMNPQRSTWXYZabcdefghijkmnopqrstuvw // The probability for a collision is around 1.5e-6 in a set of 1e12 items const nanoid = createNanoid(UNMISTAKABLE_CHARS, 17) -export * from './hash' +export * from './hash.js' export type { Complete, ArrayElement, Subtract } from '@sofie-automation/shared-lib/dist/lib/types' export { assertNever, literal } from '@sofie-automation/shared-lib/dist/lib/lib' @@ -40,7 +41,7 @@ export function flatten(vals: Array): T[] { return _.flatten( vals.filter((v) => v !== undefined), true - ) as T[] + ) } export function max(vals: T[], iterator: _.ListIterator): T | undefined { @@ -63,6 +64,10 @@ export function clone(o: ReadonlyDeep | Readonly | T): T { // Use this instead of fast-clone directly, as this retains the type return fastClone(o as any) } +export function cloneObject(o: ReadonlyObjectDeep | Readonly | T): T { + // Use this instead of fast-clone directly, as this retains the type + return fastClone(o as any) +} /** * Deeply freeze an object @@ -469,3 +474,11 @@ export function generateTranslation( namespaces, } } + +export function areSetsEqual(a: Set, b: Set): boolean { + return a.size === b.size && [...a].every((value) => b.has(value)) +} + +export function doSetsIntersect(a: Set, b: Set): boolean { + return [...a].some((value) => b.has(value)) +} diff --git a/packages/corelib/src/mongo.ts b/packages/corelib/src/mongo.ts index e3acae8c39..16728b49fb 100644 --- a/packages/corelib/src/mongo.ts +++ b/packages/corelib/src/mongo.ts @@ -1,9 +1,8 @@ -import * as _ from 'underscore' -import { ProtectedString } from './protectedString' +import _ from 'underscore' +import { ProtectedString } from './protectedString.js' import * as objectPath from 'object-path' -// eslint-disable-next-line node/no-extraneous-import import type { Condition, Filter, UpdateFilter } from 'mongodb' -import { clone } from './lib' +import { clone } from './lib.js' /** Hack's using typings pulled from meteor */ @@ -31,8 +30,8 @@ export type MongoFieldSpecifierOnesStrict> = { [key in keyof T]?: T[key] extends ProtectedString ? 1 : T[key] extends object | undefined - ? MongoFieldSpecifierOnesStrict | 1 - : 1 + ? MongoFieldSpecifierOnesStrict | 1 + : 1 } export interface FindOneOptions { @@ -146,7 +145,7 @@ export function mongoWhere(o: Record, selector: MongoQuery): ok = mongoWhere(o, innerSelector) } } - } catch (e) { + } catch (_e) { ok = false } } @@ -369,7 +368,7 @@ export function mutatePath( o.forEach((val, i) => { // mutate any objects which match if (_.isMatch(val, info.query)) { - mutator(o, i + '') + mutator(o as any, i + '') } }) } else { diff --git a/packages/corelib/src/overrideOpHelper.ts b/packages/corelib/src/overrideOpHelper.ts index a0043224ca..067c06b900 100644 --- a/packages/corelib/src/overrideOpHelper.ts +++ b/packages/corelib/src/overrideOpHelper.ts @@ -1,4 +1,4 @@ -import { clone, literal, objectPathSet } from './lib' +import { clone, literal, objectPathSet } from './lib.js' import { SomeObjectOverrideOp, ObjectWithOverrides, @@ -7,7 +7,7 @@ import { applyAndValidateOverrides, filterOverrideOpsForPrefix, findParentOpToUpdate, -} from './settings/objectWithOverrides' +} from './settings/objectWithOverrides.js' import { ReadonlyDeep } from 'type-fest' export interface WrappedOverridableItemDeleted { diff --git a/packages/corelib/src/playout/__tests__/infinites.test.ts b/packages/corelib/src/playout/__tests__/infinites.test.ts index 770237faab..5def7dab11 100644 --- a/packages/corelib/src/playout/__tests__/infinites.test.ts +++ b/packages/corelib/src/playout/__tests__/infinites.test.ts @@ -1,14 +1,14 @@ import { IBlueprintPieceType, PieceLifespan, PlaylistTimingType } from '@sofie-automation/blueprints-integration' -import { DBPartInstance } from '../../dataModel/PartInstance' -import { PartId, PartInstanceId, RundownId, RundownPlaylistId } from '../../dataModel/Ids' -import { DBPart } from '../../dataModel/Part' -import { EmptyPieceTimelineObjectsBlob, Piece } from '../../dataModel/Piece' -import { PieceInstance, PieceInstancePiece } from '../../dataModel/PieceInstance' -import { Rundown, DBRundown } from '../../dataModel/Rundown' -import { literal } from '../../lib' -import { protectString } from '../../protectedString' -import { getPlayheadTrackingInfinitesForPart } from '../infinites' -import { DBSegment, SegmentOrphanedReason } from '../../dataModel/Segment' +import { DBPartInstance } from '../../dataModel/PartInstance.js' +import { PartId, PartInstanceId, RundownId, RundownPlaylistId } from '../../dataModel/Ids.js' +import { DBPart } from '../../dataModel/Part.js' +import { EmptyPieceTimelineObjectsBlob, Piece } from '../../dataModel/Piece.js' +import { PieceInstance, PieceInstancePiece } from '../../dataModel/PieceInstance.js' +import { Rundown, DBRundown } from '../../dataModel/Rundown.js' +import { literal } from '../../lib.js' +import { protectString } from '../../protectedString.js' +import { getPlayheadTrackingInfinitesForPart } from '../infinites.js' +import { DBSegment, SegmentOrphanedReason } from '../../dataModel/Segment.js' describe('Infinites', () => { describe('getPlayheadTrackingInfinitesForPart', () => { @@ -35,6 +35,7 @@ describe('Infinites', () => { segment, newInstanceId, true, + false, false ) return resolvedInstances.map((p) => ({ diff --git a/packages/corelib/src/playout/__tests__/processAndPrune.test.ts b/packages/corelib/src/playout/__tests__/processAndPrune.test.ts index 53ad35ab02..582223f75c 100644 --- a/packages/corelib/src/playout/__tests__/processAndPrune.test.ts +++ b/packages/corelib/src/playout/__tests__/processAndPrune.test.ts @@ -1,14 +1,14 @@ import { IBlueprintPieceType, PieceLifespan, SourceLayerType } from '@sofie-automation/blueprints-integration' -import clone = require('fast-clone') -import { EmptyPieceTimelineObjectsBlob, Piece } from '../../dataModel/Piece' -import { PieceInstance, PieceInstancePiece, ResolvedPieceInstance } from '../../dataModel/PieceInstance' -import { literal } from '../../lib' -import { protectString } from '../../protectedString' +import clone from 'fast-clone' +import { EmptyPieceTimelineObjectsBlob, Piece } from '../../dataModel/Piece.js' +import { PieceInstance, PieceInstancePiece, ResolvedPieceInstance } from '../../dataModel/PieceInstance.js' +import { literal } from '../../lib.js' +import { protectString } from '../../protectedString.js' import { PieceInstanceWithTimings, processAndPrunePieceInstanceTimings, resolvePrunedPieceInstance, -} from '../processAndPrune' +} from '../processAndPrune.js' describe('processAndPrunePieceInstanceTimings', () => { function createPieceInstance( diff --git a/packages/corelib/src/playout/__tests__/timeline.test.ts b/packages/corelib/src/playout/__tests__/timeline.test.ts index 83a780f7ab..c9554738d6 100644 --- a/packages/corelib/src/playout/__tests__/timeline.test.ts +++ b/packages/corelib/src/playout/__tests__/timeline.test.ts @@ -1,6 +1,6 @@ import { TSR } from '@sofie-automation/blueprints-integration' -import { TimelineObjGeneric, TimelineObjRundown, TimelineObjType } from '../../dataModel/Timeline' -import { transformTimeline } from '../timeline' +import { TimelineObjGeneric, TimelineObjRundown, TimelineObjType } from '../../dataModel/Timeline.js' +import { transformTimeline } from '../timeline.js' describe('lib/timeline', () => { test('transformTimeline', () => { diff --git a/packages/corelib/src/playout/__tests__/timings.test.ts b/packages/corelib/src/playout/__tests__/timings.test.ts index 29d3c0670b..131e63d444 100644 --- a/packages/corelib/src/playout/__tests__/timings.test.ts +++ b/packages/corelib/src/playout/__tests__/timings.test.ts @@ -1,8 +1,8 @@ import { IBlueprintPieceType } from '@sofie-automation/blueprints-integration' import {} from 'type-fest' -import { RundownHoldState } from '../../dataModel/RundownPlaylist' -import { literal } from '../../lib' -import { calculatePartTimings, CalculateTimingsPiece, PartCalculatedTimings } from '../timings' +import { RundownHoldState } from '../../dataModel/RundownPlaylist.js' +import { literal } from '../../lib.js' +import { calculatePartTimings, CalculateTimingsPiece, PartCalculatedTimings } from '../timings.js' describe('Part Playout Timings', () => { describe('calculatePartTimings', () => { diff --git a/packages/corelib/src/playout/ids.ts b/packages/corelib/src/playout/ids.ts index 947c3e3df3..56d930ea97 100644 --- a/packages/corelib/src/playout/ids.ts +++ b/packages/corelib/src/playout/ids.ts @@ -1,7 +1,7 @@ -import { PartInstanceId, PieceInstanceId } from '../dataModel/Ids' -import { DBPartInstance } from '../dataModel/PartInstance' -import { PieceInstance } from '../dataModel/PieceInstance' -import { isProtectedString } from '../protectedString' +import { PartInstanceId, PieceInstanceId } from '../dataModel/Ids.js' +import { DBPartInstance } from '../dataModel/PartInstance.js' +import { PieceInstance } from '../dataModel/PieceInstance.js' +import { isProtectedString } from '../protectedString.js' enum PlayoutTimelinePrefixes { PART_GROUP_PREFIX = 'part_group_', diff --git a/packages/corelib/src/playout/infinites.ts b/packages/corelib/src/playout/infinites.ts index eac8b92f5a..ccda649691 100644 --- a/packages/corelib/src/playout/infinites.ts +++ b/packages/corelib/src/playout/infinites.ts @@ -1,5 +1,5 @@ -import { Piece } from '../dataModel/Piece' -import { DBPart } from '../dataModel/Part' +import { Piece } from '../dataModel/Piece.js' +import { DBPart } from '../dataModel/Part.js' import { PartId, PartInstanceId, @@ -7,17 +7,17 @@ import { RundownPlaylistActivationId, SegmentId, ShowStyleBaseId, -} from '../dataModel/Ids' +} from '../dataModel/Ids.js' import { PieceLifespan } from '@sofie-automation/blueprints-integration' -import { PieceInstance, PieceInstancePiece, rewrapPieceToInstance } from '../dataModel/PieceInstance' -import { DBPartInstance } from '../dataModel/PartInstance' -import { DBRundown } from '../dataModel/Rundown' +import { PieceInstance, PieceInstancePiece, rewrapPieceToInstance } from '../dataModel/PieceInstance.js' +import { DBPartInstance } from '../dataModel/PartInstance.js' +import { DBRundown } from '../dataModel/Rundown.js' import { ReadonlyDeep } from 'type-fest' -import { assertNever, clone, flatten, getRandomId, groupByToMapFunc, max, normalizeArrayToMapFunc } from '../lib' -import { protectString } from '../protectedString' -import _ = require('underscore') -import { MongoQuery } from '../mongo' -import { DBSegment, SegmentOrphanedReason } from '../dataModel/Segment' +import { assertNever, clone, flatten, getRandomId, groupByToMapFunc, max, normalizeArrayToMapFunc } from '../lib.js' +import { protectString } from '../protectedString.js' +import _ from 'underscore' +import { MongoQuery } from '../mongo.js' +import { DBSegment, SegmentOrphanedReason } from '../dataModel/Segment.js' export function buildPiecesStartingInThisPartQuery(part: ReadonlyDeep): MongoQuery { return { startPartId: part._id } @@ -45,7 +45,7 @@ export function buildPastInfinitePiecesForThisPartQuery( startRundownId: part.rundownId, startSegmentId: part.segmentId, startPartId: { $in: partIdsToReceiveOnSegmentEndFrom }, - } + } : undefined, segmentsToReceiveOnRundownEndFrom.length > 0 ? { @@ -59,7 +59,7 @@ export function buildPastInfinitePiecesForThisPartQuery( }, startRundownId: part.rundownId, startSegmentId: { $in: segmentsToReceiveOnRundownEndFrom }, - } + } : undefined, rundownIdsBeforeThisInPlaylist.length > 0 ? { @@ -68,7 +68,7 @@ export function buildPastInfinitePiecesForThisPartQuery( $in: [PieceLifespan.OutOnShowStyleEnd], }, startRundownId: { $in: rundownIdsBeforeThisInPlaylist }, - } + } : undefined, ]) @@ -94,7 +94,7 @@ export function getPlayheadTrackingInfinitesForPart( partsToReceiveOnSegmentEndFromSet: Set, segmentsToReceiveOnRundownEndFromSet: Set, rundownsToReceiveOnShowStyleEndFrom: RundownId[], - rundownsToShowstyles: Map, + rundownsToShowstyles: ReadonlyMap, currentPartInstance: ReadonlyDeep, playingSegment: ReadonlyDeep>, currentPartPieceInstances: ReadonlyDeep, @@ -103,9 +103,11 @@ export function getPlayheadTrackingInfinitesForPart( intoSegment: ReadonlyDeep>, newInstanceId: PartInstanceId, nextPartIsAfterCurrentPart: boolean, - isTemporary: boolean + isTemporary: boolean, + allowTestingAdlibsToPersist: boolean ): PieceInstance[] { if ( + !allowTestingAdlibsToPersist && intoSegment._id !== playingSegment._id && (intoSegment.orphaned === SegmentOrphanedReason.ADLIB_TESTING || playingSegment.orphaned === SegmentOrphanedReason.ADLIB_TESTING) @@ -210,7 +212,10 @@ export function getPlayheadTrackingInfinitesForPart( isValid = candidatePiece.rundownId === intoPart.rundownId && (segmentsToReceiveOnRundownEndFromSet.has(currentPartInstance.segmentId) || - currentPartInstance.segmentId === intoPart.segmentId) + currentPartInstance.segmentId === intoPart.segmentId || + // If infinites are allowed to persist, then the infinite is allowed to continue + (allowTestingAdlibsToPersist && + intoSegment.orphaned === SegmentOrphanedReason.ADLIB_TESTING)) break case PieceLifespan.OutOnShowStyleEnd: isValid = canContinueShowStyleEndInfinites @@ -278,7 +283,7 @@ export function isPiecePotentiallyActiveInPart( partsToReceiveOnSegmentEndFrom: Set, segmentsToReceiveOnRundownEndFrom: Set, rundownsToReceiveOnShowStyleEndFrom: RundownId[], - rundownsToShowstyles: Map, + rundownsToShowstyles: ReadonlyMap, rundown: ReadonlyDeep>, part: ReadonlyDeep, pieceToCheck: ReadonlyDeep @@ -338,7 +343,7 @@ export function isPiecePotentiallyActiveInPart( rundownsToShowstyles, previousPartInstance.rundownId, rundown - ) + ) : false default: assertNever(pieceToCheck.lifespan) @@ -375,12 +380,13 @@ export function getPieceInstancesForPart( partsToReceiveOnSegmentEndFromSet: Set, segmentsToReceiveOnRundownEndFromSet: Set, rundownsToReceiveOnShowStyleEndFrom: RundownId[], - rundownsToShowstyles: Map, + rundownsToShowstyles: ReadonlyMap, possiblePieces: ReadonlyDeep[], orderedPartIds: PartId[], newInstanceId: PartInstanceId, nextPartIsAfterCurrentPart: boolean, - isTemporary: boolean + isTemporary: boolean, + allowTestingAdlibsToPersist: boolean ): PieceInstance[] { const doesPieceAStartBeforePieceB = ( pieceA: ReadonlyDeep, @@ -458,8 +464,9 @@ export function getPieceInstancesForPart( segment, newInstanceId, nextPartIsAfterCurrentPart, - isTemporary - ) + isTemporary, + allowTestingAdlibsToPersist + ) : [] // Compile the resulting list @@ -576,7 +583,7 @@ export function isCandidateBetterToBeContinued( function continueShowStyleEndInfinites( rundownsToReceiveOnShowStyleEndFrom: RundownId[], - rundownsToShowstyles: Map, + rundownsToShowstyles: ReadonlyMap, previousRundownId: RundownId, targetRundown: ReadonlyDeep> ): boolean { diff --git a/packages/corelib/src/playout/playlist.ts b/packages/corelib/src/playout/playlist.ts index 7a9cced811..2737d8ea91 100644 --- a/packages/corelib/src/playout/playlist.ts +++ b/packages/corelib/src/playout/playlist.ts @@ -1,8 +1,8 @@ -import { DBRundown } from '../dataModel/Rundown' -import { DBSegment } from '../dataModel/Segment' -import { DBPart } from '../dataModel/Part' -import { DBPartInstance } from '../dataModel/PartInstance' -import { RundownId, SegmentId } from '../dataModel/Ids' +import { DBRundown } from '../dataModel/Rundown.js' +import { DBSegment } from '../dataModel/Segment.js' +import { DBPart } from '../dataModel/Part.js' +import { DBPartInstance } from '../dataModel/PartInstance.js' +import { RundownId, SegmentId } from '../dataModel/Ids.js' import { ReadonlyDeep } from 'type-fest' export function sortSegmentsInRundowns>( diff --git a/packages/corelib/src/playout/processAndPrune.ts b/packages/corelib/src/playout/processAndPrune.ts index 5c99f9b2ee..5fac61e44b 100644 --- a/packages/corelib/src/playout/processAndPrune.ts +++ b/packages/corelib/src/playout/processAndPrune.ts @@ -1,10 +1,10 @@ import { ISourceLayer, PieceLifespan } from '@sofie-automation/blueprints-integration' import { literal } from '@sofie-automation/shared-lib/dist/lib/lib' -import { PieceInstance, ResolvedPieceInstance } from '../dataModel/PieceInstance' -import { SourceLayers } from '../dataModel/ShowStyleBase' -import { assertNever, groupByToMapFunc } from '../lib' -import _ = require('underscore') -import { isCandidateBetterToBeContinued, isCandidateMoreImportant } from './infinites' +import { PieceInstance, ResolvedPieceInstance } from '../dataModel/PieceInstance.js' +import { SourceLayers } from '../dataModel/ShowStyleBase.js' +import { assertNever, groupByToMapFunc } from '../lib.js' +import _ from 'underscore' +import { isCandidateBetterToBeContinued, isCandidateMoreImportant } from './infinites.js' import { ReadonlyDeep } from 'type-fest' /** diff --git a/packages/corelib/src/playout/timeline.ts b/packages/corelib/src/playout/timeline.ts index eb932bcbe7..37497e0a09 100644 --- a/packages/corelib/src/playout/timeline.ts +++ b/packages/corelib/src/playout/timeline.ts @@ -1,8 +1,8 @@ // This is a collection of functions that match what the playout-gateway / TSR does -import _ = require('underscore') +import _ from 'underscore' import { TSR } from '@sofie-automation/blueprints-integration' -import { TimelineObjGeneric, TimelineObjGroup } from '../dataModel/Timeline' +import { TimelineObjGeneric, TimelineObjGroup } from '../dataModel/Timeline.js' // playout-gateway: export function transformTimeline(timeline: Array): Array { diff --git a/packages/corelib/src/playout/timings.ts b/packages/corelib/src/playout/timings.ts index b2bd4b63ad..a8ae6674e5 100644 --- a/packages/corelib/src/playout/timings.ts +++ b/packages/corelib/src/playout/timings.ts @@ -1,9 +1,9 @@ import { IBlueprintPartInTransition, IBlueprintPieceType } from '@sofie-automation/blueprints-integration' -import { DBPartInstance } from '../dataModel/PartInstance' -import { DBPart } from '../dataModel/Part' -import { PieceInstance, PieceInstancePiece } from '../dataModel/PieceInstance' -import { Piece } from '../dataModel/Piece' -import { RundownHoldState } from '../dataModel/RundownPlaylist' +import { DBPartInstance } from '../dataModel/PartInstance.js' +import { DBPart } from '../dataModel/Part.js' +import { PieceInstance, PieceInstancePiece } from '../dataModel/PieceInstance.js' +import { Piece } from '../dataModel/Piece.js' +import { RundownHoldState } from '../dataModel/RundownPlaylist.js' import { ReadonlyDeep } from 'type-fest' /** diff --git a/packages/corelib/src/pubsub.ts b/packages/corelib/src/pubsub.ts index a8436a1403..5a3bad8b2a 100644 --- a/packages/corelib/src/pubsub.ts +++ b/packages/corelib/src/pubsub.ts @@ -1,31 +1,30 @@ -import { DBPart } from './dataModel/Part' -import { CollectionName } from './dataModel/Collections' -import { MongoQuery } from './mongo' -import { AdLibAction } from './dataModel/AdlibAction' -import { AdLibPiece } from './dataModel/AdLibPiece' -import { RundownBaselineAdLibAction } from './dataModel/RundownBaselineAdLibAction' -import { RundownBaselineAdLibItem } from './dataModel/RundownBaselineAdLibPiece' -import { DBPartInstance } from './dataModel/PartInstance' -import { DBRundown } from './dataModel/Rundown' -import { DBRundownPlaylist } from './dataModel/RundownPlaylist' -import { DBSegment } from './dataModel/Segment' -import { DBShowStyleBase } from './dataModel/ShowStyleBase' -import { DBShowStyleVariant } from './dataModel/ShowStyleVariant' -import { DBStudio } from './dataModel/Studio' -import { NrcsIngestDataCacheObj } from './dataModel/NrcsIngestDataCache' +import { DBPart } from './dataModel/Part.js' +import { CollectionName, CustomCollectionName } from './dataModel/Collections.js' +import { MongoQuery } from './mongo.js' +import { AdLibAction } from './dataModel/AdlibAction.js' +import { AdLibPiece } from './dataModel/AdLibPiece.js' +import { RundownBaselineAdLibAction } from './dataModel/RundownBaselineAdLibAction.js' +import { RundownBaselineAdLibItem } from './dataModel/RundownBaselineAdLibPiece.js' +import { DBPartInstance } from './dataModel/PartInstance.js' +import { DBRundown } from './dataModel/Rundown.js' +import { DBRundownPlaylist } from './dataModel/RundownPlaylist.js' +import { DBSegment } from './dataModel/Segment.js' +import { DBShowStyleBase } from './dataModel/ShowStyleBase.js' +import { DBShowStyleVariant } from './dataModel/ShowStyleVariant.js' +import { DBStudio } from './dataModel/Studio.js' +import { NrcsIngestDataCacheObj } from './dataModel/NrcsIngestDataCache.js' import { DBTimelineDatastoreEntry } from '@sofie-automation/shared-lib/dist/core/model/TimelineDatastore' -import { Blueprint } from './dataModel/Blueprint' -import { BucketAdLibAction } from './dataModel/BucketAdLibAction' -import { BucketAdLib } from './dataModel/BucketAdLibPiece' -import { ExpectedMediaItem } from './dataModel/ExpectedMediaItem' -import { ExpectedPackageWorkStatus } from './dataModel/ExpectedPackageWorkStatuses' -import { ExpectedPackageDBBase } from './dataModel/ExpectedPackages' -import { ExternalMessageQueueObj } from './dataModel/ExternalMessageQueue' -import { PackageContainerStatusDB } from './dataModel/PackageContainerStatus' -import { PeripheralDevice } from './dataModel/PeripheralDevice' -import { Piece } from './dataModel/Piece' -import { PieceInstance } from './dataModel/PieceInstance' -import { TimelineComplete } from './dataModel/Timeline' +import { Blueprint } from './dataModel/Blueprint.js' +import { BucketAdLibAction } from './dataModel/BucketAdLibAction.js' +import { BucketAdLib } from './dataModel/BucketAdLibPiece.js' +import { ExpectedPackageWorkStatus } from './dataModel/ExpectedPackageWorkStatuses.js' +import { ExpectedPackageDBBase } from './dataModel/ExpectedPackages.js' +import { ExternalMessageQueueObj } from './dataModel/ExternalMessageQueue.js' +import { PackageContainerStatusDB } from './dataModel/PackageContainerStatus.js' +import { PeripheralDevice } from './dataModel/PeripheralDevice.js' +import { Piece } from './dataModel/Piece.js' +import { PieceInstance } from './dataModel/PieceInstance.js' +import { TimelineComplete } from './dataModel/Timeline.js' import { PartId, PartInstanceId, @@ -35,8 +34,10 @@ import { ShowStyleBaseId, StudioId, } from '@sofie-automation/shared-lib/dist/core/model/Ids' -import { BlueprintId, BucketId, RundownPlaylistActivationId, SegmentId, ShowStyleVariantId } from './dataModel/Ids' -import { PackageInfoDB } from './dataModel/PackageInfos' +import { BlueprintId, BucketId, RundownPlaylistActivationId, SegmentId, ShowStyleVariantId } from './dataModel/Ids.js' +import { PackageInfoDB } from './dataModel/PackageInfos.js' +import { UIPieceContentStatus } from './dataModel/PieceContentStatus.js' +import { Bucket } from './dataModel/Bucket.js' /** * Ids of possible DDP subscriptions for any the UI and gateways accessing the Rundown & RundownPlaylist model. @@ -135,12 +136,16 @@ export enum CorelibPubSub { packageContainerStatuses = 'packageContainerStatuses', /** - * Fetch all bucket adlib pieces for the specified Studio and Bucket. + * Fetch either all buckets for the given Studio, or the Bucket specified. + */ + buckets = 'buckets', + /** + * Fetch all bucket adlib pieces for the specified Studio and Bucket (or all buckets in a Studio). * The result will be limited to ones valid to the ShowStyleVariants specified, as well as ones marked as valid in any ShowStyleVariant */ bucketAdLibPieces = 'bucketAdLibPieces', /** - * Fetch all bucket adlib action for the specified Studio and Bucket. + * Fetch all bucket adlib action for the specified Studio and Bucket (or all buckets in a Studio). * The result will be limited to ones valid to the ShowStyleVariants specified, as well as ones marked as valid in any ShowStyleVariant */ bucketAdLibActions = 'bucketAdLibActions', @@ -180,6 +185,12 @@ export enum CorelibPubSub { * Fetch all the PackageInfos owned by a PeripheralDevice */ packageInfos = 'packageInfos', + + /** + * Fetch the Pieces content-status in the given RundownPlaylist + * If the id is null, nothing will be returned + */ + uiPieceContentStatuses = 'uiPieceContentStatuses', } /** @@ -297,14 +308,15 @@ export interface CorelibPubSubTypes { token?: string ) => CollectionName.Studios [CorelibPubSub.timelineDatastore]: (studioId: StudioId, token?: string) => CollectionName.TimelineDatastore + [CorelibPubSub.buckets]: (studioId: StudioId, bucketId: BucketId | null, token?: string) => CollectionName.Buckets [CorelibPubSub.bucketAdLibPieces]: ( studioId: StudioId, - bucketId: BucketId, + bucketId: BucketId | null, showStyleVariantIds: ShowStyleVariantId[] ) => CollectionName.BucketAdLibPieces [CorelibPubSub.bucketAdLibActions]: ( studioId: StudioId, - bucketId: BucketId, + bucketId: BucketId | null, showStyleVariantIds: ShowStyleVariantId[] ) => CollectionName.BucketAdLibActions [CorelibPubSub.expectedPackages]: (studioIds: StudioId[], token?: string) => CollectionName.ExpectedPackages @@ -317,15 +329,19 @@ export interface CorelibPubSubTypes { token?: string ) => CollectionName.PackageContainerStatuses [CorelibPubSub.packageInfos]: (deviceId: PeripheralDeviceId, token?: string) => CollectionName.PackageInfos + + [CorelibPubSub.uiPieceContentStatuses]: ( + rundownPlaylistId: RundownPlaylistId | null + ) => CustomCollectionName.UIPieceContentStatuses } export type CorelibPubSubCollections = { [CollectionName.AdLibActions]: AdLibAction [CollectionName.AdLibPieces]: AdLibPiece [CollectionName.Blueprints]: Blueprint + [CollectionName.Buckets]: Bucket [CollectionName.BucketAdLibActions]: BucketAdLibAction [CollectionName.BucketAdLibPieces]: BucketAdLib - [CollectionName.ExpectedMediaItems]: ExpectedMediaItem [CollectionName.ExpectedPackages]: ExpectedPackageDBBase [CollectionName.ExpectedPackageWorkStatuses]: ExpectedPackageWorkStatus [CollectionName.ExternalMessageQueue]: ExternalMessageQueueObj @@ -347,4 +363,8 @@ export type CorelibPubSubCollections = { [CollectionName.Studios]: DBStudio [CollectionName.Timelines]: TimelineComplete [CollectionName.TimelineDatastore]: DBTimelineDatastoreEntry +} & CorelibPubSubCustomCollections + +export type CorelibPubSubCustomCollections = { + [CustomCollectionName.UIPieceContentStatuses]: UIPieceContentStatus } diff --git a/packages/corelib/src/settings/__tests__/objectWithOverrides.spec.ts b/packages/corelib/src/settings/__tests__/objectWithOverrides.spec.ts index aecf458d49..af46f14743 100644 --- a/packages/corelib/src/settings/__tests__/objectWithOverrides.spec.ts +++ b/packages/corelib/src/settings/__tests__/objectWithOverrides.spec.ts @@ -1,10 +1,10 @@ -import { literal } from '../../lib' +import { literal } from '../../lib.js' import { applyAndValidateOverrides, ObjectWithOverrides, SomeObjectOverrideOp, updateOverrides, -} from '../objectWithOverrides' +} from '../objectWithOverrides.js' interface BasicType { valA?: string diff --git a/packages/corelib/src/settings/objectWithOverrides.ts b/packages/corelib/src/settings/objectWithOverrides.ts index 03783ab565..32dce80b53 100644 --- a/packages/corelib/src/settings/objectWithOverrides.ts +++ b/packages/corelib/src/settings/objectWithOverrides.ts @@ -1,7 +1,7 @@ -import objectPath = require('object-path') +import * as objectPath from 'object-path' import { ReadonlyDeep } from 'type-fest' -import _ = require('underscore') -import { assertNever, clone, literal } from '../lib' +import _ from 'underscore' +import { assertNever, clone, literal } from '../lib.js' /** * This is an object which allows for overrides to be tracked and reapplied diff --git a/packages/corelib/src/snapshots.ts b/packages/corelib/src/snapshots.ts index 794d733307..9791c5c719 100644 --- a/packages/corelib/src/snapshots.ts +++ b/packages/corelib/src/snapshots.ts @@ -1,22 +1,21 @@ -import { AdLibAction } from './dataModel/AdlibAction' -import { AdLibPiece } from './dataModel/AdLibPiece' -import { ExpectedMediaItem } from './dataModel/ExpectedMediaItem' -import { ExpectedPackageDB } from './dataModel/ExpectedPackages' -import { ExpectedPlayoutItem } from './dataModel/ExpectedPlayoutItem' -import { RundownPlaylistId } from './dataModel/Ids' -import { NrcsIngestDataCacheObj } from './dataModel/NrcsIngestDataCache' -import { DBPart } from './dataModel/Part' -import { DBPartInstance } from './dataModel/PartInstance' -import { Piece } from './dataModel/Piece' -import { PieceInstance } from './dataModel/PieceInstance' -import { DBRundown } from './dataModel/Rundown' -import { RundownBaselineAdLibAction } from './dataModel/RundownBaselineAdLibAction' -import { RundownBaselineAdLibItem } from './dataModel/RundownBaselineAdLibPiece' -import { RundownBaselineObj } from './dataModel/RundownBaselineObj' -import { DBRundownPlaylist } from './dataModel/RundownPlaylist' -import { DBSegment } from './dataModel/Segment' -import { SofieIngestDataCacheObj } from './dataModel/SofieIngestDataCache' -import { TimelineComplete } from './dataModel/Timeline' +import { AdLibAction } from './dataModel/AdlibAction.js' +import { AdLibPiece } from './dataModel/AdLibPiece.js' +import { ExpectedPackageDB } from './dataModel/ExpectedPackages.js' +import { ExpectedPlayoutItem } from './dataModel/ExpectedPlayoutItem.js' +import { RundownPlaylistId } from './dataModel/Ids.js' +import { NrcsIngestDataCacheObj } from './dataModel/NrcsIngestDataCache.js' +import { DBPart } from './dataModel/Part.js' +import { DBPartInstance } from './dataModel/PartInstance.js' +import { Piece } from './dataModel/Piece.js' +import { PieceInstance } from './dataModel/PieceInstance.js' +import { DBRundown } from './dataModel/Rundown.js' +import { RundownBaselineAdLibAction } from './dataModel/RundownBaselineAdLibAction.js' +import { RundownBaselineAdLibItem } from './dataModel/RundownBaselineAdLibPiece.js' +import { RundownBaselineObj } from './dataModel/RundownBaselineObj.js' +import { DBRundownPlaylist } from './dataModel/RundownPlaylist.js' +import { DBSegment } from './dataModel/Segment.js' +import { SofieIngestDataCacheObj } from './dataModel/SofieIngestDataCache.js' +import { TimelineComplete } from './dataModel/Timeline.js' export interface CoreRundownPlaylistSnapshot { version: string @@ -35,7 +34,6 @@ export interface CoreRundownPlaylistSnapshot { adLibPieces: Array adLibActions: Array baselineAdLibActions: Array - expectedMediaItems: Array expectedPlayoutItems: Array expectedPackages: Array timeline?: TimelineComplete diff --git a/packages/corelib/src/studio/baseline.ts b/packages/corelib/src/studio/baseline.ts index 86492cf75c..0f87223713 100644 --- a/packages/corelib/src/studio/baseline.ts +++ b/packages/corelib/src/studio/baseline.ts @@ -1,8 +1,8 @@ -import { DBStudio } from '../dataModel/Studio' -import { TimelineComplete } from '../dataModel/Timeline' +import { DBStudio } from '../dataModel/Studio.js' +import { TimelineComplete } from '../dataModel/Timeline.js' import { ReadonlyDeep } from 'type-fest' -import { unprotectString } from '../protectedString' -import { Blueprint } from '../dataModel/Blueprint' +import { unprotectString } from '../protectedString.js' +import { Blueprint } from '../dataModel/Blueprint.js' export function shouldUpdateStudioBaselineInner( coreVersion: string, diff --git a/packages/corelib/src/studio/playout.ts b/packages/corelib/src/studio/playout.ts index e93e15db2c..9b3868d3af 100644 --- a/packages/corelib/src/studio/playout.ts +++ b/packages/corelib/src/studio/playout.ts @@ -1,6 +1,6 @@ import { ReadonlyDeep } from 'type-fest' -import _ = require('underscore') -import { PeripheralDevice } from '../dataModel/PeripheralDevice' +import _ from 'underscore' +import { PeripheralDevice } from '../dataModel/PeripheralDevice.js' /** * Calculate what the expected latency is going to be for a device. diff --git a/packages/corelib/src/worker/events.ts b/packages/corelib/src/worker/events.ts index 84ad373958..2c1eb31a8f 100644 --- a/packages/corelib/src/worker/events.ts +++ b/packages/corelib/src/worker/events.ts @@ -1,4 +1,4 @@ -import { PartInstanceId, RundownId, RundownPlaylistId, StudioId } from '../dataModel/Ids' +import { PartInstanceId, RundownId, RundownPlaylistId, StudioId } from '../dataModel/Ids.js' export enum EventsJobs { PartInstanceTimings = 'partInstanceTimings', diff --git a/packages/corelib/src/worker/ingest.ts b/packages/corelib/src/worker/ingest.ts index ffa7c3013b..3e27a13bc1 100644 --- a/packages/corelib/src/worker/ingest.ts +++ b/packages/corelib/src/worker/ingest.ts @@ -1,15 +1,14 @@ import { - AdLibActionId, BucketAdLibActionId, + BucketAdLibId, BucketId, ExpectedPackageId, - PieceId, RundownId, SegmentId, ShowStyleBaseId, ShowStyleVariantId, StudioId, -} from '../dataModel/Ids' +} from '../dataModel/Ids.js' import type { MOS } from '@sofie-automation/shared-lib/dist/mos' import { IngestAdlib, @@ -18,8 +17,8 @@ import { IngestSegment, UserOperationTarget, } from '@sofie-automation/blueprints-integration' -import { BucketAdLibAction } from '../dataModel/BucketAdLibAction' -import { RundownSource } from '../dataModel/Rundown' +import { BucketAdLibAction } from '../dataModel/BucketAdLibAction.js' +import { RundownSource } from '../dataModel/Rundown.js' export enum IngestJobs { /** @@ -268,14 +267,14 @@ export interface BucketActionModifyProps { props: Partial> } export interface BucketPieceModifyProps { - pieceId: PieceId + pieceId: BucketAdLibId props: Partial> } export interface BucketRemoveAdlibPieceProps { - pieceId: PieceId + pieceId: BucketAdLibId } export interface BucketRemoveAdlibActionProps { - actionId: AdLibActionId + actionId: BucketAdLibActionId } export interface BucketEmptyProps { bucketId: BucketId diff --git a/packages/corelib/src/worker/studio.ts b/packages/corelib/src/worker/studio.ts index 0af95919a8..9c26cce808 100644 --- a/packages/corelib/src/worker/studio.ts +++ b/packages/corelib/src/worker/studio.ts @@ -2,6 +2,7 @@ import { PlayoutChangedResults } from '@sofie-automation/shared-lib/dist/periphe import { AdLibActionId, BucketAdLibActionId, + BucketAdLibId, BucketId, ExpectedPackageId, PartId, @@ -13,12 +14,12 @@ import { RundownPlaylistId, SegmentId, StudioId, -} from '../dataModel/Ids' +} from '../dataModel/Ids.js' import { JSONBlob } from '@sofie-automation/shared-lib/dist/lib/JSONBlob' -import { CoreRundownPlaylistSnapshot } from '../snapshots' +import { CoreRundownPlaylistSnapshot } from '../snapshots.js' import { NoteSeverity } from '@sofie-automation/blueprints-integration' -import { ITranslatableMessage } from '../TranslatableMessage' -import { QuickLoopMarker } from '../dataModel/RundownPlaylist' +import { ITranslatableMessage } from '../TranslatableMessage.js' +import { QuickLoopMarker } from '../dataModel/RundownPlaylist.js' /** List of all Jobs performed by the Worker related to a certain Studio */ export enum StudioJobs { @@ -213,7 +214,7 @@ export type UpdateTimelineAfterIngestProps = RundownPlayoutPropsBase export interface AdlibPieceStartProps extends RundownPlayoutPropsBase { partInstanceId: PartInstanceId - adLibPieceId: PieceId + adLibPieceId: PieceId | BucketAdLibId pieceType: 'baseline' | 'normal' | 'bucket' queue?: boolean } diff --git a/packages/corelib/tsconfig.build.json b/packages/corelib/tsconfig.build.json index 761f83db92..6dfa10a429 100755 --- a/packages/corelib/tsconfig.build.json +++ b/packages/corelib/tsconfig.build.json @@ -11,6 +11,7 @@ "@sofie-automation/corelib": ["./src/index.ts"] }, "resolveJsonModule": true, - "types": ["node"] + "types": ["node"], + "esModuleInterop": true } } diff --git a/packages/documentation/babel.config.js b/packages/documentation/babel.config.js index e00595dae7..63b5e55f2d 100644 --- a/packages/documentation/babel.config.js +++ b/packages/documentation/babel.config.js @@ -1,3 +1,3 @@ module.exports = { - presets: [require.resolve('@docusaurus/core/lib/babel/preset')], -}; + presets: [require.resolve('@docusaurus/core/lib/babel/preset')], +} diff --git a/packages/documentation/docs/for-developers/contribution-guidelines.md b/packages/documentation/docs/for-developers/contribution-guidelines.md index 1107179158..00a5d894bd 100644 --- a/packages/documentation/docs/for-developers/contribution-guidelines.md +++ b/packages/documentation/docs/for-developers/contribution-guidelines.md @@ -30,9 +30,10 @@ Before you start, there are a few things you should know: **Minor changes** (most bug fixes and small features) can be submitted directly as pull requests to the appropriate official repo. However, Sofie is a big project with many differing users and use cases. **Larger changes** may be difficult to merge into an official repository if NRK and other contributors have not been made aware of their existence beforehand. Since figuring out what side-effects a new feature or a change may have for other Sofie users can be tricky, we advise opening an RFC issue (_Request for Comments_) early in your process. Good moments to open an RFC include: -* When a user need is identified and described -* When you have a rough idea about how a feature may be implemented -* When you have a sketch of how a feature could look like to the user + +- When a user need is identified and described +- When you have a rough idea about how a feature may be implemented +- When you have a sketch of how a feature could look like to the user To facilitate timely handling of larger contributions, there’s a workflow intended to keep an open dialogue between all interested parties: diff --git a/packages/documentation/docs/for-developers/data-model.md b/packages/documentation/docs/for-developers/data-model.md index 27479bf97c..50b7354bf0 100644 --- a/packages/documentation/docs/for-developers/data-model.md +++ b/packages/documentation/docs/for-developers/data-model.md @@ -24,7 +24,7 @@ Currently, there is not a very clearly defined flow for modifying these document This includes: - [Blueprints](https://github.com/Sofie-Automation/sofie-core/blob/main/packages/corelib/src/dataModel/Blueprint.ts) -- [Buckets](https://github.com/Sofie-Automation/sofie-core/blob/main/meteor/lib/collections/Buckets.ts) +- [Buckets](https://github.com/Sofie-Automation/sofie-core/blob/main/packages/corelib/src/dataModel/Bucket.ts) - [CoreSystem](https://github.com/Sofie-Automation/sofie-core/blob/main/meteor/lib/collections/CoreSystem.ts) - [Evaluations](https://github.com/Sofie-Automation/sofie-core/blob/main/meteor/lib/collections/Evaluations.ts) - [ExternalMessageQueue](https://github.com/Sofie-Automation/sofie-core/blob/main/packages/corelib/src/dataModel/ExternalMessageQueue.ts) @@ -63,7 +63,6 @@ The collections which are owned by the ingest workers are: - [AdLibPieces](https://github.com/Sofie-Automation/sofie-core/blob/main/packages/corelib/src/dataModel/AdLibPieces.ts) - [BucketAdLibActions](https://github.com/Sofie-Automation/sofie-core/blob/main/packages/corelib/src/dataModel/BucketAdLibActions.ts) - [BucketAdLibPieces](https://github.com/Sofie-Automation/sofie-core/blob/main/packages/corelib/src/dataModel/BucketAdLibPieces.ts) -- [ExpectedMediaItems](https://github.com/Sofie-Automation/sofie-core/blob/main/packages/corelib/src/dataModel/ExpectedMediaItems.ts) - [ExpectedPackages](https://github.com/Sofie-Automation/sofie-core/blob/main/packages/corelib/src/dataModel/ExpectedPackages.ts) - [ExpectedPlayoutItems](https://github.com/Sofie-Automation/sofie-core/blob/main/packages/corelib/src/dataModel/ExpectedPlayoutItems.ts) - [IngestDataCache](https://github.com/Sofie-Automation/sofie-core/blob/main/packages/corelib/src/dataModel/IngestDataCache.ts) diff --git a/packages/documentation/docs/for-developers/device-integrations/_category_.json b/packages/documentation/docs/for-developers/device-integrations/_category_.json index 5f6541c2b5..c5a2693b0e 100644 --- a/packages/documentation/docs/for-developers/device-integrations/_category_.json +++ b/packages/documentation/docs/for-developers/device-integrations/_category_.json @@ -1,4 +1,4 @@ { - "label": "Device Integrations", - "position": 5 -} \ No newline at end of file + "label": "Device Integrations", + "position": 5 +} diff --git a/packages/documentation/docs/for-developers/device-integrations/intro.md b/packages/documentation/docs/for-developers/device-integrations/intro.md index dbf53b3a49..2bdfbcaad4 100644 --- a/packages/documentation/docs/for-developers/device-integrations/intro.md +++ b/packages/documentation/docs/for-developers/device-integrations/intro.md @@ -14,5 +14,5 @@ But to start of we will explain the general structure of the TSR. Any user of th The timeline is converted into disctinct states at different points in time, and these states are fed to the individual integrations. As an integration developer you shouldn't have to worry about keeping track of this. It is most important that you expose \(a\) a method to convert from a Timeline State to a Device State, \(b\) a method for diffing 2 device states and (c) a way to send commands to the device. We'll dive deeper into this in [TSR Integration API](./tsr-api.html). :::info -The information in this section is not a conclusive guide on writing an integration, it should be use more as a guide to use while looking at a TSR integration such as the [OSC integration](https://github.com/Sofie-Automation/sofie-timeline-state-resolver/tree/main/packages/timeline-state-resolver/src/integrations/osc). +The information in this section is not a conclusive guide on writing an integration, it should be use more as a guide to use while looking at a TSR integration such as the [OSC integration](https://github.com/Sofie-Automation/sofie-timeline-state-resolver/tree/master/packages/timeline-state-resolver/src/integrations/osc). ::: diff --git a/packages/documentation/docs/for-developers/device-integrations/options-and-mappings.md b/packages/documentation/docs/for-developers/device-integrations/options-and-mappings.md index 1bb182f155..7975218c50 100644 --- a/packages/documentation/docs/for-developers/device-integrations/options-and-mappings.md +++ b/packages/documentation/docs/for-developers/device-integrations/options-and-mappings.md @@ -8,4 +8,4 @@ Options are for any configuration the user needs to make for your device integra ## Mappings -A mappings is essentially an addresses into the device you are integrating with. For example, a mapping for CasparCG contains a channel and a layer. And a mapping for an Atem can be a mix effect or a downstream keyer. It is entirely possible for the user to define 2 mappings pointing to the same bit of hardware so keep that in mind while writing your integration. The granularity of the mappings influences both how you write your device as well as the shape of the timeline objects. If, for example, we had not included the layer number in the CasparCG mapping, we would have had to define this separately on every timeline object. \ No newline at end of file +A mappings is essentially an addresses into the device you are integrating with. For example, a mapping for CasparCG contains a channel and a layer. And a mapping for an Atem can be a mix effect or a downstream keyer. It is entirely possible for the user to define 2 mappings pointing to the same bit of hardware so keep that in mind while writing your integration. The granularity of the mappings influences both how you write your device as well as the shape of the timeline objects. If, for example, we had not included the layer number in the CasparCG mapping, we would have had to define this separately on every timeline object. diff --git a/packages/documentation/docs/for-developers/device-integrations/tsr-api.md b/packages/documentation/docs/for-developers/device-integrations/tsr-api.md index e68424455e..f09e0f43a0 100644 --- a/packages/documentation/docs/for-developers/device-integrations/tsr-api.md +++ b/packages/documentation/docs/for-developers/device-integrations/tsr-api.md @@ -12,7 +12,7 @@ Regarding status there are 2 important methods to be implemented, one is a gette ## State and commands -The second part is where the bulk of the work happens. First your implementation for `convertTimelineStateToDeviceState` will be called with a Timeline State and the mappings for your integration. You are ought to return a "Device State" here which is an object representing the state of your device as inferred from the Timeline State and mappings. Then the next implementation is of the `diffStates` method, which will be called with 2 Device States as you've generated them earlier. The purpose of this method is to generate commands such that a state change from Device State A to Device State B can be executed. Hence it is called a "diff". The last important method here is `sendCommand` which will be called with the commands you've generated earlier when the TSR wants to transitition from State A to State B. +The second part is where the bulk of the work happens. First your implementation for `convertTimelineStateToDeviceState` will be called with a Timeline State and the mappings for your integration. You are ought to return a "Device State" here which is an object representing the state of your device as inferred from the Timeline State and mappings. Then the next implementation is of the `diffStates` method, which will be called with 2 Device States as you've generated them earlier. The purpose of this method is to generate commands such that a state change from Device State A to Device State B can be executed. Hence it is called a "diff". The last important method here is `sendCommand` which will be called with the commands you've generated earlier when the TSR wants to transitition from State A to State B. Another thing to implement is the `actions` property. You can leave it as an empty object initially or read more about it in [TSR Actions](./tsr-actions.md). @@ -22,7 +22,7 @@ Logging is done through an event emitter as is described in the DeviceEvents int ## Best practices - - The `init` method is asynchronous but you should not use it to wait for timeouts in your connection to reject it. Instead the rest of your integration should gracefully deal with a (initially) disconnected device. - - The result of the `getStatus` method is displayed in the UI of Sofie so try to put helpful information in the messages and only elevate to a "bad" status if something is really wrong, like being fully disconnected from a device. - - Be aware for side effects in your implementations of `convertTimelineStateToDeviceState` and `diffStates` they are _not_ guaranteed to be chronological and the states changes may never actually be executed. - - If you need to do any time aware commands (such as seeking in a media file) use the time from the Timeline State to do your calculations for these \ No newline at end of file +- The `init` method is asynchronous but you should not use it to wait for timeouts in your connection to reject it. Instead the rest of your integration should gracefully deal with a (initially) disconnected device. +- The result of the `getStatus` method is displayed in the UI of Sofie so try to put helpful information in the messages and only elevate to a "bad" status if something is really wrong, like being fully disconnected from a device. +- Be aware for side effects in your implementations of `convertTimelineStateToDeviceState` and `diffStates` they are _not_ guaranteed to be chronological and the states changes may never actually be executed. +- If you need to do any time aware commands (such as seeking in a media file) use the time from the Timeline State to do your calculations for these diff --git a/packages/documentation/docs/for-developers/device-integrations/tsr-plugins.md b/packages/documentation/docs/for-developers/device-integrations/tsr-plugins.md new file mode 100644 index 0000000000..f54df1e648 --- /dev/null +++ b/packages/documentation/docs/for-developers/device-integrations/tsr-plugins.md @@ -0,0 +1,80 @@ +# TSR Plugins + +As of 1.53, it is possible to load additional device integrations into TSR as 'plugins'. This is intended to be an escape hatch when you need to make an integration for an internal system or for when an NDA with a device vendor does not allow for opensourcing. We still encourage anything which can be made opensource to be contributed back. + +## Creating a plugin + +It is expected that each plugin should be its own self-contained folder, including any npm dependencies. + +You can see a complete and working (at time of writing) example of this at [sofie-tsr-plugin-example](https://github.com/SuperFlyTV/sofie-tsr-plugin-example). This example is based upon a copy of the builtin atem integration. + +There are a few npm libraries which will be useful to you + +- `timeline-state-resolver-types` - Some common types from TSR are defined in here +- `timeline-state-resolver-api` - This defines the api and other types that your device integrations should implement. +- `timeline-state-resolver-tools` - This contains various tooling for building your plugin + +Some useful npm scripts you may wish to copy are: + +```js +{ + "translations:extract": "tsr-extract-translations tsr-plugin-example ./src/main.ts", + "translations:bundle": "tsr-bundle-translations tsr-plugin-example ./translations.json", + "schema:deref": "tsr-schema-deref ./src ./src/\\$schemas/generated", + "schema:types": "tsr-schema-types ./src/\\$schemas/generated ./src/generated" +} +``` + +There are a few key properties that your plugin must conform to, the rest of the structure and how it gets generated is up to you. + +1. It must be possible to `require(...)` your plugin folder. The resuling js must contain an export of the format `export const Devices: Record = {}` + This is how the TSR process finds the entrypoint for your code, and allows you to define multiple device types. + +2. There must be a `manifest.json` file at the root of your plugin folder. This should contain json in the form `Record` + This is a composite of various json schemas, we recommend generating this file with a script and using the same source schemas to generate relevant typescript types. + +3. There must be a `translations.json` file at the root of your plugin folder. This should contain json in the form `TranslationsBundle[]`. + This should contain any translation strings that should be used when displaying various things about your device in a UI. Populating this with translations is optional, you only need to do so if this is useful to your users. + +:::info +If running some of the `timeline-state-resolver-tools` scripts fails with an error relating to `cheerio`, you should add a yarn resolution (or equivalent for your package manager) to pin the version to `"cheerio": "1.0.0-rc.12"` which is compatible with our tooling. +::: + +## Using with the TSR API + +If you are using TSR in a non-sofie project, to load plugins you should: + +- construct a `DevicesRegistry` +- using the methods on this registry, load the needed plugins +- pass this registry into the `Conductor` constructor, inside the options object. + +You can mutate the contents of the `DevicesRegistry` after passing to the `Conductor`, and it will be used when spawning or restarting devices. + +## Using with Sofie + +In Sofie playout-gateway, plugins can be loaded by setting the `TSR_PLUGIN_PATHS` environment variable to any folders containing plugins. + +It is possible to extend the docker images to add in your own plugins. +You can use a dockerfile in your plugin git repository along the lines of: + +```Dockerfile +# BUILD IMAGE +FROM node:22 +WORKDIR /opt/tsr-plugin-example + +COPY . . + +RUN corepack enable +RUN yarn install +RUN yarn build +RUN yarn install --production + +# cleanup stuff we don't want in the final image +RUN rm -rf .git src + +# DEPLOY IMAGE +FROM sofietv/tv-automation-playout-gateway:release53 + +ENV TSR_PLUGIN_PATHS=/opt/tsr-plugin-example +COPY --from=0 /opt/tsr-plugin-example /opt/tsr-plugin-example +``` diff --git a/packages/documentation/docs/for-developers/for-blueprint-developers/_category_.json b/packages/documentation/docs/for-developers/for-blueprint-developers/_category_.json index c4c3c8c242..b4dd4fcee1 100644 --- a/packages/documentation/docs/for-developers/for-blueprint-developers/_category_.json +++ b/packages/documentation/docs/for-developers/for-blueprint-developers/_category_.json @@ -1,4 +1,4 @@ { - "label": "For Blueprint Developers", - "position": 4 -} \ No newline at end of file + "label": "For Blueprint Developers", + "position": 4 +} diff --git a/packages/documentation/docs/for-developers/libraries.md b/packages/documentation/docs/for-developers/libraries.md index 943938848c..c131c5ebdc 100644 --- a/packages/documentation/docs/for-developers/libraries.md +++ b/packages/documentation/docs/for-developers/libraries.md @@ -13,9 +13,9 @@ sidebar_position: 5 Together with the _Sofie Core_ there are several _gateways_ which are separate applications, but which connect to _Sofie Core_ and are managed from within the Core's web UI. -- [**Playout Gateway**](https://github.com/Sofie-Automation/sofie-core/tree/main/packages/playout-gateway) Handles the playout from _Sofie_. Connects to and controls a multitude of devices, such as vision mixers, graphics, light controllers, audio mixers etc.. -- [**MOS Gateway**](https://github.com/Sofie-Automation/sofie-core/tree/main/packages/mos-gateway) Connects _Sofie_ to a newsroom system \(NRCS\) and ingests rundowns via the [MOS protocol](http://mosprotocol.com/). -- [**Live Status Gateway**](https://github.com/Sofie-Automation/sofie-core/tree/main/packages/live-status-gateway) Allows external systems to subscribe to state changes in Sofie. +- [**Playout Gateway**](https://github.com/Sofie-Automation/sofie-core/tree/master/packages/playout-gateway) Handles the playout from _Sofie_. Connects to and controls a multitude of devices, such as vision mixers, graphics, light controllers, audio mixers etc.. +- [**MOS Gateway**](https://github.com/Sofie-Automation/sofie-core/tree/master/packages/mos-gateway) Connects _Sofie_ to a newsroom system \(NRCS\) and ingests rundowns via the [MOS protocol](http://mosprotocol.com/). +- [**Live Status Gateway**](https://github.com/Sofie-Automation/sofie-core/tree/master/packages/live-status-gateway) Allows external systems to subscribe to state changes in Sofie. - [**iNEWS Gateway**](https://github.com/tv2/inews-ftp-gateway) Connects _Sofie_ to an Avid iNEWS newsroom system. - [**Spreadsheet Gateway**](https://github.com/SuperFlyTV/spreadsheet-gateway) Connects _Sofie_ to a _Google Drive_ folder and ingests rundowns from _Google Sheets_. - [**Input Gateway**](https://github.com/Sofie-Automation/sofie-input-gateway) Connects _Sofie_ to various input devices, allowing triggering _User-Actions_ using these devices. @@ -50,7 +50,6 @@ There are also a few typings-only libraries that define interfaces between appli - [**CasparCG Launcher**](https://github.com/Sofie-Automation/sofie-casparcg-launcher) Launcher, controller, and logger for CasparCG Server. - [**CasparCG Media Scanner** \(NRK fork\)](https://github.com/nrkno/sofie-casparcg-server) Sofie-specific fork of CasparCG Server 2.2 Media Scanner. - [**Sofie Chef**](https://github.com/Sofie-Automation/sofie-chef) A simple Chromium based renderer, used for kiosk mode rendering of web pages. -- [**Media Manager**](https://github.com/nrkno/sofie-media-management) _(deprecated)_ Handles media transfer and media file management for pulling new files and deleting expired files on playout devices. - [**Quantel Browser Plugin**](https://github.com/Sofie-Automation/sofie-quantel-browser-plugin) MOS-compatible Quantel video clip browser for use with Sofie. - [**Sisyfos Audio Controller**](https://github.com/nrkno/sofie-sisyfos-audio-controller) _developed by [*olzzon*](https://github.com/olzzon/)_ - [**Quantel Gateway**](https://github.com/Sofie-Automation/sofie-quantel-gateway) CORBA to REST gateway for _Quantel/ISA_ playback. diff --git a/packages/documentation/docs/for-developers/url-query-parameters.md b/packages/documentation/docs/for-developers/url-query-parameters.md index e2b0fbcb75..e45dec0e81 100644 --- a/packages/documentation/docs/for-developers/url-query-parameters.md +++ b/packages/documentation/docs/for-developers/url-query-parameters.md @@ -4,22 +4,22 @@ sidebar_position: 10 --- # URL Query Parameters -Appending query parameter(s) to the URL will allow you to modify the behaviour of the GUI, as well as control the [Access Levels](../user-guide/features/access-levels.md). - -| Query Parameter | Description | -| :---------------------------------- | :------------------------------------------------------------------------ | -| `admin=1` | Gives the GUI the same access as the combination of [Configuration Mode](../user-guide/features/access-levels.md#Configuration-Mode) and [Studio Mode](../user-guide/features/access-levels.md#Studio-Mode) as well as having access to a set of [Testing Mode](../user-guide/features/access-levels.md#Testing-Mode) tools and a Manual Control section on the Rundown page. _Default value is `0`._ | -| `studio=1` | [Studio Mode](../user-guide/features/access-levels.md#Studio-Mode) gives the GUI full control of the studio and all information associated to it. This includes allowing actions like activating and deactivating rundowns, taking parts, adlibbing, etcetera. _Default value is `0`._ | -| `buckets=0,1,...` | The buckets can be specified as base-0 indices of the buckets as seen by the user. This means that `?buckets=1` will display the second bucket as seen by the user when not filtering the buckets. This allows the user to decide which bucket is displayed on a secondary attached screen simply by reordering the buckets on their main view. | -| `develop=1` | Enables the browser's default right-click menu to appear. It will also reveal the _Manual Control_ section on the Rundown page. _Default value is `0`._ | -| `display=layout,buckets,inspector` | A comma-separated list of features to be displayed in the shelf. Available values are: `layout` \(for displaying the Rundown Layout\), `buckets` \(for displaying the Buckets\) and `inspector` \(for displaying the Inspector\). | -| `help=1` | Enables some tooltips that might be useful to new users. _Default value is `0`._ | -| `ignore_piece_content_status=1` | Removes the "zebra" marking on VT pieces that have a "missing" status. _Default value is `0`._ | -| `reportNotificationsId=anyId,...` | Sets an ID for an individual client GUI system, to be used for reporting Notifications shown to the user. The Notifications' contents, tagged with this ID, will be sent back to the Sofie Core's log. _Default value is `0`, which disables the feature._ | -| `shelffollowsonair=1` | _Default value is `0`._ | -| `show_hidden_source_layers=1` | _Default value is `0`._ | -| `speak=1` | Experimental feature that starts playing an audible countdown 10 seconds before each planned _Take_. _Default value is `0`._ | -| `vibrate=1` | Experimental feature that triggers the vibration API in the web browser 3 seconds before each planned _Take_. _Default value is `0`._ | -| `zoom=1,...` | Sets the scaling of the entire GUI. _The unit is a percentage where `100` is the default scaling._ | +Appending query parameter(s) to the URL will allow you to modify the behaviour of the GUI, as well as control the [Access Levels](../user-guide/features/access-levels.md). +| Query Parameter | Description | +| :--------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `admin=1` | Gives the GUI the same access as the combination of [Configuration Mode](../user-guide/features/access-levels.md#Configuration-Mode) and [Studio Mode](../user-guide/features/access-levels.md#Studio-Mode) as well as having access to a set of [Testing Mode](../user-guide/features/access-levels.md#Testing-Mode) tools and a Manual Control section on the Rundown page. _Default value is `0`._ | +| `studio=1` | [Studio Mode](../user-guide/features/access-levels.md#Studio-Mode) gives the GUI full control of the studio and all information associated to it. This includes allowing actions like activating and deactivating rundowns, taking parts, adlibbing, etcetera. _Default value is `0`._ | +| `buckets=0,1,...` | The buckets can be specified as base-0 indices of the buckets as seen by the user. This means that `?buckets=1` will display the second bucket as seen by the user when not filtering the buckets. This allows the user to decide which bucket is displayed on a secondary attached screen simply by reordering the buckets on their main view. | +| `develop=1` | Enables the browser's default right-click menu to appear. It will also reveal the _Manual Control_ section on the Rundown page. _Default value is `0`._ | +| `display=layout,buckets,inspector` | A comma-separated list of features to be displayed in the shelf. Available values are: `layout` \(for displaying the Rundown Layout\), `buckets` \(for displaying the Buckets\) and `inspector` \(for displaying the Inspector\). | +| `help=1` | Enables some tooltips that might be useful to new users. _Default value is `0`._ | +| `ignore_piece_content_status=1` | Removes the "zebra" marking on VT pieces that have a "missing" status. _Default value is `0`._ | +| `reportNotificationsId=anyId,...` | Sets an ID for an individual client GUI system, to be used for reporting Notifications shown to the user. The Notifications' contents, tagged with this ID, will be sent back to the Sofie Core's log. _Default value is `0`, which disables the feature._ | +| `shelffollowsonair=1` | _Default value is `0`._ | +| `show_hidden_source_layers=1` | _Default value is `0`._ | +| `speak=1` | Experimental feature that starts playing an audible countdown 10 seconds before each planned _Take_. _Default value is `0`._ | +| `vibrate=1` | Experimental feature that triggers the vibration API in the web browser 3 seconds before each planned _Take_. _Default value is `0`._ | +| `zoom=1,...` | Sets the scaling of the entire GUI. _The unit is a percentage where `100` is the default scaling._ | +| `hideRundownHeader=1` | Hides header on [Rundown view](../user-guide/features/sofie-views-and-screens#rundown-view) and [Active Rundown screen](../user-guide/features/sofie-views-and-screens#active-rundown-screen). _Default value is `0`._ | diff --git a/packages/documentation/docs/user-guide/concepts-and-architecture.md b/packages/documentation/docs/user-guide/concepts-and-architecture.md index 917222182b..606bd8b2cc 100644 --- a/packages/documentation/docs/user-guide/concepts-and-architecture.md +++ b/packages/documentation/docs/user-guide/concepts-and-architecture.md @@ -15,19 +15,19 @@ It is a [NodeJS](https://nodejs.org/) process backed up by a [MongoDB](https://w ### Gateways -Gateways are applications that connect to Sofie Core and and exchanges data; such as rundown data from an NRCS or the [Timeline](#timeline) for playout. +Gateways are applications that connect to Sofie Core and exchange data; such as rundown data from an NRCS (Newsroom Computer System) or the [Timeline](#timeline) for playout. -An examples of a gateways is the [Spreadsheet Gateway](https://github.com/SuperFlyTV/spreadsheet-gateway). -All gateways use the [Core Integration Library](https://github.com/Sofie-Automation/sofie-core/tree/main/packages/server-core-integration) to communicate with Core. +An example of a gateway is the [Spreadsheet Gateway](https://github.com/SuperFlyTV/spreadsheet-gateway). +All gateways use the [Core Integration Library](https://github.com/Sofie-Automation/sofie-core/tree/master/packages/server-core-integration) to communicate with Core. ## System, \(Organization\), Studio & Show Style -To be able to facilitate various workflows and to Here's a short explanation about the differences between the "System", "Organization", "Studio" and "Show Style". +To be able to facilitate various different kinds of show, Sofie Core has the concepts of "System", "Organization", "Studio" and "Show Style". - The **System** defines the whole of the Sofie Core - The **Organization** \(only available if user accounts are enabled\) defines things that are common for an organization. An organization consists of: **Users, Studios** and **ShowStyles**. - The **Studio** contains things that are related to the "hardware" or "rig". Technically, a Studio is defined as an entity that can have one \(or none\) rundown active at any given time. In most cases, this will be a representation of your gallery, with cameras, video playback and graphics systems, external inputs, sound mixers, lighting controls and so on. A single System can easily control multiple Studios. -- The **Show Style** contains settings for the "show", for example if there's a "Morning Show" and an "Afternoon Show" - produced in the same gallery - they might be two different Show Styles \(played in the same Studio\). Most importantly, the Show Style decides the "look and feel" of the Show towards the producer/director, dictating how data ingested from the NRCS will be interpreted and how the user will interact with the system during playback (see: [Show Style](../configuration/settings-view#show-style) in Settings). +- The **Show Style** contains settings for the "show", for example if there's a "Morning Show" and an "Afternoon Show" - produced in the same gallery - they might be two different Show Styles \(played in the same Studio\). Most importantly, the Show Style decides the "look and feel" of the Show towards the producer/director, dictating how data ingested from the NRCS will be interpreted and how the user will interact with the system during playback (see: [Show Style](configuration/settings-view#show-style) in Settings). - A **Show Style Variant** is a set of Show Style _Blueprint_ configuration values, that allows to use the same interaction model across multiple Shows with potentially different assets, changing the outward look of the Show: for example news programs with different hosts produced from the same Studio, but with different light setups, backscreen and overlay graphics. ![Sofie Architecture Venn Diagram](/img/docs/main/features/sofie-venn-diagram.png) @@ -40,7 +40,7 @@ To be able to facilitate various workflows and to Here's a short explanation abo A Playlist \(or "Rundown Playlist"\) is the entity that "goes on air" and controls the playhead/Take Point. -It contains one or several Rundowns inside, which are playout out in order. +It contains one or more Rundowns, which are played out in order. :::info In some many studios, there is only ever one rundown in a playlist. In those cases, we sometimes lazily refer to playlists and rundowns as "being the same thing". @@ -78,11 +78,11 @@ See also: [Showstyle](#system-organization-studio--show-style) ### AdLib Piece -The AdLib pieces are Pieces that isn't programmed to fire at a specific time, but instead intended to be manually triggered by the user. +The AdLib pieces are Pieces that aren't programmed to fire at a specific time, but instead intended to be manually triggered by the user. The AdLib pieces can either come from the currently playing Part, or it could be _global AdLibs_ that are available throughout the show. -An AdLib isn't added to the Part in the GUI until it starts playing, instead you find it in the [Shelf](features/sofie-views.mdx#shelf). +An AdLib isn't added to the Part in the GUI until it starts playing, instead you find it in the [Shelf](features/sofie-views-and-screens.mdx#shelf). ## Buckets @@ -92,15 +92,15 @@ The primary use-case of these elements is for breaking-news formats where quick The ingest happens via the `getAdlibItem` method: [https://github.com/Sofie-Automation/sofie-core/blob/6c4edee7f352bb542c8a29317d59c0bf9ac340ba/packages/blueprints-integration/src/api/showStyle.ts#L122](https://github.com/Sofie-Automation/sofie-core/blob/6c4edee7f352bb542c8a29317d59c0bf9ac340ba/packages/blueprints-integration/src/api/showStyle.ts#L122) -## Views +## Views and Screens -Being a web-based system, Sofie has a number of customisable, user-facing web [views](features/sofie-views.mdx) used for control and monitoring. +Being a web-based system, Sofie has a number of customisable, user-facing web [views and screens](features/sofie-views-and-screens.mdx) used for control and monitoring. ## Blueprints Blueprints are plug-ins that run in Sofie Core. They interpret the data coming in from the rundowns and transform them into a rich set of playable elements \(Segments, Parts, AdLibs etc\). -The blueprints are webpacked javascript bundles which are uploaded into Sofie via the GUI. They are custom-made and changes depending on the show style, type of input data \(NRCS\) and the types of controlled devices. A generic [blueprint that works with spreadsheets is available here](https://github.com/SuperFlyTV/sofie-demo-blueprints). +The blueprints are webpacked javascript bundles which are uploaded into Sofie via the GUI. They are custom-made and vary depending on the show style, type of input data \(NRCS\) and the types of controlled devices. A generic [blueprint that works with spreadsheets is available here](https://github.com/SuperFlyTV/sofie-demo-blueprints). When [Sofie Core](#sofie-core) calls upon a Blueprint, it returns a JavaScript object containing methods callable by Sofie Core. These methods will be called by Sofie Core in different situations, depending on the method. Documentation on these interfaces are available in the [Blueprints integration](https://www.npmjs.com/package/@sofie-automation/blueprints-integration) library. @@ -111,19 +111,19 @@ There are 3 types of blueprints, and all 3 must be uploaded into Sofie before th Handle things on the _System level_. Documentation on the interface to be exposed by the Blueprint: -[https://github.com/Sofie-Automation/sofie-core/blob/main/packages/blueprints-integration/src/api.ts#L75](https://github.com/Sofie-Automation/sofie-core/blob/main/packages/blueprints-integration/src/api.ts#L75) +[https://github.com/Sofie-Automation/sofie-core/blob/main/packages/blueprints-integration/src/api/system.ts](https://github.com/Sofie-Automation/sofie-core/blob/main/packages/blueprints-integration/src/api/system.ts) ### Studio Blueprints Handle things on the _Studio level_, like "which showstyle to use for this rundown". Documentation on the interface to be exposed by the Blueprint: -[https://github.com/Sofie-Automation/sofie-core/blob/main/packages/blueprints-integration/src/api.ts#L85](https://github.com/Sofie-Automation/sofie-core/blob/main/packages/blueprints-integration/src/api.ts#L85) +[https://github.com/Sofie-Automation/sofie-core/blob/main/packages/blueprints-integration/src/api/studio.ts](https://github.com/Sofie-Automation/sofie-core/blob/main/packages/blueprints-integration/src/api/studio.ts) ### Showstyle Blueprints Handle things on the _Showstyle level_, like generating [_Baseline_](#baseline), _Segments_, _Parts, Pieces_ and _Timelines_ in a rundown. Documentation on the interface to be exposed by the Blueprint: -[https://github.com/Sofie-Automation/sofie-core/blob/main/packages/blueprints-integration/src/api.ts#L117](https://github.com/Sofie-Automation/sofie-core/blob/main/packages/blueprints-integration/src/api.ts#L117) +[https://github.com/Sofie-Automation/sofie-core/blob/main/packages/blueprints-integration/src/api/showStyle.ts](https://github.com/Sofie-Automation/sofie-core/blob/main/packages/blueprints-integration/src/api/showStyle.ts) ## `PartInstances` and `PieceInstances` @@ -152,7 +152,7 @@ The Sofie system is made to work with a modern web- and IT-based approach in min One drawback of running in a cloud over the public internet is the - sometimes unpredictable - latency. The Timeline overcomes this by moving all the immediate control of the playout devices to the Playout Gateway, which is intended to run on a local network, close to the hardware it controls. This also gives the system a simple way of load-balancing - since the number of web-clients or load on Sofie Core won't affect the playout. -Another benefit of basing the playout on a timeline is that when programming the show \(the blueprints\), you only have to care about "what you want to be on screen", you don't have to care about cleaning up previously played things, or what was actually played out before. Those are things that are handled by the Playout Gateway automatically. This also allows the user to jump around in a rundown freely, without the risk of things going wrong on air. +Another benefit of basing the playout on a timeline is that when programming the show \(the blueprints\), you only have to care about "what you want to be on screen", you don't have to care about cleaning up previously played things, or what was actually played out before. This is handled by the Playout Gateway automatically. This also allows the user to jump around in a rundown freely, without the risk of things going wrong on air. ### How does it work? @@ -181,7 +181,7 @@ The TSR then... - Maps the target-state to each playout device - Compares the target-states for each device with the currently-tracked-state and.. - Generates commands to send to each device to account for the change -- The commands are then put on queue and sent to the devices at the correct time +- Puts the commands on the queue and sends them to the devices at the correct time. :::info For more information about what playout devices _TSR_ supports, and examples of the timeline-objects, see the [README of TSR](https://github.com/Sofie-Automation/sofie-timeline-state-resolver#timeline-state-resolver) diff --git a/packages/documentation/docs/user-guide/configuration/_category_.json b/packages/documentation/docs/user-guide/configuration/_category_.json index d2aee9ef5b..c4e45c2347 100644 --- a/packages/documentation/docs/user-guide/configuration/_category_.json +++ b/packages/documentation/docs/user-guide/configuration/_category_.json @@ -1,4 +1,4 @@ { - "label": "Configuration", - "position": 4 -} \ No newline at end of file + "label": "Configuration", + "position": 4 +} diff --git a/packages/documentation/docs/user-guide/configuration/settings-view.md b/packages/documentation/docs/user-guide/configuration/settings-view.md index b6ced3ae8c..8ed0587602 100644 --- a/packages/documentation/docs/user-guide/configuration/settings-view.md +++ b/packages/documentation/docs/user-guide/configuration/settings-view.md @@ -1,6 +1,7 @@ --- sidebar_position: 2 --- + # Settings View :::caution @@ -54,15 +55,15 @@ The clean up process in Sofie will search the database for unused data and index A _Studio_ in Sofie-terms is a physical location, with a specific set of devices and equipment. Only one show can be on air in a studio at the same time. The _studio_ settings are settings for that specific studio, and contains settings related to hardware and playout, such as: -* **Attached devices** - the Gateways related to this studio -* **Blueprint configuration** - custom config option defined by the blueprints -* **Layer Mappings** - Maps the logical _timeline layers_ to physical devices and outputs +- **Attached devices** - the Gateways related to this studio +- **Blueprint configuration** - custom config option defined by the blueprints +- **Layer Mappings** - Maps the logical _timeline layers_ to physical devices and outputs The Studio uses a studio-blueprint, which handles things like mapping up an incoming rundown to a Showstyle. ### Attached Devices -This section allows you to add and remove Gateways that are related to this _Studio_. When a Gateway is attached to a Studio, it will react to the changes happening within it, as well as feed the neccessary data into it. +This section allows you to add and remove Gateways that are related to this _Studio_. When a Gateway is attached to a Studio, it will react to the changes happening within it, as well as feed the necessary data into it. ### Blueprint Configuration @@ -84,9 +85,9 @@ In order to allow the Producer to reconfigure the automation from the Switchboar A Route Set is essentially a distinct set of Layer Mappings, which can modify the settings already configured by the Layer Mappings, but can be turned On and Off. Called Routes, these can change: -* the Layer ID to a new Layer ID -* change the Device being controlled by the Layer -* change the aspect of the Device that's being controlled. +- the Layer ID to a new Layer ID +- change the Device being controlled by the Layer +- change the aspect of the Device that's being controlled. Route Sets can be grouped into Exclusivity Groups, in which only a single Route Set can be enabled at a time. When activating a Route Set within an Exclusivity Group, all other Route Sets in that group will be deactivated. This in turn, allows the System Administrator to create entire sections of exclusive automation control within the Studio that the Producer can then switch between. One such example could be switching between Primary and Backup playout servers, or switching between Primary and Backup talent microphone. @@ -115,10 +116,10 @@ Route Sets can also be configured with a _Default State_. This can be used to co A _Showstyle_ is related to the looks and logic of a _show_, which in contrast to the _studio_ is not directly related to the hardware. The Showstyle contains settings like -* **Source Layers** - Groups different types of content in the GUI -* **Output Channels** - Indicates different output targets \(such as the _Program_ or _back-screen in the studio_\) -* **Action Triggers** - Select how actions can be started on a per-show basis, outside of the on-screen controls -* **Blueprint configuration** - custom config option defined by the blueprints +- **Source Layers** - Groups different types of content in the GUI +- **Output Channels** - Indicates different output targets \(such as the _Program_ or _back-screen in the studio_\) +- **Action Triggers** - Select how actions can be started on a per-show basis, outside of the on-screen controls +- **Blueprint configuration** - custom config option defined by the blueprints :::caution Please note the difference between _Source Layers_ and _timeline-layers_: @@ -128,12 +129,12 @@ Please note the difference between _Source Layers_ and _timeline-layers_: [Timeline-objects](../concepts-and-architecture.md#timeline-object) \(inside of the [Pieces](../concepts-and-architecture.md#piece)\) are put onto timeline-layers, which are \(through the Mappings in the studio\) mapped to physical devices and outputs. The exact timeline-layer is never exposed to the user, but instead used on the technical level to control playout. -An example of the difference could be when playing a VT \(that's a Source Layer\), which could involve all of the timeline-layers _video\_player0_, _audio\_fader\_video_, _audio\_fader\_host_ and _mixer\_pgm._ +An example of the difference could be when playing a VT \(that's a Source Layer\), which could involve all of the timeline-layers _video_player0_, _audio_fader_video_, _audio_fader_host_ and _mixer_pgm._ ::: ### Action Triggers -This is a way to set up how - outside of the Point-and-Click Graphical User Interface - actions can be performed in the User Interface. Commonly, these are the *hotkey combinations* that can be used to either trigger AdLib content or other actions in the larger system. This is done by creating sets of Triggers and Actions to be triggered by them. These pairs can be set at the Show Style level or at the _Sofie Core_ (System) level, for common actions such as doing a Take or activating a Rundown, where you want a shared method of operation. _Sofie Core_ migrations will set up a base set of basic, system-wide Action Triggers for interacting with rundowns, but they can be changed by the System blueprint. +This is a way to set up how - outside of the Point-and-Click Graphical User Interface - actions can be performed in the User Interface. Commonly, these are the _hotkey combinations_ that can be used to either trigger AdLib content or other actions in the larger system. This is done by creating sets of Triggers and Actions to be triggered by them. These pairs can be set at the Show Style level or at the _Sofie Core_ (System) level, for common actions such as doing a Take or activating a Rundown, where you want a shared method of operation. _Sofie Core_ migrations will set up a base set of basic, system-wide Action Triggers for interacting with rundowns, but they can be changed by the System blueprint. ![Action triggers define modes of interacting with a Rundown](/img/docs/main/features/action_triggers_3.png) @@ -141,21 +142,21 @@ This is a way to set up how - outside of the Point-and-Click Graphical User Inte The triggers are designed to be either client-specific or issued by a peripheral device module. -Currently, the Action Triggers system supports setting up two types of triggeers: Hotkeys and Device Triggers. +Currently, the Action Triggers system supports setting up two types of triggeers: Hotkeys and Device Triggers. -Hotkeys are valid in the scope of a browser window and can be either a single key, a combination of keys (*combo*) or a *chord* - a sequnece of key combinations pressed in a particular order. *Chords* are popular in some text editing applications and vastly expand the amount of actions that can be triggered from a keyboard, at the expense of the time needed to execute them. Currently, the Hotkey editor in Sofie does not support creating *Chords*, but they can be specified by Blueprints during migrations. +Hotkeys are valid in the scope of a browser window and can be either a single key, a combination of keys (_combo_) or a _chord_ - a sequence of key combinations pressed in a particular order. _Chords_ are popular in some text editing applications and vastly expand the amount of actions that can be triggered from a keyboard, at the expense of the time needed to execute them. Currently, the Hotkey editor in Sofie does not support creating _Chords_, but they can be specified by Blueprints during migrations. To edit a given trigger, click on the trigger pill on the left of the Trigger-Action set. When hovering, a **+** sign will appear, allowing you to add a new trigger to the set. -Device Triggers are valid in the scope of a Studio and will be evaluated on the currently active Rundown in a given Studio. To use Device Triggers, you need to have at least a single [Input Gateway](../installation/installing-input-gateway) attached to a Studio and a Device configured in the Input Gateway. Once that's done, when selecting a **Device** trigger type in the pop-up, you can invoke triggers on your Input Device and you will see a preview of the input events shown at the bottom of the pop-up. You can select which of these events should be the trigger by clicking on one of the previews. Note, that some devices differentiate between _Up_ and _Down_ triggers, while others don't. Some may also have other activites that can be done _to_ a trigger. What they are and how they are identified is device-specific and is best discovered through interaction with the device. +Device Triggers are valid in the scope of a Studio and will be evaluated on the currently active Rundown in a given Studio. To use Device Triggers, you need to have at least a single [Input Gateway](../installation/installing-input-gateway) attached to a Studio and a Device configured in the Input Gateway. Once that's done, when selecting a **Device** trigger type in the pop-up, you can invoke triggers on your Input Device and you will see a preview of the input events shown at the bottom of the pop-up. You can select which of these events should be the trigger by clicking on one of the previews. Note, that some devices differentiate between _Up_ and _Down_ triggers, while others don't. Some may also have other activities that can be done _to_ a trigger. What they are and how they are identified is device-specific and is best discovered through interaction with the device. If you would like to set up combination Triggers, using Device Triggers on an Input Device that does not support them natively, you may want to look into [Shift Registers](#shift-registers) #### Actions -The actions are built using a base *action* (such as *Activate a Rundown* or *AdLib*) and a set of *filters*, limiting the scope of the *action*. Optionally, some of these *actions* can take additional *parameters*. These filters can operate on various types of objects, depending on the action in question. All actions currently require that the chain of filters starts with scoping out the Rundown the action is supposed to affect. Currently, there is only one type of Rundown-level filter supported: "The Rundown currently in view". +The actions are built using a base _action_ (such as _Activate a Rundown_ or _AdLib_) and a set of _filters_, limiting the scope of the _action_. Optionally, some of these _actions_ can take additional _parameters_. These filters can operate on various types of objects, depending on the action in question. All actions currently require that the chain of filters starts with scoping out the Rundown the action is supposed to affect. Currently, there is only one type of Rundown-level filter supported: "The Rundown currently in view". -The Action Triggers user interface guides the user in a wizzard-like fashion through the available *filter* options on a given *action*. +The Action Triggers user interface guides the user in a wizard-like fashion through the available _filter_ options on a given _action_. ![Actions can take additional parameters](/img/docs/main/features/action_triggers_2.png) @@ -163,7 +164,7 @@ If the action provides a preview of the triggered items and there is an availabl ![A preview of the action, as scoped by the filters](/img/docs/main/features/action_triggers_4.png) -Clicking on the action and filter pills allows you to edit the action parameters and filter parameters. *Limit* limits the amount of objects to only the first *N* objects matched - this can significantly improve performance on large data sets. *Pick* and *Pick last* filters end the chain of the filters by selecting a single item from the filtered set of objects (the *N-th* object from the beginning or the end, respectively). *Pick* implicitly contains a *Limit* for the performance improvement. This is not true for *Pick last*, though. +Clicking on the action and filter pills allows you to edit the action parameters and filter parameters. _Limit_ limits the amount of objects to only the first _N_ objects matched - this can significantly improve performance on large data sets. _Pick_ and _Pick last_ filters end the chain of the filters by selecting a single item from the filtered set of objects (the _N-th_ object from the beginning or the end, respectively). _Pick_ implicitly contains a _Limit_ for the performance improvement. This is not true for _Pick last_, though. ##### Shift Registers @@ -178,4 +179,3 @@ The migrations are automatic setup-scripts that help you during initial setup an There are system-migrations that comes directly from the version of _Sofie Core_ you're running, and there are also migrations added by the different blueprints. It is mandatory to run migrations when you've upgraded _Sofie Core_ to a new version, or upgraded your blueprints. - diff --git a/packages/documentation/docs/user-guide/configuration/sofie-core-settings.md b/packages/documentation/docs/user-guide/configuration/sofie-core-settings.md index ed2ecc806a..a6d00aa139 100644 --- a/packages/documentation/docs/user-guide/configuration/sofie-core-settings.md +++ b/packages/documentation/docs/user-guide/configuration/sofie-core-settings.md @@ -97,7 +97,7 @@ There are various settings you can set for an installation. See the list below: | `followOnAirSegmentsHistory` | How many segments of history to show when scrolling back in time (0 = show current segment only) | `0` | | `maximumDataAge` | Clean up stuff that are older than this [ms]) | 100 days | | `poisonKey` | Enable the use of poison key if present and use the key specified. | `'Escape'` | -| `enableNTPTimeChecker` | If set, enables a check to ensure that the system time doesn't differ too much from the speficied NTP server time. | `null` | +| `enableNTPTimeChecker` | If set, enables a check to ensure that the system time doesn't differ too much from the specified NTP server time. | `null` | | `defaultShelfDisplayOptions` | Default value used to toggle Shelf options when the 'display' URL argument is not provided. | `buckets,layout,shelfLayout,inspector` | | `enableKeyboardPreview` | The KeyboardPreview is a feature that is not implemented in the main Fork, and is kept here for compatibility | `false` | | `keyboardMapLayout` | Keyboard map layout (what physical layout to use for the keyboard) | STANDARD_102_TKL | diff --git a/packages/documentation/docs/user-guide/features/_category_.json b/packages/documentation/docs/user-guide/features/_category_.json index 0dd70d8b0e..785c16360b 100644 --- a/packages/documentation/docs/user-guide/features/_category_.json +++ b/packages/documentation/docs/user-guide/features/_category_.json @@ -1,4 +1,4 @@ { - "label": "Features", - "position": 2 -} \ No newline at end of file + "label": "Features", + "position": 2 +} diff --git a/packages/documentation/docs/user-guide/features/access-levels.md b/packages/documentation/docs/user-guide/features/access-levels.md index 807e5840bc..ebf6adfa61 100644 --- a/packages/documentation/docs/user-guide/features/access-levels.md +++ b/packages/documentation/docs/user-guide/features/access-levels.md @@ -6,17 +6,17 @@ sidebar_position: 3 ## Permissions -There are a few different access levels that users can be assigned. They are not heirarchical, you will often need to enable multiple for each user. +There are a few different access levels that users can be assigned. They are not hierarchical, you will often need to enable multiple for each user. Any client that can access Sofie always has at least view-only access to the rundowns, and system status pages. -| Level | Summary | -| :------------ | :----------------------------------------------------------------------------------------------------------------------------------------------- | -| **studio** | Grants access to operate a studio for playout of a rundown. | -| **configure** | Grants access to the settings pages of Sofie, and other abilities to configure the system. | -| **developer** | Grants access to some tools useful to developers. This also changes some ui behaviours to be less agressive in what is shown in the rundown view | -| **testing** | Enables the page Test Tools, which contains various tools useful for testing the system during development | -| **service** | Grants access to the external message status page, and some additional rundown management options that are not commonly needed | -| **gateway** | Grants access to various APIs intended for use by the various gateways that connect Sofie to other systems. | +| Level | Summary | +| :------------ | :------------------------------------------------------------------------------------------------------------------------------------------------ | +| **studio** | Grants access to operate a studio for playout of a rundown. | +| **configure** | Grants access to the settings pages of Sofie, and other abilities to configure the system. | +| **developer** | Grants access to some tools useful to developers. This also changes some ui behaviours to be less aggressive in what is shown in the rundown view | +| **testing** | Enables the page Test Tools, which contains various tools useful for testing the system during development | +| **service** | Grants access to the external message status page, and some additional rundown management options that are not commonly needed | +| **gateway** | Grants access to various APIs intended for use by the various gateways that connect Sofie to other systems. | ## Authentication providers diff --git a/packages/documentation/docs/user-guide/features/api.md b/packages/documentation/docs/user-guide/features/api.md index 9e445a263d..b58e66a4cb 100644 --- a/packages/documentation/docs/user-guide/features/api.md +++ b/packages/documentation/docs/user-guide/features/api.md @@ -6,7 +6,7 @@ sidebar_position: 10 ## Sofie User Actions REST API -Starting with version 1.50.0, there is a semantically-versioned HTTP REST API definied using the [OpenAPI specification](https://spec.openapis.org/oas/v3.0.3) that exposes some of the functionality available through the GUI in a machine-readable fashion. The API specification can be found in the `packages/openapi` folder. The latest version of this API is available in _Sofie Core_ using the endpoint: `/api/1.0`. There should be no assumption of backwards-compatibility for this API, but this API will be semantically-versioned, with redirects set up for minor-version changes for compatibility. +Starting with version 1.50.0, there is a semantically-versioned HTTP REST API defined using the [OpenAPI specification](https://spec.openapis.org/oas/v3.0.3) that exposes some of the functionality available through the GUI in a machine-readable fashion. The API specification can be found in the `packages/openapi` folder. The latest version of this API is available in _Sofie Core_ using the endpoint: `/api/1.0`. There should be no assumption of backwards-compatibility for this API, but this API will be semantically-versioned, with redirects set up for minor-version changes for compatibility. There is a also a legacy REST API available that can be used to fetch data and trigger actions. The documentation for this API is minimal, but the API endpoints are listed by _Sofie Core_ using the endpoint: `/api/0` @@ -16,4 +16,4 @@ Starting with version 1.50.0, there is also a separate service available, called ## DDP – Core Integration -If you're planning to build NodeJS applications that talk to _Sofie Core_, we recommend using the [core-integration](https://github.com/Sofie-Automation/sofie-core/tree/main/packages/server-core-integration.md) library, which exposes a number of callable methods and allows for subscribing to data the same way the [Gateways](../concepts-and-architecture.md#gateways) do it. +If you're planning to build NodeJS applications that talk to _Sofie Core_, we recommend using the [core-integration](https://github.com/Sofie-Automation/sofie-core/tree/master/packages/server-core-integration) library, which exposes a number of callable methods and allows for subscribing to data the same way the [Gateways](../concepts-and-architecture.md#gateways) do it. diff --git a/packages/documentation/docs/user-guide/features/language.md b/packages/documentation/docs/user-guide/features/language.md index 9fe03d816e..3c61fb16c3 100644 --- a/packages/documentation/docs/user-guide/features/language.md +++ b/packages/documentation/docs/user-guide/features/language.md @@ -1,9 +1,10 @@ --- sidebar_position: 7 --- + # Language -_Sofie_ uses the [i18n internationalisation framework](https://www.i18next.com/) that allows you to present user-facing views in multiple languages. +_Sofie_ uses the [i18n internationalisation framework](https://www.i18next.com/) that allows you to present user-facing views in multiple languages. ## Language selection @@ -14,10 +15,11 @@ The UI will automatically detect user browser's default matching and select the This choice is persisted in browser's local storage, and the same language will be used until a new forced language is chosen using this method. _Sofie_ currently supports three languages: -* English _(default)_ `en` -* Norwegian bokmål `nb` -* Norwegian nynorsk `nn` + +- English _(default)_ `en` +- Norwegian bokmål `nb` +- Norwegian nynorsk `nn` ## Further Reading -* [List of language tags](https://en.wikipedia.org/wiki/IETF_language_tag) \ No newline at end of file +- [List of language tags](https://en.wikipedia.org/wiki/IETF_language_tag) diff --git a/packages/documentation/docs/user-guide/features/prompter.md b/packages/documentation/docs/user-guide/features/prompter.md index 6940a84cb7..cb7a353115 100644 --- a/packages/documentation/docs/user-guide/features/prompter.md +++ b/packages/documentation/docs/user-guide/features/prompter.md @@ -2,11 +2,11 @@ sidebar_position: 3 --- -# Prompter +# Prompter Screen -See [Sofie views](sofie-views.mdx#prompter-view) for how to access the prompter page. +See [Sofie Views and Screens](sofie-views-and-screens.mdx#prompter-screen) to learn how to access the Prompter Screen. -![Prompter screen before the first Part is taken](/img/docs/main/features/prompter-view.png) +![Prompter Screen before the first Part is taken](/img/docs/main/features/prompter-view.png) The prompter will display the script for the Rundown currently active in the Studio. On Air and Next parts and segments are highlighted - in red and green, respectively - to aid in navigation. In top-right corner of the screen, a Diff clock is shown, showing the difference between planned playback and what has been actually produced. This allows the host to know how far behind/ahead they are in regards to planned execution. @@ -16,7 +16,7 @@ If the user scrolls the prompter ahead or behind the On Air part, helpful indica ## Customize looks -The prompter UI can be configured using query parameters: +The Prompter Screen can be configured using query parameters: | Query parameter | Type | Description | Default | | :-------------- | :----- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :------ | @@ -43,7 +43,7 @@ The prompter can be controlled by different types of controllers. The control mo | `?mode=mouse` | Controlled by mouse only. [See configuration details](prompter.md#control-using-mouse-scroll-wheel) | | `?mode=keyboard` | Controlled by keyboard only. [See configuration details](prompter.md#control-using-keyboard) | | `?mode=shuttlekeyboard` | Controlled by a Contour Design ShuttleXpress, X-keys Jog and Shuttle or any compatible, configured as keyboard-ish device. [See configuration details](prompter.md#control-using-contour-shuttlexpress-or-x-keys) | -| `?mode=shuttlewebhid` | Controlled by a Contour Design ShuttleXpress, using the browser's WebHID API [See configuration details](prompter.md#control-using-contour-shuttlexpress-via-webhid) | +| `?mode=shuttlewebhid` | Controlled by a Contour Design ShuttleXpress, using the browser's WebHID API [See configuration details](prompter.md#control-using-contour-shuttlexpress-via-webhid) | | `?mode=pedal` | Controlled by any MIDI device outputting note values between 0 - 127 of CC notes on channel 8. Analogue Expression pedals work well with TRS-USB midi-converters. [See configuration details](prompter.md#control-using-midi-input-mode-pedal) | | `?mode=joycon` | Controlled by Nintendo Switch Joycon, using the HTML5 GamePad API. [See configuration details](prompter.md#control-using-nintendo-joycon-gamepad) | @@ -51,11 +51,11 @@ The prompter can be controlled by different types of controllers. The control mo The prompter can be controlled in multiple ways when using the scroll wheel: -| Query parameter | Description | -| :-------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `?controlmode=normal` | Scrolling of the mouse works as "normal scrolling" | -| `?controlmode=speed` | Scrolling of the mouse changes the speed of scolling. Left-click to toggle, right-click to rewind | -| `?controlmode=smoothscroll` | Scrolling the mouse wheel starts continous scrolling. Small speed adjustments can then be made by nudging the scroll wheel. Stop the scrolling by making a "larger scroll" on the wheel. | +| Query parameter | Description | +| :-------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `?controlmode=normal` | Scrolling of the mouse works as "normal scrolling" | +| `?controlmode=speed` | Scrolling of the mouse changes the speed of scrolling. Left-click to toggle, right-click to rewind | +| `?controlmode=smoothscroll` | Scrolling the mouse wheel starts continuous scrolling. Small speed adjustments can then be made by nudging the scroll wheel. Stop the scrolling by making a "larger scroll" on the wheel. | has several operating modes, described further below. All modes are intended to be controlled by a computer mouse or similar, such as a presenter tool. @@ -72,7 +72,7 @@ Keyboard control is intended to be used when having a "keyboard"-device, such as #### Control using Contour ShuttleXpress or X-keys \(_?mode=shuttlekeyboard_\) -This mode is intended to be used when having a Contour ShuttleXpress or X-keys device, configured to work as a keyboard device. These devices have jog/shuttle wheels, and their software/firmware allow them to map scroll movement to keystrokes from any key-combination. Since we only listen for key combinations, it effectively means that any device outputing keystrokes will work in this mode. +This mode is intended to be used when having a Contour ShuttleXpress or X-keys device, configured to work as a keyboard device. These devices have jog/shuttle wheels, and their software/firmware allow them to map scroll movement to keystrokes from any key-combination. Since we only listen for key combinations, it effectively means that any device outputting keystrokes will work in this mode. | Query parameter | Type | Description | Default | | :----------------- | :--------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------- | @@ -139,7 +139,7 @@ Any movement within forward range will map to the `pedal_speedMap` with interpol | _"I can't rest my foot without it starting to run"_ | Increase `pedal_rangeNeutralMax` | | _"I have to push too far before it starts moving"_ | Decrease `pedal_rangeNeutralMax` | | _"It starts out fine, but runs too fast if I push too hard"_ | Add more weight to the lower part of the `pedal_speedMap` by adding more low values early in the map, compared to the large numbers in the end. | -| _"I have to go too far back to reverse"_ | Increse `pedal_rangeNeutralMin` | +| _"I have to go too far back to reverse"_ | Increase `pedal_rangeNeutralMin` | | _"As I find a good speed, it varies a bit in speed up/down even if I hold my foot still"_ | Use `?debug=1` to see what speed is calculated in the position the presenter wants to rest the foot in. Add more of that number in a sequence in the `pedal_speedMap` to flatten out the speed curve, i.e. `[1, 2, 3, 4, 4, 4, 4, 5, ...]` | **Note:** The default values are set up to work with the _Yamaha FC7_ expression pedal, and will probably not be good for pedals with one continuous linear range from fully released to fully depressed. A suggested configuration for such pedals \(i.e. the _Mission Engineering EP-1_\) will be like: @@ -173,7 +173,7 @@ The Joycons can operate in 3 modes, the L-stick, the R-stick or both L+R sticks - `joycon_rangeNeutralMax` has to be greater than `joycon_rangeNeutralMin` - `joycon_rangeFwdMax` has to be greater than `joycon_rangeNeutralMax` -![Nintendo Swith Joycons](/img/docs/main/features/nintendo-switch-joycons.jpg) +![Nintendo Switch Joycons](/img/docs/main/features/nintendo-switch-joycons.jpg) You can turn on `?debug=1` to see how your input maps to an output. diff --git a/packages/documentation/docs/user-guide/features/sofie-views.mdx b/packages/documentation/docs/user-guide/features/sofie-views-and-screens.mdx similarity index 64% rename from packages/documentation/docs/user-guide/features/sofie-views.mdx rename to packages/documentation/docs/user-guide/features/sofie-views-and-screens.mdx index d4e0cebd4b..60789ccf16 100644 --- a/packages/documentation/docs/user-guide/features/sofie-views.mdx +++ b/packages/documentation/docs/user-guide/features/sofie-views-and-screens.mdx @@ -5,7 +5,14 @@ sidebar_position: 2 import Tabs from '@theme/Tabs' import TabItem from '@theme/TabItem' -# Sofie Views +# Sofie Views and Screens + +## Definitions + +- A _**View**_ is defined as a particular layout of Sofie's main user interface. + - A _**Mode**_ is one of several ways to configure a particular "View" of Sofie's main user interface. + - A _**Panel**_ is defined as an expandable/collapsable area of Sofie's main user interface. +- A _**Screen**_ is defined a layout intended to be used on an external display, in addition to with Sofie's main user interface. ## Lobby View @@ -17,15 +24,15 @@ All existing rundowns are listed in the _Lobby View_. ![Rundown View](/img/docs/main/features/active-rundown-example.png) -The _Rundown View_ is the main view that the producer is working in. +The _Rundown View_ is the main view that the producer works in. -![The Rundown view and naming conventions of components](/img/docs/main/sofie-naming-conventions.png) +![The Rundown View and naming conventions of components](/img/docs/main/sofie-naming-conventions.png) ![Take Next](/img/docs/main/take-next.png) #### Take Point -The Take point is currently playing [Part](#part) in the rundown, indicated by the "On Air" line in the GUI. +The Take point is currently playing [Part](#part) in the rundown, indicated by the "On Air" line in the GUI. What's played on air is calculated from the timeline objects in the Pieces in the currently playing part. The Pieces inside of a Part determines what's going to happen, the could be indicating things like VT:s, cut to cameras, graphics, or what script the host is going to read. @@ -52,6 +59,18 @@ If a Piece has more or less content than the Part's expected duration allows, an Elements in the [Next point](#next-point) \(or beyond\) might be pre-loaded or "put on preview", depending on the blueprints and playout devices used. This feature is called "Lookahead". +### Rundown View Modes + +In the top-right corner of the Segment, there's a button controlling the display style of a given Segment. The default display style of a Segment can be indicated by the [Blueprints](../concepts-and-architecture.md#blueprints), but the user can switch to a different mode at any time. You can also change the display mode of all Segments at once, using a button in the bottom-right corner of the Rundown View. + +All user interactions work in the Storyboard Mode and List Mode the same as in Timeline Mode: Takes, AdLibs, Holds, and moving the [Next Point](#next-point) around the Rundown. + +#### Timeline Mode + +The default mode for the Rundown. + +#### Storyboard Mode + ### Storyboard Mode In the top-right corner of the Segment, there's a button controlling the display style of a given Segment. The default display style of a Segment can be indicated by the [Blueprints](../concepts-and-architecture.md#blueprints), but the User can switch to a different mode at any time. You can also change the display mode of all Segments at once, using a button in the bottom-right corner of the Rundown View. @@ -60,39 +79,39 @@ In the top-right corner of the Segment, there's a button controlling the display The **_Storyboard_** mode is an alternative to the default **_Timeline_** mode. In Storyboard mode, the accurate placement in time of each Piece is not visualized, so that more Parts can be visualized at once in a single row. This can be particularly useful in Shows without very strict timing planning or where timing is not driven by the User, but rather some external factor; or in Shows where very long Parts are joined with very short ones: sports, events and debates. This mode also does not visualize the history of the playback: rather, it only shows what is currently On Air or is planned to go On Air. -Storyboard mode selects a "main" Piece of the Part, using the same logic as the [Presenter View](#presenter-view), and presents it with a larger, hover-scrub-enabled Piece for easy preview. The countdown to freeze-frame is displayed in the top-right hand corner of the Thumbnail, once less than 10 seconds remain to freeze-frame. The Transition Piece is displayed on top of the thumbnail. Other Pieces are placed below the thumbnail, stacked in order of playback. After a Piece goes off-air, it will dissapear from the view. +Storyboard mode selects a "main" Piece of the Part, using the same logic as the [Presenter Screen](#presenter-screen), and presents it with a larger, hover-scrub-enabled Piece for easy preview. The countdown to freeze-frame is displayed in the top-right hand corner of the Thumbnail, once less than 10 seconds remain to freeze-frame. The Transition Piece is displayed on top of the thumbnail. Other Pieces are placed below the thumbnail, stacked in order of playback. After a Piece goes off-air, it will disappear from the view. -If no more Parts can be displayed in a given Segment, they are stacked in order on the right side of the Segment. The User can scroll through thse Parts by click-and-dragging the Storyboard area, or using the mouse wheel - `Alt`+Wheel, if only a vertical wheel is present in the mouse. +If no more Parts can be displayed in a given Segment, they are stacked in order on the right side of the Segment. The User can scroll through these Parts by click-and-dragging the Storyboard area, or using the mouse wheel - `Alt`+Wheel, if only a vertical wheel is present in the mouse. -### List View Mode +#### List Mode -Another mode available to display a Segment is the List View. In this mode, each _Part_ and it's contents are being displayed as a mini-timeline and it's width is normalized to fit the screen, unless it's shorter than 30 seconds, in which case it will be scaled down accordingly. +Another mode available to display a Segment is the List Mode. In this mode, each _Part_ and it's contents are being displayed as a mini-timeline and it's width is normalized to fit the screen, unless it's shorter than 30 seconds, in which case it will be scaled down accordingly. -![List View Mode](/img/docs/main/list_view.png) +![List Mode](/img/docs/main/list_view.png) In this mode, the focus is on the "main" Piece of the Part. Additional _Lower-Third_ Pieces will be displayed on top of the main Piece. Infinite _Lower-Third_ Pieces and all other content can be displayed to the right of the mini-timeline as a set of indicators, one per every Layer. Clicking on those indicators will show a pop-up with the Pieces so that they can be investigated using _hover-scrub_. Indicators can be also shown for Ad-Libs assigned to a Part, for easier discovery by the User. Which Layers should be shown in the columns can be decided in the [Settings ● Layers](../configuration/settings-view.md#show-style) area. A special, larger indicator is reserved for the Script piece, which can be useful to display so-called _out-words_. If a Part has an _in-transition_ Piece, it will be displayed to the left of the Part's Take Point. -This view is designed to be used in productions that are mixing pre-planned and timed segments with more free-flowing production or mixing short live in-camera links with longer pre-produced clips, while trying to keep as much of the show in the viewport as possible, at the expense of hiding some of the content from the User and the _duration_ of the Part on screen having no bearing on it's _width_. This mode also allows Sofie to visualize content _beyond_ the planned duration of a Part. +This List Mode is designed to be used in productions that are mixing pre-planned and timed segments with more free-flowing production or mixing short live in-camera links with longer pre-produced clips, while trying to keep as much of the show in the viewport as possible, at the expense of hiding some of the content from the User and the _duration_ of the Part on screen having no bearing on it's _width_. This mode also allows Sofie to visualize content _beyond_ the planned duration of a Part. :::info -The Segment header area also shows the expected (planned) durations for all the Parts and will also show which Parts are sharing timing in a timing group using a *⌊* symbol in the place of a counter. +The Segment header area also shows the expected (planned) durations for all the Parts and will also show which Parts are sharing timing in a timing group using a _⌊_ symbol in the place of a counter. ::: All user interactions work in the Storyboard and List View mode the same as in Timeline mode: Takes, AdLibs, Holds and moving the [Next Point](#next-point) around the Rundown. ### Segment Header Countdowns -![Each Segment has two clocks - the Segment Time Budget and a Segment Countdown](/img/docs/main/segment-budget-and-countdown.png) +![Each Segment has two clocks — the Segment Time Budget and a Segment Countdown](/img/docs/main/segment-budget-and-countdown.png) -Clock on the left is an indicator of how much time has been spent playing Parts from that Segment in relation to how much time was planned for Parts in that Segment. If more time was spent playing than was planned for, this clock will turn red, there will be a **+** sign in front of it and will begin counting upwards. +The clock on the left is an indicator of how much time has been spent playing Parts from that Segment in relation to how much time was planned for Parts in that Segment. If more time was spent playing than was planned for, this clock will turn red, there will be a **+** sign in front of it and will begin counting upwards. -Clock on the right is a countdown to the beginning of a given segment. This takes into account unplayed time in the On Air Part and all unplayed Parts between the On Air Part and a given Segment. If there are no unplayed Parts between the On Air Part and the Segment, this counter will disappear. +The clock on the right is a countdown to the beginning of a given segment. This takes into account unplayed time in the On Air Part and all unplayed Parts between the On Air Part and a given Segment. If there are no unplayed Parts between the On Air Part and the Segment, this counter will disappear. @@ -128,13 +147,13 @@ The _Rundown View_ and the _Detached Shelf View_ UI can have multiple concurrent 2. select the first layout of any type, 3. use the default layout \(no additional filters\), in the style of `RUNDOWN_LAYOUT`. -To use a specific layout in these views, you can use the `?layout=...` query string, providing either the ID of the layout or a part of the name. This string will then be mached against all available layouts for the Show Style, and the first matching will be selected. For example, for a layout called `Stream Deck layout`, to open the currently active rundown's Detached Shelf use: +To use a specific mode in these views, you can use the `?layout=...` query string, providing either the ID of the layout or a part of the name. This string will then be matched against all available layouts for the Show Style, and the first matching will be selected. For example, for a layout called `Stream Deck layout`, to open the currently active rundown's Detached Shelf use: `http://localhost:3000/activeRundown/studio0/shelf?layout=Stream` -The Detached Shelf view with a custom `DASHBOARD_LAYOUT` allows displaying the Shelf on an auxiliary touch screen, tablet or a Stream Deck device. A specialized Stream Deck view will be used if the view is opened on a device with hardware characteristics matching a Stream Deck device. +The Detached Shelf Screen with a custom `DASHBOARD_LAYOUT` allows displaying the Shelf on an auxiliary touch screen, tablet or a Stream Deck device. A specialized Stream Deck view will be used if the view is opened on a device with hardware characteristics matching a Stream Deck device. -The shelf also contains additional elements, not controlled by the Rundown View Layout. These include Buckets and the Inspector. If needed, these components can be displayed or hidden using additional url arguments: +The shelf also contains additional elements, not controlled by the Rundown View Mode. These include Buckets and the Inspector. If needed, these components can be displayed or hidden using additional url arguments: | Query parameter | Description | | :---------------------------------- | :------------------------------------------------------------------------ | @@ -163,93 +182,115 @@ The Switchboard panel can be accessed from the Rundown View's right-hand Toolbar Technically, the switchboard activates and deactivates Route Sets. The Route Sets are grouped by Exclusivity Group. If an Exclusivity Group contains exactly two elements with the `ACTIVATE_ONLY` mode, the Route Sets will be displayed on either side of the switch. Otherwise, they will be displayed separately in a list next to an _Off_ position. See also [Settings ● Route sets](../configuration/settings-view#route-sets). ::: -#### Media Status panel +#### Media Status Panel ![Media Status panel](/img/docs/main/features/media-status-rundown-view-panel.png) -This provides an overview of the status of the various Media assets required by -this Rundown for playback. You can sort these assets according to their playout +This provides an overview of the status of the various Media assets required by +this Rundown for playback. You can sort these assets according to their playout order, status, Source Layer Name and Piece Name by clicking on the table header. -Note that while the _Filter..._ text field is focused, you will not be able to +Note that while the _Filter..._ text field is focused, you will not be able to use hotkey triggers for playout actions. You can remove the focus from the field by pressing the Esc key. -## Prompter View +## Evaluations + +When a broadcast is done, users can input feedback about how the show went in an evaluation form. + +:::info +Evaluations can be configured to be sent to Slack, by setting the "Slack Webhook URL" in the [Settings View](../configuration/settings-view.md) under _Studio_. +::: + +## Settings View + +The [Settings View](../configuration/settings-view.md) is only available to users with the [Access Level](access-levels.md) set correctly. + +## Screens + +### Prompter Screen `/prompter/:studioId` -![Prompter View](/img/docs/main/features/prompter-example.png) +![Prompter Screen](/img/docs/main/features/prompter-example.png) + +A fullscreen page which displays the prompter text for the currently active rundown. The prompter can be controlled and configured in various ways, see more at the [Prompter](prompter.md) documentation. If no Rundown is active in a given studio, the [Screensaver](./sofie-views-and-screens.mdx#screensaver) will be displayed. + +### Presenter Screen + +`/countdowns/:studioId/director` + +![Director View](/img/docs/main/features/director-screen-example.png) -A fullscreen page which displays the prompter text for the currently active rundown. The prompter can be controlled and configured in various ways, see more at the [Prompter](prompter.md) documentation. If no Rundown is active in a given studio, the [Screensaver](sofie-views.mdx#screensaver) will be displayed. +A fullscreen page, intended to be shown to the director. It displays countdown timers for the current and next items in the rundown. If no Rundown is active in a given studio, the [Screensaver](./sofie-views-and-screens.mdx#screensaver) will be shown. ## Presenter View `/countdowns/:studioId/presenter` -![Presenter View](/img/docs/main/features/presenter-screen-example.png) +![Presenter Screen](/img/docs/main/features/presenter-screen-example.png) -A fullscreen page, intended to be shown to the studio presenter. It displays countdown timers for the current and next items in the rundown. If no Rundown is active in a given studio, the [Screensaver](sofie-views.mdx#screensaver) will be shown. +A fullscreen page, intended to be shown to the studio presenter. It displays countdown timers for the current and next items in the rundown. If no Rundown is active in a given studio, the [Screensaver](sofie-views-and-screens.mdx#screensaver) will be shown. -### Presenter View Overlay +#### Presenter Screen Overlay `/countdowns/:studioId/overlay` -![Presenter View Overlay](/img/docs/main/features/presenter-screen-overlay-example.png) +![Presenter Screen Overlay](/img/docs/main/features/presenter-screen-overlay-example.png) -A fullscreen view with transparent background, intended to be shown to the studio presenter as an overlay on top of the produced PGM signal. It displays a reduced amount of the information from the regular [Presenter screen](sofie-views.mdx#presenter-view): the countdown to the end of the current Part, a summary preview \(type and name\) of the next item in the Rundown and the current time of day. If no Rundown is active it will show the name of the Studio. +A fullscreen page with transparent background, intended to be shown to the studio presenter as an overlay on top of the produced PGM signal. It displays a reduced amount of the information from the regular [Presenter Screen](sofie-views-and-screens.mdx#presenter-screen): the countdown to the end of the current Part, a summary preview \(type and name\) of the next item in the Rundown and the current time of day. If no Rundown is active it will show the name of the Studio. -## Camera Position View +### Camera Position Screen `/countdowns/:studioId/camera` -![Camera Position View](/img/docs/main/features/camera-view.jpg) +![Camera Position Screen](/img/docs/main/features/camera-view.jpg) -A fullscreen view designed specifically for use on mobile devices or extra screens displaying a summary of the currently active Rundown, filtered for Parts containing Pieces matching particular Source Layers and Studio Labels. +A fullscreen page designed specifically for use on mobile devices or extra screens displaying a summary of the currently active Rundown, filtered for Parts containing Pieces matching particular Source Layers and Studio Labels. The Pieces are displayed as a Timeline, with the Pieces moving right-to-left as time progresses, and Parts being displayed from the current one being played up till the end of the Rundown. The closest (not necessarily _Next_) Part has a countdown timer in the top-right corner showing when it's expected to be Live. Each Part also has a Duration counter on the bottom-right. -This view can be configured using query parameters: +This screen can be configured using query parameters: -| Query parameter | Type | Description | Default | -| :-------------- | :--- | :---------- | :------ | -| `sourceLayerIds` | string | A comma-separated list of Source Layer IDs to be considered for display | _(show all)_ | -| `studioLabels` | string | A comma-separated list of Studio Labels (Piece `.content.studioLabel` values) to be considered for display | _(show all)_ | -| `fullscreen` | 0 / 1 | Should the view become fullscreen on the device on first user interaction | 0 | +| Query parameter | Type | Description | Default | +| :--------------- | :----- | :--------------------------------------------------------------------------------------------------------- | :----------- | +| `sourceLayerIds` | string | A comma-separated list of Source Layer IDs to be considered for display | _(show all)_ | +| `studioLabels` | string | A comma-separated list of Studio Labels (Piece `.content.studioLabel` values) to be considered for display | _(show all)_ | +| `fullscreen` | 0 / 1 | Should the screen be shown fullscreen on the device on first user interaction | 0 | Example: [http://127.0.0.1/countdowns/studio0/camera?sourceLayerIds=camera0,dve0&studioLabels=1,KAM%201,K1,KAM1&fullscreen=1](http://127.0.0.1/countdowns/studio0/camera?sourceLayerIds=camera0,dve0&studioLabels=1,KAM%201,K1,KAM1&fullscreen=1) -## Active Rundown View +### Active Rundown Screen `/activeRundown/:studioId` -![Active Rundown View](/img/docs/main/features/active-rundown-example.png) +![Active Rundown Screen](/img/docs/main/features/active-rundown-example.png) A page which automatically displays the currently active rundown. Can be useful for the producer to have on a secondary screen. -## Active Rundown – Shelf +### Active Rundown Shelf Screen `/activeRundown/:studioId/shelf` ![Active Rundown Shelf](/img/docs/main/features/active-rundown-shelf-example.png) -A view which automatically displays the currently active rundown, and shows the Shelf in full screen. Can be useful for the producer to have on a secondary screen. +A screen which automatically displays the currently active rundown, and shows the Shelf in fullscreen. Can be useful for the producer to have on a secondary screen. A shelf layout can be selected by modifying the query string, see [Shelf Layouts](#shelf-layouts). -## Specific Rundown – Shelf +### Specific Rundown Shelf Screen `/rundown/:rundownId/shelf` -Displays the shelf in fullscreen for a rundown +Displays the Shelf in fullscreen for a rundown. -## Screensaver +### Screensaver -When big screen displays \(like Prompter and the Presenter screen\) do not have any meaningful content to show, an animated screensaver showing the current time and the next planned show will be displayed. If no Rundown is upcoming, the Studio name will be displayed. +When big screen displays \(like Prompter Screen and the Presenter Screen\) do not have any meaningful content to show, an animated screensaver showing the current time and the next planned show will be displayed. If no Rundown is upcoming, the Studio name will be displayed. ![A screensaver showing the next scheduled show](/img/docs/main/features/next-scheduled-show-example.png) -## System Status +### System Status Screen :::caution Documentation for this feature is yet to be written. @@ -261,23 +302,23 @@ System and devices statuses are displayed here. An API endpoint for the system status is also available under the URL `/health` ::: -## Media Status View +### Media Status Screen -This view is a summary of all the media required for playback for Rundowns -present in this System. This view allows you to see if clips are ready for -playback or if they are still waiting to become available to be transferred +This screen is a summary of all the media required for playback for Rundowns +present in this System. This view allows you to see if clips are ready for +playback or if they are still waiting to become available to be transferred onto a playout system. -![Media Status page](/img/docs/main/features/media-status.png) +![Media Status Screen](/img/docs/main/features/media-status.png) By default, the Media items are sorted according to their position in the rundown, and the rundowns are in the same order as in the [Lobby View] -(#lobby-view). You can change the sorting order by clicking on the buttons in +(#lobby-view). You can change the sorting order by clicking on the buttons in the table header. -Rundown View also has a panel that presents this information in the [context of the current Rundown](#media-status-panel). +The Rundown View also has a panel that presents this information in the [context of the current Rundown](#media-status-panel). -## Message Queue View +### Message Queue Screen :::caution Documentation for this feature is yet to be written. @@ -289,13 +330,13 @@ These messages are retained for a period of time, and can be reviewed in this li Messages that was not successfully sent can be inspected and re-sent here. -## User Log View +### User Log Screen -The user activity log contains a list of the user-actions that users have previously done. This is used in troubleshooting issues on-air. +The user activity log contains a list of the user-actions that users have previously done. This is used in troubleshooting issues while on air. ![User Log](/img/docs/main/features/user-log.png) -### Columns, explained +#### Columns, explained #### Execution time @@ -305,12 +346,12 @@ The execution time column displays **coreDuration** + **gatewayDuration** \(**ti - **gatewayDuration** : The time it took for Playout Gateway to execute the timeline \(ie stored-result-into-database 🠺 timeline-resolved 🠺 callback-to-core\) - **timelineResolveDuration**: The duration it took in TSR \(in Playout Gateway\) to resolve the timeline -Important to note is that **gatewayDuration** begins at the exact moment **coreDuration** ends. +Important to note is that **gatewayDuration** begins at the exact moment **coreDuration** ends. So **coreDuration + gatewayDuration** is the full time it took from beginning-of-user-action to the timeline-resolved \(plus a little extra for the final callback for reporting the measurement\). #### Action -Describes what action the user did; e g pressed a key, clicked a button, or selected a meny item. +Describes what action the user did; e g pressed a key, clicked a button, or selected a menu item. #### Method diff --git a/packages/documentation/docs/user-guide/further-reading.md b/packages/documentation/docs/user-guide/further-reading.md index d78295d87b..ad6c64748e 100644 --- a/packages/documentation/docs/user-guide/further-reading.md +++ b/packages/documentation/docs/user-guide/further-reading.md @@ -19,15 +19,15 @@ description: This guide has a lot of links. Here they are all listed by section. - [Windows install for Docker](https://hub.docker.com/editions/community/docker-ce-desktop-windows) - [Linux install instructions for Docker](https://docs.docker.com/install/linux/docker-ce/ubuntu/) - [Linux install instructions for Docker Compose](https://www.digitalocean.com/community/tutorials/how-to-install-docker-compose-on-ubuntu-18-04) -- [Sofie Core Docker File Download](https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-LWRCgfY_-kYo9iX6UNy%2F-Lo5eWjgoVlRRDeFzLuO%2F-Lo5fLSSyM1eO6OXScew%2Fdocker-compose.yaml?alt=media&token=fc2fbe79-365c-4817-b270-e507c6a6e3c6) +- [Sofie Core Docker File Download](https://hub.docker.com/r/sofietv/tv-automation-server-core) ### Installing a Gateway #### Ingest Gateways and NRCS - [MOS Protocol Overview & Documentation](http://mosprotocol.com/) -- Information about ENPS on [The Associated Press' Website](https://www.ap.org/enps/support) -- Information about iNews: [Avid's Website](https://www.avid.com/products/inews/how-to-buy) +- Information about ENPS on [The Associated Press' Website](https://workflow.ap.org/) +- Information about iNews: [Avid's Website](https://www.avid.com/solutions/news-production) **Google Spreadsheet Gateway** diff --git a/packages/documentation/docs/user-guide/installation/_category_.json b/packages/documentation/docs/user-guide/installation/_category_.json index 2f3c7f2a9f..b6be4c9d35 100644 --- a/packages/documentation/docs/user-guide/installation/_category_.json +++ b/packages/documentation/docs/user-guide/installation/_category_.json @@ -1,4 +1,4 @@ { - "label": "Installation", - "position": 3 -} \ No newline at end of file + "label": "Installation", + "position": 3 +} diff --git a/packages/documentation/docs/user-guide/installation/initial-sofie-core-setup.md b/packages/documentation/docs/user-guide/installation/initial-sofie-core-setup.md index c0672b3e55..91ed165f89 100644 --- a/packages/documentation/docs/user-guide/installation/initial-sofie-core-setup.md +++ b/packages/documentation/docs/user-guide/installation/initial-sofie-core-setup.md @@ -6,7 +6,7 @@ sidebar_position: 3 #### Prerequisites -* [Installed and running _Sofie Core_](installing-sofie-server-core.md) +- [Installed and running _Sofie Core_](installing-sofie-server-core.md) Once _Sofie Core_ has been installed and is running you can begin setting it up. The first step is to navigate to the _Settings page_. Please review the [Sofie Access Level](../features/access-levels.md) page for assistance getting there. diff --git a/packages/documentation/docs/user-guide/installation/installing-a-gateway/_category_.json b/packages/documentation/docs/user-guide/installation/installing-a-gateway/_category_.json index 7fa55d484d..e83c1db9e5 100644 --- a/packages/documentation/docs/user-guide/installation/installing-a-gateway/_category_.json +++ b/packages/documentation/docs/user-guide/installation/installing-a-gateway/_category_.json @@ -1,4 +1,4 @@ { - "label": "Installing a Gateway", - "position": 5 -} \ No newline at end of file + "label": "Installing a Gateway", + "position": 5 +} diff --git a/packages/documentation/docs/user-guide/installation/installing-a-gateway/intro.md b/packages/documentation/docs/user-guide/installation/installing-a-gateway/intro.md index 03bc8a5339..d8c6539cae 100644 --- a/packages/documentation/docs/user-guide/installation/installing-a-gateway/intro.md +++ b/packages/documentation/docs/user-guide/installation/installing-a-gateway/intro.md @@ -2,11 +2,12 @@ sidebar_label: Introduction sidebar_position: 1 --- + # Introduction: Installing a Gateway #### Prerequisites -* [Installed and running Sofie Core](../installing-sofie-server-core.md) +- [Installed and running Sofie Core](../installing-sofie-server-core.md) The _Sofie Core_ is the primary application for managing the broadcast, but it doesn't play anything out on it's own. A Gateway will establish the connection from _Sofie Core_ to other pieces of hardware or remote software. A basic setup may include the [Spreadsheet Gateway](rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support.md) which will ingest a rundown from Google Sheets then, use the [Playout Gateway](playout-gateway.md) send commands to a CasparCG Server graphics playout, an ATEM vision mixer, and / or the [Sisyfos audio controller](https://github.com/olzzon/sisyfos-audio-controller). @@ -14,12 +15,11 @@ Installing a gateway is a two part process. To begin, you will [add the required ### Rundown & Newsroom Gateways -* [Google Spreadsheet Gateway](rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support.md) -* [iNEWS Gateway](rundown-or-newsroom-system-connection/inews-gateway.md) -* [MOS Gateway](rundown-or-newsroom-system-connection/mos-gateway.md) +- [Google Spreadsheet Gateway](rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support.md) +- [iNEWS Gateway](rundown-or-newsroom-system-connection/inews-gateway.md) +- [MOS Gateway](rundown-or-newsroom-system-connection/mos-gateway.md) ### Playout & Media Manager Gateways -* [Playout Gateway](playout-gateway.md) -* [Media Manager](../media-manager.md) - +- [Playout Gateway](playout-gateway.md) +- [Media Manager](../media-manager.md) diff --git a/packages/documentation/docs/user-guide/installation/installing-a-gateway/playout-gateway.md b/packages/documentation/docs/user-guide/installation/installing-a-gateway/playout-gateway.md index 0fd5f47626..e900c2d6c6 100644 --- a/packages/documentation/docs/user-guide/installation/installing-a-gateway/playout-gateway.md +++ b/packages/documentation/docs/user-guide/installation/installing-a-gateway/playout-gateway.md @@ -1,6 +1,9 @@ --- sidebar_position: 3 --- + # Playout Gateway -The _Playout Gateway_ handles interacting external pieces of hardware or software by sending commands that will playout rundown content. This gateway used to be a separate installation but it has since been moved into the main _Sofie Core_ component. +The _Playout Gateway_ handles interaction with external pieces of hardware or software by sending commands that will playout rundown content. This gateway used to be developed separately but development has been moved into the main _Sofie Core_ component. + +The playout gateway service is included the example Docker Compose file found in the [Quick install](../installing-sofie-server-core.md) diff --git a/packages/documentation/docs/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json b/packages/documentation/docs/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json index b4c4ffc34d..ae77b5c6a7 100644 --- a/packages/documentation/docs/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json +++ b/packages/documentation/docs/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json @@ -1,4 +1,4 @@ { "label": "Rundown or Newsroom System Connection", "position": 4 -} \ No newline at end of file +} diff --git a/packages/documentation/docs/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md b/packages/documentation/docs/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md index 48659251a6..cc144a45a3 100644 --- a/packages/documentation/docs/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md +++ b/packages/documentation/docs/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md @@ -4,9 +4,12 @@ The iNEWS Gateway communicates with an iNEWS system to ingest and remain in sync ### Installing iNEWS for Sofie -The iNEWS Gateway allows you to create rundowns from within iNEWS and sync them with the _Sofie Core_. The rundowns will update in real time and any changes made will be seen from within your Playout Timeline. +The iNEWS Gateway allows you to create rundowns from within iNEWS and sync them with the _Sofie Core_. The rundowns will update in real time and any changes made will be seen from within your Playout Timeline. -The setup for the iNEWS Gateway is already in the Docker Compose file you downloaded earlier. Remove the _\#_ symbol from the start of the line labeled `image: tv2/inews-ftp-gateway:develop` and add a _\#_ to the other ingest gateway that was being used. +An example setup for the iNEWS Gateway is included in the example Docker Compose file found in the [Quick install](../../installing-sofie-server-core.md) with the `inews-gateway` profile. -Although the iNEWS Gateway is available free of charge, an iNEWS license is not. Visit [Avid's website](https://www.avid.com/products/inews/how-to-buy) to find an iNEWS reseller that handles your geographic area. +You can activate the profile by setting `COMPOSE_PROFILES=inews-gateway` as an environment variable or by writing that to a file called `.env` in the same folder as the docker-compose file. For more information, see the [docker documentation on Compose profiles](https://docs.docker.com/compose/how-tos/profiles/). +If you are not using the example docker-compose, please follow the [instructions listed on the GitHub page](https://github.com/tv2/inews-ftp-gateway). + +Although the iNEWS Gateway is available free of charge, an iNEWS license is not. Visit [Avid's website](https://www.avid.com/solutions/news-production) to find an iNEWS reseller that handles your geographic area. diff --git a/packages/documentation/docs/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support.md b/packages/documentation/docs/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support.md index 8cdd2ed637..b9a86e4604 100644 --- a/packages/documentation/docs/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support.md +++ b/packages/documentation/docs/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support.md @@ -2,6 +2,14 @@ The Spreadsheet Gateway is an application for piping data between Sofie Core and Spreadsheets on Google Drive. +### Installing the Spreadsheet Gateway + +If you are using the example Docker Compose file found in the [Quick install](../../installing-sofie-server-core.md), then the configuration for the Spreadsheet Gateway is includedin the `spreadsheet-gateway` docker-compose profile. + +You can activate the profile by setting `COMPOSE_PROFILES=spreadsheet-gateway` as an environment variable or by writing that to a file called `.env` in the same folder as the docker-compose file. For more information, see the [docker documentation on Compose profiles](https://docs.docker.com/compose/how-tos/profiles/). + +If you are not using the example docker-compose, please follow the [instructions listed on the GitHub page](https://github.com/SuperFlyTV/spreadsheet-gateway) labeled _Installation \(for developers\)_. + ### Example Blueprints for Spreadsheet Gateway To begin with, you will need to install a set of Blueprints that can handle the data being sent from the _Gateway_ to _Sofie Core_. Download the `demo-blueprints-r*.zip` file containing the blueprints you need from the [Demo Blueprints GitHub Repository](https://github.com/SuperFlyTV/sofie-demo-blueprints/releases). It is recommended to choose the newest release but, an older _Sofie Core_ version may require a different Blueprint version. The _Rundown page_ will warn you about any issue and display the desired versions. @@ -10,8 +18,6 @@ Instructions on how to install any Blueprint can be found in the [Installing Blu ### Spreadsheet Gateway Configuration -If you are using the Docker version of Sofie, then the Spreadsheet Gateway will come preinstalled. For those who are not, please follow the [instructions listed on the GitHub page](https://github.com/SuperFlyTV/spreadsheet-gateway) labeled _Installation \(for developers\)._ - Once the Gateway has been installed, you can navigate to the _Settings page_ and check the newly added Gateway is listed as _Spreadsheet Gateway_ under the _Devices section_. Before you select the Device, you want to add it to the current _Studio_ you are using. Select your current Studio from the menu and navigate to the _Attached Devices_ option. Click the _+_ icon and select the Spreadsheet Gateway. diff --git a/packages/documentation/docs/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md b/packages/documentation/docs/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md index cf2c62a508..293869bc61 100644 --- a/packages/documentation/docs/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md +++ b/packages/documentation/docs/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md @@ -2,13 +2,10 @@ Sofie Core doesn't talk directly to the newsroom systems, but instead via one of the Gateways. -The Google Spreadsheet Gateway, iNEWS Gateway, and the MOS \( [Media Object Server Communications Protocol](http://mosprotocol.com/) \) Gateway which can handle interacting with any system that communicates via MOS. +The Google Spreadsheet Gateway, iNEWS Gateway, and the MOS \( [Media Object Server Communications Protocol](http://mosprotocol.com/) \) Gateway which can handle interacting with any system that communicates via MOS, for example AP ENPS. ### Further Reading -* [MOS Protocol Overview & Documentation](http://mosprotocol.com/) -* [iNEWS on Avid's Website](https://www.avid.com/products/inews/how-to-buy) -* [ENPS on The Associated Press' Website](https://www.ap.org/enps/support) - - - +- [MOS Protocol Overview & Documentation](http://mosprotocol.com/) +- [iNEWS on Avid's Website](https://www.avid.com/solutions/news-production) +- [ENPS on The Associated Press' Website](https://workflow.ap.org/) diff --git a/packages/documentation/docs/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md b/packages/documentation/docs/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md index 8a2a60145c..29840663c8 100644 --- a/packages/documentation/docs/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md +++ b/packages/documentation/docs/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md @@ -4,6 +4,10 @@ The MOS Gateway communicates with a device that supports the [MOS protocol](http The setup for the MOS Gateway is handled in the Docker Compose in the [Quick Install](../../installing-sofie-server-core.md) page. -One thing to note if managing the mos-gateway manually: It needs a few ports open \(10540, 10541\) for MOS-messages to be pushed to it from the NCS. +An example setup for the MOS Gateway is included in the example Docker Compose file found in the [Quick install](../../installing-sofie-server-core.md) with the `mos-gateway` profile. + +You can activate the profile by setting `COMPOSE_PROFILES=mos-gateway` as an environment variable or by writing that to a file called `.env` in the same folder as the docker-compose file. For more information, see the [docker documentation on Compose profiles](https://docs.docker.com/compose/how-tos/profiles/). +Development of the MOS gateway is done as a package in the [sofie-core repository on GitHub](https://github.com/nrkno/sofie-core/tree/master/packages/mos-gateway). +One thing to note if managing the mos-gateway manually: It needs a few ports open \(10540, 10541\) for MOS-messages to be pushed to it from the NCS. diff --git a/packages/documentation/docs/user-guide/installation/installing-blueprints.md b/packages/documentation/docs/user-guide/installation/installing-blueprints.md index 34796bbb1d..17adb5c68f 100644 --- a/packages/documentation/docs/user-guide/installation/installing-blueprints.md +++ b/packages/documentation/docs/user-guide/installation/installing-blueprints.md @@ -11,9 +11,9 @@ sidebar_position: 4 Blueprints are little plug-in programs that runs inside _Sofie_. They are the logic that determines how _Sofie_ interacts with rundowns, hardware, and media. -Blueprints are custom scripts that you create yourself \(or download an existing one\). There are a set of example Blueprints for the Spreadsheet Gateway available for use here: [https://github.com/SuperFlyTV/sofie-demo-blueprints](https://github.com/SuperFlyTV/sofie-demo-blueprints). +Blueprints are custom scripts that you can download or create yourself. There is a set of example Blueprints for the [Rundown Editor](https://github.com/SuperFlyTV/sofie-automation-rundown-editor) or the [Spreadsheet Gateway](https://github.com/SuperFlyTV/spreadsheet-gateway) available for use here: [https://github.com/SuperFlyTV/sofie-demo-blueprints](https://github.com/SuperFlyTV/sofie-demo-blueprints). -To begin installing any Blueprint, navigate to the _Settings page_. Getting there is covered in the [Access Levels](../features/access-levels.md) page. +To begin installing any Blueprint, navigate to the _Settings page_. ( [http://localhost:3000/settings/?admin=1](http://localhost:3000/settings/?admin=1>) ), otherwise see the [Sofie Access Level](../features/access-levels.md) page for assistance getting there. ![The Settings Page](/img/docs/getting-started/settings-page.jpg) @@ -40,7 +40,3 @@ After having installed the Blueprint, the Studio's baseline will need to be relo _Show Style Blueprints determine how your show will look / feel._ After you've uploaded the your show-style-blueprint js-file, navigate to a Show Style in the settings and assign the new Blueprint to it \(under the label _Blueprint_ \). - -### Further Reading - -- [Blueprints Supporting the Spreadsheet Gateway](https://github.com/SuperFlyTV/sofie-demo-blueprints) diff --git a/packages/documentation/docs/user-guide/installation/installing-connections-and-additional-hardware/README.md b/packages/documentation/docs/user-guide/installation/installing-connections-and-additional-hardware/README.md index 4d35fb277d..57ebb625d0 100644 --- a/packages/documentation/docs/user-guide/installation/installing-connections-and-additional-hardware/README.md +++ b/packages/documentation/docs/user-guide/installation/installing-connections-and-additional-hardware/README.md @@ -2,34 +2,40 @@ #### Prerequisites -* [Installed and running Sofie Core](../installing-sofie-server-core.md) -* [Installed Playout Gateway](../installing-a-gateway/playout-gateway.md) -* [Installed and configured Studio Blueprints](../installing-blueprints.md#installing-a-studio-blueprint) +- [Installed and running Sofie Core](../installing-sofie-server-core.md) +- [Installed Playout Gateway](../installing-a-gateway/playout-gateway.md) +- [Installed and configured Studio Blueprints](../installing-blueprints.md#installing-a-studio-blueprint) The following pages are broken up by equipment type that is supported by Sofie's Gateways. ## Playout & Recording -* [CasparCG Graphics and Video Server](casparcg-server-installation.md) - _Graphics / Playout / Recording_ -* [Blackmagic Design's HyperDeck](https://www.blackmagicdesign.com/products/hyperdeckstudio) - _Recording_ -* [Quantel](http://www.quantel.com) Solutions - _Playout_ -* [Vizrt](https://www.vizrt.com/) Graphics Solutions - _Graphics / Playout_ + +- [CasparCG Graphics and Video Server](casparcg-server-installation.md) - _Graphics / Playout / Recording_ +- [Blackmagic Design's HyperDeck](https://www.blackmagicdesign.com/products/hyperdeckstudio) - _Recording_ +- Quantel Solutions - _Playout_ \( Now part of [Grass Valley Group](https://www.grassvalley.com/products/playout/) \) +- [Vizrt](https://www.vizrt.com/) Graphics Solutions - _Graphics / Playout_ ## Vision Mixers -* [Blackmagic's ATEM](https://www.blackmagicdesign.com/products/atem) hardware vision mixers -* [vMix](https://www.vmix.com/) software vision mixer \(coming soon\) + +- [Blackmagic's ATEM](https://www.blackmagicdesign.com/products/atem) hardware vision mixers +- [vMix](https://www.vmix.com/) software vision mixer \(coming soon\) ## Audio Mixers -* [Sisyfos](https://github.com/olzzon/sisyfos-audio-controller) audio controller -* [Lawo sound mixers_,_](https://www.lawo.com/applications/broadcast-production/audio-consoles.html) _using emberplus protocol_ -* Generic OSC \(open sound control\) + +- [Sisyfos](https://github.com/olzzon/sisyfos-audio-controller) audio controller +- [Lawo sound mixers*,*](https://www.lawo.com/applications/broadcast-production/audio-consoles.html) _using emberplus protocol_ +- Generic OSC \(open sound control\) ## PTZ Cameras -* [Panasonic PTZ](https://pro-av.panasonic.net/en/products/ptz_camera_systems.html) cameras + +- [Panasonic PTZ](https://pro-av.panasonic.net/en/products/ptz_camera_systems.html) cameras ## Lights -* [Pharos](https://www.pharoscontrols.com/) light control + +- [Pharos](https://www.pharoscontrols.com/) light control ## Other -* Generic OSC \(open sound control\) -* Generic HTTP requests \(to control http-REST interfaces\) -* Generic TCP-socket + +- Generic OSC \(open sound control\) +- Generic HTTP requests \(to control http-REST interfaces\) +- Generic TCP-socket diff --git a/packages/documentation/docs/user-guide/installation/installing-connections-and-additional-hardware/_category_.json b/packages/documentation/docs/user-guide/installation/installing-connections-and-additional-hardware/_category_.json index d3e1e8979e..4d800e9a88 100644 --- a/packages/documentation/docs/user-guide/installation/installing-connections-and-additional-hardware/_category_.json +++ b/packages/documentation/docs/user-guide/installation/installing-connections-and-additional-hardware/_category_.json @@ -1,4 +1,4 @@ { - "label": "Installing Connections and Additional Hardware", - "position": 6 -} \ No newline at end of file + "label": "Installing Connections and Additional Hardware", + "position": 6 +} diff --git a/packages/documentation/docs/user-guide/installation/installing-connections-and-additional-hardware/casparcg-server-installation.md b/packages/documentation/docs/user-guide/installation/installing-connections-and-additional-hardware/casparcg-server-installation.md index 6b4f450f96..9111ee995c 100644 --- a/packages/documentation/docs/user-guide/installation/installing-connections-and-additional-hardware/casparcg-server-installation.md +++ b/packages/documentation/docs/user-guide/installation/installing-connections-and-additional-hardware/casparcg-server-installation.md @@ -11,7 +11,7 @@ Although CasparCG Server is an open source program that is free to use for To begin, download the latest release of [CasparCG Server from GitHub](https://github.com/nrkno/sofie-casparcg-server/releases). There are multiple versions of CasparCG Server available to the public for download but, you specifically want the latest NRK version. -Once downloaded, extract the files and navigate down the folders, _CasparCG Server_ then _Server_. This folder contains your CasparCG Server Configuration file, `casparcg.config`, and your CasparCG Server executable, `casparcg.exe`. +Once downloaded, extract the files. This folder contains your CasparCG Server Configuration file, `casparcg.config`, the CasparCG Server executable, `casparcg.exe`, and the CasparCG Media Scanner `scanner.exe`. How you will configure the CasparCG Server will depend on the number of DeckLink cards your machine contains. The first subsection for each CasparCG Server setup, labeled _Channels_, will contain the unique portion of the configuration. The following is the majority of the configuration file that will be consistent between setups. @@ -51,15 +51,9 @@ How you will configure the CasparCG Server will depend on the number of Dec One additional note, the Server does require the configuration file be named `casparcg.config`. -### Installing CasparCG Media Scanner - -You can use the CasparCG Media Scanner to locate and add all of your media to the _Sofie Core_. To install the Media Scanner, you will go to the [project's Release page](https://github.com/nrkno/sofie-media-scanner/releases) and download the `.zip` file under the latest release. Similar to the CasparCG Server, you want to use the NRK version. - -Once downloaded and extracted, move the `scanner.exe` file to the same folder as your `casparcg.exe` file. - ### Installing the CasparCG Launcher -You can launch both of your CasparCG applications with the[ CasparCG Launcher.](https://github.com/Sofie-Automation/sofie-casparcg-launcher) Download the `.exe` file in the latest release and once complete, move the file to the same folder as your `casparcg.exe` file. +You can launch CasparCG Server and the Media scanner applications with the [CasparCG Launcher.](https://github.com/Sofie-Automation/sofie-casparcg-launcher) Download the `.exe` file in the latest release and once complete, move the file to the same folder as your `casparcg.exe` file. ## Configuring Windows diff --git a/packages/documentation/docs/user-guide/installation/installing-connections-and-additional-hardware/ffmpeg-installation.md b/packages/documentation/docs/user-guide/installation/installing-connections-and-additional-hardware/ffmpeg-installation.md index a0fd8d66a2..9833fb45a4 100644 --- a/packages/documentation/docs/user-guide/installation/installing-connections-and-additional-hardware/ffmpeg-installation.md +++ b/packages/documentation/docs/user-guide/installation/installing-connections-and-additional-hardware/ffmpeg-installation.md @@ -11,7 +11,7 @@ Some parts of Sofie (specifically the Package Manager) require that [`FFmpeg`](h ![Start Menu screenshot](/img/docs/edit_system_environment_variables.jpg) -4. In the System Properties menu, click the "Environment Varibles..." button at the bottom of the "Advanced" tab. +4. In the System Properties menu, click the "Environment Variables..." button at the bottom of the "Advanced" tab. ![System Properties screenshot](/img/docs/system_properties.png) diff --git a/packages/documentation/docs/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md b/packages/documentation/docs/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md index 1515b08840..5c3c9b0234 100644 --- a/packages/documentation/docs/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md +++ b/packages/documentation/docs/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md @@ -1,6 +1,6 @@ # Configuring Vision Mixers -## ATEM – Blackmagic Design +## ATEM – Blackmagic Design The [Playout Gateway](../installing-a-gateway/playout-gateway.md) supports communicating with the entire line up of Blackmagic Design's ATEM vision mixers. @@ -11,4 +11,3 @@ Once your ATEM is properly configured on the network, you can add it as a device ### Additional Information Sofie does not support connecting to a vision mixer hardware panels. All interacts with the vision mixers must be handled within a Rundown. - diff --git a/packages/documentation/docs/user-guide/installation/installing-sofie-server-core.md b/packages/documentation/docs/user-guide/installation/installing-sofie-server-core.md index 789b76dab3..eb16d4d7c7 100644 --- a/packages/documentation/docs/user-guide/installation/installing-sofie-server-core.md +++ b/packages/documentation/docs/user-guide/installation/installing-sofie-server-core.md @@ -18,11 +18,11 @@ This docker-compose file automates the basic setup of the [Sofie-Core applicatio ```yaml # This is NOT recommended to be used for a production deployment. # It aims to quickly get an evaluation version of Sofie running and serve as a basis for how to set up a production deployment. -version: '3.3' +name: Sofie services: db: hostname: mongo - image: mongo:6.0 + image: mongo:8 restart: always entrypoint: ['/usr/bin/mongod', '--replSet', 'rs0', '--bind_ip_all'] # the healthcheck avoids the need to initiate the replica set @@ -39,7 +39,7 @@ services: core: hostname: core - image: sofietv/tv-automation-server-core:release52 + image: sofietv/tv-automation-server-core:release53 restart: always ports: - '3000:3000' # Same port as meteor uses by default @@ -57,10 +57,24 @@ services: - db playout-gateway: - image: sofietv/tv-automation-playout-gateway:release52 + image: sofietv/tv-automation-playout-gateway:release53 restart: always environment: - DEVICE_ID: playoutGateway0 + DEVICE_ID: playoutGateway + CORE_HOST: core + CORE_PORT: '3000' + networks: + - sofie + depends_on: + - core + + live-status-gateway: + image: sofietv/tv-automation-live-status-gateway:release53 + restart: always + ports: + - '8080:8080' + environment: + DEVICE_ID: liveStatusGateway CORE_HOST: core CORE_PORT: '3000' networks: @@ -69,64 +83,109 @@ services: depends_on: - core + package-manager: + image: sofietv/package-manager-package-manager:latest + restart: always + environment: + DEVICE_ID: packageManager + CORE_HOST: core + CORE_PORT: '3000' + PACKAGE_MANAGER_URL: ws://package-manager:8060 + WORKFORCE_URL: ws://package-manager-workforce:8070 + networks: + - sofie + depends_on: + - core + - package-manager-workforce + + package-manager-http-server: + image: sofietv/package-manager-http-server:latest + restart: always + ports: + - '8081:8080' + environment: + HTTP_SERVER_BASE_PATH: /mnt/package-manager-store + networks: + - sofie + volumes: + - package-manager-store:/mnt/package-manager-store + + package-manager-workforce: + image: sofietv/package-manager-workforce:latest + restart: always + ports: + - '8070:8070' + networks: + - sofie + # Choose one of the following images, depending on which type of ingest gateway is wanted. # If using the Rundown Editor, then none of the below images are needed. # The Rundown Editor can be found here: https://github.com/SuperFlyTV/sofie-automation-rundown-editor - # spreadsheet-gateway: - # image: superflytv/sofie-spreadsheet-gateway:latest - # restart: always - # environment: - # DEVICE_ID: spreadsheetGateway0 - # CORE_HOST: core - # CORE_PORT: '3000' - # networks: - # - sofie - # depends_on: - # - core - - # mos-gateway: - # image: sofietv/tv-automation-mos-gateway:release52 - # restart: always - # ports: - # - "10540:10540" # MOS Lower port - # - "10541:10541" # MOS Upper port - # # - "10542:10542" # MOS query port - not used - # environment: - # DEVICE_ID: mosGateway0 - # CORE_HOST: core - # CORE_PORT: '3000' - # networks: - # - sofie - # depends_on: - # - core - - # inews-gateway: - # image: tv2media/inews-ftp-gateway:1.37.0-in-testing.20 - # restart: always - # command: yarn start -host core -port 3000 -id inewsGateway0 - # networks: - # - sofie - # depends_on: - # - core + spreadsheet-gateway: + image: superflytv/sofie-spreadsheet-gateway:latest + restart: always + environment: + DEVICE_ID: spreadsheetGateway + CORE_HOST: core + CORE_PORT: '3000' + networks: + - sofie + depends_on: + - core + profiles: [spreadsheet-gateway] + + mos-gateway: + image: sofietv/tv-automation-mos-gateway:release53 + restart: always + ports: + - '10540:10540' # MOS Lower port + - '10541:10541' # MOS Upper port + # - '10542:10542' # MOS query port - not used + environment: + DEVICE_ID: mosGateway + CORE_HOST: core + CORE_PORT: '3000' + networks: + - sofie + depends_on: + - core + profiles: [mos-gateway] + + inews-gateway: + image: tv2media/inews-ftp-gateway:1.37.0-in-testing.20 + restart: always + command: yarn start -host core -port 3000 -id inewsGateway + networks: + - sofie + depends_on: + - core + profiles: [inews-gateway] networks: sofie: - lan_access: - driver: bridge volumes: db-data: sofie-store: + package-manager-store: ``` Create a `Sofie` folder, copy the above content, and save it as `docker-compose.yaml` within the `Sofie` folder. -Navigate to the _ingest-gateway_ section of `docker-compose.yaml` and select which type of _ingest-gateway_ you'd like installed by uncommenting it. Save your changes. If you are using the [Rundown Editor](rundown-editor.md), then no ingest gateways need to be uncommented. +Once the installation is done, Sofie should be running on [http://localhost:3000](http://localhost:3000) -Then open a terminal, `cd your-sofie-folder` and `sudo docker-compose up` \(just `docker-compose up` on Windows\). +You can now choose if you are using the [Rundown Editor](rundown-editor.md) or an _ingest-gateway_. Visit [Rundowns & Newsroom Systems](installing-a-gateway/rundown-or-newsroom-system-connection/intro.md) to see which _Ingest Gateway_ is best suited for _your_ production environment. -Once the installation is done, Sofie should be running on [http://localhost:3000](http://localhost:3000) +Select the ingest gateway by creating using docker compose profiles. Create a file called `.env` in the same folder as docker compose with the contents: + +``` +COMPOSE_PROFILES=ingest-profile-name +``` + +But replacing `ingest-profile-name` with one of `spreadsheet-gateway`, `mos-gateway` or `inews-gateway`, or a comma separated list of more than one. For more information, see the [docker documentation on Compose profiles](https://docs.docker.com/compose/how-tos/profiles/). + +Then open a terminal, `cd your-sofie-folder` and `sudo docker-compose up` \(just `docker-compose up` on Windows or MacOS\). Next, you will need to install a Rundown Gateway. Visit [Rundowns & Newsroom Systems](installing-a-gateway/rundown-or-newsroom-system-connection/intro.md) to see which _Rundown Gateway_ is best suited for _your_ production environment. diff --git a/packages/documentation/docs/user-guide/installation/intro.md b/packages/documentation/docs/user-guide/installation/intro.md index c3a14c218b..6e1cb0f7da 100644 --- a/packages/documentation/docs/user-guide/installation/intro.md +++ b/packages/documentation/docs/user-guide/installation/intro.md @@ -1,37 +1,35 @@ --- sidebar_position: 1 --- + # Getting Started -_Sofie_ can be installed in many different ways, depending on which platforms, needs, and features you desire. The _Sofie_ system consists of several applications that work together to provide complete broadcast automation system. Each of these components' installation will be covered in this guide. Additional information about the products or services mentioned alongside the Sofie Installation can be found on the [Further Reading](../further-reading.md). +_Sofie_ can be installed in many different ways, depending on which platforms, needs, and features you desire. The _Sofie_ system consists of several applications that work together to provide a complete broadcast automation system. Each of these components' installation will be covered in this guide. Additional information about the products or services mentioned alongside the Sofie Installation can be found on the [Further Reading](../further-reading.md). There are four minimum required components to get a Sofie system up and running. First you need the [_Sofie Core_](installing-sofie-server-core.md), which is the brains of the operation. Then a set of [_Blueprints_](installing-blueprints.md) to handle and interpret incoming and outgoing data. Next, an [_Ingest Gateway_](installing-a-gateway/rundown-or-newsroom-system-connection/intro.md) to fetch the data for the Blueprints. Then finally, a [_Playout Gateway_](installing-a-gateway/playout-gateway.md) to send the data to your playout device of choice. - - ## Sofie Core View -The _Rundowns_ view will display all the active rundowns that the _Sofie Core_ has access to. +The _Rundowns_ view will display all the active rundowns that the _Sofie Core_ has access to. ![Rundown View](/img/docs/getting-started/rundowns-in-sofie.png) The _Status_ views displays the current status for the attached devices and gateways. -![Status View – Describes the state of _Sofie Core_](/img/docs/getting-started/status-page.jpg) +![Status View – Describes the state of _Sofie Core_](/img/docs/getting-started/status-page.jpg) -The _Settings_ views contains various settings for the studio, show styles, blueprints etc.. If the link to the settings view is not visible in your application, check your [Access Levels](../features/access-levels.md). More info on specific parts of the _Settings_ view can be found in their corresponding guide sections. +The _Settings_ views contains various settings for the studio, show styles, blueprints etc.. If the link to the settings view is not visible in your application, check your [Access Levels](../features/access-levels.md). More info on specific parts of the _Settings_ view can be found in their corresponding guide sections. -![Settings View – Describes how the _Sofie Core_ is configured](/img/docs/getting-started/settings-page.jpg) +![Settings View – Describes how the _Sofie Core_ is configured](/img/docs/getting-started/settings-page.jpg) ## Sofie Core Overview -The _Sofie Core_ is the primary application for managing the broadcast but, it doesn't play anything out on it's own. You need to use Gateways to establish the connection from the _Sofie Core_ to other pieces of hardware or remote software. +The _Sofie Core_ is the primary application for managing the broadcast but, it doesn't play anything out on it's own. You need to use Gateways to establish the connection from the _Sofie Core_ to other pieces of hardware or remote software. ### Gateways -Gateways are separate applications that bridge the gap between the _Sofie Core_ and other pieces of hardware or services. At minimum, you will need a _Playout Gateway_ so your timeline can interact with your playout system of choice. To install the _Playout Gateway_, visit the [Installing a Gateway](installing-a-gateway/intro.md) section of this guide and for a more in-depth look, please see [Gateways](../concepts-and-architecture.md#gateways). +Gateways are separate applications that bridge the gap between the _Sofie Core_ and other pieces of hardware or services. At minimum, you will need a _Playout Gateway_ so your timeline can interact with your playout system of choice. To install the _Playout Gateway_, visit the [Installing a Gateway](installing-a-gateway/intro.md) section of this guide and for a more in-depth look, please see [Gateways](../concepts-and-architecture.md#gateways). ### Blueprints Blueprints can be described as the logic that determines how a studio and show should interact with one another. They interpret the data coming in from the rundowns and transform them into a rich set of playable elements \(_Segments_, _Parts_, _AdLibs,_ etcetera\). The _Sofie Core_ has three main blueprint types, _System Blueprints_, _Studio Blueprints_, and _Showstyle Blueprints_. Installing _Sofie_ does not require you understand what these blueprints do, just that they are required for the _Sofie Core_ to work. If you would like to gain a deeper understand of how _Blueprints_ work, please visit the [Blueprints](#blueprints) section. - diff --git a/packages/documentation/docs/user-guide/installation/media-manager.md b/packages/documentation/docs/user-guide/installation/media-manager.md deleted file mode 100644 index 5c966aec57..0000000000 --- a/packages/documentation/docs/user-guide/installation/media-manager.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -sidebar_position: 100 ---- - -# Media Manager - -:::caution - -Media Manager is deprecated and is not recommended for new deployments. There are known issues that won't be fixed and the API's it is using to interface with Sofie will be removed. - -::: - -The Media Manager handles the media, or files, that make up the rundown content. To install it, begin by downloading the latest release of [Media Manager from GitHub](https://github.com/nrkno/sofie-media-management/releases). You can now run the `media-manager.exe` file inside the extracted folder. A warning window may popup about the app being unrecognized. You can get around this by selecting _More Info_ and clicking _Run Anyways_. A terminal window will open and begin running the application. - -You can now open the _Sofie Core_, `http://localhost:3000`, and navigate to the _Settings page_. You will see your _Media Manager_ under the _Devices_ section of the menu. The four main sections, general properties, attached storage, media flows, monitors, as well as attached subdivides, all contribute to how the media is handled within the Sofie Core. - -### Further Reading - -- [Media Manager Releases on GitHub](https://github.com/nrkno/sofie-media-management/releases) -- [Media Manager GitHub Page for Developers](https://github.com/nrkno/sofie-media-management) diff --git a/packages/documentation/docs/user-guide/intro.md b/packages/documentation/docs/user-guide/intro.md index 4bf6b039a9..9774ce18d9 100644 --- a/packages/documentation/docs/user-guide/intro.md +++ b/packages/documentation/docs/user-guide/intro.md @@ -28,14 +28,14 @@ The Playout Gateway controls the devices and keeps track of their state and stat ### _State-based Playout_ -Sofie is using a state-based architecture to control playout. This means that each element in the show can be programmed independently - there's no need to take into account what has happened previously in the show; Sofie will make sure that the video is loaded and that the audio fader is tuned to the correct position, no matter what was played out previously. +Sofie uses a state-based architecture to control playout. This means that each element in the show can be programmed independently - there's no need to take into account what has happened previously in the show; Sofie will make sure that the video is loaded and that the audio fader is tuned to the correct position, no matter what was played out previously. This allows the producer to skip ahead or move backwards in a show, without the fear of things going wrong on air. ### Modular Data Ingest -Sofie features a modular ingest data-flow, allowing multiple types of input data to base rundowns on. Currently there is support for [MOS-based](http://mosprotocol.com) systems such as ENPS and iNEWS, as well as [Google Spreadsheets](installation/installing-a-gateway/rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support), and more is in development. +Sofie features a modular ingest data-flow, allowing multiple types of input data to base rundowns on. Currently there is support for [MOS-based](http://mosprotocol.com) systems such as ENPS and iNEWS, as well as [Google Spreadsheets](installation/installing-a-gateway/rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support), and more are in development. ### Blueprints -The [Blueprints](concepts-and-architecture.md#blueprints) are plugins to _Sofie_, which allows for customization and tailor-made show designs. -The blueprints are made different depending on how the input data \(rundowns\) look like, how the show-design look like, and what devices to control. +The [Blueprints](concepts-and-architecture.md#blueprints) are plugins to _Sofie_, which allow for customization and tailor-made show designs. +The way these blueprints are created varies based on the characteristics of the input data (rundowns), the desired show design, and the specific devices being controlled. diff --git a/packages/documentation/docs/user-guide/supported-devices.md b/packages/documentation/docs/user-guide/supported-devices.md index 5b2016babe..0bee545156 100644 --- a/packages/documentation/docs/user-guide/supported-devices.md +++ b/packages/documentation/docs/user-guide/supported-devices.md @@ -15,7 +15,7 @@ We support almost all features of these devices except fairlight audio, camera c - Full control of keyers - Full control of DVE's - Control of media pools -- Control of auxilliaries +- Control of auxiliaries ## CasparCG Server diff --git a/packages/documentation/package.json b/packages/documentation/package.json index 525fb5a383..1679332a95 100644 --- a/packages/documentation/package.json +++ b/packages/documentation/package.json @@ -1,6 +1,6 @@ { "name": "sofie-documentation", - "version": "1.52.0", + "version": "1.53.0-in-development", "private": true, "scripts": { "docusaurus": "docusaurus", @@ -15,7 +15,7 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "engines": { - "node": ">=22.11" + "node": ">=22.13.1" }, "devDependencies": { "@docusaurus/core": "3.7.0", diff --git a/packages/documentation/src/components/GitHubReleases.jsx b/packages/documentation/src/components/GitHubReleases.jsx index a6a676bddb..ec79754b88 100644 --- a/packages/documentation/src/components/GitHubReleases.jsx +++ b/packages/documentation/src/components/GitHubReleases.jsx @@ -10,24 +10,25 @@ export default function GitHubReleases({ org, repo, releaseLabel, state }) { useEffect(() => { let mounted = true fetch(`${GITHUB_API_URL}/repos/${org}/${repo}/issues?state=${state || 'open'}`, { - headers: [ - ['Accept', 'application/vnd.github.v3+json'] - ] - }).then((value) => { - if (value.ok) { - return value.json() - } else { - throw new Error(value.status) - } - }).then((data) => { - if (!mounted) return - setReleases(data.filter((issue) => issue.labels.find((label) => label.name === releaseLabel))) - setIsReady(1) - }).catch((error) => { - if (!mounted) return - console.error(error) - setIsReady(2) + headers: [['Accept', 'application/vnd.github.v3+json']], }) + .then((value) => { + if (value.ok) { + return value.json() + } else { + throw new Error(value.status) + } + }) + .then((data) => { + if (!mounted) return + setReleases(data.filter((issue) => issue.labels.find((label) => label.name === releaseLabel))) + setIsReady(1) + }) + .catch((error) => { + if (!mounted) return + console.error(error) + setIsReady(2) + }) return () => { mounted = false @@ -45,17 +46,30 @@ export default function GitHubReleases({ org, repo, releaseLabel, state }) { - { - releases.map((releaseIssue) => ( - - {releaseIssue.title} - {releaseIssue.labels.filter((label) => label.name !== releaseLabel).map((label) => ( -

{label.name.replace(/^! /, '')}
- ))} - - )) - } + {releases.map((releaseIssue) => ( + + + + {releaseIssue.title} + + + + + {releaseIssue.labels + .filter((label) => label.name !== releaseLabel) + .map((label) => ( +
+ {label.name.replace(/^! /, '')} +
+ ))} + + + ))} ) -} \ No newline at end of file +} diff --git a/packages/documentation/src/components/HomepageFeatures.module.css b/packages/documentation/src/components/HomepageFeatures.module.css index 9dcb82c354..c11db38add 100644 --- a/packages/documentation/src/components/HomepageFeatures.module.css +++ b/packages/documentation/src/components/HomepageFeatures.module.css @@ -1,13 +1,13 @@ /* stylelint-disable docusaurus/copyright-header */ .features { - display: flex; - align-items: center; - padding: 2rem 0; - width: 100%; + display: flex; + align-items: center; + padding: 2rem 0; + width: 100%; } .featureSvg { - height: 200px; - width: 200px; + height: 200px; + width: 200px; } diff --git a/packages/documentation/src/pages/index.js b/packages/documentation/src/pages/index.js index 4c008703e8..7a05e39d5b 100644 --- a/packages/documentation/src/pages/index.js +++ b/packages/documentation/src/pages/index.js @@ -1,40 +1,39 @@ -import React from 'react'; -import clsx from 'clsx'; -import Layout from '@theme/Layout'; -import Link from '@docusaurus/Link'; -import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; -import styles from './index.module.css'; -import HomepageFeatures from '../components/HomepageFeatures'; +import React from 'react' +import clsx from 'clsx' +import Layout from '@theme/Layout' +import Link from '@docusaurus/Link' +import useDocusaurusContext from '@docusaurus/useDocusaurusContext' +import styles from './index.module.css' +import HomepageFeatures from '../components/HomepageFeatures' function HomepageHeader() { - const { siteConfig } = useDocusaurusContext(); - return ( -
-
-

{siteConfig.title}

-

{siteConfig.tagline}

-
- - Learn more… - -
-
-
- ); + const { siteConfig } = useDocusaurusContext() + return ( +
+
+

{siteConfig.title}

+

{siteConfig.tagline}

+
+ + Learn more… + +
+
+
+ ) } export default function Home() { - const { siteConfig } = useDocusaurusContext(); - return ( - - -
- -
-
- ); + const { siteConfig } = useDocusaurusContext() + return ( + + +
+ +
+
+ ) } diff --git a/packages/documentation/static/img/docs/main/features/director-screen-example.png b/packages/documentation/static/img/docs/main/features/director-screen-example.png new file mode 100644 index 0000000000..e1e1d5eac6 Binary files /dev/null and b/packages/documentation/static/img/docs/main/features/director-screen-example.png differ diff --git a/packages/documentation/versioned_docs/version-1.37.0/about-sofie.md b/packages/documentation/versioned_docs/version-1.37.0/about-sofie.md index 58a8c9e93f..fe9aa85e94 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/about-sofie.md +++ b/packages/documentation/versioned_docs/version-1.37.0/about-sofie.md @@ -16,4 +16,4 @@ _**Sofie**_ is a web-based TV automation system for studios and live shows, used - Modular data-ingest architecture, supports MOS and Google spreadsheets - Plug-in architecture for programming shows -_The NRK logo is a registered trademark of Norsk rikskringkasting AS. The license does not grant any right to use, in any way, any trademarks, service marks or logos of Norsk rikskringkasting AS._ \ No newline at end of file +_The NRK logo is a registered trademark of Norsk rikskringkasting AS. The license does not grant any right to use, in any way, any trademarks, service marks or logos of Norsk rikskringkasting AS._ diff --git a/packages/documentation/versioned_docs/version-1.37.0/for-developers/api-documentation.md b/packages/documentation/versioned_docs/version-1.37.0/for-developers/api-documentation.md index b73b09a491..25a1ec1418 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/for-developers/api-documentation.md +++ b/packages/documentation/versioned_docs/version-1.37.0/for-developers/api-documentation.md @@ -1,4 +1,3 @@ - # API Documentation The Sofie Blueprints API and the Sofie Peripherals API are automatically generated and available at (https://nrkno.github.io/sofie-core/typedoc). diff --git a/packages/documentation/versioned_docs/version-1.37.0/for-developers/for-blueprint-developers.md b/packages/documentation/versioned_docs/version-1.37.0/for-developers/for-blueprint-developers.md index 9128c2a0c1..03565aff40 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/for-developers/for-blueprint-developers.md +++ b/packages/documentation/versioned_docs/version-1.37.0/for-developers/for-blueprint-developers.md @@ -6,10 +6,5 @@ Documentation for this page is yet to be written. This part of the documentation is not yet written, but it should contain information useful to someone writing blueprints, such as: -* Explaining the basic concepts -* Explaining various features, such as infinites etc.. - - - - - +- Explaining the basic concepts +- Explaining various features, such as infinites etc.. diff --git a/packages/documentation/versioned_docs/version-1.37.0/for-developers/intro.md b/packages/documentation/versioned_docs/version-1.37.0/for-developers/intro.md index 1e96298172..a2ffce4f7e 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/for-developers/intro.md +++ b/packages/documentation/versioned_docs/version-1.37.0/for-developers/intro.md @@ -9,7 +9,7 @@ The pages below are intended for developers of any of the Sofie-related repos an A read-through of the [Concepts & Architectures](../user-guide/concepts-and-architecture) is recommended, before diving too deep into development. -* [Libraries](libraries) -* [Contribution Guidelines](contribution-guidelines) -* [For Blueprint Developers](for-blueprint-developers) -* [API Documentation](api-documentation) +- [Libraries](libraries) +- [Contribution Guidelines](contribution-guidelines) +- [For Blueprint Developers](for-blueprint-developers) +- [API Documentation](api-documentation) diff --git a/packages/documentation/versioned_docs/version-1.37.0/for-developers/libraries.md b/packages/documentation/versioned_docs/version-1.37.0/for-developers/libraries.md index 58176b2910..ec4af97650 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/for-developers/libraries.md +++ b/packages/documentation/versioned_docs/version-1.37.0/for-developers/libraries.md @@ -12,47 +12,41 @@ The Sofie TV Automation system consists of the [**Sofie Core**](https://git Together with the _Sofie Core_ there are several _gateways_ which are separate applications, but which connect to _Sofie Core_ and are managed from within the Core's web UI. -* [**Input Gateway**](https://github.com/nrkno/sofie-input-gateway) -* [**MOS Gateway**](https://github.com/nrkno/sofie-mos-gateway) Connects _Sofie_ to a newsroom system \(NRCS\) and ingests rundowns via the [MOS protocol](http://mosprotocol.com/). -* [**Spreadsheet Gateway**](https://github.com/SuperFlyTV/spreadsheet-gateway) Connects _Sofie_ to a _Google Drive_ folder and ingests rundowns from _Google Sheets_. -* [**Playout Gateway**](https://github.com/nrkno/sofie-playout-gateway) Handles the playout from _Sofie_. Connects to and controls a multitude of devices, such as vision mixers, graphics, light controllers, audio mixers etc.. -* [**Quantel Gateway**](https://github.com/nrkno/sofie-quantel-gateway) CORBA to REST gateway for _Quantel/ISA_ playback. - +- [**Input Gateway**](https://github.com/nrkno/sofie-input-gateway) +- [**MOS Gateway**](https://github.com/nrkno/sofie-mos-gateway) Connects _Sofie_ to a newsroom system \(NRCS\) and ingests rundowns via the [MOS protocol](http://mosprotocol.com/). +- [**Spreadsheet Gateway**](https://github.com/SuperFlyTV/spreadsheet-gateway) Connects _Sofie_ to a _Google Drive_ folder and ingests rundowns from _Google Sheets_. +- [**Playout Gateway**](https://github.com/nrkno/sofie-playout-gateway) Handles the playout from _Sofie_. Connects to and controls a multitude of devices, such as vision mixers, graphics, light controllers, audio mixers etc.. +- [**Quantel Gateway**](https://github.com/nrkno/sofie-quantel-gateway) CORBA to REST gateway for _Quantel/ISA_ playback. ## Libraries There are a number of libraries used in the Sofie ecosystem: -* [**ATEM Connection**](https://github.com/nrkno/sofie-atem-connection) Library for communicating with Blackmagic Design's ATEM mixers -* [**ATEM State**](https://github.com/nrkno/sofie-atem-state) Used in TSR to tracks the state of ATEMs and generate commands to control them. -* [**CasparCG Server Connection**](https://github.com/SuperFlyTV/casparcg-connection) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Library to connect and interact with CasparCG Servers. -* [**CasparCG State**](https://github.com/superflytv/casparcg-state) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Used in TSR to tracks the state of CasparCG Servers and generate commands to control them. -* [**Ember+ Connection**](https://github.com/nrkno/sofie-emberplus-connection) Library to communicate with _Ember+_ control protocol -* [**HyperDeck Connection**](https://github.com/nrkno/sofie-hyperdeck-connection) Library for connecting to Blackmagic Design's HyperDeck recorders. -* [**MOS Connection**](https://github.com/nrkno/sofie-mos-connection/) A [_MOS protocol_](http://mosprotocol.com/) library for acting as a MOS device and connecting to an newsroom control system. -* [**Quantel Gateway Client**](https://github.com/nrkno/sofie-quantel-gateway-client) An interface that talks to the Quantel-Gateway application. -* [**Sofie Core Integration**](https://github.com/nrkno/sofie-core-integration) Used to connect to the [Sofie Core](https://github.com/nrkno/sofie-core) by the Gateways. -* [**Sofie Blueprints Integration**](https://github.com/nrkno/sofie-sofie-blueprints-integration) Common types and interfaces used by both Sofie Core and the user-defined blueprints. -* [**SuperFly-Timeline**](https://github.com/SuperFlyTV/supertimeline) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Resolver and rules for placing objects on a virtual timeline. -* [**ThreadedClass**](https://github.com/nytamin/threadedClass) developed by **[_Nytamin_](https://github.com/nytamin)** Used in TSR to spawn device controllers in separate processes. -* [**Timeline State Resolver**](https://github.com/nrkno/sofie-timeline-state-resolver) \(TSR\) The main driver in **Playout Gateway,** handles connections to playout-devices and sends commands based on a **Timeline** received from **Core**. - - +- [**ATEM Connection**](https://github.com/nrkno/sofie-atem-connection) Library for communicating with Blackmagic Design's ATEM mixers +- [**ATEM State**](https://github.com/nrkno/sofie-atem-state) Used in TSR to tracks the state of ATEMs and generate commands to control them. +- [**CasparCG Server Connection**](https://github.com/SuperFlyTV/casparcg-connection) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Library to connect and interact with CasparCG Servers. +- [**CasparCG State**](https://github.com/superflytv/casparcg-state) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Used in TSR to tracks the state of CasparCG Servers and generate commands to control them. +- [**Ember+ Connection**](https://github.com/nrkno/sofie-emberplus-connection) Library to communicate with _Ember+_ control protocol +- [**HyperDeck Connection**](https://github.com/nrkno/sofie-hyperdeck-connection) Library for connecting to Blackmagic Design's HyperDeck recorders. +- [**MOS Connection**](https://github.com/nrkno/sofie-mos-connection/) A [_MOS protocol_](http://mosprotocol.com/) library for acting as a MOS device and connecting to an newsroom control system. +- [**Quantel Gateway Client**](https://github.com/nrkno/sofie-quantel-gateway-client) An interface that talks to the Quantel-Gateway application. +- [**Sofie Core Integration**](https://github.com/nrkno/sofie-core-integration) Used to connect to the [Sofie Core](https://github.com/nrkno/sofie-core) by the Gateways. +- [**Sofie Blueprints Integration**](https://github.com/nrkno/sofie-sofie-blueprints-integration) Common types and interfaces used by both Sofie Core and the user-defined blueprints. +- [**SuperFly-Timeline**](https://github.com/SuperFlyTV/supertimeline) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Resolver and rules for placing objects on a virtual timeline. +- [**ThreadedClass**](https://github.com/nytamin/threadedClass) developed by **[_Nytamin_](https://github.com/nytamin)** Used in TSR to spawn device controllers in separate processes. +- [**Timeline State Resolver**](https://github.com/nrkno/sofie-timeline-state-resolver) \(TSR\) The main driver in **Playout Gateway,** handles connections to playout-devices and sends commands based on a **Timeline** received from **Core**. There are also a few typings-only libraries that define interfaces between applications: -* [**Blueprints Integration**](https://www.npmjs.com/package/tv-automation-sofie-blueprints-integration) Defines the interface between [**Blueprints**](../user-guide/concepts-and-architecture#blueprints) and **Sofie Core**. -* [**Timeline State Resolver types**](https://www.npmjs.com/package/timeline-state-resolver-types) Defines the interface between [**Blueprints**](../user-guide/concepts-and-architecture#blueprints) and the timeline that will be fed into **TSR** for playout. +- [**Blueprints Integration**](https://www.npmjs.com/package/tv-automation-sofie-blueprints-integration) Defines the interface between [**Blueprints**](../user-guide/concepts-and-architecture#blueprints) and **Sofie Core**. +- [**Timeline State Resolver types**](https://www.npmjs.com/package/timeline-state-resolver-types) Defines the interface between [**Blueprints**](../user-guide/concepts-and-architecture#blueprints) and the timeline that will be fed into **TSR** for playout. ## Other Sofie-related Repositories -* [**CasparCG Server** \(NRK fork\)](https://github.com/nrkno/sofie-casparcg-server) Sofie-specific fork of CasparCG Server. -* [**CasparCG Launcher**](https://github.com/nrkno/sofie-casparcg-launcher) Launcher, controller, and logger for CasparCG Server. -* [**CasparCG Media Scanner** \(NRK fork\)](https://github.com/nrkno/sofie-casparcg-server) Sofie-specific fork of CasparCG Server 2.2 Media Scanner. -* [**Package Manager**](https://github.com/nrkno/sofie-package-manager) Handles media asset transfer and media file management for pulling new files and deleting expired files on playout devices in a more performant, and possibly distributed, way. Can smartly figure out how to get a file on storage A to playout server B. -* [**Media Manager**](https://github.com/nrkno/sofie-media-management) *(deprecated)* Handles media transfer and media file management for pulling new files and deleting expired files on playout devices. -* [**Quantel Browser Plugin**](https://github.com/nrkno/sofie-quantel-browser-plugin) MOS-compatible Quantel video clip browser for use with Sofie. -* [**Sisyfos Audio Controller**](https://github.com/nrkno/sofie-sisyfos-audio-controller) *developed by [_olzzon_](https://github.com/olzzon/)* - - - +- [**CasparCG Server** \(NRK fork\)](https://github.com/nrkno/sofie-casparcg-server) Sofie-specific fork of CasparCG Server. +- [**CasparCG Launcher**](https://github.com/nrkno/sofie-casparcg-launcher) Launcher, controller, and logger for CasparCG Server. +- [**CasparCG Media Scanner** \(NRK fork\)](https://github.com/nrkno/sofie-casparcg-server) Sofie-specific fork of CasparCG Server 2.2 Media Scanner. +- [**Package Manager**](https://github.com/nrkno/sofie-package-manager) Handles media asset transfer and media file management for pulling new files and deleting expired files on playout devices in a more performant, and possibly distributed, way. Can smartly figure out how to get a file on storage A to playout server B. +- [**Media Manager**](https://github.com/nrkno/sofie-media-management) _(deprecated)_ Handles media transfer and media file management for pulling new files and deleting expired files on playout devices. +- [**Quantel Browser Plugin**](https://github.com/nrkno/sofie-quantel-browser-plugin) MOS-compatible Quantel video clip browser for use with Sofie. +- [**Sisyfos Audio Controller**](https://github.com/nrkno/sofie-sisyfos-audio-controller) _developed by [*olzzon*](https://github.com/olzzon/)_ diff --git a/packages/documentation/versioned_docs/version-1.37.0/releases.md b/packages/documentation/versioned_docs/version-1.37.0/releases.md index 30e7cea457..141cb53a52 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/releases.md +++ b/packages/documentation/versioned_docs/version-1.37.0/releases.md @@ -2,7 +2,8 @@ title: Releases hide_table_of_contents: true --- + # Releases -Current, future, and past releases of _Sofie_ are all tracked on +Current, future, and past releases of _Sofie_ are all tracked on [**NRK's GitHub repository**](https://github.com/nrkno/Sofie-TV-automation/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3ARelease). diff --git a/packages/documentation/versioned_docs/version-1.37.0/user-guide/concepts-and-architecture.md b/packages/documentation/versioned_docs/version-1.37.0/user-guide/concepts-and-architecture.md index 3579a3c25d..dba88202a3 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/user-guide/concepts-and-architecture.md +++ b/packages/documentation/versioned_docs/version-1.37.0/user-guide/concepts-and-architecture.md @@ -11,7 +11,7 @@ sidebar_position: 1 ### Sofie Core **Sofie Core** is a web server which handle business logic and serves the web GUI. -It is a [NodeJS](https://nodejs.org/) process backed up by a [MongoDB](https://www.mongodb.com/) database and based on the framework [Meteor](http://meteor.com/). +It is a [NodeJS](https://nodejs.org/) process backed up by a [MongoDB](https://www.mongodb.com/) database and based on the framework [Meteor](http://meteor.com/). ### Gateways @@ -87,8 +87,6 @@ An AdLib isn't added to the Part in the GUI until it starts playing, instead you Being a web-based system, Sofie has a number of customisable, user-facing web [views](features/sofie-views) used for control and monitoring. - - ## Blueprints Blueprints are plug-ins that run in Sofie Core. They interpret the data coming in from the rundowns and transform them into a rich set of playable elements \(Segments, Parts, AdLibs etc\). @@ -134,7 +132,7 @@ The [Playout Gateway](../for-developers/libraries) picks up the timeline from So The Sofie system is made to work with a modern web- and IT-based approach in mind. Therefore, the Sofie Core can be run either on-site, or in an off-site cloud. -![Sofie Core can run in the cloud](/img/docs/main/features/sofie-web-architecture.png) +![Sofie Core can run in the cloud](/img/docs/main/features/sofie-web-architecture.png) One drawback of running in a cloud over the public internet is the - sometimes unpredictable - latency. The Timeline overcomes this by moving all the immediate control of the playout devices to the Playout Gateway, which is intended to run on a local network, close to the hardware it controls. This also gives the system a simple way of load-balancing - since the number of web-clients or load on Sofie Core won't affect the playout. diff --git a/packages/documentation/versioned_docs/version-1.37.0/user-guide/configuration/_category_.json b/packages/documentation/versioned_docs/version-1.37.0/user-guide/configuration/_category_.json index 52c3367a90..fb14c17378 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/user-guide/configuration/_category_.json +++ b/packages/documentation/versioned_docs/version-1.37.0/user-guide/configuration/_category_.json @@ -1,4 +1,4 @@ { - "label": "Configuration", - "position": 2 -} \ No newline at end of file + "label": "Configuration", + "position": 2 +} diff --git a/packages/documentation/versioned_docs/version-1.37.0/user-guide/configuration/settings-view.md b/packages/documentation/versioned_docs/version-1.37.0/user-guide/configuration/settings-view.md index cff7f79e38..36aba3af2c 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/user-guide/configuration/settings-view.md +++ b/packages/documentation/versioned_docs/version-1.37.0/user-guide/configuration/settings-view.md @@ -1,6 +1,7 @@ --- sidebar_position: 2 --- + # Settings View :::caution @@ -22,9 +23,9 @@ Documentation for this section is yet to be written. A _Studio_ in Sofie-terms is a physical location, with a specific set of devices and equipment. Only one show can be on air in a studio at the same time. The _studio_ settings are settings for that specific studio, and contains settings related to hardware and playout, such as: -* **Attached devices** - the Gateways related to this studio -* **Blueprint configuration** - custom config option defined by the blueprints -* **Layer Mappings** - Maps the logical _timeline layers_ to physical devices and outputs +- **Attached devices** - the Gateways related to this studio +- **Blueprint configuration** - custom config option defined by the blueprints +- **Layer Mappings** - Maps the logical _timeline layers_ to physical devices and outputs The Studio uses a studio-blueprint, which handles things like mapping up an incoming rundown to a Showstyle. @@ -52,9 +53,9 @@ In order to allow the Producer to reconfigure the automation from the Switchboar A Route Set is essentially a distinct set of Layer Mappings, which can modify the settings already configured by the Layer Mappings, but can be turned On and Off. Called Routes, these can change: -* the Layer ID to a new Layer ID -* change the Device being controlled by the Layer -* change the aspect of the Device that's being controlled. +- the Layer ID to a new Layer ID +- change the Device being controlled by the Layer +- change the aspect of the Device that's being controlled. Route Sets can be grouped into Exclusivity Groups, in which only a single Route Set can be enabled at a time. When activating a Route Set within an Exclusivity Group, all other Route Sets in that group will be deactivated. This in turn, allows the System Administrator to create entire sections of exclusive automation control within the Studio that the Producer can then switch between. One such example could be switching between Primary and Backup playout servers, or switching between Primary and Backup talent microphone. @@ -83,10 +84,10 @@ Route Sets can also be configured with a _Default State_. This can be used to co A _Showstyle_ is related to the looks and logic of a _show_, which in contrast to the _studio_ is not directly related to the hardware. The Showstyle contains settings like -* **Source Layers** - Groups different types of content in the GUI -* **Output Channels** - Indicates different output targets \(such as the _Program_ or _back-screen in the studio_\) -* **Action Triggers** - Select how actions can be started on a per-show basis, outside of the on-screen controls -* **Blueprint configuration** - custom config option defined by the blueprints +- **Source Layers** - Groups different types of content in the GUI +- **Output Channels** - Indicates different output targets \(such as the _Program_ or _back-screen in the studio_\) +- **Action Triggers** - Select how actions can be started on a per-show basis, outside of the on-screen controls +- **Blueprint configuration** - custom config option defined by the blueprints :::caution Please note the difference between _Source Layers_ and _timeline-layers_: @@ -96,12 +97,12 @@ Please note the difference between _Source Layers_ and _timeline-layers_: [Timeline-objects](../concepts-and-architecture#timeline-object) \(inside of the [Pieces](../concepts-and-architecture#piece)\) are put onto timeline-layers, which are \(through the Mappings in the studio\) mapped to physical devices and outputs. The exact timeline-layer is never exposed to the user, but instead used on the technical level to control playout. -An example of the difference could be when playing a VT \(that's a Source Layer\), which could involve all of the timeline-layers _video\_player0_, _audio\_fader\_video_, _audio\_fader\_host_ and _mixer\_pgm._ +An example of the difference could be when playing a VT \(that's a Source Layer\), which could involve all of the timeline-layers _video_player0_, _audio_fader_video_, _audio_fader_host_ and _mixer_pgm._ ::: ### Action Triggers -This is a way to set up how - outside of the Point-and-Click Graphical User Interface - actions can be performed in the User Interface. Commonly, these are the *hotkey combinations* that can be used to either trigger AdLib content or other actions in the larger system. This is done by creating sets of Triggers and Actions to be triggered by them. These pairs can be set at the Show Style level or at the _Sofie Core_ (System) level, for common actions such as doing a Take or activating a Rundown, where you want a shared method of operation. _Sofie Core_ migrations will set up a base set of basic, system-wide Action Triggers for interacting with rundowns, but they can be changed by the System blueprint. +This is a way to set up how - outside of the Point-and-Click Graphical User Interface - actions can be performed in the User Interface. Commonly, these are the _hotkey combinations_ that can be used to either trigger AdLib content or other actions in the larger system. This is done by creating sets of Triggers and Actions to be triggered by them. These pairs can be set at the Show Style level or at the _Sofie Core_ (System) level, for common actions such as doing a Take or activating a Rundown, where you want a shared method of operation. _Sofie Core_ migrations will set up a base set of basic, system-wide Action Triggers for interacting with rundowns, but they can be changed by the System blueprint. ![Action triggers define modes of interacting with a Rundown](/img/docs/main/features/action_triggers_3.png) @@ -109,16 +110,16 @@ This is a way to set up how - outside of the Point-and-Click Graphical User Inte The triggers are designed to be either client-specific or issued by a peripheral device module. -Currently, the Action Triggers system only supports a single, client-specific trigger type: a Hotkey. Hotkeys can be either a single key, a combination of keys (*combo*) or a *chord* - a sequnece of key combinations pressed in a particular order. *Chords* are popular in some text editing applications and vastly expand the amount of actions that can be triggered from a keyboard, at the expense of the time needed to execute them. Currently, the Hotkey editor in Sofie does not support creating *Chords*, but they can be specified by Blueprints during migrations. +Currently, the Action Triggers system only supports a single, client-specific trigger type: a Hotkey. Hotkeys can be either a single key, a combination of keys (_combo_) or a _chord_ - a sequnece of key combinations pressed in a particular order. _Chords_ are popular in some text editing applications and vastly expand the amount of actions that can be triggered from a keyboard, at the expense of the time needed to execute them. Currently, the Hotkey editor in Sofie does not support creating _Chords_, but they can be specified by Blueprints during migrations. To edit a given trigger, click on the trigger pill on the left of the Trigger-Action set. When hovering, a **+** sign will appear, allowing you to add a new trigger to the set. #### Actions -The actions are built using a base *action* (such as *Activate a Rundown* or *AdLib*) and a set of *filters*, limiting the scope of the *action*. Optionally, some of these *actions* can take additional *parameters*. These filters can operate on various types of objects, depending on the action in question. All actions currently require that the chain of filters starts with scoping out the Rundown the action is supposed to affect. Currently, there is only one type of Rundown-level filter supported: "The Rundown currently in view". +The actions are built using a base _action_ (such as _Activate a Rundown_ or _AdLib_) and a set of _filters_, limiting the scope of the _action_. Optionally, some of these _actions_ can take additional _parameters_. These filters can operate on various types of objects, depending on the action in question. All actions currently require that the chain of filters starts with scoping out the Rundown the action is supposed to affect. Currently, there is only one type of Rundown-level filter supported: "The Rundown currently in view". -The Action Triggers user interface guides the user in a wizzard-like fashion through the available *filter* options on a given *action*. +The Action Triggers user interface guides the user in a wizzard-like fashion through the available _filter_ options on a given _action_. ![Actions can take additional parameters](/img/docs/main/features/action_triggers_2.png) @@ -126,7 +127,7 @@ If the action provides a preview of the triggered items and there is an availabl ![A preview of the action, as scoped by the filters](/img/docs/main/features/action_triggers_4.png) -Clicking on the action and filter pills allows you to edit the action parameters and filter parameters. *Limit* limits the amount of objects to only the first *N* objects matched - this can significantly improve performance on large data sets. *Pick* and *Pick last* filters end the chain of the filters by selecting a single item from the filtered set of objects (the *N-th* object from the beginning or the end, respectively). *Pick* implicitly contains a *Limit* for the performance improvement. This is not true for *Pick last*, though. +Clicking on the action and filter pills allows you to edit the action parameters and filter parameters. _Limit_ limits the amount of objects to only the first _N_ objects matched - this can significantly improve performance on large data sets. _Pick_ and _Pick last_ filters end the chain of the filters by selecting a single item from the filtered set of objects (the _N-th_ object from the beginning or the end, respectively). _Pick_ implicitly contains a _Limit_ for the performance improvement. This is not true for _Pick last_, though. ## Migrations @@ -135,4 +136,3 @@ The migrations are automatic setup-scripts that help you during initial setup an There are system-migrations that comes directly from the version of _Sofie Core_ you're running, and there are also migrations added by the different blueprints. It is mandatory to run migrations when you've upgraded _Sofie Core_ to a new version, or upgraded your blueprints. - diff --git a/packages/documentation/versioned_docs/version-1.37.0/user-guide/configuration/sofie-core-settings.md b/packages/documentation/versioned_docs/version-1.37.0/user-guide/configuration/sofie-core-settings.md index 0320b31466..187643dab0 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/user-guide/configuration/sofie-core-settings.md +++ b/packages/documentation/versioned_docs/version-1.37.0/user-guide/configuration/sofie-core-settings.md @@ -1,6 +1,7 @@ --- sidebar_position: 1 --- + # Sofie Core: System Configuration _Sofie Core_ is configured at it's most basic level using a settings file and environment variables. @@ -83,8 +84,8 @@ The settings file is an optional JSON file that contains some configuration sett To use a settings file: -* During development: `meteor --settings settings.json` -* During prod: environment variable \(see above\) +- During development: `meteor --settings settings.json` +- During prod: environment variable \(see above\) The structure of the file allows for public and private fields. At the moment, Sofie only uses public fields. Below is an example settings file: @@ -112,10 +113,6 @@ There are various settings you can set for an installation. See the list below: | `allowRundownResetOnAir` | Should the user be allowed to reset Rundowns when they are On Air | `false` | | `defaultDisplayDuration` | The fallback duration of a Part, when it's expectedDuration is 0. \_\_In milliseconds | `3000` | - :::info The exact definition for the settings can be found [in the code here](https://github.com/nrkno/sofie-core/blob/master/meteor/lib/Settings.ts#L12). ::: - - - diff --git a/packages/documentation/versioned_docs/version-1.37.0/user-guide/faq.md b/packages/documentation/versioned_docs/version-1.37.0/user-guide/faq.md index e832a36f5c..fb47871bb4 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/user-guide/faq.md +++ b/packages/documentation/versioned_docs/version-1.37.0/user-guide/faq.md @@ -8,10 +8,9 @@ All main components are using the [MIT license](https://opensource.org/licenses/ Everything needed to install and configure a fully functioning Sofie system is publicly available, with the following exceptions: -* A rundown data set describing the actual TV show and of media assets. -* Blueprints for your specific show. +- A rundown data set describing the actual TV show and of media assets. +- Blueprints for your specific show. ## When will feature _y_ become available? Check out the [issues page](https://github.com/nrkno/Sofie-TV-automation/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3ARelease), where there are notes on current and upcoming releases. - diff --git a/packages/documentation/versioned_docs/version-1.37.0/user-guide/features/_category_.json b/packages/documentation/versioned_docs/version-1.37.0/user-guide/features/_category_.json index 0dd70d8b0e..785c16360b 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/user-guide/features/_category_.json +++ b/packages/documentation/versioned_docs/version-1.37.0/user-guide/features/_category_.json @@ -1,4 +1,4 @@ { - "label": "Features", - "position": 2 -} \ No newline at end of file + "label": "Features", + "position": 2 +} diff --git a/packages/documentation/versioned_docs/version-1.37.0/user-guide/features/access-levels.md b/packages/documentation/versioned_docs/version-1.37.0/user-guide/features/access-levels.md index 50307f970e..3415b35bfe 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/user-guide/features/access-levels.md +++ b/packages/documentation/versioned_docs/version-1.37.0/user-guide/features/access-levels.md @@ -1,6 +1,7 @@ --- sidebar_position: 3 --- + # Access Levels A variety of access levels can be set via the URL. By default, a user cannot edit settings, nor play out anything. Some of the access levels provide additional administrative pages or helpful tool tips for new users. These modes are persistent between sessions and will need to be manually disabled by replacing the _1_ with a _0_ in the URL. Below is a quick reference to the modes and what they have access to. @@ -9,11 +10,10 @@ If user accounts are enabled \(`enableUserAccounts` in [_Sofie Core_ settin The access level is persisted in browser's Local Storage. To disable, visit`?theaccessmode=0`. -| Access area | Basic Mode | Configuration Mode | Studio Mode | Admin Mode | -| :--- | :--- | :--- | :--- | :--- | -| **Rundowns** | View Only | View Only | Yes, playout | Yes, playout | -| **Settings** | No | Yes | No | Yes | - +| Access area | Basic Mode | Configuration Mode | Studio Mode | Admin Mode | +| :----------- | :--------- | :----------------- | :----------- | :----------- | +| **Rundowns** | View Only | View Only | Yes, playout | Yes, playout | +| **Settings** | No | Yes | No | Yes | ### Basic mode diff --git a/packages/documentation/versioned_docs/version-1.37.0/user-guide/features/api.md b/packages/documentation/versioned_docs/version-1.37.0/user-guide/features/api.md index fc2e58ec1c..b4317847d8 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/user-guide/features/api.md +++ b/packages/documentation/versioned_docs/version-1.37.0/user-guide/features/api.md @@ -9,4 +9,3 @@ The documentation is minimal at the moment, but the API endpoints are listed by ## DDP – Core Integration If you're planning to build NodeJS applications that talk to _Sofie Core_, we recommend using the [core-integration](https://github.com/nrkno/sofie-core/tree/master/packages/server-core-integration) library, which exposes a number of callable methods and allows for subscribing to data the same way the [Gateways](../concepts-and-architecture#gateways) do it. - diff --git a/packages/documentation/versioned_docs/version-1.37.0/user-guide/features/language.md b/packages/documentation/versioned_docs/version-1.37.0/user-guide/features/language.md index 9fe03d816e..3c61fb16c3 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/user-guide/features/language.md +++ b/packages/documentation/versioned_docs/version-1.37.0/user-guide/features/language.md @@ -1,9 +1,10 @@ --- sidebar_position: 7 --- + # Language -_Sofie_ uses the [i18n internationalisation framework](https://www.i18next.com/) that allows you to present user-facing views in multiple languages. +_Sofie_ uses the [i18n internationalisation framework](https://www.i18next.com/) that allows you to present user-facing views in multiple languages. ## Language selection @@ -14,10 +15,11 @@ The UI will automatically detect user browser's default matching and select the This choice is persisted in browser's local storage, and the same language will be used until a new forced language is chosen using this method. _Sofie_ currently supports three languages: -* English _(default)_ `en` -* Norwegian bokmål `nb` -* Norwegian nynorsk `nn` + +- English _(default)_ `en` +- Norwegian bokmål `nb` +- Norwegian nynorsk `nn` ## Further Reading -* [List of language tags](https://en.wikipedia.org/wiki/IETF_language_tag) \ No newline at end of file +- [List of language tags](https://en.wikipedia.org/wiki/IETF_language_tag) diff --git a/packages/documentation/versioned_docs/version-1.37.0/user-guide/features/prompter.md b/packages/documentation/versioned_docs/version-1.37.0/user-guide/features/prompter.md index 264a7fd7b9..eaacc68681 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/user-guide/features/prompter.md +++ b/packages/documentation/versioned_docs/version-1.37.0/user-guide/features/prompter.md @@ -36,9 +36,9 @@ Example: [http://127.0.0.1/prompter/studio0/?mode=mouse&followtake=0&fontsize=20 The prompter can be controlled by different types of controllers. The control mode is set by a query parameter, like so: `?mode=mouse`. -| Query parameter | Description | -| :---------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Default | Controlled by both mouse and keyboard | +| Query parameter | Description | +| :---------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Default | Controlled by both mouse and keyboard | | `?mode=mouse` | Controlled by mouse only. [See configuration details](prompter#control-using-mouse-scroll-wheel) | | `?mode=keyboard` | Controlled by keyboard only. [See configuration details](prompter#control-using-keyboard) | | `?mode=shuttlekeyboard` | Controlled by a Contour Design ShuttleXpress, X-keys Jog and Shuttle or any compatible, configured as keyboard-ish device. [See configuration details](prompter#control-using-contour-shuttlexpress-or-x-keys) | @@ -72,7 +72,7 @@ Keyboard control is intended to be used when having a "keyboard"-device, such as This mode is intended to be used when having a Contour ShuttleXpress or X-keys device, configured to work as a keyboard device. These devices have jog/shuttle wheels, and their software/firmware allow them to map scroll movement to keystrokes from any key-combination. Since we only listen for key combinations, it effectively means that any device outputing keystrokes will work in this mode. -From Release 30, the speedMap has a prefix: **shuttle\_** \(i.e. shuttle\_speedMap\) +From Release 30, the speedMap has a prefix: **shuttle\_** \(i.e. shuttle_speedMap\) | Key combination | Function | | :--------------------------------------------------------- | :------------------------------------- | @@ -88,10 +88,10 @@ From Release 30, the speedMap has a prefix: **shuttle\_** \(i.e. shuttle\_speedM Configuration files that can be used in their respective driver software: -* [Contour ShuttleXpress](https://github.com/nrkno/sofie-core/blob/release26/resources/prompter_layout_shuttlexpress.pref) -* [X-keys](https://github.com/nrkno/sofie-core/blob/release26/resources/prompter_layout_xkeys.mw3) +- [Contour ShuttleXpress](https://github.com/nrkno/sofie-core/blob/release26/resources/prompter_layout_shuttlexpress.pref) +- [X-keys](https://github.com/nrkno/sofie-core/blob/release26/resources/prompter_layout_xkeys.mw3) -#### +#### #### Control using midi input \(_?mode=pedal_\) @@ -99,7 +99,7 @@ This mode listens to MIDI CC-notes on channel 8, expecting a linear range like i If you want to use traditional analogue pedals with 5 volt TRS connection, a converter such as the _Beat Bars EX2M_ will work well. -From Release 30, the parameters for the pedal have a prefix: **pedal\_** \(i.e. pedal\_speedMap, pedal\_reverseSpeedMap etc\) +From Release 30, the parameters for the pedal have a prefix: **pedal\_** \(i.e. pedal_speedMap, pedal_reverseSpeedMap etc\) | Query parameter | Type | Description | Default | | :---------------- | :--------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------- | @@ -110,11 +110,11 @@ From Release 30, the parameters for the pedal have a prefix: **pedal\_** \(i.e. | `rangeNeutralMax` | number | The minimum input to run forward, the start of the forward-range \(min speed\). This is also the end of any "deadband" you want filter out before starting moving forwards. | `80` | | `rangeFwdMax` | number | The maximum input, the end of the forward-range \(max speed\) | `127` | -* `rangeNeutralMin` has to be greater than `rangeRevMin` -* `rangeNeutralMax` has to be greater than `rangeNeutralMin` -* `rangeFwdMax` has to be greater than `rangeNeutralMax` +- `rangeNeutralMin` has to be greater than `rangeRevMin` +- `rangeNeutralMax` has to be greater than `rangeNeutralMin` +- `rangeFwdMax` has to be greater than `rangeNeutralMax` -![Yamaha FC7 mapped for both a forward \(80-127\) and backwards \(0-35\) range.](/img/docs/main/features/yamaha-fc7.jpg) +![Yamaha FC7 mapped for both a forward (80-127) and backwards (0-35) range.](/img/docs/main/features/yamaha-fc7.jpg) The default values allow for both going forwards and backwards. This matches the _Yamaha FC7_ expression pedal. The default values create a forward-range from 80-127, a neutral zone from 35-80 and a reverse-range from 0-35. @@ -130,7 +130,7 @@ Any movement within forward range will map to the _speedMap_ with interpolation | _"I have to go too far back to reverse"_ | Increse `rangeNeutralMin` | | _"As I find a good speed, it varies a bit in speed up/down even if I hold my foot still"_ | Use `?debug=1` to see what speed is calculated in the position the presenter wants to rest the foot in. Add more of that number in a sequence in the `speedMap` to flatten out the speed curve, i.e. `[1, 2, 3, 4, 4, 4, 4, 5, ...]` | -**Note:** The default values are set up to work with the _Yamaha FC7_ expression pedal, and will probably not be good for pedals with one continuous linear range from fully released to fully depressed. A suggested configuration for such pedals \(i.e. the _Mission Engineering EP-1_\) will be like: +**Note:** The default values are set up to work with the _Yamaha FC7_ expression pedal, and will probably not be good for pedals with one continuous linear range from fully released to fully depressed. A suggested configuration for such pedals \(i.e. the _Mission Engineering EP-1_\) will be like: | Query parameter | Suggestion | | :---------------- | :-------------------------------------- | @@ -147,7 +147,7 @@ This mode uses the browsers Gamapad API and polls connected Joycons for their st The Joycons can operate in 3 modes, the L-stick, the R-stick or both L+R sticks together. Reconnections and jumping between modes works, with one known limitation: **Transition from L+R to a single stick blocks all input, and requires a reconnect of the sticks you want to use.** This seems to be a bug in either the Joycons themselves or in the Gamepad API in general. -From Release 30, the parameters for the JoyCon have a prefix: **joycon\_** \(i.e. joycon\_speedMap, joycon\_reverseSpeedMap etc\) +From Release 30, the parameters for the JoyCon have a prefix: **joycon\_** \(i.e. joycon_speedMap, joycon_reverseSpeedMap etc\) | Query parameter | Type | Description | Default | | :---------------- | :--------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------- | @@ -158,9 +158,9 @@ From Release 30, the parameters for the JoyCon have a prefix: **joycon\_** \(i.e | `rangeNeutralMax` | number | The minimum input to run forward, the start of the forward-range \(min speed\). This is also the end of any "deadband" you want filter out before starting moving forwards. | `0.25` | | `rangeFwdMax` | number | The maximum input, the end of the forward-range \(max speed\) | `1` | -* `rangeNeutralMin` has to be greater than `rangeRevMin` -* `rangeNeutralMax` has to be greater than `rangeNeutralMin` -* `rangeFwdMax` has to be greater than `rangeNeutralMax` +- `rangeNeutralMin` has to be greater than `rangeRevMin` +- `rangeNeutralMax` has to be greater than `rangeNeutralMin` +- `rangeFwdMax` has to be greater than `rangeNeutralMax` ![Nintendo Swith Joycons](/img/docs/main/features/nintendo-switch-joycons.jpg) @@ -176,8 +176,6 @@ You can turn on `?debug=1` to see how your input maps to an output. | Left / Y | Go to the previous story | | Right / A | Go to the following story | - - **Calibration guide:** | **Symptom** | Adjustment | @@ -188,4 +186,3 @@ You can turn on `?debug=1` to see how your input maps to an output. | _"I can't reach max speed backwards"_ | Increase `rangeRevMin` | | _"I can't reach max speed forwards"_ | Decrease `rangeFwdMax` | | _"As I find a good speed, it varies a bit in speed up/down even if I hold my finger still"_ | Use `?debug=1` to see what speed is calculated in the position the presenter wants to rest their finger in. Add more of that number in a sequence in the `speedMap` to flatten out the speed curve, i.e. `[1, 2, 3, 4, 4, 4, 4, 5, ...]` | - diff --git a/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/_category_.json b/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/_category_.json index d4eb4cf33a..12e58396d0 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/_category_.json +++ b/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/_category_.json @@ -1,4 +1,4 @@ { - "label": "Installation", - "position": 2 -} \ No newline at end of file + "label": "Installation", + "position": 2 +} diff --git a/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/initial-sofie-core-setup.md b/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/initial-sofie-core-setup.md index 8d9a9f3e8a..a449c473a2 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/initial-sofie-core-setup.md +++ b/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/initial-sofie-core-setup.md @@ -6,15 +6,14 @@ sidebar_position: 3 #### Prerequisites -* [Installed and running _Sofie Core_](installing-sofie-server-core) +- [Installed and running _Sofie Core_](installing-sofie-server-core) Once _Sofie Core_ has been installed and is running you can begin setting it up. The first step is to navigate to the _Settings page_. Please review the [Sofie Access Level](../features/access-levels) page for assistance getting there. -To upgrade to a newer version or installation of new blueprints, Sofie needs to run its "Upgrade database" procedure to migrate data and pre-fill various settings. You can do this by clicking the _Upgrade Database_ button in the menu. +To upgrade to a newer version or installation of new blueprints, Sofie needs to run its "Upgrade database" procedure to migrate data and pre-fill various settings. You can do this by clicking the _Upgrade Database_ button in the menu. ![Update Database Section of the Settings Page](/img/docs/getting-started/settings-page-full-update-db.jpg) Fill in the form as prompted and continue by clicking _Run Migrations Procedure_. Sometimes you will need to go through multiple steps before the upgrade is finished. Next, you will need to add some [Blueprints](installing-blueprints) and add [Gateways](installing-a-gateway/intro) to allow _Sofie_ to interpret rundown data and then play out things. - diff --git a/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-a-gateway/_category_.json b/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-a-gateway/_category_.json index 7fa55d484d..e83c1db9e5 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-a-gateway/_category_.json +++ b/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-a-gateway/_category_.json @@ -1,4 +1,4 @@ { - "label": "Installing a Gateway", - "position": 5 -} \ No newline at end of file + "label": "Installing a Gateway", + "position": 5 +} diff --git a/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-a-gateway/intro.md b/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-a-gateway/intro.md index 03b3e8c0b1..22de30f226 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-a-gateway/intro.md +++ b/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-a-gateway/intro.md @@ -2,11 +2,12 @@ sidebar_label: Introduction sidebar_position: 1 --- + # Introduction: Installing a Gateway #### Prerequisites -* [Installed and running Sofie Core](../installing-sofie-server-core) +- [Installed and running Sofie Core](../installing-sofie-server-core) The _Sofie Core_ is the primary application for managing the broadcast, but it doesn't play anything out on it's own. A Gateway will establish the connection from _Sofie Core_ to other pieces of hardware or remote software. A basic setup may include the [Spreadsheet Gateway](rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support) which will ingest a rundown from Google Sheets then, use the [Playout Gateway](playout-gatewayo send commands to a CasparCG Server graphics playout, an ATEM vision mixer, and / or the [Sisyfos audio controller](https://github.com/olzzon/sisyfos-audio-controller). @@ -14,12 +15,11 @@ Installing a gateway is a two part process. To begin, you will [add the required ### Rundown & Newsroom Gateways -* [Google Spreadsheet Gateway](rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support) -* [iNEWS Gateway](rundown-or-newsroom-system-connection/inews-gateway) -* [MOS Gateway](rundown-or-newsroom-system-connection/mos-gateway) +- [Google Spreadsheet Gateway](rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support) +- [iNEWS Gateway](rundown-or-newsroom-system-connection/inews-gateway) +- [MOS Gateway](rundown-or-newsroom-system-connection/mos-gateway) ### Playout & Media Manager Gateways -* [Playout Gateway](playout-gateway) -* [Media Manager](../media-manager) - +- [Playout Gateway](playout-gateway) +- [Media Manager](../media-manager) diff --git a/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-a-gateway/playout-gateway.md b/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-a-gateway/playout-gateway.md index 0fd5f47626..0d90911760 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-a-gateway/playout-gateway.md +++ b/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-a-gateway/playout-gateway.md @@ -1,6 +1,7 @@ --- sidebar_position: 3 --- + # Playout Gateway The _Playout Gateway_ handles interacting external pieces of hardware or software by sending commands that will playout rundown content. This gateway used to be a separate installation but it has since been moved into the main _Sofie Core_ component. diff --git a/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json b/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json index b4c4ffc34d..ae77b5c6a7 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json +++ b/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json @@ -1,4 +1,4 @@ { "label": "Rundown or Newsroom System Connection", "position": 4 -} \ No newline at end of file +} diff --git a/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md b/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md index 48659251a6..0d67551638 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md +++ b/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md @@ -4,9 +4,8 @@ The iNEWS Gateway communicates with an iNEWS system to ingest and remain in sync ### Installing iNEWS for Sofie -The iNEWS Gateway allows you to create rundowns from within iNEWS and sync them with the _Sofie Core_. The rundowns will update in real time and any changes made will be seen from within your Playout Timeline. +The iNEWS Gateway allows you to create rundowns from within iNEWS and sync them with the _Sofie Core_. The rundowns will update in real time and any changes made will be seen from within your Playout Timeline. The setup for the iNEWS Gateway is already in the Docker Compose file you downloaded earlier. Remove the _\#_ symbol from the start of the line labeled `image: tv2/inews-ftp-gateway:develop` and add a _\#_ to the other ingest gateway that was being used. Although the iNEWS Gateway is available free of charge, an iNEWS license is not. Visit [Avid's website](https://www.avid.com/products/inews/how-to-buy) to find an iNEWS reseller that handles your geographic area. - diff --git a/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md b/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md index cf2c62a508..dcdc7db5b6 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md +++ b/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md @@ -2,13 +2,10 @@ Sofie Core doesn't talk directly to the newsroom systems, but instead via one of the Gateways. -The Google Spreadsheet Gateway, iNEWS Gateway, and the MOS \( [Media Object Server Communications Protocol](http://mosprotocol.com/) \) Gateway which can handle interacting with any system that communicates via MOS. +The Google Spreadsheet Gateway, iNEWS Gateway, and the MOS \( [Media Object Server Communications Protocol](http://mosprotocol.com/) \) Gateway which can handle interacting with any system that communicates via MOS. ### Further Reading -* [MOS Protocol Overview & Documentation](http://mosprotocol.com/) -* [iNEWS on Avid's Website](https://www.avid.com/products/inews/how-to-buy) -* [ENPS on The Associated Press' Website](https://www.ap.org/enps/support) - - - +- [MOS Protocol Overview & Documentation](http://mosprotocol.com/) +- [iNEWS on Avid's Website](https://www.avid.com/products/inews/how-to-buy) +- [ENPS on The Associated Press' Website](https://www.ap.org/enps/support) diff --git a/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md b/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md index b1eff262fe..81f0e0fc81 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md +++ b/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md @@ -5,5 +5,3 @@ The MOS Gateway communicates with a device that supports the [MOS protocol](http The setup for the MOS Gateway is handled in the Docker Compose in the [Quick Install](../../installing-sofie-server-core) page. One thing to note if managing the mos-gateway manually: It needs a few ports open \(10540, 10541\) for MOS-messages to be pushed to it from the NCS. - - diff --git a/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-connections-and-additional-hardware/README.md b/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-connections-and-additional-hardware/README.md index 92826611ec..8d7990f460 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-connections-and-additional-hardware/README.md +++ b/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-connections-and-additional-hardware/README.md @@ -2,34 +2,40 @@ #### Prerequisites -* [Installed and running Sofie Core](../installing-sofie-server-core) -* [Installed Playout Gateway](../installing-a-gateway/playout-gateway) -* [Installed and configured Studio Blueprints](../installing-blueprints#installing-a-studio-blueprint) +- [Installed and running Sofie Core](../installing-sofie-server-core) +- [Installed Playout Gateway](../installing-a-gateway/playout-gateway) +- [Installed and configured Studio Blueprints](../installing-blueprints#installing-a-studio-blueprint) The following pages are broken up by equipment type that is supported by Sofie's Gateways. ## Playout & Recording -* [CasparCG Graphics and Video Server](casparcg-server-installation) - _Graphics / Playout / Recording_ -* [Blackmagic Design's HyperDeck](https://www.blackmagicdesign.com/products/hyperdeckstudio) - _Recording_ -* [Quantel](http://www.quantel.com) Solutions - _Playout_ -* [Vizrt](https://www.vizrt.com/) Graphics Solutions - _Graphics / Playout_ + +- [CasparCG Graphics and Video Server](casparcg-server-installation) - _Graphics / Playout / Recording_ +- [Blackmagic Design's HyperDeck](https://www.blackmagicdesign.com/products/hyperdeckstudio) - _Recording_ +- [Quantel](http://www.quantel.com) Solutions - _Playout_ +- [Vizrt](https://www.vizrt.com/) Graphics Solutions - _Graphics / Playout_ ## Vision Mixers -* [Blackmagic's ATEM](https://www.blackmagicdesign.com/products/atem) hardware vision mixers -* [vMix](https://www.vmix.com/) software vision mixer \(coming soon\) + +- [Blackmagic's ATEM](https://www.blackmagicdesign.com/products/atem) hardware vision mixers +- [vMix](https://www.vmix.com/) software vision mixer \(coming soon\) ## Audio Mixers -* [Sisyfos](https://github.com/olzzon/sisyfos-audio-controller) audio controller -* [Lawo sound mixers_,_](https://www.lawo.com/applications/broadcast-production/audio-consoles.html) _using emberplus protocol_ -* Generic OSC \(open sound control\) + +- [Sisyfos](https://github.com/olzzon/sisyfos-audio-controller) audio controller +- [Lawo sound mixers*,*](https://www.lawo.com/applications/broadcast-production/audio-consoles.html) _using emberplus protocol_ +- Generic OSC \(open sound control\) ## PTZ Cameras -* [Panasonic PTZ](https://pro-av.panasonic.net/en/products/ptz_camera_systems.html) cameras + +- [Panasonic PTZ](https://pro-av.panasonic.net/en/products/ptz_camera_systems.html) cameras ## Lights -* [Pharos](https://www.pharoscontrols.com/) light control + +- [Pharos](https://www.pharoscontrols.com/) light control ## Other -* Generic OSC \(open sound control\) -* Generic HTTP requests \(to control http-REST interfaces\) -* Generic TCP-socket + +- Generic OSC \(open sound control\) +- Generic HTTP requests \(to control http-REST interfaces\) +- Generic TCP-socket diff --git a/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-connections-and-additional-hardware/_category_.json b/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-connections-and-additional-hardware/_category_.json index d3e1e8979e..4d800e9a88 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-connections-and-additional-hardware/_category_.json +++ b/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-connections-and-additional-hardware/_category_.json @@ -1,4 +1,4 @@ { - "label": "Installing Connections and Additional Hardware", - "position": 6 -} \ No newline at end of file + "label": "Installing Connections and Additional Hardware", + "position": 6 +} diff --git a/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md b/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md index 7ce94888eb..a1a1514bdc 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md +++ b/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md @@ -1,6 +1,6 @@ # Configuring Vision Mixers -## ATEM – Blackmagic Design +## ATEM – Blackmagic Design The [Playout Gateway](../installing-a-gateway/playout-gateway) supports communicating with the entire line up of Blackmagic Design's ATEM vision mixers. @@ -11,4 +11,3 @@ Once your ATEM is properly configured on the network, you can add it as a device ### Additional Information Sofie does not support connecting to a vision mixer hardware panels. All interacts with the vision mixers must be handled within a Rundown. - diff --git a/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/intro.md b/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/intro.md index e2f13307dd..e63bd18c4f 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/intro.md +++ b/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/intro.md @@ -1,37 +1,35 @@ --- sidebar_position: 1 --- + # Getting Started _Sofie_ can be installed in many different ways, depending on which platforms, needs, and features you desire. The _Sofie_ system consists of several applications that work together to provide complete broadcast automation system. Each of these components' installation will be covered in this guide. Additional information about the products or services mentioned alongside the Sofie Installation can be found on the [Further Reading](../further-reading). There are four minimum required components to get a Sofie system up and running. First you need the [_Sofie Core_](installing-sofie-server-core), which is the brains of the operation. Then a set of [_Blueprints_](installing-blueprints) to handle and interpret incoming and outgoing data. Next, an [_Ingest Gateway_](installing-a-gateway/rundown-or-newsroom-system-connection/intro) to fetch the data for the Blueprints. Then finally, a [_Playout Gateway_](installing-a-gateway/playout-gateway) to send the data to your playout device of choice. - - ## Sofie Core View -The _Rundowns_ view will display all the active rundowns that the _Sofie Core_ has access to. +The _Rundowns_ view will display all the active rundowns that the _Sofie Core_ has access to. ![Rundown View](/img/docs/getting-started/rundowns-in-sofie.png) The _Status_ views displays the current status for the attached devices and gateways. -![Status View – Describes the state of _Sofie Core_](/img/docs/getting-started/status-page.jpg) +![Status View – Describes the state of _Sofie Core_](/img/docs/getting-started/status-page.jpg) -The _Settings_ views contains various settings for the studio, show styles, blueprints etc.. If the link to the settings view is not visible in your application, check your [Access Levels](../features/access-levels). More info on specific parts of the _Settings_ view can be found in their corresponding guide sections. +The _Settings_ views contains various settings for the studio, show styles, blueprints etc.. If the link to the settings view is not visible in your application, check your [Access Levels](../features/access-levels). More info on specific parts of the _Settings_ view can be found in their corresponding guide sections. -![Settings View – Describes how the _Sofie Core_ is configured](/img/docs/getting-started/settings-page.jpg) +![Settings View – Describes how the _Sofie Core_ is configured](/img/docs/getting-started/settings-page.jpg) ## Sofie Core Overview -The _Sofie Core_ is the primary application for managing the broadcast but, it doesn't play anything out on it's own. You need to use Gateways to establish the connection from the _Sofie Core_ to other pieces of hardware or remote software. +The _Sofie Core_ is the primary application for managing the broadcast but, it doesn't play anything out on it's own. You need to use Gateways to establish the connection from the _Sofie Core_ to other pieces of hardware or remote software. ### Gateways -Gateways are separate applications that bridge the gap between the _Sofie Core_ and other pieces of hardware or services. At minimum, you will need a _Playout Gateway_ so your timeline can interact with your playout system of choice. To install the _Playout Gateway_, visit the [Installing a Gateway](installing-a-gateway/intro) section of this guide and for a more in-depth look, please see [Gateways](../concepts-and-architecture#gateways). +Gateways are separate applications that bridge the gap between the _Sofie Core_ and other pieces of hardware or services. At minimum, you will need a _Playout Gateway_ so your timeline can interact with your playout system of choice. To install the _Playout Gateway_, visit the [Installing a Gateway](installing-a-gateway/intro) section of this guide and for a more in-depth look, please see [Gateways](../concepts-and-architecture#gateways). ### Blueprints Blueprints can be described as the logic that determines how a studio and show should interact with one another. They interpret the data coming in from the rundowns and transform them into a rich set of playable elements \(_Segments_, _Parts_, _AdLibs,_ etcetera\). The _Sofie Core_ has three main blueprint types, _System Blueprints_, _Studio Blueprints_, and _Showstyle Blueprints_. Installing _Sofie_ does not require you understand what these blueprints do, just that they are required for the _Sofie Core_ to work. If you would like to gain a deeper understand of how _Blueprints_ work, please visit the [Blueprints](#blueprints) section. - diff --git a/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/media-manager.md b/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/media-manager.md index 7697dfe00f..614fe4d560 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/media-manager.md +++ b/packages/documentation/versioned_docs/version-1.37.0/user-guide/installation/media-manager.md @@ -1,11 +1,10 @@ # Media Manager -The Media Manager handles the media, or files, that make up the rundown content. To install it, begin by downloading the latest release of [Media Manager from GitHub](https://github.com/nrkno/sofie-media-management/releases). You can now run the `media-manager.exe` file inside the extracted folder. A warning window may popup about the app being unrecognized. You can get around this by selecting _More Info_ and clicking _Run Anyways_. A terminal window will open and begin running the application. +The Media Manager handles the media, or files, that make up the rundown content. To install it, begin by downloading the latest release of [Media Manager from GitHub](https://github.com/nrkno/sofie-media-management/releases). You can now run the `media-manager.exe` file inside the extracted folder. A warning window may popup about the app being unrecognized. You can get around this by selecting _More Info_ and clicking _Run Anyways_. A terminal window will open and begin running the application. -You can now open the _Sofie Core_, `http://localhost:3000`, and navigate to the _Settings page_. You will see your _Media Manager_ under the _Devices_ section of the menu. The four main sections, general properties, attached storage, media flows, monitors, as well as attached subdivides, all contribute to how the media is handled within the Sofie Core. +You can now open the _Sofie Core_, `http://localhost:3000`, and navigate to the _Settings page_. You will see your _Media Manager_ under the _Devices_ section of the menu. The four main sections, general properties, attached storage, media flows, monitors, as well as attached subdivides, all contribute to how the media is handled within the Sofie Core. ### Further Reading -* [Media Manager Releases on GitHub](https://github.com/nrkno/sofie-media-management/releases) -* [Media Manager GitHub Page for Developers](https://github.com/nrkno/sofie-media-management) - +- [Media Manager Releases on GitHub](https://github.com/nrkno/sofie-media-management/releases) +- [Media Manager GitHub Page for Developers](https://github.com/nrkno/sofie-media-management) diff --git a/packages/documentation/versioned_docs/version-1.37.0/user-guide/supported-devices.md b/packages/documentation/versioned_docs/version-1.37.0/user-guide/supported-devices.md index c0bce866ea..fc6fcfb30c 100644 --- a/packages/documentation/versioned_docs/version-1.37.0/user-guide/supported-devices.md +++ b/packages/documentation/versioned_docs/version-1.37.0/user-guide/supported-devices.md @@ -1,6 +1,7 @@ --- sidebar_position: 4 --- + # Supported Playout Devices All playout devices are essentially driven through the _timeline_, which passes through _Sofie Core_ into the Playout Gateway where it is processed by the timeline-state-resolver. This page details which devices and what parts of the devices can be controlled through the timeline-state-resolver library. In general a blueprints developer can use the [timeline-state-resolver-types package](https://www.npmjs.com/package/timeline-state-resolver-types) to see the interfaces for the timeline objects used to control the devices. @@ -9,99 +10,98 @@ All playout devices are essentially driven through the _timeline_, which passes We support almost all features of these devices except fairlight audio, camera controls and streaming capabilities. A non-inclusive list: -* Control of camera inputs -* Transitions -* Full control of keyers -* Full control of DVE's -* Control of media pools -* Control of auxilliaries +- Control of camera inputs +- Transitions +- Full control of keyers +- Full control of DVE's +- Control of media pools +- Control of auxilliaries ## CasparCG Server Tested and developed against [a fork of version 2.1](https://github.com/nrkno/sofie-casparcg-server) with more support for version 2.3 being added in the future. -* Video playback -* Graphics playback -* Recording / streaming -* Mixer parameters -* Transitions +- Video playback +- Graphics playback +- Recording / streaming +- Mixer parameters +- Transitions ## HTTP Protocol -* Get/post/put/delete methods -* Interval based watcher for status monitoring +- Get/post/put/delete methods +- Interval based watcher for status monitoring ## Blackmagic Design HyperDeck -* Recording +- Recording ## Lawo Powercore & MC2 Series -* Control over faders - * Using the ramp function on the powercore -* Control of parameters in the ember tree +- Control over faders + - Using the ramp function on the powercore +- Control of parameters in the ember tree ## OSC protocol -* Sending of integers, floats, strings, blobs -* Tweening \(transitioning between\) values +- Sending of integers, floats, strings, blobs +- Tweening \(transitioning between\) values Can be configured in TCP or UDP mode. ## Panasonic PTZ Cameras -* Recalling presets -* Setting zoom, zoom speed and recall speed +- Recalling presets +- Setting zoom, zoom speed and recall speed ## Pharos Lighting Control -* Recalling scenes -* Recalling timelines +- Recalling scenes +- Recalling timelines ## Grass Valley SQ Media Servers -* Control of playback -* Looping -* Cloning +- Control of playback +- Looping +- Cloning _Note: some features are controlled through the media-manager_ ## Shotoku Camera Robotics -* Cutting to shots -* Fading to shots +- Cutting to shots +- Fading to shots ## Singular Live -* Control nodes +- Control nodes _Note: this is not currently used in production by anyone we know of_ ## Sisyfos -* On-air controls -* Fader levels -* Labels -* Hide / show channels +- On-air controls +- Fader levels +- Labels +- Hide / show channels ## TCP Protocol -* Sending messages +- Sending messages ## VizRT Viz MSE -* Pilot elements -* Continue commands -* Loading all elements -* Clearing all elements +- Pilot elements +- Continue commands +- Loading all elements +- Clearing all elements ## vMix -* Full M/E control -* Audio control -* Streaming / recording control -* Fade to black -* Overlays -* Transforms -* Transitions - +- Full M/E control +- Audio control +- Streaming / recording control +- Fade to black +- Overlays +- Transforms +- Transitions diff --git a/packages/documentation/versioned_docs/version-1.38.0/about-sofie.md b/packages/documentation/versioned_docs/version-1.38.0/about-sofie.md index 363475f108..0c022bcb7e 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/about-sofie.md +++ b/packages/documentation/versioned_docs/version-1.38.0/about-sofie.md @@ -19,4 +19,4 @@ _**Sofie**_ is a web-based TV automation system for studios and live shows, used - Modular data-ingest architecture, supports MOS and Google spreadsheets - Plug-in architecture for programming shows -_The NRK logo is a registered trademark of Norsk rikskringkasting AS. The license does not grant any right to use, in any way, any trademarks, service marks or logos of Norsk rikskringkasting AS._ \ No newline at end of file +_The NRK logo is a registered trademark of Norsk rikskringkasting AS. The license does not grant any right to use, in any way, any trademarks, service marks or logos of Norsk rikskringkasting AS._ diff --git a/packages/documentation/versioned_docs/version-1.38.0/for-developers/api-documentation.md b/packages/documentation/versioned_docs/version-1.38.0/for-developers/api-documentation.md index b73b09a491..25a1ec1418 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/for-developers/api-documentation.md +++ b/packages/documentation/versioned_docs/version-1.38.0/for-developers/api-documentation.md @@ -1,4 +1,3 @@ - # API Documentation The Sofie Blueprints API and the Sofie Peripherals API are automatically generated and available at (https://nrkno.github.io/sofie-core/typedoc). diff --git a/packages/documentation/versioned_docs/version-1.38.0/for-developers/for-blueprint-developers.md b/packages/documentation/versioned_docs/version-1.38.0/for-developers/for-blueprint-developers.md index 9128c2a0c1..03565aff40 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/for-developers/for-blueprint-developers.md +++ b/packages/documentation/versioned_docs/version-1.38.0/for-developers/for-blueprint-developers.md @@ -6,10 +6,5 @@ Documentation for this page is yet to be written. This part of the documentation is not yet written, but it should contain information useful to someone writing blueprints, such as: -* Explaining the basic concepts -* Explaining various features, such as infinites etc.. - - - - - +- Explaining the basic concepts +- Explaining various features, such as infinites etc.. diff --git a/packages/documentation/versioned_docs/version-1.38.0/for-developers/intro.md b/packages/documentation/versioned_docs/version-1.38.0/for-developers/intro.md index 1e96298172..a2ffce4f7e 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/for-developers/intro.md +++ b/packages/documentation/versioned_docs/version-1.38.0/for-developers/intro.md @@ -9,7 +9,7 @@ The pages below are intended for developers of any of the Sofie-related repos an A read-through of the [Concepts & Architectures](../user-guide/concepts-and-architecture) is recommended, before diving too deep into development. -* [Libraries](libraries) -* [Contribution Guidelines](contribution-guidelines) -* [For Blueprint Developers](for-blueprint-developers) -* [API Documentation](api-documentation) +- [Libraries](libraries) +- [Contribution Guidelines](contribution-guidelines) +- [For Blueprint Developers](for-blueprint-developers) +- [API Documentation](api-documentation) diff --git a/packages/documentation/versioned_docs/version-1.38.0/for-developers/libraries.md b/packages/documentation/versioned_docs/version-1.38.0/for-developers/libraries.md index 4d18d694f7..cd53888717 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/for-developers/libraries.md +++ b/packages/documentation/versioned_docs/version-1.38.0/for-developers/libraries.md @@ -12,48 +12,42 @@ description: List of all repositories related to Sofie Together with the _Sofie Core_ there are several _gateways_ which are separate applications, but which connect to _Sofie Core_ and are managed from within the Core's web UI. -* [**Playout Gateway**](https://github.com/nrkno/sofie-core/tree/master/packages/playout-gateway) Handles the playout from _Sofie_. Connects to and controls a multitude of devices, such as vision mixers, graphics, light controllers, audio mixers etc.. -* [**MOS Gateway**](https://github.com/nrkno/sofie-core/tree/master/packages/mos-gateway) Connects _Sofie_ to a newsroom system \(NRCS\) and ingests rundowns via the [MOS protocol](http://mosprotocol.com/). -* [**iNEWS Gateway**](https://github.com/tv2/inews-ftp-gateway) Connects _Sofie_ to an Avid iNEWS newsroom system. -* [**Quantel Gateway**](https://github.com/nrkno/sofie-quantel-gateway) CORBA to REST gateway for _Quantel/ISA_ playback. -* [**Spreadsheet Gateway**](https://github.com/SuperFlyTV/spreadsheet-gateway) Connects _Sofie_ to a _Google Drive_ folder and ingests rundowns from _Google Sheets_. -* [**Input Gateway**](https://github.com/nrkno/sofie-input-gateway) - +- [**Playout Gateway**](https://github.com/nrkno/sofie-core/tree/master/packages/playout-gateway) Handles the playout from _Sofie_. Connects to and controls a multitude of devices, such as vision mixers, graphics, light controllers, audio mixers etc.. +- [**MOS Gateway**](https://github.com/nrkno/sofie-core/tree/master/packages/mos-gateway) Connects _Sofie_ to a newsroom system \(NRCS\) and ingests rundowns via the [MOS protocol](http://mosprotocol.com/). +- [**iNEWS Gateway**](https://github.com/tv2/inews-ftp-gateway) Connects _Sofie_ to an Avid iNEWS newsroom system. +- [**Quantel Gateway**](https://github.com/nrkno/sofie-quantel-gateway) CORBA to REST gateway for _Quantel/ISA_ playback. +- [**Spreadsheet Gateway**](https://github.com/SuperFlyTV/spreadsheet-gateway) Connects _Sofie_ to a _Google Drive_ folder and ingests rundowns from _Google Sheets_. +- [**Input Gateway**](https://github.com/nrkno/sofie-input-gateway) ## Libraries There are a number of libraries used in the Sofie ecosystem: -* [**ATEM Connection**](https://github.com/nrkno/sofie-atem-connection) Library for communicating with Blackmagic Design's ATEM mixers -* [**ATEM State**](https://github.com/nrkno/sofie-atem-state) Used in TSR to tracks the state of ATEMs and generate commands to control them. -* [**CasparCG Server Connection**](https://github.com/SuperFlyTV/casparcg-connection) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Library to connect and interact with CasparCG Servers. -* [**CasparCG State**](https://github.com/superflytv/casparcg-state) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Used in TSR to tracks the state of CasparCG Servers and generate commands to control them. -* [**Ember+ Connection**](https://github.com/nrkno/sofie-emberplus-connection) Library to communicate with _Ember+_ control protocol -* [**HyperDeck Connection**](https://github.com/nrkno/sofie-hyperdeck-connection) Library for connecting to Blackmagic Design's HyperDeck recorders. -* [**MOS Connection**](https://github.com/nrkno/sofie-mos-connection/) A [_MOS protocol_](http://mosprotocol.com/) library for acting as a MOS device and connecting to an newsroom control system. -* [**Quantel Gateway Client**](https://github.com/nrkno/sofie-quantel-gateway-client) An interface that talks to the Quantel-Gateway application. -* [**Sofie Core Integration**](https://github.com/nrkno/sofie-core-integration) Used to connect to the [Sofie Core](https://github.com/nrkno/sofie-core) by the Gateways. -* [**Sofie Blueprints Integration**](https://github.com/nrkno/sofie-sofie-blueprints-integration) Common types and interfaces used by both Sofie Core and the user-defined blueprints. -* [**SuperFly-Timeline**](https://github.com/SuperFlyTV/supertimeline) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Resolver and rules for placing objects on a virtual timeline. -* [**ThreadedClass**](https://github.com/nytamin/threadedClass) developed by **[_Nytamin_](https://github.com/nytamin)** Used in TSR to spawn device controllers in separate processes. -* [**Timeline State Resolver**](https://github.com/nrkno/sofie-timeline-state-resolver) \(TSR\) The main driver in **Playout Gateway,** handles connections to playout-devices and sends commands based on a **Timeline** received from **Core**. - - +- [**ATEM Connection**](https://github.com/nrkno/sofie-atem-connection) Library for communicating with Blackmagic Design's ATEM mixers +- [**ATEM State**](https://github.com/nrkno/sofie-atem-state) Used in TSR to tracks the state of ATEMs and generate commands to control them. +- [**CasparCG Server Connection**](https://github.com/SuperFlyTV/casparcg-connection) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Library to connect and interact with CasparCG Servers. +- [**CasparCG State**](https://github.com/superflytv/casparcg-state) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Used in TSR to tracks the state of CasparCG Servers and generate commands to control them. +- [**Ember+ Connection**](https://github.com/nrkno/sofie-emberplus-connection) Library to communicate with _Ember+_ control protocol +- [**HyperDeck Connection**](https://github.com/nrkno/sofie-hyperdeck-connection) Library for connecting to Blackmagic Design's HyperDeck recorders. +- [**MOS Connection**](https://github.com/nrkno/sofie-mos-connection/) A [_MOS protocol_](http://mosprotocol.com/) library for acting as a MOS device and connecting to an newsroom control system. +- [**Quantel Gateway Client**](https://github.com/nrkno/sofie-quantel-gateway-client) An interface that talks to the Quantel-Gateway application. +- [**Sofie Core Integration**](https://github.com/nrkno/sofie-core-integration) Used to connect to the [Sofie Core](https://github.com/nrkno/sofie-core) by the Gateways. +- [**Sofie Blueprints Integration**](https://github.com/nrkno/sofie-sofie-blueprints-integration) Common types and interfaces used by both Sofie Core and the user-defined blueprints. +- [**SuperFly-Timeline**](https://github.com/SuperFlyTV/supertimeline) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Resolver and rules for placing objects on a virtual timeline. +- [**ThreadedClass**](https://github.com/nytamin/threadedClass) developed by **[_Nytamin_](https://github.com/nytamin)** Used in TSR to spawn device controllers in separate processes. +- [**Timeline State Resolver**](https://github.com/nrkno/sofie-timeline-state-resolver) \(TSR\) The main driver in **Playout Gateway,** handles connections to playout-devices and sends commands based on a **Timeline** received from **Core**. There are also a few typings-only libraries that define interfaces between applications: -* [**Blueprints Integration**](https://www.npmjs.com/package/tv-automation-sofie-blueprints-integration) Defines the interface between [**Blueprints**](../user-guide/concepts-and-architecture#blueprints) and **Sofie Core**. -* [**Timeline State Resolver types**](https://www.npmjs.com/package/timeline-state-resolver-types) Defines the interface between [**Blueprints**](../user-guide/concepts-and-architecture#blueprints) and the timeline that will be fed into **TSR** for playout. +- [**Blueprints Integration**](https://www.npmjs.com/package/tv-automation-sofie-blueprints-integration) Defines the interface between [**Blueprints**](../user-guide/concepts-and-architecture#blueprints) and **Sofie Core**. +- [**Timeline State Resolver types**](https://www.npmjs.com/package/timeline-state-resolver-types) Defines the interface between [**Blueprints**](../user-guide/concepts-and-architecture#blueprints) and the timeline that will be fed into **TSR** for playout. ## Other Sofie-related Repositories -* [**CasparCG Server** \(NRK fork\)](https://github.com/nrkno/sofie-casparcg-server) Sofie-specific fork of CasparCG Server. -* [**CasparCG Launcher**](https://github.com/nrkno/sofie-casparcg-launcher) Launcher, controller, and logger for CasparCG Server. -* [**CasparCG Media Scanner** \(NRK fork\)](https://github.com/nrkno/sofie-casparcg-server) Sofie-specific fork of CasparCG Server 2.2 Media Scanner. -* [**Package Manager**](https://github.com/nrkno/sofie-package-manager) Handles media asset transfer and media file management for pulling new files and deleting expired files on playout devices in a more performant, and possibly distributed, way. Can smartly figure out how to get a file on storage A to playout server B. -* [**Media Manager**](https://github.com/nrkno/sofie-media-management) *(deprecated)* Handles media transfer and media file management for pulling new files and deleting expired files on playout devices. -* [**Quantel Browser Plugin**](https://github.com/nrkno/sofie-quantel-browser-plugin) MOS-compatible Quantel video clip browser for use with Sofie. -* [**Sisyfos Audio Controller**](https://github.com/nrkno/sofie-sisyfos-audio-controller) *developed by [_olzzon_](https://github.com/olzzon/)* - - - +- [**CasparCG Server** \(NRK fork\)](https://github.com/nrkno/sofie-casparcg-server) Sofie-specific fork of CasparCG Server. +- [**CasparCG Launcher**](https://github.com/nrkno/sofie-casparcg-launcher) Launcher, controller, and logger for CasparCG Server. +- [**CasparCG Media Scanner** \(NRK fork\)](https://github.com/nrkno/sofie-casparcg-server) Sofie-specific fork of CasparCG Server 2.2 Media Scanner. +- [**Package Manager**](https://github.com/nrkno/sofie-package-manager) Handles media asset transfer and media file management for pulling new files and deleting expired files on playout devices in a more performant, and possibly distributed, way. Can smartly figure out how to get a file on storage A to playout server B. +- [**Media Manager**](https://github.com/nrkno/sofie-media-management) _(deprecated)_ Handles media transfer and media file management for pulling new files and deleting expired files on playout devices. +- [**Quantel Browser Plugin**](https://github.com/nrkno/sofie-quantel-browser-plugin) MOS-compatible Quantel video clip browser for use with Sofie. +- [**Sisyfos Audio Controller**](https://github.com/nrkno/sofie-sisyfos-audio-controller) _developed by [*olzzon*](https://github.com/olzzon/)_ diff --git a/packages/documentation/versioned_docs/version-1.38.0/user-guide/concepts-and-architecture.md b/packages/documentation/versioned_docs/version-1.38.0/user-guide/concepts-and-architecture.md index 3579a3c25d..dba88202a3 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/user-guide/concepts-and-architecture.md +++ b/packages/documentation/versioned_docs/version-1.38.0/user-guide/concepts-and-architecture.md @@ -11,7 +11,7 @@ sidebar_position: 1 ### Sofie Core **Sofie Core** is a web server which handle business logic and serves the web GUI. -It is a [NodeJS](https://nodejs.org/) process backed up by a [MongoDB](https://www.mongodb.com/) database and based on the framework [Meteor](http://meteor.com/). +It is a [NodeJS](https://nodejs.org/) process backed up by a [MongoDB](https://www.mongodb.com/) database and based on the framework [Meteor](http://meteor.com/). ### Gateways @@ -87,8 +87,6 @@ An AdLib isn't added to the Part in the GUI until it starts playing, instead you Being a web-based system, Sofie has a number of customisable, user-facing web [views](features/sofie-views) used for control and monitoring. - - ## Blueprints Blueprints are plug-ins that run in Sofie Core. They interpret the data coming in from the rundowns and transform them into a rich set of playable elements \(Segments, Parts, AdLibs etc\). @@ -134,7 +132,7 @@ The [Playout Gateway](../for-developers/libraries) picks up the timeline from So The Sofie system is made to work with a modern web- and IT-based approach in mind. Therefore, the Sofie Core can be run either on-site, or in an off-site cloud. -![Sofie Core can run in the cloud](/img/docs/main/features/sofie-web-architecture.png) +![Sofie Core can run in the cloud](/img/docs/main/features/sofie-web-architecture.png) One drawback of running in a cloud over the public internet is the - sometimes unpredictable - latency. The Timeline overcomes this by moving all the immediate control of the playout devices to the Playout Gateway, which is intended to run on a local network, close to the hardware it controls. This also gives the system a simple way of load-balancing - since the number of web-clients or load on Sofie Core won't affect the playout. diff --git a/packages/documentation/versioned_docs/version-1.38.0/user-guide/configuration/_category_.json b/packages/documentation/versioned_docs/version-1.38.0/user-guide/configuration/_category_.json index 52c3367a90..fb14c17378 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/user-guide/configuration/_category_.json +++ b/packages/documentation/versioned_docs/version-1.38.0/user-guide/configuration/_category_.json @@ -1,4 +1,4 @@ { - "label": "Configuration", - "position": 2 -} \ No newline at end of file + "label": "Configuration", + "position": 2 +} diff --git a/packages/documentation/versioned_docs/version-1.38.0/user-guide/configuration/settings-view.md b/packages/documentation/versioned_docs/version-1.38.0/user-guide/configuration/settings-view.md index cff7f79e38..36aba3af2c 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/user-guide/configuration/settings-view.md +++ b/packages/documentation/versioned_docs/version-1.38.0/user-guide/configuration/settings-view.md @@ -1,6 +1,7 @@ --- sidebar_position: 2 --- + # Settings View :::caution @@ -22,9 +23,9 @@ Documentation for this section is yet to be written. A _Studio_ in Sofie-terms is a physical location, with a specific set of devices and equipment. Only one show can be on air in a studio at the same time. The _studio_ settings are settings for that specific studio, and contains settings related to hardware and playout, such as: -* **Attached devices** - the Gateways related to this studio -* **Blueprint configuration** - custom config option defined by the blueprints -* **Layer Mappings** - Maps the logical _timeline layers_ to physical devices and outputs +- **Attached devices** - the Gateways related to this studio +- **Blueprint configuration** - custom config option defined by the blueprints +- **Layer Mappings** - Maps the logical _timeline layers_ to physical devices and outputs The Studio uses a studio-blueprint, which handles things like mapping up an incoming rundown to a Showstyle. @@ -52,9 +53,9 @@ In order to allow the Producer to reconfigure the automation from the Switchboar A Route Set is essentially a distinct set of Layer Mappings, which can modify the settings already configured by the Layer Mappings, but can be turned On and Off. Called Routes, these can change: -* the Layer ID to a new Layer ID -* change the Device being controlled by the Layer -* change the aspect of the Device that's being controlled. +- the Layer ID to a new Layer ID +- change the Device being controlled by the Layer +- change the aspect of the Device that's being controlled. Route Sets can be grouped into Exclusivity Groups, in which only a single Route Set can be enabled at a time. When activating a Route Set within an Exclusivity Group, all other Route Sets in that group will be deactivated. This in turn, allows the System Administrator to create entire sections of exclusive automation control within the Studio that the Producer can then switch between. One such example could be switching between Primary and Backup playout servers, or switching between Primary and Backup talent microphone. @@ -83,10 +84,10 @@ Route Sets can also be configured with a _Default State_. This can be used to co A _Showstyle_ is related to the looks and logic of a _show_, which in contrast to the _studio_ is not directly related to the hardware. The Showstyle contains settings like -* **Source Layers** - Groups different types of content in the GUI -* **Output Channels** - Indicates different output targets \(such as the _Program_ or _back-screen in the studio_\) -* **Action Triggers** - Select how actions can be started on a per-show basis, outside of the on-screen controls -* **Blueprint configuration** - custom config option defined by the blueprints +- **Source Layers** - Groups different types of content in the GUI +- **Output Channels** - Indicates different output targets \(such as the _Program_ or _back-screen in the studio_\) +- **Action Triggers** - Select how actions can be started on a per-show basis, outside of the on-screen controls +- **Blueprint configuration** - custom config option defined by the blueprints :::caution Please note the difference between _Source Layers_ and _timeline-layers_: @@ -96,12 +97,12 @@ Please note the difference between _Source Layers_ and _timeline-layers_: [Timeline-objects](../concepts-and-architecture#timeline-object) \(inside of the [Pieces](../concepts-and-architecture#piece)\) are put onto timeline-layers, which are \(through the Mappings in the studio\) mapped to physical devices and outputs. The exact timeline-layer is never exposed to the user, but instead used on the technical level to control playout. -An example of the difference could be when playing a VT \(that's a Source Layer\), which could involve all of the timeline-layers _video\_player0_, _audio\_fader\_video_, _audio\_fader\_host_ and _mixer\_pgm._ +An example of the difference could be when playing a VT \(that's a Source Layer\), which could involve all of the timeline-layers _video_player0_, _audio_fader_video_, _audio_fader_host_ and _mixer_pgm._ ::: ### Action Triggers -This is a way to set up how - outside of the Point-and-Click Graphical User Interface - actions can be performed in the User Interface. Commonly, these are the *hotkey combinations* that can be used to either trigger AdLib content or other actions in the larger system. This is done by creating sets of Triggers and Actions to be triggered by them. These pairs can be set at the Show Style level or at the _Sofie Core_ (System) level, for common actions such as doing a Take or activating a Rundown, where you want a shared method of operation. _Sofie Core_ migrations will set up a base set of basic, system-wide Action Triggers for interacting with rundowns, but they can be changed by the System blueprint. +This is a way to set up how - outside of the Point-and-Click Graphical User Interface - actions can be performed in the User Interface. Commonly, these are the _hotkey combinations_ that can be used to either trigger AdLib content or other actions in the larger system. This is done by creating sets of Triggers and Actions to be triggered by them. These pairs can be set at the Show Style level or at the _Sofie Core_ (System) level, for common actions such as doing a Take or activating a Rundown, where you want a shared method of operation. _Sofie Core_ migrations will set up a base set of basic, system-wide Action Triggers for interacting with rundowns, but they can be changed by the System blueprint. ![Action triggers define modes of interacting with a Rundown](/img/docs/main/features/action_triggers_3.png) @@ -109,16 +110,16 @@ This is a way to set up how - outside of the Point-and-Click Graphical User Inte The triggers are designed to be either client-specific or issued by a peripheral device module. -Currently, the Action Triggers system only supports a single, client-specific trigger type: a Hotkey. Hotkeys can be either a single key, a combination of keys (*combo*) or a *chord* - a sequnece of key combinations pressed in a particular order. *Chords* are popular in some text editing applications and vastly expand the amount of actions that can be triggered from a keyboard, at the expense of the time needed to execute them. Currently, the Hotkey editor in Sofie does not support creating *Chords*, but they can be specified by Blueprints during migrations. +Currently, the Action Triggers system only supports a single, client-specific trigger type: a Hotkey. Hotkeys can be either a single key, a combination of keys (_combo_) or a _chord_ - a sequnece of key combinations pressed in a particular order. _Chords_ are popular in some text editing applications and vastly expand the amount of actions that can be triggered from a keyboard, at the expense of the time needed to execute them. Currently, the Hotkey editor in Sofie does not support creating _Chords_, but they can be specified by Blueprints during migrations. To edit a given trigger, click on the trigger pill on the left of the Trigger-Action set. When hovering, a **+** sign will appear, allowing you to add a new trigger to the set. #### Actions -The actions are built using a base *action* (such as *Activate a Rundown* or *AdLib*) and a set of *filters*, limiting the scope of the *action*. Optionally, some of these *actions* can take additional *parameters*. These filters can operate on various types of objects, depending on the action in question. All actions currently require that the chain of filters starts with scoping out the Rundown the action is supposed to affect. Currently, there is only one type of Rundown-level filter supported: "The Rundown currently in view". +The actions are built using a base _action_ (such as _Activate a Rundown_ or _AdLib_) and a set of _filters_, limiting the scope of the _action_. Optionally, some of these _actions_ can take additional _parameters_. These filters can operate on various types of objects, depending on the action in question. All actions currently require that the chain of filters starts with scoping out the Rundown the action is supposed to affect. Currently, there is only one type of Rundown-level filter supported: "The Rundown currently in view". -The Action Triggers user interface guides the user in a wizzard-like fashion through the available *filter* options on a given *action*. +The Action Triggers user interface guides the user in a wizzard-like fashion through the available _filter_ options on a given _action_. ![Actions can take additional parameters](/img/docs/main/features/action_triggers_2.png) @@ -126,7 +127,7 @@ If the action provides a preview of the triggered items and there is an availabl ![A preview of the action, as scoped by the filters](/img/docs/main/features/action_triggers_4.png) -Clicking on the action and filter pills allows you to edit the action parameters and filter parameters. *Limit* limits the amount of objects to only the first *N* objects matched - this can significantly improve performance on large data sets. *Pick* and *Pick last* filters end the chain of the filters by selecting a single item from the filtered set of objects (the *N-th* object from the beginning or the end, respectively). *Pick* implicitly contains a *Limit* for the performance improvement. This is not true for *Pick last*, though. +Clicking on the action and filter pills allows you to edit the action parameters and filter parameters. _Limit_ limits the amount of objects to only the first _N_ objects matched - this can significantly improve performance on large data sets. _Pick_ and _Pick last_ filters end the chain of the filters by selecting a single item from the filtered set of objects (the _N-th_ object from the beginning or the end, respectively). _Pick_ implicitly contains a _Limit_ for the performance improvement. This is not true for _Pick last_, though. ## Migrations @@ -135,4 +136,3 @@ The migrations are automatic setup-scripts that help you during initial setup an There are system-migrations that comes directly from the version of _Sofie Core_ you're running, and there are also migrations added by the different blueprints. It is mandatory to run migrations when you've upgraded _Sofie Core_ to a new version, or upgraded your blueprints. - diff --git a/packages/documentation/versioned_docs/version-1.38.0/user-guide/configuration/sofie-core-settings.md b/packages/documentation/versioned_docs/version-1.38.0/user-guide/configuration/sofie-core-settings.md index 0320b31466..187643dab0 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/user-guide/configuration/sofie-core-settings.md +++ b/packages/documentation/versioned_docs/version-1.38.0/user-guide/configuration/sofie-core-settings.md @@ -1,6 +1,7 @@ --- sidebar_position: 1 --- + # Sofie Core: System Configuration _Sofie Core_ is configured at it's most basic level using a settings file and environment variables. @@ -83,8 +84,8 @@ The settings file is an optional JSON file that contains some configuration sett To use a settings file: -* During development: `meteor --settings settings.json` -* During prod: environment variable \(see above\) +- During development: `meteor --settings settings.json` +- During prod: environment variable \(see above\) The structure of the file allows for public and private fields. At the moment, Sofie only uses public fields. Below is an example settings file: @@ -112,10 +113,6 @@ There are various settings you can set for an installation. See the list below: | `allowRundownResetOnAir` | Should the user be allowed to reset Rundowns when they are On Air | `false` | | `defaultDisplayDuration` | The fallback duration of a Part, when it's expectedDuration is 0. \_\_In milliseconds | `3000` | - :::info The exact definition for the settings can be found [in the code here](https://github.com/nrkno/sofie-core/blob/master/meteor/lib/Settings.ts#L12). ::: - - - diff --git a/packages/documentation/versioned_docs/version-1.38.0/user-guide/faq.md b/packages/documentation/versioned_docs/version-1.38.0/user-guide/faq.md index e832a36f5c..fb47871bb4 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/user-guide/faq.md +++ b/packages/documentation/versioned_docs/version-1.38.0/user-guide/faq.md @@ -8,10 +8,9 @@ All main components are using the [MIT license](https://opensource.org/licenses/ Everything needed to install and configure a fully functioning Sofie system is publicly available, with the following exceptions: -* A rundown data set describing the actual TV show and of media assets. -* Blueprints for your specific show. +- A rundown data set describing the actual TV show and of media assets. +- Blueprints for your specific show. ## When will feature _y_ become available? Check out the [issues page](https://github.com/nrkno/Sofie-TV-automation/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3ARelease), where there are notes on current and upcoming releases. - diff --git a/packages/documentation/versioned_docs/version-1.38.0/user-guide/features/_category_.json b/packages/documentation/versioned_docs/version-1.38.0/user-guide/features/_category_.json index 0dd70d8b0e..785c16360b 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/user-guide/features/_category_.json +++ b/packages/documentation/versioned_docs/version-1.38.0/user-guide/features/_category_.json @@ -1,4 +1,4 @@ { - "label": "Features", - "position": 2 -} \ No newline at end of file + "label": "Features", + "position": 2 +} diff --git a/packages/documentation/versioned_docs/version-1.38.0/user-guide/features/access-levels.md b/packages/documentation/versioned_docs/version-1.38.0/user-guide/features/access-levels.md index 50307f970e..3415b35bfe 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/user-guide/features/access-levels.md +++ b/packages/documentation/versioned_docs/version-1.38.0/user-guide/features/access-levels.md @@ -1,6 +1,7 @@ --- sidebar_position: 3 --- + # Access Levels A variety of access levels can be set via the URL. By default, a user cannot edit settings, nor play out anything. Some of the access levels provide additional administrative pages or helpful tool tips for new users. These modes are persistent between sessions and will need to be manually disabled by replacing the _1_ with a _0_ in the URL. Below is a quick reference to the modes and what they have access to. @@ -9,11 +10,10 @@ If user accounts are enabled \(`enableUserAccounts` in [_Sofie Core_ settin The access level is persisted in browser's Local Storage. To disable, visit`?theaccessmode=0`. -| Access area | Basic Mode | Configuration Mode | Studio Mode | Admin Mode | -| :--- | :--- | :--- | :--- | :--- | -| **Rundowns** | View Only | View Only | Yes, playout | Yes, playout | -| **Settings** | No | Yes | No | Yes | - +| Access area | Basic Mode | Configuration Mode | Studio Mode | Admin Mode | +| :----------- | :--------- | :----------------- | :----------- | :----------- | +| **Rundowns** | View Only | View Only | Yes, playout | Yes, playout | +| **Settings** | No | Yes | No | Yes | ### Basic mode diff --git a/packages/documentation/versioned_docs/version-1.38.0/user-guide/features/api.md b/packages/documentation/versioned_docs/version-1.38.0/user-guide/features/api.md index fc2e58ec1c..b4317847d8 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/user-guide/features/api.md +++ b/packages/documentation/versioned_docs/version-1.38.0/user-guide/features/api.md @@ -9,4 +9,3 @@ The documentation is minimal at the moment, but the API endpoints are listed by ## DDP – Core Integration If you're planning to build NodeJS applications that talk to _Sofie Core_, we recommend using the [core-integration](https://github.com/nrkno/sofie-core/tree/master/packages/server-core-integration) library, which exposes a number of callable methods and allows for subscribing to data the same way the [Gateways](../concepts-and-architecture#gateways) do it. - diff --git a/packages/documentation/versioned_docs/version-1.38.0/user-guide/features/language.md b/packages/documentation/versioned_docs/version-1.38.0/user-guide/features/language.md index 9fe03d816e..3c61fb16c3 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/user-guide/features/language.md +++ b/packages/documentation/versioned_docs/version-1.38.0/user-guide/features/language.md @@ -1,9 +1,10 @@ --- sidebar_position: 7 --- + # Language -_Sofie_ uses the [i18n internationalisation framework](https://www.i18next.com/) that allows you to present user-facing views in multiple languages. +_Sofie_ uses the [i18n internationalisation framework](https://www.i18next.com/) that allows you to present user-facing views in multiple languages. ## Language selection @@ -14,10 +15,11 @@ The UI will automatically detect user browser's default matching and select the This choice is persisted in browser's local storage, and the same language will be used until a new forced language is chosen using this method. _Sofie_ currently supports three languages: -* English _(default)_ `en` -* Norwegian bokmål `nb` -* Norwegian nynorsk `nn` + +- English _(default)_ `en` +- Norwegian bokmål `nb` +- Norwegian nynorsk `nn` ## Further Reading -* [List of language tags](https://en.wikipedia.org/wiki/IETF_language_tag) \ No newline at end of file +- [List of language tags](https://en.wikipedia.org/wiki/IETF_language_tag) diff --git a/packages/documentation/versioned_docs/version-1.38.0/user-guide/features/prompter.md b/packages/documentation/versioned_docs/version-1.38.0/user-guide/features/prompter.md index 264a7fd7b9..eaacc68681 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/user-guide/features/prompter.md +++ b/packages/documentation/versioned_docs/version-1.38.0/user-guide/features/prompter.md @@ -36,9 +36,9 @@ Example: [http://127.0.0.1/prompter/studio0/?mode=mouse&followtake=0&fontsize=20 The prompter can be controlled by different types of controllers. The control mode is set by a query parameter, like so: `?mode=mouse`. -| Query parameter | Description | -| :---------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Default | Controlled by both mouse and keyboard | +| Query parameter | Description | +| :---------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Default | Controlled by both mouse and keyboard | | `?mode=mouse` | Controlled by mouse only. [See configuration details](prompter#control-using-mouse-scroll-wheel) | | `?mode=keyboard` | Controlled by keyboard only. [See configuration details](prompter#control-using-keyboard) | | `?mode=shuttlekeyboard` | Controlled by a Contour Design ShuttleXpress, X-keys Jog and Shuttle or any compatible, configured as keyboard-ish device. [See configuration details](prompter#control-using-contour-shuttlexpress-or-x-keys) | @@ -72,7 +72,7 @@ Keyboard control is intended to be used when having a "keyboard"-device, such as This mode is intended to be used when having a Contour ShuttleXpress or X-keys device, configured to work as a keyboard device. These devices have jog/shuttle wheels, and their software/firmware allow them to map scroll movement to keystrokes from any key-combination. Since we only listen for key combinations, it effectively means that any device outputing keystrokes will work in this mode. -From Release 30, the speedMap has a prefix: **shuttle\_** \(i.e. shuttle\_speedMap\) +From Release 30, the speedMap has a prefix: **shuttle\_** \(i.e. shuttle_speedMap\) | Key combination | Function | | :--------------------------------------------------------- | :------------------------------------- | @@ -88,10 +88,10 @@ From Release 30, the speedMap has a prefix: **shuttle\_** \(i.e. shuttle\_speedM Configuration files that can be used in their respective driver software: -* [Contour ShuttleXpress](https://github.com/nrkno/sofie-core/blob/release26/resources/prompter_layout_shuttlexpress.pref) -* [X-keys](https://github.com/nrkno/sofie-core/blob/release26/resources/prompter_layout_xkeys.mw3) +- [Contour ShuttleXpress](https://github.com/nrkno/sofie-core/blob/release26/resources/prompter_layout_shuttlexpress.pref) +- [X-keys](https://github.com/nrkno/sofie-core/blob/release26/resources/prompter_layout_xkeys.mw3) -#### +#### #### Control using midi input \(_?mode=pedal_\) @@ -99,7 +99,7 @@ This mode listens to MIDI CC-notes on channel 8, expecting a linear range like i If you want to use traditional analogue pedals with 5 volt TRS connection, a converter such as the _Beat Bars EX2M_ will work well. -From Release 30, the parameters for the pedal have a prefix: **pedal\_** \(i.e. pedal\_speedMap, pedal\_reverseSpeedMap etc\) +From Release 30, the parameters for the pedal have a prefix: **pedal\_** \(i.e. pedal_speedMap, pedal_reverseSpeedMap etc\) | Query parameter | Type | Description | Default | | :---------------- | :--------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------- | @@ -110,11 +110,11 @@ From Release 30, the parameters for the pedal have a prefix: **pedal\_** \(i.e. | `rangeNeutralMax` | number | The minimum input to run forward, the start of the forward-range \(min speed\). This is also the end of any "deadband" you want filter out before starting moving forwards. | `80` | | `rangeFwdMax` | number | The maximum input, the end of the forward-range \(max speed\) | `127` | -* `rangeNeutralMin` has to be greater than `rangeRevMin` -* `rangeNeutralMax` has to be greater than `rangeNeutralMin` -* `rangeFwdMax` has to be greater than `rangeNeutralMax` +- `rangeNeutralMin` has to be greater than `rangeRevMin` +- `rangeNeutralMax` has to be greater than `rangeNeutralMin` +- `rangeFwdMax` has to be greater than `rangeNeutralMax` -![Yamaha FC7 mapped for both a forward \(80-127\) and backwards \(0-35\) range.](/img/docs/main/features/yamaha-fc7.jpg) +![Yamaha FC7 mapped for both a forward (80-127) and backwards (0-35) range.](/img/docs/main/features/yamaha-fc7.jpg) The default values allow for both going forwards and backwards. This matches the _Yamaha FC7_ expression pedal. The default values create a forward-range from 80-127, a neutral zone from 35-80 and a reverse-range from 0-35. @@ -130,7 +130,7 @@ Any movement within forward range will map to the _speedMap_ with interpolation | _"I have to go too far back to reverse"_ | Increse `rangeNeutralMin` | | _"As I find a good speed, it varies a bit in speed up/down even if I hold my foot still"_ | Use `?debug=1` to see what speed is calculated in the position the presenter wants to rest the foot in. Add more of that number in a sequence in the `speedMap` to flatten out the speed curve, i.e. `[1, 2, 3, 4, 4, 4, 4, 5, ...]` | -**Note:** The default values are set up to work with the _Yamaha FC7_ expression pedal, and will probably not be good for pedals with one continuous linear range from fully released to fully depressed. A suggested configuration for such pedals \(i.e. the _Mission Engineering EP-1_\) will be like: +**Note:** The default values are set up to work with the _Yamaha FC7_ expression pedal, and will probably not be good for pedals with one continuous linear range from fully released to fully depressed. A suggested configuration for such pedals \(i.e. the _Mission Engineering EP-1_\) will be like: | Query parameter | Suggestion | | :---------------- | :-------------------------------------- | @@ -147,7 +147,7 @@ This mode uses the browsers Gamapad API and polls connected Joycons for their st The Joycons can operate in 3 modes, the L-stick, the R-stick or both L+R sticks together. Reconnections and jumping between modes works, with one known limitation: **Transition from L+R to a single stick blocks all input, and requires a reconnect of the sticks you want to use.** This seems to be a bug in either the Joycons themselves or in the Gamepad API in general. -From Release 30, the parameters for the JoyCon have a prefix: **joycon\_** \(i.e. joycon\_speedMap, joycon\_reverseSpeedMap etc\) +From Release 30, the parameters for the JoyCon have a prefix: **joycon\_** \(i.e. joycon_speedMap, joycon_reverseSpeedMap etc\) | Query parameter | Type | Description | Default | | :---------------- | :--------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------- | @@ -158,9 +158,9 @@ From Release 30, the parameters for the JoyCon have a prefix: **joycon\_** \(i.e | `rangeNeutralMax` | number | The minimum input to run forward, the start of the forward-range \(min speed\). This is also the end of any "deadband" you want filter out before starting moving forwards. | `0.25` | | `rangeFwdMax` | number | The maximum input, the end of the forward-range \(max speed\) | `1` | -* `rangeNeutralMin` has to be greater than `rangeRevMin` -* `rangeNeutralMax` has to be greater than `rangeNeutralMin` -* `rangeFwdMax` has to be greater than `rangeNeutralMax` +- `rangeNeutralMin` has to be greater than `rangeRevMin` +- `rangeNeutralMax` has to be greater than `rangeNeutralMin` +- `rangeFwdMax` has to be greater than `rangeNeutralMax` ![Nintendo Swith Joycons](/img/docs/main/features/nintendo-switch-joycons.jpg) @@ -176,8 +176,6 @@ You can turn on `?debug=1` to see how your input maps to an output. | Left / Y | Go to the previous story | | Right / A | Go to the following story | - - **Calibration guide:** | **Symptom** | Adjustment | @@ -188,4 +186,3 @@ You can turn on `?debug=1` to see how your input maps to an output. | _"I can't reach max speed backwards"_ | Increase `rangeRevMin` | | _"I can't reach max speed forwards"_ | Decrease `rangeFwdMax` | | _"As I find a good speed, it varies a bit in speed up/down even if I hold my finger still"_ | Use `?debug=1` to see what speed is calculated in the position the presenter wants to rest their finger in. Add more of that number in a sequence in the `speedMap` to flatten out the speed curve, i.e. `[1, 2, 3, 4, 4, 4, 4, 5, ...]` | - diff --git a/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/_category_.json b/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/_category_.json index d4eb4cf33a..12e58396d0 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/_category_.json +++ b/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/_category_.json @@ -1,4 +1,4 @@ { - "label": "Installation", - "position": 2 -} \ No newline at end of file + "label": "Installation", + "position": 2 +} diff --git a/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/initial-sofie-core-setup.md b/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/initial-sofie-core-setup.md index 8d9a9f3e8a..a449c473a2 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/initial-sofie-core-setup.md +++ b/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/initial-sofie-core-setup.md @@ -6,15 +6,14 @@ sidebar_position: 3 #### Prerequisites -* [Installed and running _Sofie Core_](installing-sofie-server-core) +- [Installed and running _Sofie Core_](installing-sofie-server-core) Once _Sofie Core_ has been installed and is running you can begin setting it up. The first step is to navigate to the _Settings page_. Please review the [Sofie Access Level](../features/access-levels) page for assistance getting there. -To upgrade to a newer version or installation of new blueprints, Sofie needs to run its "Upgrade database" procedure to migrate data and pre-fill various settings. You can do this by clicking the _Upgrade Database_ button in the menu. +To upgrade to a newer version or installation of new blueprints, Sofie needs to run its "Upgrade database" procedure to migrate data and pre-fill various settings. You can do this by clicking the _Upgrade Database_ button in the menu. ![Update Database Section of the Settings Page](/img/docs/getting-started/settings-page-full-update-db.jpg) Fill in the form as prompted and continue by clicking _Run Migrations Procedure_. Sometimes you will need to go through multiple steps before the upgrade is finished. Next, you will need to add some [Blueprints](installing-blueprints) and add [Gateways](installing-a-gateway/intro) to allow _Sofie_ to interpret rundown data and then play out things. - diff --git a/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-a-gateway/_category_.json b/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-a-gateway/_category_.json index 7fa55d484d..e83c1db9e5 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-a-gateway/_category_.json +++ b/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-a-gateway/_category_.json @@ -1,4 +1,4 @@ { - "label": "Installing a Gateway", - "position": 5 -} \ No newline at end of file + "label": "Installing a Gateway", + "position": 5 +} diff --git a/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-a-gateway/intro.md b/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-a-gateway/intro.md index 0092282166..794e7703b9 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-a-gateway/intro.md +++ b/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-a-gateway/intro.md @@ -2,11 +2,12 @@ sidebar_label: Introduction sidebar_position: 1 --- + # Introduction: Installing a Gateway #### Prerequisites -* [Installed and running Sofie Core](../installing-sofie-server-core) +- [Installed and running Sofie Core](../installing-sofie-server-core) The _Sofie Core_ is the primary application for managing the broadcast, but it doesn't play anything out on it's own. A Gateway will establish the connection from _Sofie Core_ to other pieces of hardware or remote software. A basic setup may include the [Spreadsheet Gateway](rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support) which will ingest a rundown from Google Sheets then, use the [Playout Gateway](playout-gateway) send commands to a CasparCG Server graphics playout, an ATEM vision mixer, and / or the [Sisyfos audio controller](https://github.com/olzzon/sisyfos-audio-controller). @@ -14,12 +15,11 @@ Installing a gateway is a two part process. To begin, you will [add the required ### Rundown & Newsroom Gateways -* [Google Spreadsheet Gateway](rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support) -* [iNEWS Gateway](rundown-or-newsroom-system-connection/inews-gateway) -* [MOS Gateway](rundown-or-newsroom-system-connection/mos-gateway) +- [Google Spreadsheet Gateway](rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support) +- [iNEWS Gateway](rundown-or-newsroom-system-connection/inews-gateway) +- [MOS Gateway](rundown-or-newsroom-system-connection/mos-gateway) ### Playout & Media Manager Gateways -* [Playout Gateway](playout-gateway) -* [Media Manager](../media-manager) - +- [Playout Gateway](playout-gateway) +- [Media Manager](../media-manager) diff --git a/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-a-gateway/playout-gateway.md b/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-a-gateway/playout-gateway.md index 0fd5f47626..0d90911760 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-a-gateway/playout-gateway.md +++ b/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-a-gateway/playout-gateway.md @@ -1,6 +1,7 @@ --- sidebar_position: 3 --- + # Playout Gateway The _Playout Gateway_ handles interacting external pieces of hardware or software by sending commands that will playout rundown content. This gateway used to be a separate installation but it has since been moved into the main _Sofie Core_ component. diff --git a/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json b/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json index b4c4ffc34d..ae77b5c6a7 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json +++ b/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json @@ -1,4 +1,4 @@ { "label": "Rundown or Newsroom System Connection", "position": 4 -} \ No newline at end of file +} diff --git a/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md b/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md index 48659251a6..0d67551638 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md +++ b/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md @@ -4,9 +4,8 @@ The iNEWS Gateway communicates with an iNEWS system to ingest and remain in sync ### Installing iNEWS for Sofie -The iNEWS Gateway allows you to create rundowns from within iNEWS and sync them with the _Sofie Core_. The rundowns will update in real time and any changes made will be seen from within your Playout Timeline. +The iNEWS Gateway allows you to create rundowns from within iNEWS and sync them with the _Sofie Core_. The rundowns will update in real time and any changes made will be seen from within your Playout Timeline. The setup for the iNEWS Gateway is already in the Docker Compose file you downloaded earlier. Remove the _\#_ symbol from the start of the line labeled `image: tv2/inews-ftp-gateway:develop` and add a _\#_ to the other ingest gateway that was being used. Although the iNEWS Gateway is available free of charge, an iNEWS license is not. Visit [Avid's website](https://www.avid.com/products/inews/how-to-buy) to find an iNEWS reseller that handles your geographic area. - diff --git a/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md b/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md index cf2c62a508..dcdc7db5b6 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md +++ b/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md @@ -2,13 +2,10 @@ Sofie Core doesn't talk directly to the newsroom systems, but instead via one of the Gateways. -The Google Spreadsheet Gateway, iNEWS Gateway, and the MOS \( [Media Object Server Communications Protocol](http://mosprotocol.com/) \) Gateway which can handle interacting with any system that communicates via MOS. +The Google Spreadsheet Gateway, iNEWS Gateway, and the MOS \( [Media Object Server Communications Protocol](http://mosprotocol.com/) \) Gateway which can handle interacting with any system that communicates via MOS. ### Further Reading -* [MOS Protocol Overview & Documentation](http://mosprotocol.com/) -* [iNEWS on Avid's Website](https://www.avid.com/products/inews/how-to-buy) -* [ENPS on The Associated Press' Website](https://www.ap.org/enps/support) - - - +- [MOS Protocol Overview & Documentation](http://mosprotocol.com/) +- [iNEWS on Avid's Website](https://www.avid.com/products/inews/how-to-buy) +- [ENPS on The Associated Press' Website](https://www.ap.org/enps/support) diff --git a/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md b/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md index b1eff262fe..81f0e0fc81 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md +++ b/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md @@ -5,5 +5,3 @@ The MOS Gateway communicates with a device that supports the [MOS protocol](http The setup for the MOS Gateway is handled in the Docker Compose in the [Quick Install](../../installing-sofie-server-core) page. One thing to note if managing the mos-gateway manually: It needs a few ports open \(10540, 10541\) for MOS-messages to be pushed to it from the NCS. - - diff --git a/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-connections-and-additional-hardware/README.md b/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-connections-and-additional-hardware/README.md index 92826611ec..8d7990f460 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-connections-and-additional-hardware/README.md +++ b/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-connections-and-additional-hardware/README.md @@ -2,34 +2,40 @@ #### Prerequisites -* [Installed and running Sofie Core](../installing-sofie-server-core) -* [Installed Playout Gateway](../installing-a-gateway/playout-gateway) -* [Installed and configured Studio Blueprints](../installing-blueprints#installing-a-studio-blueprint) +- [Installed and running Sofie Core](../installing-sofie-server-core) +- [Installed Playout Gateway](../installing-a-gateway/playout-gateway) +- [Installed and configured Studio Blueprints](../installing-blueprints#installing-a-studio-blueprint) The following pages are broken up by equipment type that is supported by Sofie's Gateways. ## Playout & Recording -* [CasparCG Graphics and Video Server](casparcg-server-installation) - _Graphics / Playout / Recording_ -* [Blackmagic Design's HyperDeck](https://www.blackmagicdesign.com/products/hyperdeckstudio) - _Recording_ -* [Quantel](http://www.quantel.com) Solutions - _Playout_ -* [Vizrt](https://www.vizrt.com/) Graphics Solutions - _Graphics / Playout_ + +- [CasparCG Graphics and Video Server](casparcg-server-installation) - _Graphics / Playout / Recording_ +- [Blackmagic Design's HyperDeck](https://www.blackmagicdesign.com/products/hyperdeckstudio) - _Recording_ +- [Quantel](http://www.quantel.com) Solutions - _Playout_ +- [Vizrt](https://www.vizrt.com/) Graphics Solutions - _Graphics / Playout_ ## Vision Mixers -* [Blackmagic's ATEM](https://www.blackmagicdesign.com/products/atem) hardware vision mixers -* [vMix](https://www.vmix.com/) software vision mixer \(coming soon\) + +- [Blackmagic's ATEM](https://www.blackmagicdesign.com/products/atem) hardware vision mixers +- [vMix](https://www.vmix.com/) software vision mixer \(coming soon\) ## Audio Mixers -* [Sisyfos](https://github.com/olzzon/sisyfos-audio-controller) audio controller -* [Lawo sound mixers_,_](https://www.lawo.com/applications/broadcast-production/audio-consoles.html) _using emberplus protocol_ -* Generic OSC \(open sound control\) + +- [Sisyfos](https://github.com/olzzon/sisyfos-audio-controller) audio controller +- [Lawo sound mixers*,*](https://www.lawo.com/applications/broadcast-production/audio-consoles.html) _using emberplus protocol_ +- Generic OSC \(open sound control\) ## PTZ Cameras -* [Panasonic PTZ](https://pro-av.panasonic.net/en/products/ptz_camera_systems.html) cameras + +- [Panasonic PTZ](https://pro-av.panasonic.net/en/products/ptz_camera_systems.html) cameras ## Lights -* [Pharos](https://www.pharoscontrols.com/) light control + +- [Pharos](https://www.pharoscontrols.com/) light control ## Other -* Generic OSC \(open sound control\) -* Generic HTTP requests \(to control http-REST interfaces\) -* Generic TCP-socket + +- Generic OSC \(open sound control\) +- Generic HTTP requests \(to control http-REST interfaces\) +- Generic TCP-socket diff --git a/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-connections-and-additional-hardware/_category_.json b/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-connections-and-additional-hardware/_category_.json index d3e1e8979e..4d800e9a88 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-connections-and-additional-hardware/_category_.json +++ b/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-connections-and-additional-hardware/_category_.json @@ -1,4 +1,4 @@ { - "label": "Installing Connections and Additional Hardware", - "position": 6 -} \ No newline at end of file + "label": "Installing Connections and Additional Hardware", + "position": 6 +} diff --git a/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md b/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md index 7ce94888eb..a1a1514bdc 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md +++ b/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md @@ -1,6 +1,6 @@ # Configuring Vision Mixers -## ATEM – Blackmagic Design +## ATEM – Blackmagic Design The [Playout Gateway](../installing-a-gateway/playout-gateway) supports communicating with the entire line up of Blackmagic Design's ATEM vision mixers. @@ -11,4 +11,3 @@ Once your ATEM is properly configured on the network, you can add it as a device ### Additional Information Sofie does not support connecting to a vision mixer hardware panels. All interacts with the vision mixers must be handled within a Rundown. - diff --git a/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/intro.md b/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/intro.md index e2f13307dd..e63bd18c4f 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/intro.md +++ b/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/intro.md @@ -1,37 +1,35 @@ --- sidebar_position: 1 --- + # Getting Started _Sofie_ can be installed in many different ways, depending on which platforms, needs, and features you desire. The _Sofie_ system consists of several applications that work together to provide complete broadcast automation system. Each of these components' installation will be covered in this guide. Additional information about the products or services mentioned alongside the Sofie Installation can be found on the [Further Reading](../further-reading). There are four minimum required components to get a Sofie system up and running. First you need the [_Sofie Core_](installing-sofie-server-core), which is the brains of the operation. Then a set of [_Blueprints_](installing-blueprints) to handle and interpret incoming and outgoing data. Next, an [_Ingest Gateway_](installing-a-gateway/rundown-or-newsroom-system-connection/intro) to fetch the data for the Blueprints. Then finally, a [_Playout Gateway_](installing-a-gateway/playout-gateway) to send the data to your playout device of choice. - - ## Sofie Core View -The _Rundowns_ view will display all the active rundowns that the _Sofie Core_ has access to. +The _Rundowns_ view will display all the active rundowns that the _Sofie Core_ has access to. ![Rundown View](/img/docs/getting-started/rundowns-in-sofie.png) The _Status_ views displays the current status for the attached devices and gateways. -![Status View – Describes the state of _Sofie Core_](/img/docs/getting-started/status-page.jpg) +![Status View – Describes the state of _Sofie Core_](/img/docs/getting-started/status-page.jpg) -The _Settings_ views contains various settings for the studio, show styles, blueprints etc.. If the link to the settings view is not visible in your application, check your [Access Levels](../features/access-levels). More info on specific parts of the _Settings_ view can be found in their corresponding guide sections. +The _Settings_ views contains various settings for the studio, show styles, blueprints etc.. If the link to the settings view is not visible in your application, check your [Access Levels](../features/access-levels). More info on specific parts of the _Settings_ view can be found in their corresponding guide sections. -![Settings View – Describes how the _Sofie Core_ is configured](/img/docs/getting-started/settings-page.jpg) +![Settings View – Describes how the _Sofie Core_ is configured](/img/docs/getting-started/settings-page.jpg) ## Sofie Core Overview -The _Sofie Core_ is the primary application for managing the broadcast but, it doesn't play anything out on it's own. You need to use Gateways to establish the connection from the _Sofie Core_ to other pieces of hardware or remote software. +The _Sofie Core_ is the primary application for managing the broadcast but, it doesn't play anything out on it's own. You need to use Gateways to establish the connection from the _Sofie Core_ to other pieces of hardware or remote software. ### Gateways -Gateways are separate applications that bridge the gap between the _Sofie Core_ and other pieces of hardware or services. At minimum, you will need a _Playout Gateway_ so your timeline can interact with your playout system of choice. To install the _Playout Gateway_, visit the [Installing a Gateway](installing-a-gateway/intro) section of this guide and for a more in-depth look, please see [Gateways](../concepts-and-architecture#gateways). +Gateways are separate applications that bridge the gap between the _Sofie Core_ and other pieces of hardware or services. At minimum, you will need a _Playout Gateway_ so your timeline can interact with your playout system of choice. To install the _Playout Gateway_, visit the [Installing a Gateway](installing-a-gateway/intro) section of this guide and for a more in-depth look, please see [Gateways](../concepts-and-architecture#gateways). ### Blueprints Blueprints can be described as the logic that determines how a studio and show should interact with one another. They interpret the data coming in from the rundowns and transform them into a rich set of playable elements \(_Segments_, _Parts_, _AdLibs,_ etcetera\). The _Sofie Core_ has three main blueprint types, _System Blueprints_, _Studio Blueprints_, and _Showstyle Blueprints_. Installing _Sofie_ does not require you understand what these blueprints do, just that they are required for the _Sofie Core_ to work. If you would like to gain a deeper understand of how _Blueprints_ work, please visit the [Blueprints](#blueprints) section. - diff --git a/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/media-manager.md b/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/media-manager.md index 7697dfe00f..614fe4d560 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/media-manager.md +++ b/packages/documentation/versioned_docs/version-1.38.0/user-guide/installation/media-manager.md @@ -1,11 +1,10 @@ # Media Manager -The Media Manager handles the media, or files, that make up the rundown content. To install it, begin by downloading the latest release of [Media Manager from GitHub](https://github.com/nrkno/sofie-media-management/releases). You can now run the `media-manager.exe` file inside the extracted folder. A warning window may popup about the app being unrecognized. You can get around this by selecting _More Info_ and clicking _Run Anyways_. A terminal window will open and begin running the application. +The Media Manager handles the media, or files, that make up the rundown content. To install it, begin by downloading the latest release of [Media Manager from GitHub](https://github.com/nrkno/sofie-media-management/releases). You can now run the `media-manager.exe` file inside the extracted folder. A warning window may popup about the app being unrecognized. You can get around this by selecting _More Info_ and clicking _Run Anyways_. A terminal window will open and begin running the application. -You can now open the _Sofie Core_, `http://localhost:3000`, and navigate to the _Settings page_. You will see your _Media Manager_ under the _Devices_ section of the menu. The four main sections, general properties, attached storage, media flows, monitors, as well as attached subdivides, all contribute to how the media is handled within the Sofie Core. +You can now open the _Sofie Core_, `http://localhost:3000`, and navigate to the _Settings page_. You will see your _Media Manager_ under the _Devices_ section of the menu. The four main sections, general properties, attached storage, media flows, monitors, as well as attached subdivides, all contribute to how the media is handled within the Sofie Core. ### Further Reading -* [Media Manager Releases on GitHub](https://github.com/nrkno/sofie-media-management/releases) -* [Media Manager GitHub Page for Developers](https://github.com/nrkno/sofie-media-management) - +- [Media Manager Releases on GitHub](https://github.com/nrkno/sofie-media-management/releases) +- [Media Manager GitHub Page for Developers](https://github.com/nrkno/sofie-media-management) diff --git a/packages/documentation/versioned_docs/version-1.38.0/user-guide/supported-devices.md b/packages/documentation/versioned_docs/version-1.38.0/user-guide/supported-devices.md index c0bce866ea..fc6fcfb30c 100644 --- a/packages/documentation/versioned_docs/version-1.38.0/user-guide/supported-devices.md +++ b/packages/documentation/versioned_docs/version-1.38.0/user-guide/supported-devices.md @@ -1,6 +1,7 @@ --- sidebar_position: 4 --- + # Supported Playout Devices All playout devices are essentially driven through the _timeline_, which passes through _Sofie Core_ into the Playout Gateway where it is processed by the timeline-state-resolver. This page details which devices and what parts of the devices can be controlled through the timeline-state-resolver library. In general a blueprints developer can use the [timeline-state-resolver-types package](https://www.npmjs.com/package/timeline-state-resolver-types) to see the interfaces for the timeline objects used to control the devices. @@ -9,99 +10,98 @@ All playout devices are essentially driven through the _timeline_, which passes We support almost all features of these devices except fairlight audio, camera controls and streaming capabilities. A non-inclusive list: -* Control of camera inputs -* Transitions -* Full control of keyers -* Full control of DVE's -* Control of media pools -* Control of auxilliaries +- Control of camera inputs +- Transitions +- Full control of keyers +- Full control of DVE's +- Control of media pools +- Control of auxilliaries ## CasparCG Server Tested and developed against [a fork of version 2.1](https://github.com/nrkno/sofie-casparcg-server) with more support for version 2.3 being added in the future. -* Video playback -* Graphics playback -* Recording / streaming -* Mixer parameters -* Transitions +- Video playback +- Graphics playback +- Recording / streaming +- Mixer parameters +- Transitions ## HTTP Protocol -* Get/post/put/delete methods -* Interval based watcher for status monitoring +- Get/post/put/delete methods +- Interval based watcher for status monitoring ## Blackmagic Design HyperDeck -* Recording +- Recording ## Lawo Powercore & MC2 Series -* Control over faders - * Using the ramp function on the powercore -* Control of parameters in the ember tree +- Control over faders + - Using the ramp function on the powercore +- Control of parameters in the ember tree ## OSC protocol -* Sending of integers, floats, strings, blobs -* Tweening \(transitioning between\) values +- Sending of integers, floats, strings, blobs +- Tweening \(transitioning between\) values Can be configured in TCP or UDP mode. ## Panasonic PTZ Cameras -* Recalling presets -* Setting zoom, zoom speed and recall speed +- Recalling presets +- Setting zoom, zoom speed and recall speed ## Pharos Lighting Control -* Recalling scenes -* Recalling timelines +- Recalling scenes +- Recalling timelines ## Grass Valley SQ Media Servers -* Control of playback -* Looping -* Cloning +- Control of playback +- Looping +- Cloning _Note: some features are controlled through the media-manager_ ## Shotoku Camera Robotics -* Cutting to shots -* Fading to shots +- Cutting to shots +- Fading to shots ## Singular Live -* Control nodes +- Control nodes _Note: this is not currently used in production by anyone we know of_ ## Sisyfos -* On-air controls -* Fader levels -* Labels -* Hide / show channels +- On-air controls +- Fader levels +- Labels +- Hide / show channels ## TCP Protocol -* Sending messages +- Sending messages ## VizRT Viz MSE -* Pilot elements -* Continue commands -* Loading all elements -* Clearing all elements +- Pilot elements +- Continue commands +- Loading all elements +- Clearing all elements ## vMix -* Full M/E control -* Audio control -* Streaming / recording control -* Fade to black -* Overlays -* Transforms -* Transitions - +- Full M/E control +- Audio control +- Streaming / recording control +- Fade to black +- Overlays +- Transforms +- Transitions diff --git a/packages/documentation/versioned_docs/version-1.41.0/about-sofie.md b/packages/documentation/versioned_docs/version-1.41.0/about-sofie.md index 363475f108..0c022bcb7e 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/about-sofie.md +++ b/packages/documentation/versioned_docs/version-1.41.0/about-sofie.md @@ -19,4 +19,4 @@ _**Sofie**_ is a web-based TV automation system for studios and live shows, used - Modular data-ingest architecture, supports MOS and Google spreadsheets - Plug-in architecture for programming shows -_The NRK logo is a registered trademark of Norsk rikskringkasting AS. The license does not grant any right to use, in any way, any trademarks, service marks or logos of Norsk rikskringkasting AS._ \ No newline at end of file +_The NRK logo is a registered trademark of Norsk rikskringkasting AS. The license does not grant any right to use, in any way, any trademarks, service marks or logos of Norsk rikskringkasting AS._ diff --git a/packages/documentation/versioned_docs/version-1.41.0/for-developers/for-blueprint-developers/_category_.json b/packages/documentation/versioned_docs/version-1.41.0/for-developers/for-blueprint-developers/_category_.json index c4c3c8c242..b4dd4fcee1 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/for-developers/for-blueprint-developers/_category_.json +++ b/packages/documentation/versioned_docs/version-1.41.0/for-developers/for-blueprint-developers/_category_.json @@ -1,4 +1,4 @@ { - "label": "For Blueprint Developers", - "position": 4 -} \ No newline at end of file + "label": "For Blueprint Developers", + "position": 4 +} diff --git a/packages/documentation/versioned_docs/version-1.41.0/for-developers/for-blueprint-developers/intro.md b/packages/documentation/versioned_docs/version-1.41.0/for-developers/for-blueprint-developers/intro.md index 4fec84373c..645d79c9c8 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/for-developers/for-blueprint-developers/intro.md +++ b/packages/documentation/versioned_docs/version-1.41.0/for-developers/for-blueprint-developers/intro.md @@ -11,6 +11,6 @@ Technically, a Blueprint is a JavaScript object, implementing one of the `Bluepr Currently, there are three types of Blueprints: -* [Show Style Blueprints](https://nrkno.github.io/sofie-core/typedoc/interfaces/_sofie_automation_blueprints_integration.ShowStyleBlueprintManifest.html) - handling converting NRCS Rundown data into Sofie Rundowns and content. -* [Studio Blueprints](https://nrkno.github.io/sofie-core/typedoc/interfaces/_sofie_automation_blueprints_integration.StudioBlueprintManifest.html) - handling selecting ShowStyles for a given NRCS Rundown and assigning NRCS Rundowns to Sofie Playlists -* [System Blueprints](https://nrkno.github.io/sofie-core/typedoc/interfaces/_sofie_automation_blueprints_integration.SystemBlueprintManifest.html) - handling system provisioning and global configuration \ No newline at end of file +- [Show Style Blueprints](https://nrkno.github.io/sofie-core/typedoc/interfaces/_sofie_automation_blueprints_integration.ShowStyleBlueprintManifest.html) - handling converting NRCS Rundown data into Sofie Rundowns and content. +- [Studio Blueprints](https://nrkno.github.io/sofie-core/typedoc/interfaces/_sofie_automation_blueprints_integration.StudioBlueprintManifest.html) - handling selecting ShowStyles for a given NRCS Rundown and assigning NRCS Rundowns to Sofie Playlists +- [System Blueprints](https://nrkno.github.io/sofie-core/typedoc/interfaces/_sofie_automation_blueprints_integration.SystemBlueprintManifest.html) - handling system provisioning and global configuration diff --git a/packages/documentation/versioned_docs/version-1.41.0/for-developers/intro.md b/packages/documentation/versioned_docs/version-1.41.0/for-developers/intro.md index 1e96298172..a2ffce4f7e 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/for-developers/intro.md +++ b/packages/documentation/versioned_docs/version-1.41.0/for-developers/intro.md @@ -9,7 +9,7 @@ The pages below are intended for developers of any of the Sofie-related repos an A read-through of the [Concepts & Architectures](../user-guide/concepts-and-architecture) is recommended, before diving too deep into development. -* [Libraries](libraries) -* [Contribution Guidelines](contribution-guidelines) -* [For Blueprint Developers](for-blueprint-developers) -* [API Documentation](api-documentation) +- [Libraries](libraries) +- [Contribution Guidelines](contribution-guidelines) +- [For Blueprint Developers](for-blueprint-developers) +- [API Documentation](api-documentation) diff --git a/packages/documentation/versioned_docs/version-1.41.0/for-developers/libraries.md b/packages/documentation/versioned_docs/version-1.41.0/for-developers/libraries.md index 815f52f020..e6e8b61a23 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/for-developers/libraries.md +++ b/packages/documentation/versioned_docs/version-1.41.0/for-developers/libraries.md @@ -13,48 +13,42 @@ sidebar_position: 5 Together with the _Sofie Core_ there are several _gateways_ which are separate applications, but which connect to _Sofie Core_ and are managed from within the Core's web UI. -* [**Playout Gateway**](https://github.com/nrkno/sofie-core/tree/master/packages/playout-gateway) Handles the playout from _Sofie_. Connects to and controls a multitude of devices, such as vision mixers, graphics, light controllers, audio mixers etc.. -* [**MOS Gateway**](https://github.com/nrkno/sofie-core/tree/master/packages/mos-gateway) Connects _Sofie_ to a newsroom system \(NRCS\) and ingests rundowns via the [MOS protocol](http://mosprotocol.com/). -* [**iNEWS Gateway**](https://github.com/tv2/inews-ftp-gateway) Connects _Sofie_ to an Avid iNEWS newsroom system. -* [**Quantel Gateway**](https://github.com/nrkno/sofie-quantel-gateway) CORBA to REST gateway for _Quantel/ISA_ playback. -* [**Spreadsheet Gateway**](https://github.com/SuperFlyTV/spreadsheet-gateway) Connects _Sofie_ to a _Google Drive_ folder and ingests rundowns from _Google Sheets_. -* [**Input Gateway**](https://github.com/nrkno/sofie-input-gateway) - +- [**Playout Gateway**](https://github.com/nrkno/sofie-core/tree/master/packages/playout-gateway) Handles the playout from _Sofie_. Connects to and controls a multitude of devices, such as vision mixers, graphics, light controllers, audio mixers etc.. +- [**MOS Gateway**](https://github.com/nrkno/sofie-core/tree/master/packages/mos-gateway) Connects _Sofie_ to a newsroom system \(NRCS\) and ingests rundowns via the [MOS protocol](http://mosprotocol.com/). +- [**iNEWS Gateway**](https://github.com/tv2/inews-ftp-gateway) Connects _Sofie_ to an Avid iNEWS newsroom system. +- [**Quantel Gateway**](https://github.com/nrkno/sofie-quantel-gateway) CORBA to REST gateway for _Quantel/ISA_ playback. +- [**Spreadsheet Gateway**](https://github.com/SuperFlyTV/spreadsheet-gateway) Connects _Sofie_ to a _Google Drive_ folder and ingests rundowns from _Google Sheets_. +- [**Input Gateway**](https://github.com/nrkno/sofie-input-gateway) ## Libraries There are a number of libraries used in the Sofie ecosystem: -* [**ATEM Connection**](https://github.com/nrkno/sofie-atem-connection) Library for communicating with Blackmagic Design's ATEM mixers -* [**ATEM State**](https://github.com/nrkno/sofie-atem-state) Used in TSR to tracks the state of ATEMs and generate commands to control them. -* [**CasparCG Server Connection**](https://github.com/SuperFlyTV/casparcg-connection) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Library to connect and interact with CasparCG Servers. -* [**CasparCG State**](https://github.com/superflytv/casparcg-state) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Used in TSR to tracks the state of CasparCG Servers and generate commands to control them. -* [**Ember+ Connection**](https://github.com/nrkno/sofie-emberplus-connection) Library to communicate with _Ember+_ control protocol -* [**HyperDeck Connection**](https://github.com/nrkno/sofie-hyperdeck-connection) Library for connecting to Blackmagic Design's HyperDeck recorders. -* [**MOS Connection**](https://github.com/nrkno/sofie-mos-connection/) A [_MOS protocol_](http://mosprotocol.com/) library for acting as a MOS device and connecting to an newsroom control system. -* [**Quantel Gateway Client**](https://github.com/nrkno/sofie-quantel-gateway-client) An interface that talks to the Quantel-Gateway application. -* [**Sofie Core Integration**](https://github.com/nrkno/sofie-core-integration) Used to connect to the [Sofie Core](https://github.com/nrkno/sofie-core) by the Gateways. -* [**Sofie Blueprints Integration**](https://github.com/nrkno/sofie-sofie-blueprints-integration) Common types and interfaces used by both Sofie Core and the user-defined blueprints. -* [**SuperFly-Timeline**](https://github.com/SuperFlyTV/supertimeline) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Resolver and rules for placing objects on a virtual timeline. -* [**ThreadedClass**](https://github.com/nytamin/threadedClass) developed by **[_Nytamin_](https://github.com/nytamin)** Used in TSR to spawn device controllers in separate processes. -* [**Timeline State Resolver**](https://github.com/nrkno/sofie-timeline-state-resolver) \(TSR\) The main driver in **Playout Gateway,** handles connections to playout-devices and sends commands based on a **Timeline** received from **Core**. - - +- [**ATEM Connection**](https://github.com/nrkno/sofie-atem-connection) Library for communicating with Blackmagic Design's ATEM mixers +- [**ATEM State**](https://github.com/nrkno/sofie-atem-state) Used in TSR to tracks the state of ATEMs and generate commands to control them. +- [**CasparCG Server Connection**](https://github.com/SuperFlyTV/casparcg-connection) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Library to connect and interact with CasparCG Servers. +- [**CasparCG State**](https://github.com/superflytv/casparcg-state) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Used in TSR to tracks the state of CasparCG Servers and generate commands to control them. +- [**Ember+ Connection**](https://github.com/nrkno/sofie-emberplus-connection) Library to communicate with _Ember+_ control protocol +- [**HyperDeck Connection**](https://github.com/nrkno/sofie-hyperdeck-connection) Library for connecting to Blackmagic Design's HyperDeck recorders. +- [**MOS Connection**](https://github.com/nrkno/sofie-mos-connection/) A [_MOS protocol_](http://mosprotocol.com/) library for acting as a MOS device and connecting to an newsroom control system. +- [**Quantel Gateway Client**](https://github.com/nrkno/sofie-quantel-gateway-client) An interface that talks to the Quantel-Gateway application. +- [**Sofie Core Integration**](https://github.com/nrkno/sofie-core-integration) Used to connect to the [Sofie Core](https://github.com/nrkno/sofie-core) by the Gateways. +- [**Sofie Blueprints Integration**](https://github.com/nrkno/sofie-sofie-blueprints-integration) Common types and interfaces used by both Sofie Core and the user-defined blueprints. +- [**SuperFly-Timeline**](https://github.com/SuperFlyTV/supertimeline) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Resolver and rules for placing objects on a virtual timeline. +- [**ThreadedClass**](https://github.com/nytamin/threadedClass) developed by **[_Nytamin_](https://github.com/nytamin)** Used in TSR to spawn device controllers in separate processes. +- [**Timeline State Resolver**](https://github.com/nrkno/sofie-timeline-state-resolver) \(TSR\) The main driver in **Playout Gateway,** handles connections to playout-devices and sends commands based on a **Timeline** received from **Core**. There are also a few typings-only libraries that define interfaces between applications: -* [**Blueprints Integration**](https://www.npmjs.com/package/@sofie-automation/blueprints-integration) Defines the interface between [**Blueprints**](../user-guide/concepts-and-architecture#blueprints) and **Sofie Core**. -* [**Timeline State Resolver types**](https://www.npmjs.com/package/timeline-state-resolver-types) Defines the interface between [**Blueprints**](../user-guide/concepts-and-architecture#blueprints) and the timeline that will be fed into **TSR** for playout. +- [**Blueprints Integration**](https://www.npmjs.com/package/@sofie-automation/blueprints-integration) Defines the interface between [**Blueprints**](../user-guide/concepts-and-architecture#blueprints) and **Sofie Core**. +- [**Timeline State Resolver types**](https://www.npmjs.com/package/timeline-state-resolver-types) Defines the interface between [**Blueprints**](../user-guide/concepts-and-architecture#blueprints) and the timeline that will be fed into **TSR** for playout. ## Other Sofie-related Repositories -* [**CasparCG Server** \(NRK fork\)](https://github.com/nrkno/sofie-casparcg-server) Sofie-specific fork of CasparCG Server. -* [**CasparCG Launcher**](https://github.com/nrkno/sofie-casparcg-launcher) Launcher, controller, and logger for CasparCG Server. -* [**CasparCG Media Scanner** \(NRK fork\)](https://github.com/nrkno/sofie-casparcg-server) Sofie-specific fork of CasparCG Server 2.2 Media Scanner. -* [**Package Manager**](https://github.com/nrkno/sofie-package-manager) Handles media asset transfer and media file management for pulling new files and deleting expired files on playout devices in a more performant, and possibly distributed, way. Can smartly figure out how to get a file on storage A to playout server B. -* [**Media Manager**](https://github.com/nrkno/sofie-media-management) *(deprecated)* Handles media transfer and media file management for pulling new files and deleting expired files on playout devices. -* [**Quantel Browser Plugin**](https://github.com/nrkno/sofie-quantel-browser-plugin) MOS-compatible Quantel video clip browser for use with Sofie. -* [**Sisyfos Audio Controller**](https://github.com/nrkno/sofie-sisyfos-audio-controller) *developed by [_olzzon_](https://github.com/olzzon/)* - - - +- [**CasparCG Server** \(NRK fork\)](https://github.com/nrkno/sofie-casparcg-server) Sofie-specific fork of CasparCG Server. +- [**CasparCG Launcher**](https://github.com/nrkno/sofie-casparcg-launcher) Launcher, controller, and logger for CasparCG Server. +- [**CasparCG Media Scanner** \(NRK fork\)](https://github.com/nrkno/sofie-casparcg-server) Sofie-specific fork of CasparCG Server 2.2 Media Scanner. +- [**Package Manager**](https://github.com/nrkno/sofie-package-manager) Handles media asset transfer and media file management for pulling new files and deleting expired files on playout devices in a more performant, and possibly distributed, way. Can smartly figure out how to get a file on storage A to playout server B. +- [**Media Manager**](https://github.com/nrkno/sofie-media-management) _(deprecated)_ Handles media transfer and media file management for pulling new files and deleting expired files on playout devices. +- [**Quantel Browser Plugin**](https://github.com/nrkno/sofie-quantel-browser-plugin) MOS-compatible Quantel video clip browser for use with Sofie. +- [**Sisyfos Audio Controller**](https://github.com/nrkno/sofie-sisyfos-audio-controller) _developed by [*olzzon*](https://github.com/olzzon/)_ diff --git a/packages/documentation/versioned_docs/version-1.41.0/user-guide/concepts-and-architecture.md b/packages/documentation/versioned_docs/version-1.41.0/user-guide/concepts-and-architecture.md index 03bda7f8f6..7805e81c3e 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/user-guide/concepts-and-architecture.md +++ b/packages/documentation/versioned_docs/version-1.41.0/user-guide/concepts-and-architecture.md @@ -11,7 +11,7 @@ sidebar_position: 1 ### Sofie Core **Sofie Core** is a web server which handle business logic and serves the web GUI. -It is a [NodeJS](https://nodejs.org/) process backed up by a [MongoDB](https://www.mongodb.com/) database and based on the framework [Meteor](http://meteor.com/). +It is a [NodeJS](https://nodejs.org/) process backed up by a [MongoDB](https://www.mongodb.com/) database and based on the framework [Meteor](http://meteor.com/). ### Gateways @@ -87,8 +87,6 @@ An AdLib isn't added to the Part in the GUI until it starts playing, instead you Being a web-based system, Sofie has a number of customisable, user-facing web [views](features/sofie-views) used for control and monitoring. - - ## Blueprints Blueprints are plug-ins that run in Sofie Core. They interpret the data coming in from the rundowns and transform them into a rich set of playable elements \(Segments, Parts, AdLibs etc\). @@ -134,7 +132,7 @@ The [Playout Gateway](../for-developers/libraries) picks up the timeline from So The Sofie system is made to work with a modern web- and IT-based approach in mind. Therefore, the Sofie Core can be run either on-site, or in an off-site cloud. -![Sofie Core can run in the cloud](/img/docs/main/features/sofie-web-architecture.png) +![Sofie Core can run in the cloud](/img/docs/main/features/sofie-web-architecture.png) One drawback of running in a cloud over the public internet is the - sometimes unpredictable - latency. The Timeline overcomes this by moving all the immediate control of the playout devices to the Playout Gateway, which is intended to run on a local network, close to the hardware it controls. This also gives the system a simple way of load-balancing - since the number of web-clients or load on Sofie Core won't affect the playout. diff --git a/packages/documentation/versioned_docs/version-1.41.0/user-guide/configuration/_category_.json b/packages/documentation/versioned_docs/version-1.41.0/user-guide/configuration/_category_.json index 52c3367a90..fb14c17378 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/user-guide/configuration/_category_.json +++ b/packages/documentation/versioned_docs/version-1.41.0/user-guide/configuration/_category_.json @@ -1,4 +1,4 @@ { - "label": "Configuration", - "position": 2 -} \ No newline at end of file + "label": "Configuration", + "position": 2 +} diff --git a/packages/documentation/versioned_docs/version-1.41.0/user-guide/configuration/settings-view.md b/packages/documentation/versioned_docs/version-1.41.0/user-guide/configuration/settings-view.md index cff7f79e38..36aba3af2c 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/user-guide/configuration/settings-view.md +++ b/packages/documentation/versioned_docs/version-1.41.0/user-guide/configuration/settings-view.md @@ -1,6 +1,7 @@ --- sidebar_position: 2 --- + # Settings View :::caution @@ -22,9 +23,9 @@ Documentation for this section is yet to be written. A _Studio_ in Sofie-terms is a physical location, with a specific set of devices and equipment. Only one show can be on air in a studio at the same time. The _studio_ settings are settings for that specific studio, and contains settings related to hardware and playout, such as: -* **Attached devices** - the Gateways related to this studio -* **Blueprint configuration** - custom config option defined by the blueprints -* **Layer Mappings** - Maps the logical _timeline layers_ to physical devices and outputs +- **Attached devices** - the Gateways related to this studio +- **Blueprint configuration** - custom config option defined by the blueprints +- **Layer Mappings** - Maps the logical _timeline layers_ to physical devices and outputs The Studio uses a studio-blueprint, which handles things like mapping up an incoming rundown to a Showstyle. @@ -52,9 +53,9 @@ In order to allow the Producer to reconfigure the automation from the Switchboar A Route Set is essentially a distinct set of Layer Mappings, which can modify the settings already configured by the Layer Mappings, but can be turned On and Off. Called Routes, these can change: -* the Layer ID to a new Layer ID -* change the Device being controlled by the Layer -* change the aspect of the Device that's being controlled. +- the Layer ID to a new Layer ID +- change the Device being controlled by the Layer +- change the aspect of the Device that's being controlled. Route Sets can be grouped into Exclusivity Groups, in which only a single Route Set can be enabled at a time. When activating a Route Set within an Exclusivity Group, all other Route Sets in that group will be deactivated. This in turn, allows the System Administrator to create entire sections of exclusive automation control within the Studio that the Producer can then switch between. One such example could be switching between Primary and Backup playout servers, or switching between Primary and Backup talent microphone. @@ -83,10 +84,10 @@ Route Sets can also be configured with a _Default State_. This can be used to co A _Showstyle_ is related to the looks and logic of a _show_, which in contrast to the _studio_ is not directly related to the hardware. The Showstyle contains settings like -* **Source Layers** - Groups different types of content in the GUI -* **Output Channels** - Indicates different output targets \(such as the _Program_ or _back-screen in the studio_\) -* **Action Triggers** - Select how actions can be started on a per-show basis, outside of the on-screen controls -* **Blueprint configuration** - custom config option defined by the blueprints +- **Source Layers** - Groups different types of content in the GUI +- **Output Channels** - Indicates different output targets \(such as the _Program_ or _back-screen in the studio_\) +- **Action Triggers** - Select how actions can be started on a per-show basis, outside of the on-screen controls +- **Blueprint configuration** - custom config option defined by the blueprints :::caution Please note the difference between _Source Layers_ and _timeline-layers_: @@ -96,12 +97,12 @@ Please note the difference between _Source Layers_ and _timeline-layers_: [Timeline-objects](../concepts-and-architecture#timeline-object) \(inside of the [Pieces](../concepts-and-architecture#piece)\) are put onto timeline-layers, which are \(through the Mappings in the studio\) mapped to physical devices and outputs. The exact timeline-layer is never exposed to the user, but instead used on the technical level to control playout. -An example of the difference could be when playing a VT \(that's a Source Layer\), which could involve all of the timeline-layers _video\_player0_, _audio\_fader\_video_, _audio\_fader\_host_ and _mixer\_pgm._ +An example of the difference could be when playing a VT \(that's a Source Layer\), which could involve all of the timeline-layers _video_player0_, _audio_fader_video_, _audio_fader_host_ and _mixer_pgm._ ::: ### Action Triggers -This is a way to set up how - outside of the Point-and-Click Graphical User Interface - actions can be performed in the User Interface. Commonly, these are the *hotkey combinations* that can be used to either trigger AdLib content or other actions in the larger system. This is done by creating sets of Triggers and Actions to be triggered by them. These pairs can be set at the Show Style level or at the _Sofie Core_ (System) level, for common actions such as doing a Take or activating a Rundown, where you want a shared method of operation. _Sofie Core_ migrations will set up a base set of basic, system-wide Action Triggers for interacting with rundowns, but they can be changed by the System blueprint. +This is a way to set up how - outside of the Point-and-Click Graphical User Interface - actions can be performed in the User Interface. Commonly, these are the _hotkey combinations_ that can be used to either trigger AdLib content or other actions in the larger system. This is done by creating sets of Triggers and Actions to be triggered by them. These pairs can be set at the Show Style level or at the _Sofie Core_ (System) level, for common actions such as doing a Take or activating a Rundown, where you want a shared method of operation. _Sofie Core_ migrations will set up a base set of basic, system-wide Action Triggers for interacting with rundowns, but they can be changed by the System blueprint. ![Action triggers define modes of interacting with a Rundown](/img/docs/main/features/action_triggers_3.png) @@ -109,16 +110,16 @@ This is a way to set up how - outside of the Point-and-Click Graphical User Inte The triggers are designed to be either client-specific or issued by a peripheral device module. -Currently, the Action Triggers system only supports a single, client-specific trigger type: a Hotkey. Hotkeys can be either a single key, a combination of keys (*combo*) or a *chord* - a sequnece of key combinations pressed in a particular order. *Chords* are popular in some text editing applications and vastly expand the amount of actions that can be triggered from a keyboard, at the expense of the time needed to execute them. Currently, the Hotkey editor in Sofie does not support creating *Chords*, but they can be specified by Blueprints during migrations. +Currently, the Action Triggers system only supports a single, client-specific trigger type: a Hotkey. Hotkeys can be either a single key, a combination of keys (_combo_) or a _chord_ - a sequnece of key combinations pressed in a particular order. _Chords_ are popular in some text editing applications and vastly expand the amount of actions that can be triggered from a keyboard, at the expense of the time needed to execute them. Currently, the Hotkey editor in Sofie does not support creating _Chords_, but they can be specified by Blueprints during migrations. To edit a given trigger, click on the trigger pill on the left of the Trigger-Action set. When hovering, a **+** sign will appear, allowing you to add a new trigger to the set. #### Actions -The actions are built using a base *action* (such as *Activate a Rundown* or *AdLib*) and a set of *filters*, limiting the scope of the *action*. Optionally, some of these *actions* can take additional *parameters*. These filters can operate on various types of objects, depending on the action in question. All actions currently require that the chain of filters starts with scoping out the Rundown the action is supposed to affect. Currently, there is only one type of Rundown-level filter supported: "The Rundown currently in view". +The actions are built using a base _action_ (such as _Activate a Rundown_ or _AdLib_) and a set of _filters_, limiting the scope of the _action_. Optionally, some of these _actions_ can take additional _parameters_. These filters can operate on various types of objects, depending on the action in question. All actions currently require that the chain of filters starts with scoping out the Rundown the action is supposed to affect. Currently, there is only one type of Rundown-level filter supported: "The Rundown currently in view". -The Action Triggers user interface guides the user in a wizzard-like fashion through the available *filter* options on a given *action*. +The Action Triggers user interface guides the user in a wizzard-like fashion through the available _filter_ options on a given _action_. ![Actions can take additional parameters](/img/docs/main/features/action_triggers_2.png) @@ -126,7 +127,7 @@ If the action provides a preview of the triggered items and there is an availabl ![A preview of the action, as scoped by the filters](/img/docs/main/features/action_triggers_4.png) -Clicking on the action and filter pills allows you to edit the action parameters and filter parameters. *Limit* limits the amount of objects to only the first *N* objects matched - this can significantly improve performance on large data sets. *Pick* and *Pick last* filters end the chain of the filters by selecting a single item from the filtered set of objects (the *N-th* object from the beginning or the end, respectively). *Pick* implicitly contains a *Limit* for the performance improvement. This is not true for *Pick last*, though. +Clicking on the action and filter pills allows you to edit the action parameters and filter parameters. _Limit_ limits the amount of objects to only the first _N_ objects matched - this can significantly improve performance on large data sets. _Pick_ and _Pick last_ filters end the chain of the filters by selecting a single item from the filtered set of objects (the _N-th_ object from the beginning or the end, respectively). _Pick_ implicitly contains a _Limit_ for the performance improvement. This is not true for _Pick last_, though. ## Migrations @@ -135,4 +136,3 @@ The migrations are automatic setup-scripts that help you during initial setup an There are system-migrations that comes directly from the version of _Sofie Core_ you're running, and there are also migrations added by the different blueprints. It is mandatory to run migrations when you've upgraded _Sofie Core_ to a new version, or upgraded your blueprints. - diff --git a/packages/documentation/versioned_docs/version-1.41.0/user-guide/configuration/sofie-core-settings.md b/packages/documentation/versioned_docs/version-1.41.0/user-guide/configuration/sofie-core-settings.md index 0320b31466..187643dab0 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/user-guide/configuration/sofie-core-settings.md +++ b/packages/documentation/versioned_docs/version-1.41.0/user-guide/configuration/sofie-core-settings.md @@ -1,6 +1,7 @@ --- sidebar_position: 1 --- + # Sofie Core: System Configuration _Sofie Core_ is configured at it's most basic level using a settings file and environment variables. @@ -83,8 +84,8 @@ The settings file is an optional JSON file that contains some configuration sett To use a settings file: -* During development: `meteor --settings settings.json` -* During prod: environment variable \(see above\) +- During development: `meteor --settings settings.json` +- During prod: environment variable \(see above\) The structure of the file allows for public and private fields. At the moment, Sofie only uses public fields. Below is an example settings file: @@ -112,10 +113,6 @@ There are various settings you can set for an installation. See the list below: | `allowRundownResetOnAir` | Should the user be allowed to reset Rundowns when they are On Air | `false` | | `defaultDisplayDuration` | The fallback duration of a Part, when it's expectedDuration is 0. \_\_In milliseconds | `3000` | - :::info The exact definition for the settings can be found [in the code here](https://github.com/nrkno/sofie-core/blob/master/meteor/lib/Settings.ts#L12). ::: - - - diff --git a/packages/documentation/versioned_docs/version-1.41.0/user-guide/faq.md b/packages/documentation/versioned_docs/version-1.41.0/user-guide/faq.md index e832a36f5c..fb47871bb4 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/user-guide/faq.md +++ b/packages/documentation/versioned_docs/version-1.41.0/user-guide/faq.md @@ -8,10 +8,9 @@ All main components are using the [MIT license](https://opensource.org/licenses/ Everything needed to install and configure a fully functioning Sofie system is publicly available, with the following exceptions: -* A rundown data set describing the actual TV show and of media assets. -* Blueprints for your specific show. +- A rundown data set describing the actual TV show and of media assets. +- Blueprints for your specific show. ## When will feature _y_ become available? Check out the [issues page](https://github.com/nrkno/Sofie-TV-automation/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3ARelease), where there are notes on current and upcoming releases. - diff --git a/packages/documentation/versioned_docs/version-1.41.0/user-guide/features/_category_.json b/packages/documentation/versioned_docs/version-1.41.0/user-guide/features/_category_.json index 0dd70d8b0e..785c16360b 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/user-guide/features/_category_.json +++ b/packages/documentation/versioned_docs/version-1.41.0/user-guide/features/_category_.json @@ -1,4 +1,4 @@ { - "label": "Features", - "position": 2 -} \ No newline at end of file + "label": "Features", + "position": 2 +} diff --git a/packages/documentation/versioned_docs/version-1.41.0/user-guide/features/access-levels.md b/packages/documentation/versioned_docs/version-1.41.0/user-guide/features/access-levels.md index 50307f970e..3415b35bfe 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/user-guide/features/access-levels.md +++ b/packages/documentation/versioned_docs/version-1.41.0/user-guide/features/access-levels.md @@ -1,6 +1,7 @@ --- sidebar_position: 3 --- + # Access Levels A variety of access levels can be set via the URL. By default, a user cannot edit settings, nor play out anything. Some of the access levels provide additional administrative pages or helpful tool tips for new users. These modes are persistent between sessions and will need to be manually disabled by replacing the _1_ with a _0_ in the URL. Below is a quick reference to the modes and what they have access to. @@ -9,11 +10,10 @@ If user accounts are enabled \(`enableUserAccounts` in [_Sofie Core_ settin The access level is persisted in browser's Local Storage. To disable, visit`?theaccessmode=0`. -| Access area | Basic Mode | Configuration Mode | Studio Mode | Admin Mode | -| :--- | :--- | :--- | :--- | :--- | -| **Rundowns** | View Only | View Only | Yes, playout | Yes, playout | -| **Settings** | No | Yes | No | Yes | - +| Access area | Basic Mode | Configuration Mode | Studio Mode | Admin Mode | +| :----------- | :--------- | :----------------- | :----------- | :----------- | +| **Rundowns** | View Only | View Only | Yes, playout | Yes, playout | +| **Settings** | No | Yes | No | Yes | ### Basic mode diff --git a/packages/documentation/versioned_docs/version-1.41.0/user-guide/features/api.md b/packages/documentation/versioned_docs/version-1.41.0/user-guide/features/api.md index fc2e58ec1c..b4317847d8 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/user-guide/features/api.md +++ b/packages/documentation/versioned_docs/version-1.41.0/user-guide/features/api.md @@ -9,4 +9,3 @@ The documentation is minimal at the moment, but the API endpoints are listed by ## DDP – Core Integration If you're planning to build NodeJS applications that talk to _Sofie Core_, we recommend using the [core-integration](https://github.com/nrkno/sofie-core/tree/master/packages/server-core-integration) library, which exposes a number of callable methods and allows for subscribing to data the same way the [Gateways](../concepts-and-architecture#gateways) do it. - diff --git a/packages/documentation/versioned_docs/version-1.41.0/user-guide/features/language.md b/packages/documentation/versioned_docs/version-1.41.0/user-guide/features/language.md index 9fe03d816e..3c61fb16c3 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/user-guide/features/language.md +++ b/packages/documentation/versioned_docs/version-1.41.0/user-guide/features/language.md @@ -1,9 +1,10 @@ --- sidebar_position: 7 --- + # Language -_Sofie_ uses the [i18n internationalisation framework](https://www.i18next.com/) that allows you to present user-facing views in multiple languages. +_Sofie_ uses the [i18n internationalisation framework](https://www.i18next.com/) that allows you to present user-facing views in multiple languages. ## Language selection @@ -14,10 +15,11 @@ The UI will automatically detect user browser's default matching and select the This choice is persisted in browser's local storage, and the same language will be used until a new forced language is chosen using this method. _Sofie_ currently supports three languages: -* English _(default)_ `en` -* Norwegian bokmål `nb` -* Norwegian nynorsk `nn` + +- English _(default)_ `en` +- Norwegian bokmål `nb` +- Norwegian nynorsk `nn` ## Further Reading -* [List of language tags](https://en.wikipedia.org/wiki/IETF_language_tag) \ No newline at end of file +- [List of language tags](https://en.wikipedia.org/wiki/IETF_language_tag) diff --git a/packages/documentation/versioned_docs/version-1.41.0/user-guide/features/prompter.md b/packages/documentation/versioned_docs/version-1.41.0/user-guide/features/prompter.md index 264a7fd7b9..eaacc68681 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/user-guide/features/prompter.md +++ b/packages/documentation/versioned_docs/version-1.41.0/user-guide/features/prompter.md @@ -36,9 +36,9 @@ Example: [http://127.0.0.1/prompter/studio0/?mode=mouse&followtake=0&fontsize=20 The prompter can be controlled by different types of controllers. The control mode is set by a query parameter, like so: `?mode=mouse`. -| Query parameter | Description | -| :---------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Default | Controlled by both mouse and keyboard | +| Query parameter | Description | +| :---------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Default | Controlled by both mouse and keyboard | | `?mode=mouse` | Controlled by mouse only. [See configuration details](prompter#control-using-mouse-scroll-wheel) | | `?mode=keyboard` | Controlled by keyboard only. [See configuration details](prompter#control-using-keyboard) | | `?mode=shuttlekeyboard` | Controlled by a Contour Design ShuttleXpress, X-keys Jog and Shuttle or any compatible, configured as keyboard-ish device. [See configuration details](prompter#control-using-contour-shuttlexpress-or-x-keys) | @@ -72,7 +72,7 @@ Keyboard control is intended to be used when having a "keyboard"-device, such as This mode is intended to be used when having a Contour ShuttleXpress or X-keys device, configured to work as a keyboard device. These devices have jog/shuttle wheels, and their software/firmware allow them to map scroll movement to keystrokes from any key-combination. Since we only listen for key combinations, it effectively means that any device outputing keystrokes will work in this mode. -From Release 30, the speedMap has a prefix: **shuttle\_** \(i.e. shuttle\_speedMap\) +From Release 30, the speedMap has a prefix: **shuttle\_** \(i.e. shuttle_speedMap\) | Key combination | Function | | :--------------------------------------------------------- | :------------------------------------- | @@ -88,10 +88,10 @@ From Release 30, the speedMap has a prefix: **shuttle\_** \(i.e. shuttle\_speedM Configuration files that can be used in their respective driver software: -* [Contour ShuttleXpress](https://github.com/nrkno/sofie-core/blob/release26/resources/prompter_layout_shuttlexpress.pref) -* [X-keys](https://github.com/nrkno/sofie-core/blob/release26/resources/prompter_layout_xkeys.mw3) +- [Contour ShuttleXpress](https://github.com/nrkno/sofie-core/blob/release26/resources/prompter_layout_shuttlexpress.pref) +- [X-keys](https://github.com/nrkno/sofie-core/blob/release26/resources/prompter_layout_xkeys.mw3) -#### +#### #### Control using midi input \(_?mode=pedal_\) @@ -99,7 +99,7 @@ This mode listens to MIDI CC-notes on channel 8, expecting a linear range like i If you want to use traditional analogue pedals with 5 volt TRS connection, a converter such as the _Beat Bars EX2M_ will work well. -From Release 30, the parameters for the pedal have a prefix: **pedal\_** \(i.e. pedal\_speedMap, pedal\_reverseSpeedMap etc\) +From Release 30, the parameters for the pedal have a prefix: **pedal\_** \(i.e. pedal_speedMap, pedal_reverseSpeedMap etc\) | Query parameter | Type | Description | Default | | :---------------- | :--------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------- | @@ -110,11 +110,11 @@ From Release 30, the parameters for the pedal have a prefix: **pedal\_** \(i.e. | `rangeNeutralMax` | number | The minimum input to run forward, the start of the forward-range \(min speed\). This is also the end of any "deadband" you want filter out before starting moving forwards. | `80` | | `rangeFwdMax` | number | The maximum input, the end of the forward-range \(max speed\) | `127` | -* `rangeNeutralMin` has to be greater than `rangeRevMin` -* `rangeNeutralMax` has to be greater than `rangeNeutralMin` -* `rangeFwdMax` has to be greater than `rangeNeutralMax` +- `rangeNeutralMin` has to be greater than `rangeRevMin` +- `rangeNeutralMax` has to be greater than `rangeNeutralMin` +- `rangeFwdMax` has to be greater than `rangeNeutralMax` -![Yamaha FC7 mapped for both a forward \(80-127\) and backwards \(0-35\) range.](/img/docs/main/features/yamaha-fc7.jpg) +![Yamaha FC7 mapped for both a forward (80-127) and backwards (0-35) range.](/img/docs/main/features/yamaha-fc7.jpg) The default values allow for both going forwards and backwards. This matches the _Yamaha FC7_ expression pedal. The default values create a forward-range from 80-127, a neutral zone from 35-80 and a reverse-range from 0-35. @@ -130,7 +130,7 @@ Any movement within forward range will map to the _speedMap_ with interpolation | _"I have to go too far back to reverse"_ | Increse `rangeNeutralMin` | | _"As I find a good speed, it varies a bit in speed up/down even if I hold my foot still"_ | Use `?debug=1` to see what speed is calculated in the position the presenter wants to rest the foot in. Add more of that number in a sequence in the `speedMap` to flatten out the speed curve, i.e. `[1, 2, 3, 4, 4, 4, 4, 5, ...]` | -**Note:** The default values are set up to work with the _Yamaha FC7_ expression pedal, and will probably not be good for pedals with one continuous linear range from fully released to fully depressed. A suggested configuration for such pedals \(i.e. the _Mission Engineering EP-1_\) will be like: +**Note:** The default values are set up to work with the _Yamaha FC7_ expression pedal, and will probably not be good for pedals with one continuous linear range from fully released to fully depressed. A suggested configuration for such pedals \(i.e. the _Mission Engineering EP-1_\) will be like: | Query parameter | Suggestion | | :---------------- | :-------------------------------------- | @@ -147,7 +147,7 @@ This mode uses the browsers Gamapad API and polls connected Joycons for their st The Joycons can operate in 3 modes, the L-stick, the R-stick or both L+R sticks together. Reconnections and jumping between modes works, with one known limitation: **Transition from L+R to a single stick blocks all input, and requires a reconnect of the sticks you want to use.** This seems to be a bug in either the Joycons themselves or in the Gamepad API in general. -From Release 30, the parameters for the JoyCon have a prefix: **joycon\_** \(i.e. joycon\_speedMap, joycon\_reverseSpeedMap etc\) +From Release 30, the parameters for the JoyCon have a prefix: **joycon\_** \(i.e. joycon_speedMap, joycon_reverseSpeedMap etc\) | Query parameter | Type | Description | Default | | :---------------- | :--------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------- | @@ -158,9 +158,9 @@ From Release 30, the parameters for the JoyCon have a prefix: **joycon\_** \(i.e | `rangeNeutralMax` | number | The minimum input to run forward, the start of the forward-range \(min speed\). This is also the end of any "deadband" you want filter out before starting moving forwards. | `0.25` | | `rangeFwdMax` | number | The maximum input, the end of the forward-range \(max speed\) | `1` | -* `rangeNeutralMin` has to be greater than `rangeRevMin` -* `rangeNeutralMax` has to be greater than `rangeNeutralMin` -* `rangeFwdMax` has to be greater than `rangeNeutralMax` +- `rangeNeutralMin` has to be greater than `rangeRevMin` +- `rangeNeutralMax` has to be greater than `rangeNeutralMin` +- `rangeFwdMax` has to be greater than `rangeNeutralMax` ![Nintendo Swith Joycons](/img/docs/main/features/nintendo-switch-joycons.jpg) @@ -176,8 +176,6 @@ You can turn on `?debug=1` to see how your input maps to an output. | Left / Y | Go to the previous story | | Right / A | Go to the following story | - - **Calibration guide:** | **Symptom** | Adjustment | @@ -188,4 +186,3 @@ You can turn on `?debug=1` to see how your input maps to an output. | _"I can't reach max speed backwards"_ | Increase `rangeRevMin` | | _"I can't reach max speed forwards"_ | Decrease `rangeFwdMax` | | _"As I find a good speed, it varies a bit in speed up/down even if I hold my finger still"_ | Use `?debug=1` to see what speed is calculated in the position the presenter wants to rest their finger in. Add more of that number in a sequence in the `speedMap` to flatten out the speed curve, i.e. `[1, 2, 3, 4, 4, 4, 4, 5, ...]` | - diff --git a/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/_category_.json b/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/_category_.json index d4eb4cf33a..12e58396d0 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/_category_.json +++ b/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/_category_.json @@ -1,4 +1,4 @@ { - "label": "Installation", - "position": 2 -} \ No newline at end of file + "label": "Installation", + "position": 2 +} diff --git a/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/initial-sofie-core-setup.md b/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/initial-sofie-core-setup.md index 8d9a9f3e8a..a449c473a2 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/initial-sofie-core-setup.md +++ b/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/initial-sofie-core-setup.md @@ -6,15 +6,14 @@ sidebar_position: 3 #### Prerequisites -* [Installed and running _Sofie Core_](installing-sofie-server-core) +- [Installed and running _Sofie Core_](installing-sofie-server-core) Once _Sofie Core_ has been installed and is running you can begin setting it up. The first step is to navigate to the _Settings page_. Please review the [Sofie Access Level](../features/access-levels) page for assistance getting there. -To upgrade to a newer version or installation of new blueprints, Sofie needs to run its "Upgrade database" procedure to migrate data and pre-fill various settings. You can do this by clicking the _Upgrade Database_ button in the menu. +To upgrade to a newer version or installation of new blueprints, Sofie needs to run its "Upgrade database" procedure to migrate data and pre-fill various settings. You can do this by clicking the _Upgrade Database_ button in the menu. ![Update Database Section of the Settings Page](/img/docs/getting-started/settings-page-full-update-db.jpg) Fill in the form as prompted and continue by clicking _Run Migrations Procedure_. Sometimes you will need to go through multiple steps before the upgrade is finished. Next, you will need to add some [Blueprints](installing-blueprints) and add [Gateways](installing-a-gateway/intro) to allow _Sofie_ to interpret rundown data and then play out things. - diff --git a/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-a-gateway/_category_.json b/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-a-gateway/_category_.json index 7fa55d484d..e83c1db9e5 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-a-gateway/_category_.json +++ b/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-a-gateway/_category_.json @@ -1,4 +1,4 @@ { - "label": "Installing a Gateway", - "position": 5 -} \ No newline at end of file + "label": "Installing a Gateway", + "position": 5 +} diff --git a/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-a-gateway/intro.md b/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-a-gateway/intro.md index 0092282166..794e7703b9 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-a-gateway/intro.md +++ b/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-a-gateway/intro.md @@ -2,11 +2,12 @@ sidebar_label: Introduction sidebar_position: 1 --- + # Introduction: Installing a Gateway #### Prerequisites -* [Installed and running Sofie Core](../installing-sofie-server-core) +- [Installed and running Sofie Core](../installing-sofie-server-core) The _Sofie Core_ is the primary application for managing the broadcast, but it doesn't play anything out on it's own. A Gateway will establish the connection from _Sofie Core_ to other pieces of hardware or remote software. A basic setup may include the [Spreadsheet Gateway](rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support) which will ingest a rundown from Google Sheets then, use the [Playout Gateway](playout-gateway) send commands to a CasparCG Server graphics playout, an ATEM vision mixer, and / or the [Sisyfos audio controller](https://github.com/olzzon/sisyfos-audio-controller). @@ -14,12 +15,11 @@ Installing a gateway is a two part process. To begin, you will [add the required ### Rundown & Newsroom Gateways -* [Google Spreadsheet Gateway](rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support) -* [iNEWS Gateway](rundown-or-newsroom-system-connection/inews-gateway) -* [MOS Gateway](rundown-or-newsroom-system-connection/mos-gateway) +- [Google Spreadsheet Gateway](rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support) +- [iNEWS Gateway](rundown-or-newsroom-system-connection/inews-gateway) +- [MOS Gateway](rundown-or-newsroom-system-connection/mos-gateway) ### Playout & Media Manager Gateways -* [Playout Gateway](playout-gateway) -* [Media Manager](../media-manager) - +- [Playout Gateway](playout-gateway) +- [Media Manager](../media-manager) diff --git a/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-a-gateway/playout-gateway.md b/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-a-gateway/playout-gateway.md index 0fd5f47626..0d90911760 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-a-gateway/playout-gateway.md +++ b/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-a-gateway/playout-gateway.md @@ -1,6 +1,7 @@ --- sidebar_position: 3 --- + # Playout Gateway The _Playout Gateway_ handles interacting external pieces of hardware or software by sending commands that will playout rundown content. This gateway used to be a separate installation but it has since been moved into the main _Sofie Core_ component. diff --git a/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json b/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json index b4c4ffc34d..ae77b5c6a7 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json +++ b/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json @@ -1,4 +1,4 @@ { "label": "Rundown or Newsroom System Connection", "position": 4 -} \ No newline at end of file +} diff --git a/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md b/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md index 48659251a6..0d67551638 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md +++ b/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md @@ -4,9 +4,8 @@ The iNEWS Gateway communicates with an iNEWS system to ingest and remain in sync ### Installing iNEWS for Sofie -The iNEWS Gateway allows you to create rundowns from within iNEWS and sync them with the _Sofie Core_. The rundowns will update in real time and any changes made will be seen from within your Playout Timeline. +The iNEWS Gateway allows you to create rundowns from within iNEWS and sync them with the _Sofie Core_. The rundowns will update in real time and any changes made will be seen from within your Playout Timeline. The setup for the iNEWS Gateway is already in the Docker Compose file you downloaded earlier. Remove the _\#_ symbol from the start of the line labeled `image: tv2/inews-ftp-gateway:develop` and add a _\#_ to the other ingest gateway that was being used. Although the iNEWS Gateway is available free of charge, an iNEWS license is not. Visit [Avid's website](https://www.avid.com/products/inews/how-to-buy) to find an iNEWS reseller that handles your geographic area. - diff --git a/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md b/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md index cf2c62a508..dcdc7db5b6 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md +++ b/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md @@ -2,13 +2,10 @@ Sofie Core doesn't talk directly to the newsroom systems, but instead via one of the Gateways. -The Google Spreadsheet Gateway, iNEWS Gateway, and the MOS \( [Media Object Server Communications Protocol](http://mosprotocol.com/) \) Gateway which can handle interacting with any system that communicates via MOS. +The Google Spreadsheet Gateway, iNEWS Gateway, and the MOS \( [Media Object Server Communications Protocol](http://mosprotocol.com/) \) Gateway which can handle interacting with any system that communicates via MOS. ### Further Reading -* [MOS Protocol Overview & Documentation](http://mosprotocol.com/) -* [iNEWS on Avid's Website](https://www.avid.com/products/inews/how-to-buy) -* [ENPS on The Associated Press' Website](https://www.ap.org/enps/support) - - - +- [MOS Protocol Overview & Documentation](http://mosprotocol.com/) +- [iNEWS on Avid's Website](https://www.avid.com/products/inews/how-to-buy) +- [ENPS on The Associated Press' Website](https://www.ap.org/enps/support) diff --git a/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md b/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md index b1eff262fe..81f0e0fc81 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md +++ b/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md @@ -5,5 +5,3 @@ The MOS Gateway communicates with a device that supports the [MOS protocol](http The setup for the MOS Gateway is handled in the Docker Compose in the [Quick Install](../../installing-sofie-server-core) page. One thing to note if managing the mos-gateway manually: It needs a few ports open \(10540, 10541\) for MOS-messages to be pushed to it from the NCS. - - diff --git a/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-connections-and-additional-hardware/README.md b/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-connections-and-additional-hardware/README.md index 92826611ec..8d7990f460 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-connections-and-additional-hardware/README.md +++ b/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-connections-and-additional-hardware/README.md @@ -2,34 +2,40 @@ #### Prerequisites -* [Installed and running Sofie Core](../installing-sofie-server-core) -* [Installed Playout Gateway](../installing-a-gateway/playout-gateway) -* [Installed and configured Studio Blueprints](../installing-blueprints#installing-a-studio-blueprint) +- [Installed and running Sofie Core](../installing-sofie-server-core) +- [Installed Playout Gateway](../installing-a-gateway/playout-gateway) +- [Installed and configured Studio Blueprints](../installing-blueprints#installing-a-studio-blueprint) The following pages are broken up by equipment type that is supported by Sofie's Gateways. ## Playout & Recording -* [CasparCG Graphics and Video Server](casparcg-server-installation) - _Graphics / Playout / Recording_ -* [Blackmagic Design's HyperDeck](https://www.blackmagicdesign.com/products/hyperdeckstudio) - _Recording_ -* [Quantel](http://www.quantel.com) Solutions - _Playout_ -* [Vizrt](https://www.vizrt.com/) Graphics Solutions - _Graphics / Playout_ + +- [CasparCG Graphics and Video Server](casparcg-server-installation) - _Graphics / Playout / Recording_ +- [Blackmagic Design's HyperDeck](https://www.blackmagicdesign.com/products/hyperdeckstudio) - _Recording_ +- [Quantel](http://www.quantel.com) Solutions - _Playout_ +- [Vizrt](https://www.vizrt.com/) Graphics Solutions - _Graphics / Playout_ ## Vision Mixers -* [Blackmagic's ATEM](https://www.blackmagicdesign.com/products/atem) hardware vision mixers -* [vMix](https://www.vmix.com/) software vision mixer \(coming soon\) + +- [Blackmagic's ATEM](https://www.blackmagicdesign.com/products/atem) hardware vision mixers +- [vMix](https://www.vmix.com/) software vision mixer \(coming soon\) ## Audio Mixers -* [Sisyfos](https://github.com/olzzon/sisyfos-audio-controller) audio controller -* [Lawo sound mixers_,_](https://www.lawo.com/applications/broadcast-production/audio-consoles.html) _using emberplus protocol_ -* Generic OSC \(open sound control\) + +- [Sisyfos](https://github.com/olzzon/sisyfos-audio-controller) audio controller +- [Lawo sound mixers*,*](https://www.lawo.com/applications/broadcast-production/audio-consoles.html) _using emberplus protocol_ +- Generic OSC \(open sound control\) ## PTZ Cameras -* [Panasonic PTZ](https://pro-av.panasonic.net/en/products/ptz_camera_systems.html) cameras + +- [Panasonic PTZ](https://pro-av.panasonic.net/en/products/ptz_camera_systems.html) cameras ## Lights -* [Pharos](https://www.pharoscontrols.com/) light control + +- [Pharos](https://www.pharoscontrols.com/) light control ## Other -* Generic OSC \(open sound control\) -* Generic HTTP requests \(to control http-REST interfaces\) -* Generic TCP-socket + +- Generic OSC \(open sound control\) +- Generic HTTP requests \(to control http-REST interfaces\) +- Generic TCP-socket diff --git a/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-connections-and-additional-hardware/_category_.json b/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-connections-and-additional-hardware/_category_.json index d3e1e8979e..4d800e9a88 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-connections-and-additional-hardware/_category_.json +++ b/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-connections-and-additional-hardware/_category_.json @@ -1,4 +1,4 @@ { - "label": "Installing Connections and Additional Hardware", - "position": 6 -} \ No newline at end of file + "label": "Installing Connections and Additional Hardware", + "position": 6 +} diff --git a/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md b/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md index 7ce94888eb..a1a1514bdc 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md +++ b/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md @@ -1,6 +1,6 @@ # Configuring Vision Mixers -## ATEM – Blackmagic Design +## ATEM – Blackmagic Design The [Playout Gateway](../installing-a-gateway/playout-gateway) supports communicating with the entire line up of Blackmagic Design's ATEM vision mixers. @@ -11,4 +11,3 @@ Once your ATEM is properly configured on the network, you can add it as a device ### Additional Information Sofie does not support connecting to a vision mixer hardware panels. All interacts with the vision mixers must be handled within a Rundown. - diff --git a/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/intro.md b/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/intro.md index e2f13307dd..e63bd18c4f 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/intro.md +++ b/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/intro.md @@ -1,37 +1,35 @@ --- sidebar_position: 1 --- + # Getting Started _Sofie_ can be installed in many different ways, depending on which platforms, needs, and features you desire. The _Sofie_ system consists of several applications that work together to provide complete broadcast automation system. Each of these components' installation will be covered in this guide. Additional information about the products or services mentioned alongside the Sofie Installation can be found on the [Further Reading](../further-reading). There are four minimum required components to get a Sofie system up and running. First you need the [_Sofie Core_](installing-sofie-server-core), which is the brains of the operation. Then a set of [_Blueprints_](installing-blueprints) to handle and interpret incoming and outgoing data. Next, an [_Ingest Gateway_](installing-a-gateway/rundown-or-newsroom-system-connection/intro) to fetch the data for the Blueprints. Then finally, a [_Playout Gateway_](installing-a-gateway/playout-gateway) to send the data to your playout device of choice. - - ## Sofie Core View -The _Rundowns_ view will display all the active rundowns that the _Sofie Core_ has access to. +The _Rundowns_ view will display all the active rundowns that the _Sofie Core_ has access to. ![Rundown View](/img/docs/getting-started/rundowns-in-sofie.png) The _Status_ views displays the current status for the attached devices and gateways. -![Status View – Describes the state of _Sofie Core_](/img/docs/getting-started/status-page.jpg) +![Status View – Describes the state of _Sofie Core_](/img/docs/getting-started/status-page.jpg) -The _Settings_ views contains various settings for the studio, show styles, blueprints etc.. If the link to the settings view is not visible in your application, check your [Access Levels](../features/access-levels). More info on specific parts of the _Settings_ view can be found in their corresponding guide sections. +The _Settings_ views contains various settings for the studio, show styles, blueprints etc.. If the link to the settings view is not visible in your application, check your [Access Levels](../features/access-levels). More info on specific parts of the _Settings_ view can be found in their corresponding guide sections. -![Settings View – Describes how the _Sofie Core_ is configured](/img/docs/getting-started/settings-page.jpg) +![Settings View – Describes how the _Sofie Core_ is configured](/img/docs/getting-started/settings-page.jpg) ## Sofie Core Overview -The _Sofie Core_ is the primary application for managing the broadcast but, it doesn't play anything out on it's own. You need to use Gateways to establish the connection from the _Sofie Core_ to other pieces of hardware or remote software. +The _Sofie Core_ is the primary application for managing the broadcast but, it doesn't play anything out on it's own. You need to use Gateways to establish the connection from the _Sofie Core_ to other pieces of hardware or remote software. ### Gateways -Gateways are separate applications that bridge the gap between the _Sofie Core_ and other pieces of hardware or services. At minimum, you will need a _Playout Gateway_ so your timeline can interact with your playout system of choice. To install the _Playout Gateway_, visit the [Installing a Gateway](installing-a-gateway/intro) section of this guide and for a more in-depth look, please see [Gateways](../concepts-and-architecture#gateways). +Gateways are separate applications that bridge the gap between the _Sofie Core_ and other pieces of hardware or services. At minimum, you will need a _Playout Gateway_ so your timeline can interact with your playout system of choice. To install the _Playout Gateway_, visit the [Installing a Gateway](installing-a-gateway/intro) section of this guide and for a more in-depth look, please see [Gateways](../concepts-and-architecture#gateways). ### Blueprints Blueprints can be described as the logic that determines how a studio and show should interact with one another. They interpret the data coming in from the rundowns and transform them into a rich set of playable elements \(_Segments_, _Parts_, _AdLibs,_ etcetera\). The _Sofie Core_ has three main blueprint types, _System Blueprints_, _Studio Blueprints_, and _Showstyle Blueprints_. Installing _Sofie_ does not require you understand what these blueprints do, just that they are required for the _Sofie Core_ to work. If you would like to gain a deeper understand of how _Blueprints_ work, please visit the [Blueprints](#blueprints) section. - diff --git a/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/media-manager.md b/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/media-manager.md index 7697dfe00f..614fe4d560 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/media-manager.md +++ b/packages/documentation/versioned_docs/version-1.41.0/user-guide/installation/media-manager.md @@ -1,11 +1,10 @@ # Media Manager -The Media Manager handles the media, or files, that make up the rundown content. To install it, begin by downloading the latest release of [Media Manager from GitHub](https://github.com/nrkno/sofie-media-management/releases). You can now run the `media-manager.exe` file inside the extracted folder. A warning window may popup about the app being unrecognized. You can get around this by selecting _More Info_ and clicking _Run Anyways_. A terminal window will open and begin running the application. +The Media Manager handles the media, or files, that make up the rundown content. To install it, begin by downloading the latest release of [Media Manager from GitHub](https://github.com/nrkno/sofie-media-management/releases). You can now run the `media-manager.exe` file inside the extracted folder. A warning window may popup about the app being unrecognized. You can get around this by selecting _More Info_ and clicking _Run Anyways_. A terminal window will open and begin running the application. -You can now open the _Sofie Core_, `http://localhost:3000`, and navigate to the _Settings page_. You will see your _Media Manager_ under the _Devices_ section of the menu. The four main sections, general properties, attached storage, media flows, monitors, as well as attached subdivides, all contribute to how the media is handled within the Sofie Core. +You can now open the _Sofie Core_, `http://localhost:3000`, and navigate to the _Settings page_. You will see your _Media Manager_ under the _Devices_ section of the menu. The four main sections, general properties, attached storage, media flows, monitors, as well as attached subdivides, all contribute to how the media is handled within the Sofie Core. ### Further Reading -* [Media Manager Releases on GitHub](https://github.com/nrkno/sofie-media-management/releases) -* [Media Manager GitHub Page for Developers](https://github.com/nrkno/sofie-media-management) - +- [Media Manager Releases on GitHub](https://github.com/nrkno/sofie-media-management/releases) +- [Media Manager GitHub Page for Developers](https://github.com/nrkno/sofie-media-management) diff --git a/packages/documentation/versioned_docs/version-1.41.0/user-guide/supported-devices.md b/packages/documentation/versioned_docs/version-1.41.0/user-guide/supported-devices.md index c0bce866ea..fc6fcfb30c 100644 --- a/packages/documentation/versioned_docs/version-1.41.0/user-guide/supported-devices.md +++ b/packages/documentation/versioned_docs/version-1.41.0/user-guide/supported-devices.md @@ -1,6 +1,7 @@ --- sidebar_position: 4 --- + # Supported Playout Devices All playout devices are essentially driven through the _timeline_, which passes through _Sofie Core_ into the Playout Gateway where it is processed by the timeline-state-resolver. This page details which devices and what parts of the devices can be controlled through the timeline-state-resolver library. In general a blueprints developer can use the [timeline-state-resolver-types package](https://www.npmjs.com/package/timeline-state-resolver-types) to see the interfaces for the timeline objects used to control the devices. @@ -9,99 +10,98 @@ All playout devices are essentially driven through the _timeline_, which passes We support almost all features of these devices except fairlight audio, camera controls and streaming capabilities. A non-inclusive list: -* Control of camera inputs -* Transitions -* Full control of keyers -* Full control of DVE's -* Control of media pools -* Control of auxilliaries +- Control of camera inputs +- Transitions +- Full control of keyers +- Full control of DVE's +- Control of media pools +- Control of auxilliaries ## CasparCG Server Tested and developed against [a fork of version 2.1](https://github.com/nrkno/sofie-casparcg-server) with more support for version 2.3 being added in the future. -* Video playback -* Graphics playback -* Recording / streaming -* Mixer parameters -* Transitions +- Video playback +- Graphics playback +- Recording / streaming +- Mixer parameters +- Transitions ## HTTP Protocol -* Get/post/put/delete methods -* Interval based watcher for status monitoring +- Get/post/put/delete methods +- Interval based watcher for status monitoring ## Blackmagic Design HyperDeck -* Recording +- Recording ## Lawo Powercore & MC2 Series -* Control over faders - * Using the ramp function on the powercore -* Control of parameters in the ember tree +- Control over faders + - Using the ramp function on the powercore +- Control of parameters in the ember tree ## OSC protocol -* Sending of integers, floats, strings, blobs -* Tweening \(transitioning between\) values +- Sending of integers, floats, strings, blobs +- Tweening \(transitioning between\) values Can be configured in TCP or UDP mode. ## Panasonic PTZ Cameras -* Recalling presets -* Setting zoom, zoom speed and recall speed +- Recalling presets +- Setting zoom, zoom speed and recall speed ## Pharos Lighting Control -* Recalling scenes -* Recalling timelines +- Recalling scenes +- Recalling timelines ## Grass Valley SQ Media Servers -* Control of playback -* Looping -* Cloning +- Control of playback +- Looping +- Cloning _Note: some features are controlled through the media-manager_ ## Shotoku Camera Robotics -* Cutting to shots -* Fading to shots +- Cutting to shots +- Fading to shots ## Singular Live -* Control nodes +- Control nodes _Note: this is not currently used in production by anyone we know of_ ## Sisyfos -* On-air controls -* Fader levels -* Labels -* Hide / show channels +- On-air controls +- Fader levels +- Labels +- Hide / show channels ## TCP Protocol -* Sending messages +- Sending messages ## VizRT Viz MSE -* Pilot elements -* Continue commands -* Loading all elements -* Clearing all elements +- Pilot elements +- Continue commands +- Loading all elements +- Clearing all elements ## vMix -* Full M/E control -* Audio control -* Streaming / recording control -* Fade to black -* Overlays -* Transforms -* Transitions - +- Full M/E control +- Audio control +- Streaming / recording control +- Fade to black +- Overlays +- Transforms +- Transitions diff --git a/packages/documentation/versioned_docs/version-1.46.0/about-sofie.md b/packages/documentation/versioned_docs/version-1.46.0/about-sofie.md index 363475f108..0c022bcb7e 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/about-sofie.md +++ b/packages/documentation/versioned_docs/version-1.46.0/about-sofie.md @@ -19,4 +19,4 @@ _**Sofie**_ is a web-based TV automation system for studios and live shows, used - Modular data-ingest architecture, supports MOS and Google spreadsheets - Plug-in architecture for programming shows -_The NRK logo is a registered trademark of Norsk rikskringkasting AS. The license does not grant any right to use, in any way, any trademarks, service marks or logos of Norsk rikskringkasting AS._ \ No newline at end of file +_The NRK logo is a registered trademark of Norsk rikskringkasting AS. The license does not grant any right to use, in any way, any trademarks, service marks or logos of Norsk rikskringkasting AS._ diff --git a/packages/documentation/versioned_docs/version-1.46.0/for-developers/for-blueprint-developers/_category_.json b/packages/documentation/versioned_docs/version-1.46.0/for-developers/for-blueprint-developers/_category_.json index c4c3c8c242..b4dd4fcee1 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/for-developers/for-blueprint-developers/_category_.json +++ b/packages/documentation/versioned_docs/version-1.46.0/for-developers/for-blueprint-developers/_category_.json @@ -1,4 +1,4 @@ { - "label": "For Blueprint Developers", - "position": 4 -} \ No newline at end of file + "label": "For Blueprint Developers", + "position": 4 +} diff --git a/packages/documentation/versioned_docs/version-1.46.0/for-developers/for-blueprint-developers/hold.md b/packages/documentation/versioned_docs/version-1.46.0/for-developers/for-blueprint-developers/hold.md index 35d8dde7e4..c535462fce 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/for-developers/for-blueprint-developers/hold.md +++ b/packages/documentation/versioned_docs/version-1.46.0/for-developers/for-blueprint-developers/hold.md @@ -37,7 +37,7 @@ Some unanswered questions we have are: - Should _Hold_ be rewritten to be done with adlib-actions instead to allow for more complex scenarios? - Should there be a way to more intelligently check if _Hold_ can be done between two Parts? (perhaps a new blueprint method?) -::: + ::: The blueprints have to label parts as supporting _Hold_. You can do this with the [`holdMode`](https://nrkno.github.io/sofie-core/typedoc/interfaces/_sofie_automation_blueprints_integration.IBlueprintPart.html#holdMode) property, and labelling it possible to _Hold_ from or to the part. diff --git a/packages/documentation/versioned_docs/version-1.46.0/for-developers/intro.md b/packages/documentation/versioned_docs/version-1.46.0/for-developers/intro.md index 01513049a9..5914d27a7e 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/for-developers/intro.md +++ b/packages/documentation/versioned_docs/version-1.46.0/for-developers/intro.md @@ -9,7 +9,7 @@ The pages below are intended for developers of any of the Sofie-related repos an A read-through of the [Concepts & Architectures](../user-guide/concepts-and-architecture) is recommended, before diving too deep into development. -* [Libraries](libraries) -* [Contribution Guidelines](contribution-guidelines) -* [For Blueprint Developers](for-blueprint-developers/intro) -* [API Documentation](api-documentation) +- [Libraries](libraries) +- [Contribution Guidelines](contribution-guidelines) +- [For Blueprint Developers](for-blueprint-developers/intro) +- [API Documentation](api-documentation) diff --git a/packages/documentation/versioned_docs/version-1.46.0/for-developers/libraries.md b/packages/documentation/versioned_docs/version-1.46.0/for-developers/libraries.md index 815f52f020..e6e8b61a23 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/for-developers/libraries.md +++ b/packages/documentation/versioned_docs/version-1.46.0/for-developers/libraries.md @@ -13,48 +13,42 @@ sidebar_position: 5 Together with the _Sofie Core_ there are several _gateways_ which are separate applications, but which connect to _Sofie Core_ and are managed from within the Core's web UI. -* [**Playout Gateway**](https://github.com/nrkno/sofie-core/tree/master/packages/playout-gateway) Handles the playout from _Sofie_. Connects to and controls a multitude of devices, such as vision mixers, graphics, light controllers, audio mixers etc.. -* [**MOS Gateway**](https://github.com/nrkno/sofie-core/tree/master/packages/mos-gateway) Connects _Sofie_ to a newsroom system \(NRCS\) and ingests rundowns via the [MOS protocol](http://mosprotocol.com/). -* [**iNEWS Gateway**](https://github.com/tv2/inews-ftp-gateway) Connects _Sofie_ to an Avid iNEWS newsroom system. -* [**Quantel Gateway**](https://github.com/nrkno/sofie-quantel-gateway) CORBA to REST gateway for _Quantel/ISA_ playback. -* [**Spreadsheet Gateway**](https://github.com/SuperFlyTV/spreadsheet-gateway) Connects _Sofie_ to a _Google Drive_ folder and ingests rundowns from _Google Sheets_. -* [**Input Gateway**](https://github.com/nrkno/sofie-input-gateway) - +- [**Playout Gateway**](https://github.com/nrkno/sofie-core/tree/master/packages/playout-gateway) Handles the playout from _Sofie_. Connects to and controls a multitude of devices, such as vision mixers, graphics, light controllers, audio mixers etc.. +- [**MOS Gateway**](https://github.com/nrkno/sofie-core/tree/master/packages/mos-gateway) Connects _Sofie_ to a newsroom system \(NRCS\) and ingests rundowns via the [MOS protocol](http://mosprotocol.com/). +- [**iNEWS Gateway**](https://github.com/tv2/inews-ftp-gateway) Connects _Sofie_ to an Avid iNEWS newsroom system. +- [**Quantel Gateway**](https://github.com/nrkno/sofie-quantel-gateway) CORBA to REST gateway for _Quantel/ISA_ playback. +- [**Spreadsheet Gateway**](https://github.com/SuperFlyTV/spreadsheet-gateway) Connects _Sofie_ to a _Google Drive_ folder and ingests rundowns from _Google Sheets_. +- [**Input Gateway**](https://github.com/nrkno/sofie-input-gateway) ## Libraries There are a number of libraries used in the Sofie ecosystem: -* [**ATEM Connection**](https://github.com/nrkno/sofie-atem-connection) Library for communicating with Blackmagic Design's ATEM mixers -* [**ATEM State**](https://github.com/nrkno/sofie-atem-state) Used in TSR to tracks the state of ATEMs and generate commands to control them. -* [**CasparCG Server Connection**](https://github.com/SuperFlyTV/casparcg-connection) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Library to connect and interact with CasparCG Servers. -* [**CasparCG State**](https://github.com/superflytv/casparcg-state) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Used in TSR to tracks the state of CasparCG Servers and generate commands to control them. -* [**Ember+ Connection**](https://github.com/nrkno/sofie-emberplus-connection) Library to communicate with _Ember+_ control protocol -* [**HyperDeck Connection**](https://github.com/nrkno/sofie-hyperdeck-connection) Library for connecting to Blackmagic Design's HyperDeck recorders. -* [**MOS Connection**](https://github.com/nrkno/sofie-mos-connection/) A [_MOS protocol_](http://mosprotocol.com/) library for acting as a MOS device and connecting to an newsroom control system. -* [**Quantel Gateway Client**](https://github.com/nrkno/sofie-quantel-gateway-client) An interface that talks to the Quantel-Gateway application. -* [**Sofie Core Integration**](https://github.com/nrkno/sofie-core-integration) Used to connect to the [Sofie Core](https://github.com/nrkno/sofie-core) by the Gateways. -* [**Sofie Blueprints Integration**](https://github.com/nrkno/sofie-sofie-blueprints-integration) Common types and interfaces used by both Sofie Core and the user-defined blueprints. -* [**SuperFly-Timeline**](https://github.com/SuperFlyTV/supertimeline) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Resolver and rules for placing objects on a virtual timeline. -* [**ThreadedClass**](https://github.com/nytamin/threadedClass) developed by **[_Nytamin_](https://github.com/nytamin)** Used in TSR to spawn device controllers in separate processes. -* [**Timeline State Resolver**](https://github.com/nrkno/sofie-timeline-state-resolver) \(TSR\) The main driver in **Playout Gateway,** handles connections to playout-devices and sends commands based on a **Timeline** received from **Core**. - - +- [**ATEM Connection**](https://github.com/nrkno/sofie-atem-connection) Library for communicating with Blackmagic Design's ATEM mixers +- [**ATEM State**](https://github.com/nrkno/sofie-atem-state) Used in TSR to tracks the state of ATEMs and generate commands to control them. +- [**CasparCG Server Connection**](https://github.com/SuperFlyTV/casparcg-connection) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Library to connect and interact with CasparCG Servers. +- [**CasparCG State**](https://github.com/superflytv/casparcg-state) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Used in TSR to tracks the state of CasparCG Servers and generate commands to control them. +- [**Ember+ Connection**](https://github.com/nrkno/sofie-emberplus-connection) Library to communicate with _Ember+_ control protocol +- [**HyperDeck Connection**](https://github.com/nrkno/sofie-hyperdeck-connection) Library for connecting to Blackmagic Design's HyperDeck recorders. +- [**MOS Connection**](https://github.com/nrkno/sofie-mos-connection/) A [_MOS protocol_](http://mosprotocol.com/) library for acting as a MOS device and connecting to an newsroom control system. +- [**Quantel Gateway Client**](https://github.com/nrkno/sofie-quantel-gateway-client) An interface that talks to the Quantel-Gateway application. +- [**Sofie Core Integration**](https://github.com/nrkno/sofie-core-integration) Used to connect to the [Sofie Core](https://github.com/nrkno/sofie-core) by the Gateways. +- [**Sofie Blueprints Integration**](https://github.com/nrkno/sofie-sofie-blueprints-integration) Common types and interfaces used by both Sofie Core and the user-defined blueprints. +- [**SuperFly-Timeline**](https://github.com/SuperFlyTV/supertimeline) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Resolver and rules for placing objects on a virtual timeline. +- [**ThreadedClass**](https://github.com/nytamin/threadedClass) developed by **[_Nytamin_](https://github.com/nytamin)** Used in TSR to spawn device controllers in separate processes. +- [**Timeline State Resolver**](https://github.com/nrkno/sofie-timeline-state-resolver) \(TSR\) The main driver in **Playout Gateway,** handles connections to playout-devices and sends commands based on a **Timeline** received from **Core**. There are also a few typings-only libraries that define interfaces between applications: -* [**Blueprints Integration**](https://www.npmjs.com/package/@sofie-automation/blueprints-integration) Defines the interface between [**Blueprints**](../user-guide/concepts-and-architecture#blueprints) and **Sofie Core**. -* [**Timeline State Resolver types**](https://www.npmjs.com/package/timeline-state-resolver-types) Defines the interface between [**Blueprints**](../user-guide/concepts-and-architecture#blueprints) and the timeline that will be fed into **TSR** for playout. +- [**Blueprints Integration**](https://www.npmjs.com/package/@sofie-automation/blueprints-integration) Defines the interface between [**Blueprints**](../user-guide/concepts-and-architecture#blueprints) and **Sofie Core**. +- [**Timeline State Resolver types**](https://www.npmjs.com/package/timeline-state-resolver-types) Defines the interface between [**Blueprints**](../user-guide/concepts-and-architecture#blueprints) and the timeline that will be fed into **TSR** for playout. ## Other Sofie-related Repositories -* [**CasparCG Server** \(NRK fork\)](https://github.com/nrkno/sofie-casparcg-server) Sofie-specific fork of CasparCG Server. -* [**CasparCG Launcher**](https://github.com/nrkno/sofie-casparcg-launcher) Launcher, controller, and logger for CasparCG Server. -* [**CasparCG Media Scanner** \(NRK fork\)](https://github.com/nrkno/sofie-casparcg-server) Sofie-specific fork of CasparCG Server 2.2 Media Scanner. -* [**Package Manager**](https://github.com/nrkno/sofie-package-manager) Handles media asset transfer and media file management for pulling new files and deleting expired files on playout devices in a more performant, and possibly distributed, way. Can smartly figure out how to get a file on storage A to playout server B. -* [**Media Manager**](https://github.com/nrkno/sofie-media-management) *(deprecated)* Handles media transfer and media file management for pulling new files and deleting expired files on playout devices. -* [**Quantel Browser Plugin**](https://github.com/nrkno/sofie-quantel-browser-plugin) MOS-compatible Quantel video clip browser for use with Sofie. -* [**Sisyfos Audio Controller**](https://github.com/nrkno/sofie-sisyfos-audio-controller) *developed by [_olzzon_](https://github.com/olzzon/)* - - - +- [**CasparCG Server** \(NRK fork\)](https://github.com/nrkno/sofie-casparcg-server) Sofie-specific fork of CasparCG Server. +- [**CasparCG Launcher**](https://github.com/nrkno/sofie-casparcg-launcher) Launcher, controller, and logger for CasparCG Server. +- [**CasparCG Media Scanner** \(NRK fork\)](https://github.com/nrkno/sofie-casparcg-server) Sofie-specific fork of CasparCG Server 2.2 Media Scanner. +- [**Package Manager**](https://github.com/nrkno/sofie-package-manager) Handles media asset transfer and media file management for pulling new files and deleting expired files on playout devices in a more performant, and possibly distributed, way. Can smartly figure out how to get a file on storage A to playout server B. +- [**Media Manager**](https://github.com/nrkno/sofie-media-management) _(deprecated)_ Handles media transfer and media file management for pulling new files and deleting expired files on playout devices. +- [**Quantel Browser Plugin**](https://github.com/nrkno/sofie-quantel-browser-plugin) MOS-compatible Quantel video clip browser for use with Sofie. +- [**Sisyfos Audio Controller**](https://github.com/nrkno/sofie-sisyfos-audio-controller) _developed by [*olzzon*](https://github.com/olzzon/)_ diff --git a/packages/documentation/versioned_docs/version-1.46.0/user-guide/concepts-and-architecture.md b/packages/documentation/versioned_docs/version-1.46.0/user-guide/concepts-and-architecture.md index 03bda7f8f6..7805e81c3e 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/user-guide/concepts-and-architecture.md +++ b/packages/documentation/versioned_docs/version-1.46.0/user-guide/concepts-and-architecture.md @@ -11,7 +11,7 @@ sidebar_position: 1 ### Sofie Core **Sofie Core** is a web server which handle business logic and serves the web GUI. -It is a [NodeJS](https://nodejs.org/) process backed up by a [MongoDB](https://www.mongodb.com/) database and based on the framework [Meteor](http://meteor.com/). +It is a [NodeJS](https://nodejs.org/) process backed up by a [MongoDB](https://www.mongodb.com/) database and based on the framework [Meteor](http://meteor.com/). ### Gateways @@ -87,8 +87,6 @@ An AdLib isn't added to the Part in the GUI until it starts playing, instead you Being a web-based system, Sofie has a number of customisable, user-facing web [views](features/sofie-views) used for control and monitoring. - - ## Blueprints Blueprints are plug-ins that run in Sofie Core. They interpret the data coming in from the rundowns and transform them into a rich set of playable elements \(Segments, Parts, AdLibs etc\). @@ -134,7 +132,7 @@ The [Playout Gateway](../for-developers/libraries) picks up the timeline from So The Sofie system is made to work with a modern web- and IT-based approach in mind. Therefore, the Sofie Core can be run either on-site, or in an off-site cloud. -![Sofie Core can run in the cloud](/img/docs/main/features/sofie-web-architecture.png) +![Sofie Core can run in the cloud](/img/docs/main/features/sofie-web-architecture.png) One drawback of running in a cloud over the public internet is the - sometimes unpredictable - latency. The Timeline overcomes this by moving all the immediate control of the playout devices to the Playout Gateway, which is intended to run on a local network, close to the hardware it controls. This also gives the system a simple way of load-balancing - since the number of web-clients or load on Sofie Core won't affect the playout. diff --git a/packages/documentation/versioned_docs/version-1.46.0/user-guide/configuration/_category_.json b/packages/documentation/versioned_docs/version-1.46.0/user-guide/configuration/_category_.json index d2aee9ef5b..c4e45c2347 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/user-guide/configuration/_category_.json +++ b/packages/documentation/versioned_docs/version-1.46.0/user-guide/configuration/_category_.json @@ -1,4 +1,4 @@ { - "label": "Configuration", - "position": 4 -} \ No newline at end of file + "label": "Configuration", + "position": 4 +} diff --git a/packages/documentation/versioned_docs/version-1.46.0/user-guide/configuration/settings-view.md b/packages/documentation/versioned_docs/version-1.46.0/user-guide/configuration/settings-view.md index cff7f79e38..36aba3af2c 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/user-guide/configuration/settings-view.md +++ b/packages/documentation/versioned_docs/version-1.46.0/user-guide/configuration/settings-view.md @@ -1,6 +1,7 @@ --- sidebar_position: 2 --- + # Settings View :::caution @@ -22,9 +23,9 @@ Documentation for this section is yet to be written. A _Studio_ in Sofie-terms is a physical location, with a specific set of devices and equipment. Only one show can be on air in a studio at the same time. The _studio_ settings are settings for that specific studio, and contains settings related to hardware and playout, such as: -* **Attached devices** - the Gateways related to this studio -* **Blueprint configuration** - custom config option defined by the blueprints -* **Layer Mappings** - Maps the logical _timeline layers_ to physical devices and outputs +- **Attached devices** - the Gateways related to this studio +- **Blueprint configuration** - custom config option defined by the blueprints +- **Layer Mappings** - Maps the logical _timeline layers_ to physical devices and outputs The Studio uses a studio-blueprint, which handles things like mapping up an incoming rundown to a Showstyle. @@ -52,9 +53,9 @@ In order to allow the Producer to reconfigure the automation from the Switchboar A Route Set is essentially a distinct set of Layer Mappings, which can modify the settings already configured by the Layer Mappings, but can be turned On and Off. Called Routes, these can change: -* the Layer ID to a new Layer ID -* change the Device being controlled by the Layer -* change the aspect of the Device that's being controlled. +- the Layer ID to a new Layer ID +- change the Device being controlled by the Layer +- change the aspect of the Device that's being controlled. Route Sets can be grouped into Exclusivity Groups, in which only a single Route Set can be enabled at a time. When activating a Route Set within an Exclusivity Group, all other Route Sets in that group will be deactivated. This in turn, allows the System Administrator to create entire sections of exclusive automation control within the Studio that the Producer can then switch between. One such example could be switching between Primary and Backup playout servers, or switching between Primary and Backup talent microphone. @@ -83,10 +84,10 @@ Route Sets can also be configured with a _Default State_. This can be used to co A _Showstyle_ is related to the looks and logic of a _show_, which in contrast to the _studio_ is not directly related to the hardware. The Showstyle contains settings like -* **Source Layers** - Groups different types of content in the GUI -* **Output Channels** - Indicates different output targets \(such as the _Program_ or _back-screen in the studio_\) -* **Action Triggers** - Select how actions can be started on a per-show basis, outside of the on-screen controls -* **Blueprint configuration** - custom config option defined by the blueprints +- **Source Layers** - Groups different types of content in the GUI +- **Output Channels** - Indicates different output targets \(such as the _Program_ or _back-screen in the studio_\) +- **Action Triggers** - Select how actions can be started on a per-show basis, outside of the on-screen controls +- **Blueprint configuration** - custom config option defined by the blueprints :::caution Please note the difference between _Source Layers_ and _timeline-layers_: @@ -96,12 +97,12 @@ Please note the difference between _Source Layers_ and _timeline-layers_: [Timeline-objects](../concepts-and-architecture#timeline-object) \(inside of the [Pieces](../concepts-and-architecture#piece)\) are put onto timeline-layers, which are \(through the Mappings in the studio\) mapped to physical devices and outputs. The exact timeline-layer is never exposed to the user, but instead used on the technical level to control playout. -An example of the difference could be when playing a VT \(that's a Source Layer\), which could involve all of the timeline-layers _video\_player0_, _audio\_fader\_video_, _audio\_fader\_host_ and _mixer\_pgm._ +An example of the difference could be when playing a VT \(that's a Source Layer\), which could involve all of the timeline-layers _video_player0_, _audio_fader_video_, _audio_fader_host_ and _mixer_pgm._ ::: ### Action Triggers -This is a way to set up how - outside of the Point-and-Click Graphical User Interface - actions can be performed in the User Interface. Commonly, these are the *hotkey combinations* that can be used to either trigger AdLib content or other actions in the larger system. This is done by creating sets of Triggers and Actions to be triggered by them. These pairs can be set at the Show Style level or at the _Sofie Core_ (System) level, for common actions such as doing a Take or activating a Rundown, where you want a shared method of operation. _Sofie Core_ migrations will set up a base set of basic, system-wide Action Triggers for interacting with rundowns, but they can be changed by the System blueprint. +This is a way to set up how - outside of the Point-and-Click Graphical User Interface - actions can be performed in the User Interface. Commonly, these are the _hotkey combinations_ that can be used to either trigger AdLib content or other actions in the larger system. This is done by creating sets of Triggers and Actions to be triggered by them. These pairs can be set at the Show Style level or at the _Sofie Core_ (System) level, for common actions such as doing a Take or activating a Rundown, where you want a shared method of operation. _Sofie Core_ migrations will set up a base set of basic, system-wide Action Triggers for interacting with rundowns, but they can be changed by the System blueprint. ![Action triggers define modes of interacting with a Rundown](/img/docs/main/features/action_triggers_3.png) @@ -109,16 +110,16 @@ This is a way to set up how - outside of the Point-and-Click Graphical User Inte The triggers are designed to be either client-specific or issued by a peripheral device module. -Currently, the Action Triggers system only supports a single, client-specific trigger type: a Hotkey. Hotkeys can be either a single key, a combination of keys (*combo*) or a *chord* - a sequnece of key combinations pressed in a particular order. *Chords* are popular in some text editing applications and vastly expand the amount of actions that can be triggered from a keyboard, at the expense of the time needed to execute them. Currently, the Hotkey editor in Sofie does not support creating *Chords*, but they can be specified by Blueprints during migrations. +Currently, the Action Triggers system only supports a single, client-specific trigger type: a Hotkey. Hotkeys can be either a single key, a combination of keys (_combo_) or a _chord_ - a sequnece of key combinations pressed in a particular order. _Chords_ are popular in some text editing applications and vastly expand the amount of actions that can be triggered from a keyboard, at the expense of the time needed to execute them. Currently, the Hotkey editor in Sofie does not support creating _Chords_, but they can be specified by Blueprints during migrations. To edit a given trigger, click on the trigger pill on the left of the Trigger-Action set. When hovering, a **+** sign will appear, allowing you to add a new trigger to the set. #### Actions -The actions are built using a base *action* (such as *Activate a Rundown* or *AdLib*) and a set of *filters*, limiting the scope of the *action*. Optionally, some of these *actions* can take additional *parameters*. These filters can operate on various types of objects, depending on the action in question. All actions currently require that the chain of filters starts with scoping out the Rundown the action is supposed to affect. Currently, there is only one type of Rundown-level filter supported: "The Rundown currently in view". +The actions are built using a base _action_ (such as _Activate a Rundown_ or _AdLib_) and a set of _filters_, limiting the scope of the _action_. Optionally, some of these _actions_ can take additional _parameters_. These filters can operate on various types of objects, depending on the action in question. All actions currently require that the chain of filters starts with scoping out the Rundown the action is supposed to affect. Currently, there is only one type of Rundown-level filter supported: "The Rundown currently in view". -The Action Triggers user interface guides the user in a wizzard-like fashion through the available *filter* options on a given *action*. +The Action Triggers user interface guides the user in a wizzard-like fashion through the available _filter_ options on a given _action_. ![Actions can take additional parameters](/img/docs/main/features/action_triggers_2.png) @@ -126,7 +127,7 @@ If the action provides a preview of the triggered items and there is an availabl ![A preview of the action, as scoped by the filters](/img/docs/main/features/action_triggers_4.png) -Clicking on the action and filter pills allows you to edit the action parameters and filter parameters. *Limit* limits the amount of objects to only the first *N* objects matched - this can significantly improve performance on large data sets. *Pick* and *Pick last* filters end the chain of the filters by selecting a single item from the filtered set of objects (the *N-th* object from the beginning or the end, respectively). *Pick* implicitly contains a *Limit* for the performance improvement. This is not true for *Pick last*, though. +Clicking on the action and filter pills allows you to edit the action parameters and filter parameters. _Limit_ limits the amount of objects to only the first _N_ objects matched - this can significantly improve performance on large data sets. _Pick_ and _Pick last_ filters end the chain of the filters by selecting a single item from the filtered set of objects (the _N-th_ object from the beginning or the end, respectively). _Pick_ implicitly contains a _Limit_ for the performance improvement. This is not true for _Pick last_, though. ## Migrations @@ -135,4 +136,3 @@ The migrations are automatic setup-scripts that help you during initial setup an There are system-migrations that comes directly from the version of _Sofie Core_ you're running, and there are also migrations added by the different blueprints. It is mandatory to run migrations when you've upgraded _Sofie Core_ to a new version, or upgraded your blueprints. - diff --git a/packages/documentation/versioned_docs/version-1.46.0/user-guide/faq.md b/packages/documentation/versioned_docs/version-1.46.0/user-guide/faq.md index e832a36f5c..fb47871bb4 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/user-guide/faq.md +++ b/packages/documentation/versioned_docs/version-1.46.0/user-guide/faq.md @@ -8,10 +8,9 @@ All main components are using the [MIT license](https://opensource.org/licenses/ Everything needed to install and configure a fully functioning Sofie system is publicly available, with the following exceptions: -* A rundown data set describing the actual TV show and of media assets. -* Blueprints for your specific show. +- A rundown data set describing the actual TV show and of media assets. +- Blueprints for your specific show. ## When will feature _y_ become available? Check out the [issues page](https://github.com/nrkno/Sofie-TV-automation/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3ARelease), where there are notes on current and upcoming releases. - diff --git a/packages/documentation/versioned_docs/version-1.46.0/user-guide/features/_category_.json b/packages/documentation/versioned_docs/version-1.46.0/user-guide/features/_category_.json index 0dd70d8b0e..785c16360b 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/user-guide/features/_category_.json +++ b/packages/documentation/versioned_docs/version-1.46.0/user-guide/features/_category_.json @@ -1,4 +1,4 @@ { - "label": "Features", - "position": 2 -} \ No newline at end of file + "label": "Features", + "position": 2 +} diff --git a/packages/documentation/versioned_docs/version-1.46.0/user-guide/features/access-levels.md b/packages/documentation/versioned_docs/version-1.46.0/user-guide/features/access-levels.md index 50307f970e..3415b35bfe 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/user-guide/features/access-levels.md +++ b/packages/documentation/versioned_docs/version-1.46.0/user-guide/features/access-levels.md @@ -1,6 +1,7 @@ --- sidebar_position: 3 --- + # Access Levels A variety of access levels can be set via the URL. By default, a user cannot edit settings, nor play out anything. Some of the access levels provide additional administrative pages or helpful tool tips for new users. These modes are persistent between sessions and will need to be manually disabled by replacing the _1_ with a _0_ in the URL. Below is a quick reference to the modes and what they have access to. @@ -9,11 +10,10 @@ If user accounts are enabled \(`enableUserAccounts` in [_Sofie Core_ settin The access level is persisted in browser's Local Storage. To disable, visit`?theaccessmode=0`. -| Access area | Basic Mode | Configuration Mode | Studio Mode | Admin Mode | -| :--- | :--- | :--- | :--- | :--- | -| **Rundowns** | View Only | View Only | Yes, playout | Yes, playout | -| **Settings** | No | Yes | No | Yes | - +| Access area | Basic Mode | Configuration Mode | Studio Mode | Admin Mode | +| :----------- | :--------- | :----------------- | :----------- | :----------- | +| **Rundowns** | View Only | View Only | Yes, playout | Yes, playout | +| **Settings** | No | Yes | No | Yes | ### Basic mode diff --git a/packages/documentation/versioned_docs/version-1.46.0/user-guide/features/api.md b/packages/documentation/versioned_docs/version-1.46.0/user-guide/features/api.md index fc2e58ec1c..b4317847d8 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/user-guide/features/api.md +++ b/packages/documentation/versioned_docs/version-1.46.0/user-guide/features/api.md @@ -9,4 +9,3 @@ The documentation is minimal at the moment, but the API endpoints are listed by ## DDP – Core Integration If you're planning to build NodeJS applications that talk to _Sofie Core_, we recommend using the [core-integration](https://github.com/nrkno/sofie-core/tree/master/packages/server-core-integration) library, which exposes a number of callable methods and allows for subscribing to data the same way the [Gateways](../concepts-and-architecture#gateways) do it. - diff --git a/packages/documentation/versioned_docs/version-1.46.0/user-guide/features/language.md b/packages/documentation/versioned_docs/version-1.46.0/user-guide/features/language.md index 9fe03d816e..3c61fb16c3 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/user-guide/features/language.md +++ b/packages/documentation/versioned_docs/version-1.46.0/user-guide/features/language.md @@ -1,9 +1,10 @@ --- sidebar_position: 7 --- + # Language -_Sofie_ uses the [i18n internationalisation framework](https://www.i18next.com/) that allows you to present user-facing views in multiple languages. +_Sofie_ uses the [i18n internationalisation framework](https://www.i18next.com/) that allows you to present user-facing views in multiple languages. ## Language selection @@ -14,10 +15,11 @@ The UI will automatically detect user browser's default matching and select the This choice is persisted in browser's local storage, and the same language will be used until a new forced language is chosen using this method. _Sofie_ currently supports three languages: -* English _(default)_ `en` -* Norwegian bokmål `nb` -* Norwegian nynorsk `nn` + +- English _(default)_ `en` +- Norwegian bokmål `nb` +- Norwegian nynorsk `nn` ## Further Reading -* [List of language tags](https://en.wikipedia.org/wiki/IETF_language_tag) \ No newline at end of file +- [List of language tags](https://en.wikipedia.org/wiki/IETF_language_tag) diff --git a/packages/documentation/versioned_docs/version-1.46.0/user-guide/features/prompter.md b/packages/documentation/versioned_docs/version-1.46.0/user-guide/features/prompter.md index f8a26a6232..2035527608 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/user-guide/features/prompter.md +++ b/packages/documentation/versioned_docs/version-1.46.0/user-guide/features/prompter.md @@ -28,7 +28,7 @@ The prompter UI can be configured using query parameters: | `showmarker` | 0 / 1 | If the marker is not set to "hide", control if the marker is hidden or not | `1` | | `showscroll` | 0 / 1 | Whether the scroll bar should be shown | `1` | | `followtake` | 0 / 1 | Whether the prompter should automatically scroll to current segment when the operator TAKE:s it | `1` | -| `showoverunder` | 0 / 1 | The timer in the top-right of the prompter, showing the overtime/undertime of the current show. | `1` | +| `showoverunder` | 0 / 1 | The timer in the top-right of the prompter, showing the overtime/undertime of the current show. | `1` | | `debug` | 0 / 1 | Whether to display a debug box showing controller input values and the calculated speed the prompter is currently scrolling at. Used to tweak speedMaps and ranges. | `0` | Example: [http://127.0.0.1/prompter/studio0/?mode=mouse&followtake=0&fontsize=20](http://127.0.0.1/prompter/studio0/?mode=mouse&followtake=0&fontsize=20) @@ -37,9 +37,9 @@ Example: [http://127.0.0.1/prompter/studio0/?mode=mouse&followtake=0&fontsize=20 The prompter can be controlled by different types of controllers. The control mode is set by a query parameter, like so: `?mode=mouse`. -| Query parameter | Description | -| :---------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Default | Controlled by both mouse and keyboard | +| Query parameter | Description | +| :---------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Default | Controlled by both mouse and keyboard | | `?mode=mouse` | Controlled by mouse only. [See configuration details](prompter#control-using-mouse-scroll-wheel) | | `?mode=keyboard` | Controlled by keyboard only. [See configuration details](prompter#control-using-keyboard) | | `?mode=shuttlekeyboard` | Controlled by a Contour Design ShuttleXpress, X-keys Jog and Shuttle or any compatible, configured as keyboard-ish device. [See configuration details](prompter#control-using-contour-shuttlexpress-or-x-keys) | @@ -73,7 +73,7 @@ Keyboard control is intended to be used when having a "keyboard"-device, such as This mode is intended to be used when having a Contour ShuttleXpress or X-keys device, configured to work as a keyboard device. These devices have jog/shuttle wheels, and their software/firmware allow them to map scroll movement to keystrokes from any key-combination. Since we only listen for key combinations, it effectively means that any device outputing keystrokes will work in this mode. -From Release 30, the speedMap has a prefix: **shuttle\_** \(i.e. shuttle\_speedMap\) +From Release 30, the speedMap has a prefix: **shuttle\_** \(i.e. shuttle_speedMap\) | Key combination | Function | | :--------------------------------------------------------- | :------------------------------------- | @@ -89,10 +89,10 @@ From Release 30, the speedMap has a prefix: **shuttle\_** \(i.e. shuttle\_speedM Configuration files that can be used in their respective driver software: -* [Contour ShuttleXpress](https://github.com/nrkno/sofie-core/blob/release26/resources/prompter_layout_shuttlexpress.pref) -* [X-keys](https://github.com/nrkno/sofie-core/blob/release26/resources/prompter_layout_xkeys.mw3) +- [Contour ShuttleXpress](https://github.com/nrkno/sofie-core/blob/release26/resources/prompter_layout_shuttlexpress.pref) +- [X-keys](https://github.com/nrkno/sofie-core/blob/release26/resources/prompter_layout_xkeys.mw3) -#### +#### #### Control using midi input \(_?mode=pedal_\) @@ -100,7 +100,7 @@ This mode listens to MIDI CC-notes on channel 8, expecting a linear range like i If you want to use traditional analogue pedals with 5 volt TRS connection, a converter such as the _Beat Bars EX2M_ will work well. -From Release 30, the parameters for the pedal have a prefix: **pedal\_** \(i.e. pedal\_speedMap, pedal\_reverseSpeedMap etc\) +From Release 30, the parameters for the pedal have a prefix: **pedal\_** \(i.e. pedal_speedMap, pedal_reverseSpeedMap etc\) | Query parameter | Type | Description | Default | | :---------------- | :--------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------- | @@ -111,11 +111,11 @@ From Release 30, the parameters for the pedal have a prefix: **pedal\_** \(i.e. | `rangeNeutralMax` | number | The minimum input to run forward, the start of the forward-range \(min speed\). This is also the end of any "deadband" you want filter out before starting moving forwards. | `80` | | `rangeFwdMax` | number | The maximum input, the end of the forward-range \(max speed\) | `127` | -* `rangeNeutralMin` has to be greater than `rangeRevMin` -* `rangeNeutralMax` has to be greater than `rangeNeutralMin` -* `rangeFwdMax` has to be greater than `rangeNeutralMax` +- `rangeNeutralMin` has to be greater than `rangeRevMin` +- `rangeNeutralMax` has to be greater than `rangeNeutralMin` +- `rangeFwdMax` has to be greater than `rangeNeutralMax` -![Yamaha FC7 mapped for both a forward \(80-127\) and backwards \(0-35\) range.](/img/docs/main/features/yamaha-fc7.jpg) +![Yamaha FC7 mapped for both a forward (80-127) and backwards (0-35) range.](/img/docs/main/features/yamaha-fc7.jpg) The default values allow for both going forwards and backwards. This matches the _Yamaha FC7_ expression pedal. The default values create a forward-range from 80-127, a neutral zone from 35-80 and a reverse-range from 0-35. @@ -131,7 +131,7 @@ Any movement within forward range will map to the _speedMap_ with interpolation | _"I have to go too far back to reverse"_ | Increse `rangeNeutralMin` | | _"As I find a good speed, it varies a bit in speed up/down even if I hold my foot still"_ | Use `?debug=1` to see what speed is calculated in the position the presenter wants to rest the foot in. Add more of that number in a sequence in the `speedMap` to flatten out the speed curve, i.e. `[1, 2, 3, 4, 4, 4, 4, 5, ...]` | -**Note:** The default values are set up to work with the _Yamaha FC7_ expression pedal, and will probably not be good for pedals with one continuous linear range from fully released to fully depressed. A suggested configuration for such pedals \(i.e. the _Mission Engineering EP-1_\) will be like: +**Note:** The default values are set up to work with the _Yamaha FC7_ expression pedal, and will probably not be good for pedals with one continuous linear range from fully released to fully depressed. A suggested configuration for such pedals \(i.e. the _Mission Engineering EP-1_\) will be like: | Query parameter | Suggestion | | :---------------- | :-------------------------------------- | @@ -148,7 +148,7 @@ This mode uses the browsers Gamapad API and polls connected Joycons for their st The Joycons can operate in 3 modes, the L-stick, the R-stick or both L+R sticks together. Reconnections and jumping between modes works, with one known limitation: **Transition from L+R to a single stick blocks all input, and requires a reconnect of the sticks you want to use.** This seems to be a bug in either the Joycons themselves or in the Gamepad API in general. -From Release 30, the parameters for the JoyCon have a prefix: **joycon\_** \(i.e. joycon\_speedMap, joycon\_reverseSpeedMap etc\) +From Release 30, the parameters for the JoyCon have a prefix: **joycon\_** \(i.e. joycon_speedMap, joycon_reverseSpeedMap etc\) | Query parameter | Type | Description | Default | | :---------------- | :--------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------- | @@ -159,9 +159,9 @@ From Release 30, the parameters for the JoyCon have a prefix: **joycon\_** \(i.e | `rangeNeutralMax` | number | The minimum input to run forward, the start of the forward-range \(min speed\). This is also the end of any "deadband" you want filter out before starting moving forwards. | `0.25` | | `rangeFwdMax` | number | The maximum input, the end of the forward-range \(max speed\) | `1` | -* `rangeNeutralMin` has to be greater than `rangeRevMin` -* `rangeNeutralMax` has to be greater than `rangeNeutralMin` -* `rangeFwdMax` has to be greater than `rangeNeutralMax` +- `rangeNeutralMin` has to be greater than `rangeRevMin` +- `rangeNeutralMax` has to be greater than `rangeNeutralMin` +- `rangeFwdMax` has to be greater than `rangeNeutralMax` ![Nintendo Swith Joycons](/img/docs/main/features/nintendo-switch-joycons.jpg) @@ -177,8 +177,6 @@ You can turn on `?debug=1` to see how your input maps to an output. | Left / Y | Go to the previous story | | Right / A | Go to the following story | - - **Calibration guide:** | **Symptom** | Adjustment | @@ -189,4 +187,3 @@ You can turn on `?debug=1` to see how your input maps to an output. | _"I can't reach max speed backwards"_ | Increase `rangeRevMin` | | _"I can't reach max speed forwards"_ | Decrease `rangeFwdMax` | | _"As I find a good speed, it varies a bit in speed up/down even if I hold my finger still"_ | Use `?debug=1` to see what speed is calculated in the position the presenter wants to rest their finger in. Add more of that number in a sequence in the `speedMap` to flatten out the speed curve, i.e. `[1, 2, 3, 4, 4, 4, 4, 5, ...]` | - diff --git a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/_category_.json b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/_category_.json index 2f3c7f2a9f..b6be4c9d35 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/_category_.json +++ b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/_category_.json @@ -1,4 +1,4 @@ { - "label": "Installation", - "position": 3 -} \ No newline at end of file + "label": "Installation", + "position": 3 +} diff --git a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/initial-sofie-core-setup.md b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/initial-sofie-core-setup.md index 8d9a9f3e8a..a449c473a2 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/initial-sofie-core-setup.md +++ b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/initial-sofie-core-setup.md @@ -6,15 +6,14 @@ sidebar_position: 3 #### Prerequisites -* [Installed and running _Sofie Core_](installing-sofie-server-core) +- [Installed and running _Sofie Core_](installing-sofie-server-core) Once _Sofie Core_ has been installed and is running you can begin setting it up. The first step is to navigate to the _Settings page_. Please review the [Sofie Access Level](../features/access-levels) page for assistance getting there. -To upgrade to a newer version or installation of new blueprints, Sofie needs to run its "Upgrade database" procedure to migrate data and pre-fill various settings. You can do this by clicking the _Upgrade Database_ button in the menu. +To upgrade to a newer version or installation of new blueprints, Sofie needs to run its "Upgrade database" procedure to migrate data and pre-fill various settings. You can do this by clicking the _Upgrade Database_ button in the menu. ![Update Database Section of the Settings Page](/img/docs/getting-started/settings-page-full-update-db.jpg) Fill in the form as prompted and continue by clicking _Run Migrations Procedure_. Sometimes you will need to go through multiple steps before the upgrade is finished. Next, you will need to add some [Blueprints](installing-blueprints) and add [Gateways](installing-a-gateway/intro) to allow _Sofie_ to interpret rundown data and then play out things. - diff --git a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-a-gateway/_category_.json b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-a-gateway/_category_.json index 7fa55d484d..e83c1db9e5 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-a-gateway/_category_.json +++ b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-a-gateway/_category_.json @@ -1,4 +1,4 @@ { - "label": "Installing a Gateway", - "position": 5 -} \ No newline at end of file + "label": "Installing a Gateway", + "position": 5 +} diff --git a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-a-gateway/intro.md b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-a-gateway/intro.md index 0092282166..794e7703b9 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-a-gateway/intro.md +++ b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-a-gateway/intro.md @@ -2,11 +2,12 @@ sidebar_label: Introduction sidebar_position: 1 --- + # Introduction: Installing a Gateway #### Prerequisites -* [Installed and running Sofie Core](../installing-sofie-server-core) +- [Installed and running Sofie Core](../installing-sofie-server-core) The _Sofie Core_ is the primary application for managing the broadcast, but it doesn't play anything out on it's own. A Gateway will establish the connection from _Sofie Core_ to other pieces of hardware or remote software. A basic setup may include the [Spreadsheet Gateway](rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support) which will ingest a rundown from Google Sheets then, use the [Playout Gateway](playout-gateway) send commands to a CasparCG Server graphics playout, an ATEM vision mixer, and / or the [Sisyfos audio controller](https://github.com/olzzon/sisyfos-audio-controller). @@ -14,12 +15,11 @@ Installing a gateway is a two part process. To begin, you will [add the required ### Rundown & Newsroom Gateways -* [Google Spreadsheet Gateway](rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support) -* [iNEWS Gateway](rundown-or-newsroom-system-connection/inews-gateway) -* [MOS Gateway](rundown-or-newsroom-system-connection/mos-gateway) +- [Google Spreadsheet Gateway](rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support) +- [iNEWS Gateway](rundown-or-newsroom-system-connection/inews-gateway) +- [MOS Gateway](rundown-or-newsroom-system-connection/mos-gateway) ### Playout & Media Manager Gateways -* [Playout Gateway](playout-gateway) -* [Media Manager](../media-manager) - +- [Playout Gateway](playout-gateway) +- [Media Manager](../media-manager) diff --git a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-a-gateway/playout-gateway.md b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-a-gateway/playout-gateway.md index 0fd5f47626..0d90911760 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-a-gateway/playout-gateway.md +++ b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-a-gateway/playout-gateway.md @@ -1,6 +1,7 @@ --- sidebar_position: 3 --- + # Playout Gateway The _Playout Gateway_ handles interacting external pieces of hardware or software by sending commands that will playout rundown content. This gateway used to be a separate installation but it has since been moved into the main _Sofie Core_ component. diff --git a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json index b4c4ffc34d..ae77b5c6a7 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json +++ b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json @@ -1,4 +1,4 @@ { "label": "Rundown or Newsroom System Connection", "position": 4 -} \ No newline at end of file +} diff --git a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md index 48659251a6..0d67551638 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md +++ b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md @@ -4,9 +4,8 @@ The iNEWS Gateway communicates with an iNEWS system to ingest and remain in sync ### Installing iNEWS for Sofie -The iNEWS Gateway allows you to create rundowns from within iNEWS and sync them with the _Sofie Core_. The rundowns will update in real time and any changes made will be seen from within your Playout Timeline. +The iNEWS Gateway allows you to create rundowns from within iNEWS and sync them with the _Sofie Core_. The rundowns will update in real time and any changes made will be seen from within your Playout Timeline. The setup for the iNEWS Gateway is already in the Docker Compose file you downloaded earlier. Remove the _\#_ symbol from the start of the line labeled `image: tv2/inews-ftp-gateway:develop` and add a _\#_ to the other ingest gateway that was being used. Although the iNEWS Gateway is available free of charge, an iNEWS license is not. Visit [Avid's website](https://www.avid.com/products/inews/how-to-buy) to find an iNEWS reseller that handles your geographic area. - diff --git a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md index cf2c62a508..dcdc7db5b6 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md +++ b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md @@ -2,13 +2,10 @@ Sofie Core doesn't talk directly to the newsroom systems, but instead via one of the Gateways. -The Google Spreadsheet Gateway, iNEWS Gateway, and the MOS \( [Media Object Server Communications Protocol](http://mosprotocol.com/) \) Gateway which can handle interacting with any system that communicates via MOS. +The Google Spreadsheet Gateway, iNEWS Gateway, and the MOS \( [Media Object Server Communications Protocol](http://mosprotocol.com/) \) Gateway which can handle interacting with any system that communicates via MOS. ### Further Reading -* [MOS Protocol Overview & Documentation](http://mosprotocol.com/) -* [iNEWS on Avid's Website](https://www.avid.com/products/inews/how-to-buy) -* [ENPS on The Associated Press' Website](https://www.ap.org/enps/support) - - - +- [MOS Protocol Overview & Documentation](http://mosprotocol.com/) +- [iNEWS on Avid's Website](https://www.avid.com/products/inews/how-to-buy) +- [ENPS on The Associated Press' Website](https://www.ap.org/enps/support) diff --git a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md index b1eff262fe..81f0e0fc81 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md +++ b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md @@ -5,5 +5,3 @@ The MOS Gateway communicates with a device that supports the [MOS protocol](http The setup for the MOS Gateway is handled in the Docker Compose in the [Quick Install](../../installing-sofie-server-core) page. One thing to note if managing the mos-gateway manually: It needs a few ports open \(10540, 10541\) for MOS-messages to be pushed to it from the NCS. - - diff --git a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-connections-and-additional-hardware/README.md b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-connections-and-additional-hardware/README.md index 92826611ec..8d7990f460 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-connections-and-additional-hardware/README.md +++ b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-connections-and-additional-hardware/README.md @@ -2,34 +2,40 @@ #### Prerequisites -* [Installed and running Sofie Core](../installing-sofie-server-core) -* [Installed Playout Gateway](../installing-a-gateway/playout-gateway) -* [Installed and configured Studio Blueprints](../installing-blueprints#installing-a-studio-blueprint) +- [Installed and running Sofie Core](../installing-sofie-server-core) +- [Installed Playout Gateway](../installing-a-gateway/playout-gateway) +- [Installed and configured Studio Blueprints](../installing-blueprints#installing-a-studio-blueprint) The following pages are broken up by equipment type that is supported by Sofie's Gateways. ## Playout & Recording -* [CasparCG Graphics and Video Server](casparcg-server-installation) - _Graphics / Playout / Recording_ -* [Blackmagic Design's HyperDeck](https://www.blackmagicdesign.com/products/hyperdeckstudio) - _Recording_ -* [Quantel](http://www.quantel.com) Solutions - _Playout_ -* [Vizrt](https://www.vizrt.com/) Graphics Solutions - _Graphics / Playout_ + +- [CasparCG Graphics and Video Server](casparcg-server-installation) - _Graphics / Playout / Recording_ +- [Blackmagic Design's HyperDeck](https://www.blackmagicdesign.com/products/hyperdeckstudio) - _Recording_ +- [Quantel](http://www.quantel.com) Solutions - _Playout_ +- [Vizrt](https://www.vizrt.com/) Graphics Solutions - _Graphics / Playout_ ## Vision Mixers -* [Blackmagic's ATEM](https://www.blackmagicdesign.com/products/atem) hardware vision mixers -* [vMix](https://www.vmix.com/) software vision mixer \(coming soon\) + +- [Blackmagic's ATEM](https://www.blackmagicdesign.com/products/atem) hardware vision mixers +- [vMix](https://www.vmix.com/) software vision mixer \(coming soon\) ## Audio Mixers -* [Sisyfos](https://github.com/olzzon/sisyfos-audio-controller) audio controller -* [Lawo sound mixers_,_](https://www.lawo.com/applications/broadcast-production/audio-consoles.html) _using emberplus protocol_ -* Generic OSC \(open sound control\) + +- [Sisyfos](https://github.com/olzzon/sisyfos-audio-controller) audio controller +- [Lawo sound mixers*,*](https://www.lawo.com/applications/broadcast-production/audio-consoles.html) _using emberplus protocol_ +- Generic OSC \(open sound control\) ## PTZ Cameras -* [Panasonic PTZ](https://pro-av.panasonic.net/en/products/ptz_camera_systems.html) cameras + +- [Panasonic PTZ](https://pro-av.panasonic.net/en/products/ptz_camera_systems.html) cameras ## Lights -* [Pharos](https://www.pharoscontrols.com/) light control + +- [Pharos](https://www.pharoscontrols.com/) light control ## Other -* Generic OSC \(open sound control\) -* Generic HTTP requests \(to control http-REST interfaces\) -* Generic TCP-socket + +- Generic OSC \(open sound control\) +- Generic HTTP requests \(to control http-REST interfaces\) +- Generic TCP-socket diff --git a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-connections-and-additional-hardware/_category_.json b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-connections-and-additional-hardware/_category_.json index d3e1e8979e..4d800e9a88 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-connections-and-additional-hardware/_category_.json +++ b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-connections-and-additional-hardware/_category_.json @@ -1,4 +1,4 @@ { - "label": "Installing Connections and Additional Hardware", - "position": 6 -} \ No newline at end of file + "label": "Installing Connections and Additional Hardware", + "position": 6 +} diff --git a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md index 7ce94888eb..a1a1514bdc 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md +++ b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md @@ -1,6 +1,6 @@ # Configuring Vision Mixers -## ATEM – Blackmagic Design +## ATEM – Blackmagic Design The [Playout Gateway](../installing-a-gateway/playout-gateway) supports communicating with the entire line up of Blackmagic Design's ATEM vision mixers. @@ -11,4 +11,3 @@ Once your ATEM is properly configured on the network, you can add it as a device ### Additional Information Sofie does not support connecting to a vision mixer hardware panels. All interacts with the vision mixers must be handled within a Rundown. - diff --git a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-package-manager.md b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-package-manager.md index 239ea06996..f71ec60996 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-package-manager.md +++ b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/installing-package-manager.md @@ -49,7 +49,6 @@ To setup, go into Core and add this device to a Studio This first run is necessary to get the Package Manager device registered with _Sofie Core_. We'll restart Package Manager later on in the [Configuration](#configuration) instructions. - ## Installation In Production We provide pre-built executables for Windows (x64) systems that can be used in production environments. These can be found on the [Releases](https://github.com/nrkno/sofie-package-manager/releases) GitHub repository page for Package Manager. For a minimal installation, you'll need the `package-manager-single-app.exe` and `worker.exe`. Put them in a folder of your choice. You can also place `ffmpeg.exe` and `ffprobe.exe` alongside them, if you don't want to make them available in `PATH`. diff --git a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/intro.md b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/intro.md index e2f13307dd..e63bd18c4f 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/intro.md +++ b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/intro.md @@ -1,37 +1,35 @@ --- sidebar_position: 1 --- + # Getting Started _Sofie_ can be installed in many different ways, depending on which platforms, needs, and features you desire. The _Sofie_ system consists of several applications that work together to provide complete broadcast automation system. Each of these components' installation will be covered in this guide. Additional information about the products or services mentioned alongside the Sofie Installation can be found on the [Further Reading](../further-reading). There are four minimum required components to get a Sofie system up and running. First you need the [_Sofie Core_](installing-sofie-server-core), which is the brains of the operation. Then a set of [_Blueprints_](installing-blueprints) to handle and interpret incoming and outgoing data. Next, an [_Ingest Gateway_](installing-a-gateway/rundown-or-newsroom-system-connection/intro) to fetch the data for the Blueprints. Then finally, a [_Playout Gateway_](installing-a-gateway/playout-gateway) to send the data to your playout device of choice. - - ## Sofie Core View -The _Rundowns_ view will display all the active rundowns that the _Sofie Core_ has access to. +The _Rundowns_ view will display all the active rundowns that the _Sofie Core_ has access to. ![Rundown View](/img/docs/getting-started/rundowns-in-sofie.png) The _Status_ views displays the current status for the attached devices and gateways. -![Status View – Describes the state of _Sofie Core_](/img/docs/getting-started/status-page.jpg) +![Status View – Describes the state of _Sofie Core_](/img/docs/getting-started/status-page.jpg) -The _Settings_ views contains various settings for the studio, show styles, blueprints etc.. If the link to the settings view is not visible in your application, check your [Access Levels](../features/access-levels). More info on specific parts of the _Settings_ view can be found in their corresponding guide sections. +The _Settings_ views contains various settings for the studio, show styles, blueprints etc.. If the link to the settings view is not visible in your application, check your [Access Levels](../features/access-levels). More info on specific parts of the _Settings_ view can be found in their corresponding guide sections. -![Settings View – Describes how the _Sofie Core_ is configured](/img/docs/getting-started/settings-page.jpg) +![Settings View – Describes how the _Sofie Core_ is configured](/img/docs/getting-started/settings-page.jpg) ## Sofie Core Overview -The _Sofie Core_ is the primary application for managing the broadcast but, it doesn't play anything out on it's own. You need to use Gateways to establish the connection from the _Sofie Core_ to other pieces of hardware or remote software. +The _Sofie Core_ is the primary application for managing the broadcast but, it doesn't play anything out on it's own. You need to use Gateways to establish the connection from the _Sofie Core_ to other pieces of hardware or remote software. ### Gateways -Gateways are separate applications that bridge the gap between the _Sofie Core_ and other pieces of hardware or services. At minimum, you will need a _Playout Gateway_ so your timeline can interact with your playout system of choice. To install the _Playout Gateway_, visit the [Installing a Gateway](installing-a-gateway/intro) section of this guide and for a more in-depth look, please see [Gateways](../concepts-and-architecture#gateways). +Gateways are separate applications that bridge the gap between the _Sofie Core_ and other pieces of hardware or services. At minimum, you will need a _Playout Gateway_ so your timeline can interact with your playout system of choice. To install the _Playout Gateway_, visit the [Installing a Gateway](installing-a-gateway/intro) section of this guide and for a more in-depth look, please see [Gateways](../concepts-and-architecture#gateways). ### Blueprints Blueprints can be described as the logic that determines how a studio and show should interact with one another. They interpret the data coming in from the rundowns and transform them into a rich set of playable elements \(_Segments_, _Parts_, _AdLibs,_ etcetera\). The _Sofie Core_ has three main blueprint types, _System Blueprints_, _Studio Blueprints_, and _Showstyle Blueprints_. Installing _Sofie_ does not require you understand what these blueprints do, just that they are required for the _Sofie Core_ to work. If you would like to gain a deeper understand of how _Blueprints_ work, please visit the [Blueprints](#blueprints) section. - diff --git a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/media-manager.md b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/media-manager.md index c286df52c3..5c966aec57 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/media-manager.md +++ b/packages/documentation/versioned_docs/version-1.46.0/user-guide/installation/media-manager.md @@ -10,12 +10,11 @@ Media Manager is deprecated and is not recommended for new deployments. There ar ::: -The Media Manager handles the media, or files, that make up the rundown content. To install it, begin by downloading the latest release of [Media Manager from GitHub](https://github.com/nrkno/sofie-media-management/releases). You can now run the `media-manager.exe` file inside the extracted folder. A warning window may popup about the app being unrecognized. You can get around this by selecting _More Info_ and clicking _Run Anyways_. A terminal window will open and begin running the application. +The Media Manager handles the media, or files, that make up the rundown content. To install it, begin by downloading the latest release of [Media Manager from GitHub](https://github.com/nrkno/sofie-media-management/releases). You can now run the `media-manager.exe` file inside the extracted folder. A warning window may popup about the app being unrecognized. You can get around this by selecting _More Info_ and clicking _Run Anyways_. A terminal window will open and begin running the application. -You can now open the _Sofie Core_, `http://localhost:3000`, and navigate to the _Settings page_. You will see your _Media Manager_ under the _Devices_ section of the menu. The four main sections, general properties, attached storage, media flows, monitors, as well as attached subdivides, all contribute to how the media is handled within the Sofie Core. +You can now open the _Sofie Core_, `http://localhost:3000`, and navigate to the _Settings page_. You will see your _Media Manager_ under the _Devices_ section of the menu. The four main sections, general properties, attached storage, media flows, monitors, as well as attached subdivides, all contribute to how the media is handled within the Sofie Core. ### Further Reading -* [Media Manager Releases on GitHub](https://github.com/nrkno/sofie-media-management/releases) -* [Media Manager GitHub Page for Developers](https://github.com/nrkno/sofie-media-management) - +- [Media Manager Releases on GitHub](https://github.com/nrkno/sofie-media-management/releases) +- [Media Manager GitHub Page for Developers](https://github.com/nrkno/sofie-media-management) diff --git a/packages/documentation/versioned_docs/version-1.46.0/user-guide/supported-devices.md b/packages/documentation/versioned_docs/version-1.46.0/user-guide/supported-devices.md index 55f27cd5ab..b49c1a4e41 100644 --- a/packages/documentation/versioned_docs/version-1.46.0/user-guide/supported-devices.md +++ b/packages/documentation/versioned_docs/version-1.46.0/user-guide/supported-devices.md @@ -1,6 +1,7 @@ --- sidebar_position: 1.5 --- + # Supported Playout Devices All playout devices are essentially driven through the _timeline_, which passes through _Sofie Core_ into the Playout Gateway where it is processed by the timeline-state-resolver. This page details which devices and what parts of the devices can be controlled through the timeline-state-resolver library. In general a blueprints developer can use the [timeline-state-resolver-types package](https://www.npmjs.com/package/timeline-state-resolver-types) to see the interfaces for the timeline objects used to control the devices. @@ -9,110 +10,110 @@ All playout devices are essentially driven through the _timeline_, which passes We support almost all features of these devices except fairlight audio, camera controls and streaming capabilities. A non-inclusive list: -* Control of camera inputs -* Transitions -* Full control of keyers -* Full control of DVE's -* Control of media pools -* Control of auxilliaries +- Control of camera inputs +- Transitions +- Full control of keyers +- Full control of DVE's +- Control of media pools +- Control of auxilliaries ## CasparCG Server Tested and developed against [a fork of version 2.1](https://github.com/nrkno/sofie-casparcg-server) with more support for version 2.3 being added in the future. -* Video playback -* Graphics playback -* Recording / streaming -* Mixer parameters -* Transitions +- Video playback +- Graphics playback +- Recording / streaming +- Mixer parameters +- Transitions ## HTTP Protocol -* GET/POST/PUT/DELETE methods -* Interval based watcher for status monitoring +- GET/POST/PUT/DELETE methods +- Interval based watcher for status monitoring ## Blackmagic Design HyperDeck -* Recording +- Recording ## Lawo Powercore & MC2 Series -* Control over faders - * Using the ramp function on the powercore -* Control of parameters in the ember tree +- Control over faders + - Using the ramp function on the powercore +- Control of parameters in the ember tree ## OSC protocol -* Sending of integers, floats, strings, blobs -* Tweening \(transitioning between\) values +- Sending of integers, floats, strings, blobs +- Tweening \(transitioning between\) values Can be configured in TCP or UDP mode. ## Panasonic PTZ Cameras -* Recalling presets -* Setting zoom, zoom speed and recall speed +- Recalling presets +- Setting zoom, zoom speed and recall speed ## Pharos Lighting Control -* Recalling scenes -* Recalling timelines +- Recalling scenes +- Recalling timelines ## Grass Valley SQ Media Servers -* Control of playback -* Looping -* Cloning +- Control of playback +- Looping +- Cloning _Note: some features are controlled through the Package Manager_ ## Shotoku Camera Robotics -* Cutting to shots -* Fading to shots +- Cutting to shots +- Fading to shots ## Singular Live -* Control nodes +- Control nodes _Note: this is not currently used in production by anyone we know of_ ## Sisyfos -* On-air controls -* Fader levels -* Labels -* Hide / show channels +- On-air controls +- Fader levels +- Labels +- Hide / show channels ## TCP Protocol -* Sending messages +- Sending messages ## VizRT Viz MSE -* Pilot elements -* Continue commands -* Loading all elements -* Clearing all elements +- Pilot elements +- Continue commands +- Loading all elements +- Clearing all elements ## vMix -* Full M/E control -* Audio control -* Streaming / recording control -* Fade to black -* Overlays -* Transforms -* Transitions +- Full M/E control +- Audio control +- Streaming / recording control +- Fade to black +- Overlays +- Transforms +- Transitions ## OBS -*Through OBS WebSocket v4 RPC API* +_Through OBS WebSocket v4 RPC API_ -* Current / Preview Scene -* Current Transition -* Recording -* Streaming -* Scene Item visibility -* Source Settings (FFmpeg source) -* Source Mute +- Current / Preview Scene +- Current Transition +- Recording +- Streaming +- Scene Item visibility +- Source Settings (FFmpeg source) +- Source Mute diff --git a/packages/documentation/versioned_docs/version-1.47.0/about-sofie.md b/packages/documentation/versioned_docs/version-1.47.0/about-sofie.md index 363475f108..0c022bcb7e 100644 --- a/packages/documentation/versioned_docs/version-1.47.0/about-sofie.md +++ b/packages/documentation/versioned_docs/version-1.47.0/about-sofie.md @@ -19,4 +19,4 @@ _**Sofie**_ is a web-based TV automation system for studios and live shows, used - Modular data-ingest architecture, supports MOS and Google spreadsheets - Plug-in architecture for programming shows -_The NRK logo is a registered trademark of Norsk rikskringkasting AS. The license does not grant any right to use, in any way, any trademarks, service marks or logos of Norsk rikskringkasting AS._ \ No newline at end of file +_The NRK logo is a registered trademark of Norsk rikskringkasting AS. The license does not grant any right to use, in any way, any trademarks, service marks or logos of Norsk rikskringkasting AS._ diff --git a/packages/documentation/versioned_docs/version-1.47.0/for-developers/for-blueprint-developers/_category_.json b/packages/documentation/versioned_docs/version-1.47.0/for-developers/for-blueprint-developers/_category_.json index c4c3c8c242..b4dd4fcee1 100644 --- a/packages/documentation/versioned_docs/version-1.47.0/for-developers/for-blueprint-developers/_category_.json +++ b/packages/documentation/versioned_docs/version-1.47.0/for-developers/for-blueprint-developers/_category_.json @@ -1,4 +1,4 @@ { - "label": "For Blueprint Developers", - "position": 4 -} \ No newline at end of file + "label": "For Blueprint Developers", + "position": 4 +} diff --git a/packages/documentation/versioned_docs/version-1.47.0/for-developers/for-blueprint-developers/hold.md b/packages/documentation/versioned_docs/version-1.47.0/for-developers/for-blueprint-developers/hold.md index 35d8dde7e4..c535462fce 100644 --- a/packages/documentation/versioned_docs/version-1.47.0/for-developers/for-blueprint-developers/hold.md +++ b/packages/documentation/versioned_docs/version-1.47.0/for-developers/for-blueprint-developers/hold.md @@ -37,7 +37,7 @@ Some unanswered questions we have are: - Should _Hold_ be rewritten to be done with adlib-actions instead to allow for more complex scenarios? - Should there be a way to more intelligently check if _Hold_ can be done between two Parts? (perhaps a new blueprint method?) -::: + ::: The blueprints have to label parts as supporting _Hold_. You can do this with the [`holdMode`](https://nrkno.github.io/sofie-core/typedoc/interfaces/_sofie_automation_blueprints_integration.IBlueprintPart.html#holdMode) property, and labelling it possible to _Hold_ from or to the part. diff --git a/packages/documentation/versioned_docs/version-1.47.0/for-developers/libraries.md b/packages/documentation/versioned_docs/version-1.47.0/for-developers/libraries.md index 4ee8091c88..36bfaf2a60 100644 --- a/packages/documentation/versioned_docs/version-1.47.0/for-developers/libraries.md +++ b/packages/documentation/versioned_docs/version-1.47.0/for-developers/libraries.md @@ -13,48 +13,42 @@ sidebar_position: 5 Together with the _Sofie Core_ there are several _gateways_ which are separate applications, but which connect to _Sofie Core_ and are managed from within the Core's web UI. -* [**Playout Gateway**](https://github.com/nrkno/sofie-core/tree/master/packages/playout-gateway) Handles the playout from _Sofie_. Connects to and controls a multitude of devices, such as vision mixers, graphics, light controllers, audio mixers etc.. -* [**MOS Gateway**](https://github.com/nrkno/sofie-core/tree/master/packages/mos-gateway) Connects _Sofie_ to a newsroom system \(NRCS\) and ingests rundowns via the [MOS protocol](http://mosprotocol.com/). -* [**iNEWS Gateway**](https://github.com/tv2/inews-ftp-gateway) Connects _Sofie_ to an Avid iNEWS newsroom system. -* [**Quantel Gateway**](https://github.com/nrkno/sofie-quantel-gateway) CORBA to REST gateway for _Quantel/ISA_ playback. -* [**Spreadsheet Gateway**](https://github.com/SuperFlyTV/spreadsheet-gateway) Connects _Sofie_ to a _Google Drive_ folder and ingests rundowns from _Google Sheets_. -* [**Input Gateway**](https://github.com/nrkno/sofie-input-gateway) - +- [**Playout Gateway**](https://github.com/nrkno/sofie-core/tree/master/packages/playout-gateway) Handles the playout from _Sofie_. Connects to and controls a multitude of devices, such as vision mixers, graphics, light controllers, audio mixers etc.. +- [**MOS Gateway**](https://github.com/nrkno/sofie-core/tree/master/packages/mos-gateway) Connects _Sofie_ to a newsroom system \(NRCS\) and ingests rundowns via the [MOS protocol](http://mosprotocol.com/). +- [**iNEWS Gateway**](https://github.com/tv2/inews-ftp-gateway) Connects _Sofie_ to an Avid iNEWS newsroom system. +- [**Quantel Gateway**](https://github.com/nrkno/sofie-quantel-gateway) CORBA to REST gateway for _Quantel/ISA_ playback. +- [**Spreadsheet Gateway**](https://github.com/SuperFlyTV/spreadsheet-gateway) Connects _Sofie_ to a _Google Drive_ folder and ingests rundowns from _Google Sheets_. +- [**Input Gateway**](https://github.com/nrkno/sofie-input-gateway) ## Libraries There are a number of libraries used in the Sofie ecosystem: -* [**ATEM Connection**](https://github.com/nrkno/sofie-atem-connection) Library for communicating with Blackmagic Design's ATEM mixers -* [**ATEM State**](https://github.com/nrkno/sofie-atem-state) Used in TSR to tracks the state of ATEMs and generate commands to control them. -* [**CasparCG Server Connection**](https://github.com/SuperFlyTV/casparcg-connection) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Library to connect and interact with CasparCG Servers. -* [**CasparCG State**](https://github.com/superflytv/casparcg-state) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Used in TSR to tracks the state of CasparCG Servers and generate commands to control them. -* [**Ember+ Connection**](https://github.com/nrkno/sofie-emberplus-connection) Library to communicate with _Ember+_ control protocol -* [**HyperDeck Connection**](https://github.com/nrkno/sofie-hyperdeck-connection) Library for connecting to Blackmagic Design's HyperDeck recorders. -* [**MOS Connection**](https://github.com/nrkno/sofie-mos-connection/) A [_MOS protocol_](http://mosprotocol.com/) library for acting as a MOS device and connecting to an newsroom control system. -* [**Quantel Gateway Client**](https://github.com/nrkno/sofie-quantel-gateway-client) An interface that talks to the Quantel-Gateway application. -* [**Sofie Core Integration**](https://github.com/nrkno/sofie-core-integration) Used to connect to the [Sofie Core](https://github.com/nrkno/sofie-core) by the Gateways. -* [**Sofie Blueprints Integration**](https://github.com/nrkno/sofie-sofie-blueprints-integration) Common types and interfaces used by both Sofie Core and the user-defined blueprints. -* [**SuperFly-Timeline**](https://github.com/SuperFlyTV/supertimeline) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Resolver and rules for placing objects on a virtual timeline. -* [**ThreadedClass**](https://github.com/nytamin/threadedClass) developed by **[_Nytamin_](https://github.com/nytamin)** Used in TSR to spawn device controllers in separate processes. -* [**Timeline State Resolver**](https://github.com/nrkno/sofie-timeline-state-resolver) \(TSR\) The main driver in **Playout Gateway,** handles connections to playout-devices and sends commands based on a **Timeline** received from **Core**. - - +- [**ATEM Connection**](https://github.com/nrkno/sofie-atem-connection) Library for communicating with Blackmagic Design's ATEM mixers +- [**ATEM State**](https://github.com/nrkno/sofie-atem-state) Used in TSR to tracks the state of ATEMs and generate commands to control them. +- [**CasparCG Server Connection**](https://github.com/SuperFlyTV/casparcg-connection) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Library to connect and interact with CasparCG Servers. +- [**CasparCG State**](https://github.com/superflytv/casparcg-state) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Used in TSR to tracks the state of CasparCG Servers and generate commands to control them. +- [**Ember+ Connection**](https://github.com/nrkno/sofie-emberplus-connection) Library to communicate with _Ember+_ control protocol +- [**HyperDeck Connection**](https://github.com/nrkno/sofie-hyperdeck-connection) Library for connecting to Blackmagic Design's HyperDeck recorders. +- [**MOS Connection**](https://github.com/nrkno/sofie-mos-connection/) A [_MOS protocol_](http://mosprotocol.com/) library for acting as a MOS device and connecting to an newsroom control system. +- [**Quantel Gateway Client**](https://github.com/nrkno/sofie-quantel-gateway-client) An interface that talks to the Quantel-Gateway application. +- [**Sofie Core Integration**](https://github.com/nrkno/sofie-core-integration) Used to connect to the [Sofie Core](https://github.com/nrkno/sofie-core) by the Gateways. +- [**Sofie Blueprints Integration**](https://github.com/nrkno/sofie-sofie-blueprints-integration) Common types and interfaces used by both Sofie Core and the user-defined blueprints. +- [**SuperFly-Timeline**](https://github.com/SuperFlyTV/supertimeline) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Resolver and rules for placing objects on a virtual timeline. +- [**ThreadedClass**](https://github.com/nytamin/threadedClass) developed by **[_Nytamin_](https://github.com/nytamin)** Used in TSR to spawn device controllers in separate processes. +- [**Timeline State Resolver**](https://github.com/nrkno/sofie-timeline-state-resolver) \(TSR\) The main driver in **Playout Gateway,** handles connections to playout-devices and sends commands based on a **Timeline** received from **Core**. There are also a few typings-only libraries that define interfaces between applications: -* [**Blueprints Integration**](https://www.npmjs.com/package/@sofie-automation/blueprints-integration) Defines the interface between [**Blueprints**](../user-guide/concepts-and-architecture.md#blueprints) and **Sofie Core**. -* [**Timeline State Resolver types**](https://www.npmjs.com/package/timeline-state-resolver-types) Defines the interface between [**Blueprints**](../user-guide/concepts-and-architecture.md#blueprints) and the timeline that will be fed into **TSR** for playout. +- [**Blueprints Integration**](https://www.npmjs.com/package/@sofie-automation/blueprints-integration) Defines the interface between [**Blueprints**](../user-guide/concepts-and-architecture.md#blueprints) and **Sofie Core**. +- [**Timeline State Resolver types**](https://www.npmjs.com/package/timeline-state-resolver-types) Defines the interface between [**Blueprints**](../user-guide/concepts-and-architecture.md#blueprints) and the timeline that will be fed into **TSR** for playout. ## Other Sofie-related Repositories -* [**CasparCG Server** \(NRK fork\)](https://github.com/nrkno/sofie-casparcg-server) Sofie-specific fork of CasparCG Server. -* [**CasparCG Launcher**](https://github.com/nrkno/sofie-casparcg-launcher) Launcher, controller, and logger for CasparCG Server. -* [**CasparCG Media Scanner** \(NRK fork\)](https://github.com/nrkno/sofie-casparcg-server) Sofie-specific fork of CasparCG Server 2.2 Media Scanner. -* [**Package Manager**](https://github.com/nrkno/sofie-package-manager) Handles media asset transfer and media file management for pulling new files and deleting expired files on playout devices in a more performant, and possibly distributed, way. Can smartly figure out how to get a file on storage A to playout server B. -* [**Media Manager**](https://github.com/nrkno/sofie-media-management) *(deprecated)* Handles media transfer and media file management for pulling new files and deleting expired files on playout devices. -* [**Quantel Browser Plugin**](https://github.com/nrkno/sofie-quantel-browser-plugin) MOS-compatible Quantel video clip browser for use with Sofie. -* [**Sisyfos Audio Controller**](https://github.com/nrkno/sofie-sisyfos-audio-controller) *developed by [_olzzon_](https://github.com/olzzon/)* - - - +- [**CasparCG Server** \(NRK fork\)](https://github.com/nrkno/sofie-casparcg-server) Sofie-specific fork of CasparCG Server. +- [**CasparCG Launcher**](https://github.com/nrkno/sofie-casparcg-launcher) Launcher, controller, and logger for CasparCG Server. +- [**CasparCG Media Scanner** \(NRK fork\)](https://github.com/nrkno/sofie-casparcg-server) Sofie-specific fork of CasparCG Server 2.2 Media Scanner. +- [**Package Manager**](https://github.com/nrkno/sofie-package-manager) Handles media asset transfer and media file management for pulling new files and deleting expired files on playout devices in a more performant, and possibly distributed, way. Can smartly figure out how to get a file on storage A to playout server B. +- [**Media Manager**](https://github.com/nrkno/sofie-media-management) _(deprecated)_ Handles media transfer and media file management for pulling new files and deleting expired files on playout devices. +- [**Quantel Browser Plugin**](https://github.com/nrkno/sofie-quantel-browser-plugin) MOS-compatible Quantel video clip browser for use with Sofie. +- [**Sisyfos Audio Controller**](https://github.com/nrkno/sofie-sisyfos-audio-controller) _developed by [*olzzon*](https://github.com/olzzon/)_ diff --git a/packages/documentation/versioned_docs/version-1.47.0/user-guide/configuration/_category_.json b/packages/documentation/versioned_docs/version-1.47.0/user-guide/configuration/_category_.json index d2aee9ef5b..c4e45c2347 100644 --- a/packages/documentation/versioned_docs/version-1.47.0/user-guide/configuration/_category_.json +++ b/packages/documentation/versioned_docs/version-1.47.0/user-guide/configuration/_category_.json @@ -1,4 +1,4 @@ { - "label": "Configuration", - "position": 4 -} \ No newline at end of file + "label": "Configuration", + "position": 4 +} diff --git a/packages/documentation/versioned_docs/version-1.47.0/user-guide/configuration/settings-view.md b/packages/documentation/versioned_docs/version-1.47.0/user-guide/configuration/settings-view.md index 8f02e32e01..274df2a1ef 100644 --- a/packages/documentation/versioned_docs/version-1.47.0/user-guide/configuration/settings-view.md +++ b/packages/documentation/versioned_docs/version-1.47.0/user-guide/configuration/settings-view.md @@ -1,6 +1,7 @@ --- sidebar_position: 2 --- + # Settings View :::caution @@ -22,9 +23,9 @@ Documentation for this section is yet to be written. A _Studio_ in Sofie-terms is a physical location, with a specific set of devices and equipment. Only one show can be on air in a studio at the same time. The _studio_ settings are settings for that specific studio, and contains settings related to hardware and playout, such as: -* **Attached devices** - the Gateways related to this studio -* **Blueprint configuration** - custom config option defined by the blueprints -* **Layer Mappings** - Maps the logical _timeline layers_ to physical devices and outputs +- **Attached devices** - the Gateways related to this studio +- **Blueprint configuration** - custom config option defined by the blueprints +- **Layer Mappings** - Maps the logical _timeline layers_ to physical devices and outputs The Studio uses a studio-blueprint, which handles things like mapping up an incoming rundown to a Showstyle. @@ -52,9 +53,9 @@ In order to allow the Producer to reconfigure the automation from the Switchboar A Route Set is essentially a distinct set of Layer Mappings, which can modify the settings already configured by the Layer Mappings, but can be turned On and Off. Called Routes, these can change: -* the Layer ID to a new Layer ID -* change the Device being controlled by the Layer -* change the aspect of the Device that's being controlled. +- the Layer ID to a new Layer ID +- change the Device being controlled by the Layer +- change the aspect of the Device that's being controlled. Route Sets can be grouped into Exclusivity Groups, in which only a single Route Set can be enabled at a time. When activating a Route Set within an Exclusivity Group, all other Route Sets in that group will be deactivated. This in turn, allows the System Administrator to create entire sections of exclusive automation control within the Studio that the Producer can then switch between. One such example could be switching between Primary and Backup playout servers, or switching between Primary and Backup talent microphone. @@ -83,10 +84,10 @@ Route Sets can also be configured with a _Default State_. This can be used to co A _Showstyle_ is related to the looks and logic of a _show_, which in contrast to the _studio_ is not directly related to the hardware. The Showstyle contains settings like -* **Source Layers** - Groups different types of content in the GUI -* **Output Channels** - Indicates different output targets \(such as the _Program_ or _back-screen in the studio_\) -* **Action Triggers** - Select how actions can be started on a per-show basis, outside of the on-screen controls -* **Blueprint configuration** - custom config option defined by the blueprints +- **Source Layers** - Groups different types of content in the GUI +- **Output Channels** - Indicates different output targets \(such as the _Program_ or _back-screen in the studio_\) +- **Action Triggers** - Select how actions can be started on a per-show basis, outside of the on-screen controls +- **Blueprint configuration** - custom config option defined by the blueprints :::caution Please note the difference between _Source Layers_ and _timeline-layers_: @@ -96,12 +97,12 @@ Please note the difference between _Source Layers_ and _timeline-layers_: [Timeline-objects](../concepts-and-architecture.md#timeline-object) \(inside of the [Pieces](../concepts-and-architecture.md#piece)\) are put onto timeline-layers, which are \(through the Mappings in the studio\) mapped to physical devices and outputs. The exact timeline-layer is never exposed to the user, but instead used on the technical level to control playout. -An example of the difference could be when playing a VT \(that's a Source Layer\), which could involve all of the timeline-layers _video\_player0_, _audio\_fader\_video_, _audio\_fader\_host_ and _mixer\_pgm._ +An example of the difference could be when playing a VT \(that's a Source Layer\), which could involve all of the timeline-layers _video_player0_, _audio_fader_video_, _audio_fader_host_ and _mixer_pgm._ ::: ### Action Triggers -This is a way to set up how - outside of the Point-and-Click Graphical User Interface - actions can be performed in the User Interface. Commonly, these are the *hotkey combinations* that can be used to either trigger AdLib content or other actions in the larger system. This is done by creating sets of Triggers and Actions to be triggered by them. These pairs can be set at the Show Style level or at the _Sofie Core_ (System) level, for common actions such as doing a Take or activating a Rundown, where you want a shared method of operation. _Sofie Core_ migrations will set up a base set of basic, system-wide Action Triggers for interacting with rundowns, but they can be changed by the System blueprint. +This is a way to set up how - outside of the Point-and-Click Graphical User Interface - actions can be performed in the User Interface. Commonly, these are the _hotkey combinations_ that can be used to either trigger AdLib content or other actions in the larger system. This is done by creating sets of Triggers and Actions to be triggered by them. These pairs can be set at the Show Style level or at the _Sofie Core_ (System) level, for common actions such as doing a Take or activating a Rundown, where you want a shared method of operation. _Sofie Core_ migrations will set up a base set of basic, system-wide Action Triggers for interacting with rundowns, but they can be changed by the System blueprint. ![Action triggers define modes of interacting with a Rundown](/img/docs/main/features/action_triggers_3.png) @@ -109,16 +110,16 @@ This is a way to set up how - outside of the Point-and-Click Graphical User Inte The triggers are designed to be either client-specific or issued by a peripheral device module. -Currently, the Action Triggers system only supports a single, client-specific trigger type: a Hotkey. Hotkeys can be either a single key, a combination of keys (*combo*) or a *chord* - a sequnece of key combinations pressed in a particular order. *Chords* are popular in some text editing applications and vastly expand the amount of actions that can be triggered from a keyboard, at the expense of the time needed to execute them. Currently, the Hotkey editor in Sofie does not support creating *Chords*, but they can be specified by Blueprints during migrations. +Currently, the Action Triggers system only supports a single, client-specific trigger type: a Hotkey. Hotkeys can be either a single key, a combination of keys (_combo_) or a _chord_ - a sequnece of key combinations pressed in a particular order. _Chords_ are popular in some text editing applications and vastly expand the amount of actions that can be triggered from a keyboard, at the expense of the time needed to execute them. Currently, the Hotkey editor in Sofie does not support creating _Chords_, but they can be specified by Blueprints during migrations. To edit a given trigger, click on the trigger pill on the left of the Trigger-Action set. When hovering, a **+** sign will appear, allowing you to add a new trigger to the set. #### Actions -The actions are built using a base *action* (such as *Activate a Rundown* or *AdLib*) and a set of *filters*, limiting the scope of the *action*. Optionally, some of these *actions* can take additional *parameters*. These filters can operate on various types of objects, depending on the action in question. All actions currently require that the chain of filters starts with scoping out the Rundown the action is supposed to affect. Currently, there is only one type of Rundown-level filter supported: "The Rundown currently in view". +The actions are built using a base _action_ (such as _Activate a Rundown_ or _AdLib_) and a set of _filters_, limiting the scope of the _action_. Optionally, some of these _actions_ can take additional _parameters_. These filters can operate on various types of objects, depending on the action in question. All actions currently require that the chain of filters starts with scoping out the Rundown the action is supposed to affect. Currently, there is only one type of Rundown-level filter supported: "The Rundown currently in view". -The Action Triggers user interface guides the user in a wizzard-like fashion through the available *filter* options on a given *action*. +The Action Triggers user interface guides the user in a wizzard-like fashion through the available _filter_ options on a given _action_. ![Actions can take additional parameters](/img/docs/main/features/action_triggers_2.png) @@ -126,7 +127,7 @@ If the action provides a preview of the triggered items and there is an availabl ![A preview of the action, as scoped by the filters](/img/docs/main/features/action_triggers_4.png) -Clicking on the action and filter pills allows you to edit the action parameters and filter parameters. *Limit* limits the amount of objects to only the first *N* objects matched - this can significantly improve performance on large data sets. *Pick* and *Pick last* filters end the chain of the filters by selecting a single item from the filtered set of objects (the *N-th* object from the beginning or the end, respectively). *Pick* implicitly contains a *Limit* for the performance improvement. This is not true for *Pick last*, though. +Clicking on the action and filter pills allows you to edit the action parameters and filter parameters. _Limit_ limits the amount of objects to only the first _N_ objects matched - this can significantly improve performance on large data sets. _Pick_ and _Pick last_ filters end the chain of the filters by selecting a single item from the filtered set of objects (the _N-th_ object from the beginning or the end, respectively). _Pick_ implicitly contains a _Limit_ for the performance improvement. This is not true for _Pick last_, though. ## Migrations @@ -135,4 +136,3 @@ The migrations are automatic setup-scripts that help you during initial setup an There are system-migrations that comes directly from the version of _Sofie Core_ you're running, and there are also migrations added by the different blueprints. It is mandatory to run migrations when you've upgraded _Sofie Core_ to a new version, or upgraded your blueprints. - diff --git a/packages/documentation/versioned_docs/version-1.47.0/user-guide/faq.md b/packages/documentation/versioned_docs/version-1.47.0/user-guide/faq.md index e832a36f5c..fb47871bb4 100644 --- a/packages/documentation/versioned_docs/version-1.47.0/user-guide/faq.md +++ b/packages/documentation/versioned_docs/version-1.47.0/user-guide/faq.md @@ -8,10 +8,9 @@ All main components are using the [MIT license](https://opensource.org/licenses/ Everything needed to install and configure a fully functioning Sofie system is publicly available, with the following exceptions: -* A rundown data set describing the actual TV show and of media assets. -* Blueprints for your specific show. +- A rundown data set describing the actual TV show and of media assets. +- Blueprints for your specific show. ## When will feature _y_ become available? Check out the [issues page](https://github.com/nrkno/Sofie-TV-automation/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3ARelease), where there are notes on current and upcoming releases. - diff --git a/packages/documentation/versioned_docs/version-1.47.0/user-guide/features/_category_.json b/packages/documentation/versioned_docs/version-1.47.0/user-guide/features/_category_.json index 0dd70d8b0e..785c16360b 100644 --- a/packages/documentation/versioned_docs/version-1.47.0/user-guide/features/_category_.json +++ b/packages/documentation/versioned_docs/version-1.47.0/user-guide/features/_category_.json @@ -1,4 +1,4 @@ { - "label": "Features", - "position": 2 -} \ No newline at end of file + "label": "Features", + "position": 2 +} diff --git a/packages/documentation/versioned_docs/version-1.47.0/user-guide/features/access-levels.md b/packages/documentation/versioned_docs/version-1.47.0/user-guide/features/access-levels.md index 50307f970e..3415b35bfe 100644 --- a/packages/documentation/versioned_docs/version-1.47.0/user-guide/features/access-levels.md +++ b/packages/documentation/versioned_docs/version-1.47.0/user-guide/features/access-levels.md @@ -1,6 +1,7 @@ --- sidebar_position: 3 --- + # Access Levels A variety of access levels can be set via the URL. By default, a user cannot edit settings, nor play out anything. Some of the access levels provide additional administrative pages or helpful tool tips for new users. These modes are persistent between sessions and will need to be manually disabled by replacing the _1_ with a _0_ in the URL. Below is a quick reference to the modes and what they have access to. @@ -9,11 +10,10 @@ If user accounts are enabled \(`enableUserAccounts` in [_Sofie Core_ settin The access level is persisted in browser's Local Storage. To disable, visit`?theaccessmode=0`. -| Access area | Basic Mode | Configuration Mode | Studio Mode | Admin Mode | -| :--- | :--- | :--- | :--- | :--- | -| **Rundowns** | View Only | View Only | Yes, playout | Yes, playout | -| **Settings** | No | Yes | No | Yes | - +| Access area | Basic Mode | Configuration Mode | Studio Mode | Admin Mode | +| :----------- | :--------- | :----------------- | :----------- | :----------- | +| **Rundowns** | View Only | View Only | Yes, playout | Yes, playout | +| **Settings** | No | Yes | No | Yes | ### Basic mode diff --git a/packages/documentation/versioned_docs/version-1.47.0/user-guide/features/api.md b/packages/documentation/versioned_docs/version-1.47.0/user-guide/features/api.md index 85cd29af7a..f80a27e542 100644 --- a/packages/documentation/versioned_docs/version-1.47.0/user-guide/features/api.md +++ b/packages/documentation/versioned_docs/version-1.47.0/user-guide/features/api.md @@ -9,4 +9,3 @@ The documentation is minimal at the moment, but the API endpoints are listed by ## DDP – Core Integration If you're planning to build NodeJS applications that talk to _Sofie Core_, we recommend using the [core-integration](https://github.com/nrkno/sofie-core/tree/master/packages/server-core-integration.md) library, which exposes a number of callable methods and allows for subscribing to data the same way the [Gateways](../concepts-and-architecture.md#gateways) do it. - diff --git a/packages/documentation/versioned_docs/version-1.47.0/user-guide/features/language.md b/packages/documentation/versioned_docs/version-1.47.0/user-guide/features/language.md index 9fe03d816e..3c61fb16c3 100644 --- a/packages/documentation/versioned_docs/version-1.47.0/user-guide/features/language.md +++ b/packages/documentation/versioned_docs/version-1.47.0/user-guide/features/language.md @@ -1,9 +1,10 @@ --- sidebar_position: 7 --- + # Language -_Sofie_ uses the [i18n internationalisation framework](https://www.i18next.com/) that allows you to present user-facing views in multiple languages. +_Sofie_ uses the [i18n internationalisation framework](https://www.i18next.com/) that allows you to present user-facing views in multiple languages. ## Language selection @@ -14,10 +15,11 @@ The UI will automatically detect user browser's default matching and select the This choice is persisted in browser's local storage, and the same language will be used until a new forced language is chosen using this method. _Sofie_ currently supports three languages: -* English _(default)_ `en` -* Norwegian bokmål `nb` -* Norwegian nynorsk `nn` + +- English _(default)_ `en` +- Norwegian bokmål `nb` +- Norwegian nynorsk `nn` ## Further Reading -* [List of language tags](https://en.wikipedia.org/wiki/IETF_language_tag) \ No newline at end of file +- [List of language tags](https://en.wikipedia.org/wiki/IETF_language_tag) diff --git a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/_category_.json b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/_category_.json index 2f3c7f2a9f..b6be4c9d35 100644 --- a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/_category_.json +++ b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/_category_.json @@ -1,4 +1,4 @@ { - "label": "Installation", - "position": 3 -} \ No newline at end of file + "label": "Installation", + "position": 3 +} diff --git a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/initial-sofie-core-setup.md b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/initial-sofie-core-setup.md index 20cf647320..3e4d112b77 100644 --- a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/initial-sofie-core-setup.md +++ b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/initial-sofie-core-setup.md @@ -6,15 +6,14 @@ sidebar_position: 3 #### Prerequisites -* [Installed and running _Sofie Core_](installing-sofie-server-core.md) +- [Installed and running _Sofie Core_](installing-sofie-server-core.md) Once _Sofie Core_ has been installed and is running you can begin setting it up. The first step is to navigate to the _Settings page_. Please review the [Sofie Access Level](../features/access-levels.md) page for assistance getting there. -To upgrade to a newer version or installation of new blueprints, Sofie needs to run its "Upgrade database" procedure to migrate data and pre-fill various settings. You can do this by clicking the _Upgrade Database_ button in the menu. +To upgrade to a newer version or installation of new blueprints, Sofie needs to run its "Upgrade database" procedure to migrate data and pre-fill various settings. You can do this by clicking the _Upgrade Database_ button in the menu. ![Update Database Section of the Settings Page](/img/docs/getting-started/settings-page-full-update-db.jpg) Fill in the form as prompted and continue by clicking _Run Migrations Procedure_. Sometimes you will need to go through multiple steps before the upgrade is finished. Next, you will need to add some [Blueprints](installing-blueprints.md) and add [Gateways](installing-a-gateway/intro.md) to allow _Sofie_ to interpret rundown data and then play out things. - diff --git a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-a-gateway/_category_.json b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-a-gateway/_category_.json index 7fa55d484d..e83c1db9e5 100644 --- a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-a-gateway/_category_.json +++ b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-a-gateway/_category_.json @@ -1,4 +1,4 @@ { - "label": "Installing a Gateway", - "position": 5 -} \ No newline at end of file + "label": "Installing a Gateway", + "position": 5 +} diff --git a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-a-gateway/intro.md b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-a-gateway/intro.md index 03bc8a5339..d8c6539cae 100644 --- a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-a-gateway/intro.md +++ b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-a-gateway/intro.md @@ -2,11 +2,12 @@ sidebar_label: Introduction sidebar_position: 1 --- + # Introduction: Installing a Gateway #### Prerequisites -* [Installed and running Sofie Core](../installing-sofie-server-core.md) +- [Installed and running Sofie Core](../installing-sofie-server-core.md) The _Sofie Core_ is the primary application for managing the broadcast, but it doesn't play anything out on it's own. A Gateway will establish the connection from _Sofie Core_ to other pieces of hardware or remote software. A basic setup may include the [Spreadsheet Gateway](rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support.md) which will ingest a rundown from Google Sheets then, use the [Playout Gateway](playout-gateway.md) send commands to a CasparCG Server graphics playout, an ATEM vision mixer, and / or the [Sisyfos audio controller](https://github.com/olzzon/sisyfos-audio-controller). @@ -14,12 +15,11 @@ Installing a gateway is a two part process. To begin, you will [add the required ### Rundown & Newsroom Gateways -* [Google Spreadsheet Gateway](rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support.md) -* [iNEWS Gateway](rundown-or-newsroom-system-connection/inews-gateway.md) -* [MOS Gateway](rundown-or-newsroom-system-connection/mos-gateway.md) +- [Google Spreadsheet Gateway](rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support.md) +- [iNEWS Gateway](rundown-or-newsroom-system-connection/inews-gateway.md) +- [MOS Gateway](rundown-or-newsroom-system-connection/mos-gateway.md) ### Playout & Media Manager Gateways -* [Playout Gateway](playout-gateway.md) -* [Media Manager](../media-manager.md) - +- [Playout Gateway](playout-gateway.md) +- [Media Manager](../media-manager.md) diff --git a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-a-gateway/playout-gateway.md b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-a-gateway/playout-gateway.md index 0fd5f47626..0d90911760 100644 --- a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-a-gateway/playout-gateway.md +++ b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-a-gateway/playout-gateway.md @@ -1,6 +1,7 @@ --- sidebar_position: 3 --- + # Playout Gateway The _Playout Gateway_ handles interacting external pieces of hardware or software by sending commands that will playout rundown content. This gateway used to be a separate installation but it has since been moved into the main _Sofie Core_ component. diff --git a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json index b4c4ffc34d..ae77b5c6a7 100644 --- a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json +++ b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json @@ -1,4 +1,4 @@ { "label": "Rundown or Newsroom System Connection", "position": 4 -} \ No newline at end of file +} diff --git a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md index 48659251a6..0d67551638 100644 --- a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md +++ b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md @@ -4,9 +4,8 @@ The iNEWS Gateway communicates with an iNEWS system to ingest and remain in sync ### Installing iNEWS for Sofie -The iNEWS Gateway allows you to create rundowns from within iNEWS and sync them with the _Sofie Core_. The rundowns will update in real time and any changes made will be seen from within your Playout Timeline. +The iNEWS Gateway allows you to create rundowns from within iNEWS and sync them with the _Sofie Core_. The rundowns will update in real time and any changes made will be seen from within your Playout Timeline. The setup for the iNEWS Gateway is already in the Docker Compose file you downloaded earlier. Remove the _\#_ symbol from the start of the line labeled `image: tv2/inews-ftp-gateway:develop` and add a _\#_ to the other ingest gateway that was being used. Although the iNEWS Gateway is available free of charge, an iNEWS license is not. Visit [Avid's website](https://www.avid.com/products/inews/how-to-buy) to find an iNEWS reseller that handles your geographic area. - diff --git a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md index cf2c62a508..dcdc7db5b6 100644 --- a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md +++ b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md @@ -2,13 +2,10 @@ Sofie Core doesn't talk directly to the newsroom systems, but instead via one of the Gateways. -The Google Spreadsheet Gateway, iNEWS Gateway, and the MOS \( [Media Object Server Communications Protocol](http://mosprotocol.com/) \) Gateway which can handle interacting with any system that communicates via MOS. +The Google Spreadsheet Gateway, iNEWS Gateway, and the MOS \( [Media Object Server Communications Protocol](http://mosprotocol.com/) \) Gateway which can handle interacting with any system that communicates via MOS. ### Further Reading -* [MOS Protocol Overview & Documentation](http://mosprotocol.com/) -* [iNEWS on Avid's Website](https://www.avid.com/products/inews/how-to-buy) -* [ENPS on The Associated Press' Website](https://www.ap.org/enps/support) - - - +- [MOS Protocol Overview & Documentation](http://mosprotocol.com/) +- [iNEWS on Avid's Website](https://www.avid.com/products/inews/how-to-buy) +- [ENPS on The Associated Press' Website](https://www.ap.org/enps/support) diff --git a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md index 8a2a60145c..9f1aa88995 100644 --- a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md +++ b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md @@ -5,5 +5,3 @@ The MOS Gateway communicates with a device that supports the [MOS protocol](http The setup for the MOS Gateway is handled in the Docker Compose in the [Quick Install](../../installing-sofie-server-core.md) page. One thing to note if managing the mos-gateway manually: It needs a few ports open \(10540, 10541\) for MOS-messages to be pushed to it from the NCS. - - diff --git a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-connections-and-additional-hardware/README.md b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-connections-and-additional-hardware/README.md index 4d35fb277d..a2205dd173 100644 --- a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-connections-and-additional-hardware/README.md +++ b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-connections-and-additional-hardware/README.md @@ -2,34 +2,40 @@ #### Prerequisites -* [Installed and running Sofie Core](../installing-sofie-server-core.md) -* [Installed Playout Gateway](../installing-a-gateway/playout-gateway.md) -* [Installed and configured Studio Blueprints](../installing-blueprints.md#installing-a-studio-blueprint) +- [Installed and running Sofie Core](../installing-sofie-server-core.md) +- [Installed Playout Gateway](../installing-a-gateway/playout-gateway.md) +- [Installed and configured Studio Blueprints](../installing-blueprints.md#installing-a-studio-blueprint) The following pages are broken up by equipment type that is supported by Sofie's Gateways. ## Playout & Recording -* [CasparCG Graphics and Video Server](casparcg-server-installation.md) - _Graphics / Playout / Recording_ -* [Blackmagic Design's HyperDeck](https://www.blackmagicdesign.com/products/hyperdeckstudio) - _Recording_ -* [Quantel](http://www.quantel.com) Solutions - _Playout_ -* [Vizrt](https://www.vizrt.com/) Graphics Solutions - _Graphics / Playout_ + +- [CasparCG Graphics and Video Server](casparcg-server-installation.md) - _Graphics / Playout / Recording_ +- [Blackmagic Design's HyperDeck](https://www.blackmagicdesign.com/products/hyperdeckstudio) - _Recording_ +- [Quantel](http://www.quantel.com) Solutions - _Playout_ +- [Vizrt](https://www.vizrt.com/) Graphics Solutions - _Graphics / Playout_ ## Vision Mixers -* [Blackmagic's ATEM](https://www.blackmagicdesign.com/products/atem) hardware vision mixers -* [vMix](https://www.vmix.com/) software vision mixer \(coming soon\) + +- [Blackmagic's ATEM](https://www.blackmagicdesign.com/products/atem) hardware vision mixers +- [vMix](https://www.vmix.com/) software vision mixer \(coming soon\) ## Audio Mixers -* [Sisyfos](https://github.com/olzzon/sisyfos-audio-controller) audio controller -* [Lawo sound mixers_,_](https://www.lawo.com/applications/broadcast-production/audio-consoles.html) _using emberplus protocol_ -* Generic OSC \(open sound control\) + +- [Sisyfos](https://github.com/olzzon/sisyfos-audio-controller) audio controller +- [Lawo sound mixers*,*](https://www.lawo.com/applications/broadcast-production/audio-consoles.html) _using emberplus protocol_ +- Generic OSC \(open sound control\) ## PTZ Cameras -* [Panasonic PTZ](https://pro-av.panasonic.net/en/products/ptz_camera_systems.html) cameras + +- [Panasonic PTZ](https://pro-av.panasonic.net/en/products/ptz_camera_systems.html) cameras ## Lights -* [Pharos](https://www.pharoscontrols.com/) light control + +- [Pharos](https://www.pharoscontrols.com/) light control ## Other -* Generic OSC \(open sound control\) -* Generic HTTP requests \(to control http-REST interfaces\) -* Generic TCP-socket + +- Generic OSC \(open sound control\) +- Generic HTTP requests \(to control http-REST interfaces\) +- Generic TCP-socket diff --git a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-connections-and-additional-hardware/_category_.json b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-connections-and-additional-hardware/_category_.json index d3e1e8979e..4d800e9a88 100644 --- a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-connections-and-additional-hardware/_category_.json +++ b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-connections-and-additional-hardware/_category_.json @@ -1,4 +1,4 @@ { - "label": "Installing Connections and Additional Hardware", - "position": 6 -} \ No newline at end of file + "label": "Installing Connections and Additional Hardware", + "position": 6 +} diff --git a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md index 1515b08840..5c3c9b0234 100644 --- a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md +++ b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md @@ -1,6 +1,6 @@ # Configuring Vision Mixers -## ATEM – Blackmagic Design +## ATEM – Blackmagic Design The [Playout Gateway](../installing-a-gateway/playout-gateway.md) supports communicating with the entire line up of Blackmagic Design's ATEM vision mixers. @@ -11,4 +11,3 @@ Once your ATEM is properly configured on the network, you can add it as a device ### Additional Information Sofie does not support connecting to a vision mixer hardware panels. All interacts with the vision mixers must be handled within a Rundown. - diff --git a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-package-manager.md b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-package-manager.md index bd6cbf3a15..677a583a5e 100644 --- a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-package-manager.md +++ b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/installing-package-manager.md @@ -49,7 +49,6 @@ To setup, go into Core and add this device to a Studio This first run is necessary to get the Package Manager device registered with _Sofie Core_. We'll restart Package Manager later on in the [Configuration](#configuration) instructions. - ## Installation In Production We provide pre-built executables for Windows (x64) systems that can be used in production environments. These can be found on the [Releases](https://github.com/nrkno/sofie-package-manager/releases) GitHub repository page for Package Manager. For a minimal installation, you'll need the `package-manager-single-app.exe` and `worker.exe`. Put them in a folder of your choice. You can also place `ffmpeg.exe` and `ffprobe.exe` alongside them, if you don't want to make them available in `PATH`. diff --git a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/intro.md b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/intro.md index c3a14c218b..8ac8fdf3d6 100644 --- a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/intro.md +++ b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/intro.md @@ -1,37 +1,35 @@ --- sidebar_position: 1 --- + # Getting Started _Sofie_ can be installed in many different ways, depending on which platforms, needs, and features you desire. The _Sofie_ system consists of several applications that work together to provide complete broadcast automation system. Each of these components' installation will be covered in this guide. Additional information about the products or services mentioned alongside the Sofie Installation can be found on the [Further Reading](../further-reading.md). There are four minimum required components to get a Sofie system up and running. First you need the [_Sofie Core_](installing-sofie-server-core.md), which is the brains of the operation. Then a set of [_Blueprints_](installing-blueprints.md) to handle and interpret incoming and outgoing data. Next, an [_Ingest Gateway_](installing-a-gateway/rundown-or-newsroom-system-connection/intro.md) to fetch the data for the Blueprints. Then finally, a [_Playout Gateway_](installing-a-gateway/playout-gateway.md) to send the data to your playout device of choice. - - ## Sofie Core View -The _Rundowns_ view will display all the active rundowns that the _Sofie Core_ has access to. +The _Rundowns_ view will display all the active rundowns that the _Sofie Core_ has access to. ![Rundown View](/img/docs/getting-started/rundowns-in-sofie.png) The _Status_ views displays the current status for the attached devices and gateways. -![Status View – Describes the state of _Sofie Core_](/img/docs/getting-started/status-page.jpg) +![Status View – Describes the state of _Sofie Core_](/img/docs/getting-started/status-page.jpg) -The _Settings_ views contains various settings for the studio, show styles, blueprints etc.. If the link to the settings view is not visible in your application, check your [Access Levels](../features/access-levels.md). More info on specific parts of the _Settings_ view can be found in their corresponding guide sections. +The _Settings_ views contains various settings for the studio, show styles, blueprints etc.. If the link to the settings view is not visible in your application, check your [Access Levels](../features/access-levels.md). More info on specific parts of the _Settings_ view can be found in their corresponding guide sections. -![Settings View – Describes how the _Sofie Core_ is configured](/img/docs/getting-started/settings-page.jpg) +![Settings View – Describes how the _Sofie Core_ is configured](/img/docs/getting-started/settings-page.jpg) ## Sofie Core Overview -The _Sofie Core_ is the primary application for managing the broadcast but, it doesn't play anything out on it's own. You need to use Gateways to establish the connection from the _Sofie Core_ to other pieces of hardware or remote software. +The _Sofie Core_ is the primary application for managing the broadcast but, it doesn't play anything out on it's own. You need to use Gateways to establish the connection from the _Sofie Core_ to other pieces of hardware or remote software. ### Gateways -Gateways are separate applications that bridge the gap between the _Sofie Core_ and other pieces of hardware or services. At minimum, you will need a _Playout Gateway_ so your timeline can interact with your playout system of choice. To install the _Playout Gateway_, visit the [Installing a Gateway](installing-a-gateway/intro.md) section of this guide and for a more in-depth look, please see [Gateways](../concepts-and-architecture.md#gateways). +Gateways are separate applications that bridge the gap between the _Sofie Core_ and other pieces of hardware or services. At minimum, you will need a _Playout Gateway_ so your timeline can interact with your playout system of choice. To install the _Playout Gateway_, visit the [Installing a Gateway](installing-a-gateway/intro.md) section of this guide and for a more in-depth look, please see [Gateways](../concepts-and-architecture.md#gateways). ### Blueprints Blueprints can be described as the logic that determines how a studio and show should interact with one another. They interpret the data coming in from the rundowns and transform them into a rich set of playable elements \(_Segments_, _Parts_, _AdLibs,_ etcetera\). The _Sofie Core_ has three main blueprint types, _System Blueprints_, _Studio Blueprints_, and _Showstyle Blueprints_. Installing _Sofie_ does not require you understand what these blueprints do, just that they are required for the _Sofie Core_ to work. If you would like to gain a deeper understand of how _Blueprints_ work, please visit the [Blueprints](#blueprints) section. - diff --git a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/media-manager.md b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/media-manager.md index c286df52c3..5c966aec57 100644 --- a/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/media-manager.md +++ b/packages/documentation/versioned_docs/version-1.47.0/user-guide/installation/media-manager.md @@ -10,12 +10,11 @@ Media Manager is deprecated and is not recommended for new deployments. There ar ::: -The Media Manager handles the media, or files, that make up the rundown content. To install it, begin by downloading the latest release of [Media Manager from GitHub](https://github.com/nrkno/sofie-media-management/releases). You can now run the `media-manager.exe` file inside the extracted folder. A warning window may popup about the app being unrecognized. You can get around this by selecting _More Info_ and clicking _Run Anyways_. A terminal window will open and begin running the application. +The Media Manager handles the media, or files, that make up the rundown content. To install it, begin by downloading the latest release of [Media Manager from GitHub](https://github.com/nrkno/sofie-media-management/releases). You can now run the `media-manager.exe` file inside the extracted folder. A warning window may popup about the app being unrecognized. You can get around this by selecting _More Info_ and clicking _Run Anyways_. A terminal window will open and begin running the application. -You can now open the _Sofie Core_, `http://localhost:3000`, and navigate to the _Settings page_. You will see your _Media Manager_ under the _Devices_ section of the menu. The four main sections, general properties, attached storage, media flows, monitors, as well as attached subdivides, all contribute to how the media is handled within the Sofie Core. +You can now open the _Sofie Core_, `http://localhost:3000`, and navigate to the _Settings page_. You will see your _Media Manager_ under the _Devices_ section of the menu. The four main sections, general properties, attached storage, media flows, monitors, as well as attached subdivides, all contribute to how the media is handled within the Sofie Core. ### Further Reading -* [Media Manager Releases on GitHub](https://github.com/nrkno/sofie-media-management/releases) -* [Media Manager GitHub Page for Developers](https://github.com/nrkno/sofie-media-management) - +- [Media Manager Releases on GitHub](https://github.com/nrkno/sofie-media-management/releases) +- [Media Manager GitHub Page for Developers](https://github.com/nrkno/sofie-media-management) diff --git a/packages/documentation/versioned_docs/version-1.47.0/user-guide/supported-devices.md b/packages/documentation/versioned_docs/version-1.47.0/user-guide/supported-devices.md index 55f27cd5ab..b49c1a4e41 100644 --- a/packages/documentation/versioned_docs/version-1.47.0/user-guide/supported-devices.md +++ b/packages/documentation/versioned_docs/version-1.47.0/user-guide/supported-devices.md @@ -1,6 +1,7 @@ --- sidebar_position: 1.5 --- + # Supported Playout Devices All playout devices are essentially driven through the _timeline_, which passes through _Sofie Core_ into the Playout Gateway where it is processed by the timeline-state-resolver. This page details which devices and what parts of the devices can be controlled through the timeline-state-resolver library. In general a blueprints developer can use the [timeline-state-resolver-types package](https://www.npmjs.com/package/timeline-state-resolver-types) to see the interfaces for the timeline objects used to control the devices. @@ -9,110 +10,110 @@ All playout devices are essentially driven through the _timeline_, which passes We support almost all features of these devices except fairlight audio, camera controls and streaming capabilities. A non-inclusive list: -* Control of camera inputs -* Transitions -* Full control of keyers -* Full control of DVE's -* Control of media pools -* Control of auxilliaries +- Control of camera inputs +- Transitions +- Full control of keyers +- Full control of DVE's +- Control of media pools +- Control of auxilliaries ## CasparCG Server Tested and developed against [a fork of version 2.1](https://github.com/nrkno/sofie-casparcg-server) with more support for version 2.3 being added in the future. -* Video playback -* Graphics playback -* Recording / streaming -* Mixer parameters -* Transitions +- Video playback +- Graphics playback +- Recording / streaming +- Mixer parameters +- Transitions ## HTTP Protocol -* GET/POST/PUT/DELETE methods -* Interval based watcher for status monitoring +- GET/POST/PUT/DELETE methods +- Interval based watcher for status monitoring ## Blackmagic Design HyperDeck -* Recording +- Recording ## Lawo Powercore & MC2 Series -* Control over faders - * Using the ramp function on the powercore -* Control of parameters in the ember tree +- Control over faders + - Using the ramp function on the powercore +- Control of parameters in the ember tree ## OSC protocol -* Sending of integers, floats, strings, blobs -* Tweening \(transitioning between\) values +- Sending of integers, floats, strings, blobs +- Tweening \(transitioning between\) values Can be configured in TCP or UDP mode. ## Panasonic PTZ Cameras -* Recalling presets -* Setting zoom, zoom speed and recall speed +- Recalling presets +- Setting zoom, zoom speed and recall speed ## Pharos Lighting Control -* Recalling scenes -* Recalling timelines +- Recalling scenes +- Recalling timelines ## Grass Valley SQ Media Servers -* Control of playback -* Looping -* Cloning +- Control of playback +- Looping +- Cloning _Note: some features are controlled through the Package Manager_ ## Shotoku Camera Robotics -* Cutting to shots -* Fading to shots +- Cutting to shots +- Fading to shots ## Singular Live -* Control nodes +- Control nodes _Note: this is not currently used in production by anyone we know of_ ## Sisyfos -* On-air controls -* Fader levels -* Labels -* Hide / show channels +- On-air controls +- Fader levels +- Labels +- Hide / show channels ## TCP Protocol -* Sending messages +- Sending messages ## VizRT Viz MSE -* Pilot elements -* Continue commands -* Loading all elements -* Clearing all elements +- Pilot elements +- Continue commands +- Loading all elements +- Clearing all elements ## vMix -* Full M/E control -* Audio control -* Streaming / recording control -* Fade to black -* Overlays -* Transforms -* Transitions +- Full M/E control +- Audio control +- Streaming / recording control +- Fade to black +- Overlays +- Transforms +- Transitions ## OBS -*Through OBS WebSocket v4 RPC API* +_Through OBS WebSocket v4 RPC API_ -* Current / Preview Scene -* Current Transition -* Recording -* Streaming -* Scene Item visibility -* Source Settings (FFmpeg source) -* Source Mute +- Current / Preview Scene +- Current Transition +- Recording +- Streaming +- Scene Item visibility +- Source Settings (FFmpeg source) +- Source Mute diff --git a/packages/documentation/versioned_docs/version-1.49.0/about-sofie.md b/packages/documentation/versioned_docs/version-1.49.0/about-sofie.md index 363475f108..0c022bcb7e 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/about-sofie.md +++ b/packages/documentation/versioned_docs/version-1.49.0/about-sofie.md @@ -19,4 +19,4 @@ _**Sofie**_ is a web-based TV automation system for studios and live shows, used - Modular data-ingest architecture, supports MOS and Google spreadsheets - Plug-in architecture for programming shows -_The NRK logo is a registered trademark of Norsk rikskringkasting AS. The license does not grant any right to use, in any way, any trademarks, service marks or logos of Norsk rikskringkasting AS._ \ No newline at end of file +_The NRK logo is a registered trademark of Norsk rikskringkasting AS. The license does not grant any right to use, in any way, any trademarks, service marks or logos of Norsk rikskringkasting AS._ diff --git a/packages/documentation/versioned_docs/version-1.49.0/for-developers/contribution-guidelines.md b/packages/documentation/versioned_docs/version-1.49.0/for-developers/contribution-guidelines.md index 210edd8029..a17bea49e3 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/for-developers/contribution-guidelines.md +++ b/packages/documentation/versioned_docs/version-1.49.0/for-developers/contribution-guidelines.md @@ -17,7 +17,6 @@ The Sofie team at NRK is responsible for development and maintenance. We also do The Sofie team welcomes open source contributions and will actively work towards enabling contributions to become mergeable into the Sofie repositories. However, as main stakeholder and maintainer we reserve the right to refuse any contributions. - ## About Contributions Thank you for considering contributing to the Sofie project! @@ -36,6 +35,7 @@ However, Sofie is a big project with many differing users and use cases. **Large 4. The contributor references the RFC when a pull request is ready. ### Base contributions on the in-development branch (or the master branch) + In order to facilitate merging, we ask that contributions are based on the latest (at the time of the pull request) _in-development_ branch (often named `release*`), alternatively the stable (eg. `master`) branch. NRK will take responsibility for rebasing stable contributions to the latest in-development branch if needed. See **CONTRIBUTING.md** in each official repository for details on which branch to use as a base for contributions. @@ -59,12 +59,13 @@ We rely on two types of documentation; the [Sofie documentation](https://nrkno.g We don't aim to have the "absolute perfect documentation possible", BUT we do try to improve and add documentation to have a good-enough-to-be-comprehensible standard. We think that: -* _What_ something does is not as important – we can read the code for that. -* _Why_ something does something, **is** important. Implied usage, side-effects, descriptions of the context etcetera... +- _What_ something does is not as important – we can read the code for that. +- _Why_ something does something, **is** important. Implied usage, side-effects, descriptions of the context etcetera... When you contribute, we ask you to also update any documentation where needed. ### Updating Dependencies​ + When updating dependencies in a library, it is preferred to do so via `yarn upgrade-interactive --latest` whenever possible. This is so that the versions in `package.json` are also updated as we have no guarantee that the library will work with versions lower than that used in the `yarn.lock` file, even if it is compatible with the semver range in `package.json`. After this, a `yarn upgrade` can be used to update any child dependencies Be careful when bumping across major versions. diff --git a/packages/documentation/versioned_docs/version-1.49.0/for-developers/for-blueprint-developers/_category_.json b/packages/documentation/versioned_docs/version-1.49.0/for-developers/for-blueprint-developers/_category_.json index c4c3c8c242..b4dd4fcee1 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/for-developers/for-blueprint-developers/_category_.json +++ b/packages/documentation/versioned_docs/version-1.49.0/for-developers/for-blueprint-developers/_category_.json @@ -1,4 +1,4 @@ { - "label": "For Blueprint Developers", - "position": 4 -} \ No newline at end of file + "label": "For Blueprint Developers", + "position": 4 +} diff --git a/packages/documentation/versioned_docs/version-1.49.0/for-developers/for-blueprint-developers/hold.md b/packages/documentation/versioned_docs/version-1.49.0/for-developers/for-blueprint-developers/hold.md index 35d8dde7e4..c535462fce 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/for-developers/for-blueprint-developers/hold.md +++ b/packages/documentation/versioned_docs/version-1.49.0/for-developers/for-blueprint-developers/hold.md @@ -37,7 +37,7 @@ Some unanswered questions we have are: - Should _Hold_ be rewritten to be done with adlib-actions instead to allow for more complex scenarios? - Should there be a way to more intelligently check if _Hold_ can be done between two Parts? (perhaps a new blueprint method?) -::: + ::: The blueprints have to label parts as supporting _Hold_. You can do this with the [`holdMode`](https://nrkno.github.io/sofie-core/typedoc/interfaces/_sofie_automation_blueprints_integration.IBlueprintPart.html#holdMode) property, and labelling it possible to _Hold_ from or to the part. diff --git a/packages/documentation/versioned_docs/version-1.49.0/for-developers/libraries.md b/packages/documentation/versioned_docs/version-1.49.0/for-developers/libraries.md index b1540117c9..2abdf6935b 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/for-developers/libraries.md +++ b/packages/documentation/versioned_docs/version-1.49.0/for-developers/libraries.md @@ -13,49 +13,43 @@ sidebar_position: 5 Together with the _Sofie Core_ there are several _gateways_ which are separate applications, but which connect to _Sofie Core_ and are managed from within the Core's web UI. -* [**Playout Gateway**](https://github.com/nrkno/sofie-core/tree/master/packages/playout-gateway) Handles the playout from _Sofie_. Connects to and controls a multitude of devices, such as vision mixers, graphics, light controllers, audio mixers etc.. -* [**MOS Gateway**](https://github.com/nrkno/sofie-core/tree/master/packages/mos-gateway) Connects _Sofie_ to a newsroom system \(NRCS\) and ingests rundowns via the [MOS protocol](http://mosprotocol.com/). -* [**iNEWS Gateway**](https://github.com/tv2/inews-ftp-gateway) Connects _Sofie_ to an Avid iNEWS newsroom system. -* [**Spreadsheet Gateway**](https://github.com/SuperFlyTV/spreadsheet-gateway) Connects _Sofie_ to a _Google Drive_ folder and ingests rundowns from _Google Sheets_. -* [**Input Gateway**](https://github.com/nrkno/sofie-input-gateway) Connects _Sofie_ to various input devices, allowing triggering _User-Actions_ using these devices. -* [**Package Manager**](https://github.com/nrkno/sofie-package-manager) Handles media asset transfer and media file management for pulling new files, deleting expired files on playout devices and generating additional metadata (previews, thumbnails, automated QA checks) in a more performant, and possibly distributed, way. Can smartly figure out how to get a file on storage A to playout server B. - +- [**Playout Gateway**](https://github.com/nrkno/sofie-core/tree/master/packages/playout-gateway) Handles the playout from _Sofie_. Connects to and controls a multitude of devices, such as vision mixers, graphics, light controllers, audio mixers etc.. +- [**MOS Gateway**](https://github.com/nrkno/sofie-core/tree/master/packages/mos-gateway) Connects _Sofie_ to a newsroom system \(NRCS\) and ingests rundowns via the [MOS protocol](http://mosprotocol.com/). +- [**iNEWS Gateway**](https://github.com/tv2/inews-ftp-gateway) Connects _Sofie_ to an Avid iNEWS newsroom system. +- [**Spreadsheet Gateway**](https://github.com/SuperFlyTV/spreadsheet-gateway) Connects _Sofie_ to a _Google Drive_ folder and ingests rundowns from _Google Sheets_. +- [**Input Gateway**](https://github.com/nrkno/sofie-input-gateway) Connects _Sofie_ to various input devices, allowing triggering _User-Actions_ using these devices. +- [**Package Manager**](https://github.com/nrkno/sofie-package-manager) Handles media asset transfer and media file management for pulling new files, deleting expired files on playout devices and generating additional metadata (previews, thumbnails, automated QA checks) in a more performant, and possibly distributed, way. Can smartly figure out how to get a file on storage A to playout server B. ## Libraries There are a number of libraries used in the Sofie ecosystem: -* [**ATEM Connection**](https://github.com/nrkno/sofie-atem-connection) Library for communicating with Blackmagic Design's ATEM mixers -* [**ATEM State**](https://github.com/nrkno/sofie-atem-state) Used in TSR to tracks the state of ATEMs and generate commands to control them. -* [**CasparCG Server Connection**](https://github.com/SuperFlyTV/casparcg-connection) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Library to connect and interact with CasparCG Servers. -* [**CasparCG State**](https://github.com/superflytv/casparcg-state) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Used in TSR to tracks the state of CasparCG Servers and generate commands to control them. -* [**Ember+ Connection**](https://github.com/nrkno/sofie-emberplus-connection) Library to communicate with _Ember+_ control protocol -* [**HyperDeck Connection**](https://github.com/nrkno/sofie-hyperdeck-connection) Library for connecting to Blackmagic Design's HyperDeck recorders. -* [**MOS Connection**](https://github.com/nrkno/sofie-mos-connection/) A [_MOS protocol_](http://mosprotocol.com/) library for acting as a MOS device and connecting to an newsroom control system. -* [**Quantel Gateway Client**](https://github.com/nrkno/sofie-quantel-gateway-client) An interface that talks to the Quantel-Gateway application. -* [**Sofie Core Integration**](https://github.com/nrkno/sofie-core-integration) Used to connect to the [Sofie Core](https://github.com/nrkno/sofie-core) by the Gateways. -* [**Sofie Blueprints Integration**](https://github.com/nrkno/sofie-sofie-blueprints-integration) Common types and interfaces used by both Sofie Core and the user-defined blueprints. -* [**SuperFly-Timeline**](https://github.com/SuperFlyTV/supertimeline) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Resolver and rules for placing objects on a virtual timeline. -* [**ThreadedClass**](https://github.com/nytamin/threadedClass) developed by **[_Nytamin_](https://github.com/nytamin)** Used in TSR to spawn device controllers in separate processes. -* [**Timeline State Resolver**](https://github.com/nrkno/sofie-timeline-state-resolver) \(TSR\) The main driver in **Playout Gateway,** handles connections to playout-devices and sends commands based on a **Timeline** received from **Core**. - - +- [**ATEM Connection**](https://github.com/nrkno/sofie-atem-connection) Library for communicating with Blackmagic Design's ATEM mixers +- [**ATEM State**](https://github.com/nrkno/sofie-atem-state) Used in TSR to tracks the state of ATEMs and generate commands to control them. +- [**CasparCG Server Connection**](https://github.com/SuperFlyTV/casparcg-connection) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Library to connect and interact with CasparCG Servers. +- [**CasparCG State**](https://github.com/superflytv/casparcg-state) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Used in TSR to tracks the state of CasparCG Servers and generate commands to control them. +- [**Ember+ Connection**](https://github.com/nrkno/sofie-emberplus-connection) Library to communicate with _Ember+_ control protocol +- [**HyperDeck Connection**](https://github.com/nrkno/sofie-hyperdeck-connection) Library for connecting to Blackmagic Design's HyperDeck recorders. +- [**MOS Connection**](https://github.com/nrkno/sofie-mos-connection/) A [_MOS protocol_](http://mosprotocol.com/) library for acting as a MOS device and connecting to an newsroom control system. +- [**Quantel Gateway Client**](https://github.com/nrkno/sofie-quantel-gateway-client) An interface that talks to the Quantel-Gateway application. +- [**Sofie Core Integration**](https://github.com/nrkno/sofie-core-integration) Used to connect to the [Sofie Core](https://github.com/nrkno/sofie-core) by the Gateways. +- [**Sofie Blueprints Integration**](https://github.com/nrkno/sofie-sofie-blueprints-integration) Common types and interfaces used by both Sofie Core and the user-defined blueprints. +- [**SuperFly-Timeline**](https://github.com/SuperFlyTV/supertimeline) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Resolver and rules for placing objects on a virtual timeline. +- [**ThreadedClass**](https://github.com/nytamin/threadedClass) developed by **[_Nytamin_](https://github.com/nytamin)** Used in TSR to spawn device controllers in separate processes. +- [**Timeline State Resolver**](https://github.com/nrkno/sofie-timeline-state-resolver) \(TSR\) The main driver in **Playout Gateway,** handles connections to playout-devices and sends commands based on a **Timeline** received from **Core**. There are also a few typings-only libraries that define interfaces between applications: -* [**Blueprints Integration**](https://www.npmjs.com/package/@sofie-automation/blueprints-integration) Defines the interface between [**Blueprints**](../user-guide/concepts-and-architecture.md#blueprints) and **Sofie Core**. -* [**Timeline State Resolver types**](https://www.npmjs.com/package/timeline-state-resolver-types) Defines the interface between [**Blueprints**](../user-guide/concepts-and-architecture.md#blueprints) and the timeline that will be fed into **TSR** for playout. +- [**Blueprints Integration**](https://www.npmjs.com/package/@sofie-automation/blueprints-integration) Defines the interface between [**Blueprints**](../user-guide/concepts-and-architecture.md#blueprints) and **Sofie Core**. +- [**Timeline State Resolver types**](https://www.npmjs.com/package/timeline-state-resolver-types) Defines the interface between [**Blueprints**](../user-guide/concepts-and-architecture.md#blueprints) and the timeline that will be fed into **TSR** for playout. ## Other Sofie-related Repositories -* [**CasparCG Server** \(NRK fork\)](https://github.com/nrkno/sofie-casparcg-server) Sofie-specific fork of CasparCG Server. -* [**CasparCG Launcher**](https://github.com/nrkno/sofie-casparcg-launcher) Launcher, controller, and logger for CasparCG Server. -* [**CasparCG Media Scanner** \(NRK fork\)](https://github.com/nrkno/sofie-casparcg-server) Sofie-specific fork of CasparCG Server 2.2 Media Scanner. -* [**Sofie Chef**](https://github.com/nrkno/sofie-chef) A simple Chromium based renderer, used for kiosk mode rendering of web pages. -* [**Media Manager**](https://github.com/nrkno/sofie-media-management) *(deprecated)* Handles media transfer and media file management for pulling new files and deleting expired files on playout devices. -* [**Quantel Browser Plugin**](https://github.com/nrkno/sofie-quantel-browser-plugin) MOS-compatible Quantel video clip browser for use with Sofie. -* [**Sisyfos Audio Controller**](https://github.com/nrkno/sofie-sisyfos-audio-controller) *developed by [_olzzon_](https://github.com/olzzon/)* -* [**Quantel Gateway**](https://github.com/nrkno/sofie-quantel-gateway) CORBA to REST gateway for _Quantel/ISA_ playback. - - - +- [**CasparCG Server** \(NRK fork\)](https://github.com/nrkno/sofie-casparcg-server) Sofie-specific fork of CasparCG Server. +- [**CasparCG Launcher**](https://github.com/nrkno/sofie-casparcg-launcher) Launcher, controller, and logger for CasparCG Server. +- [**CasparCG Media Scanner** \(NRK fork\)](https://github.com/nrkno/sofie-casparcg-server) Sofie-specific fork of CasparCG Server 2.2 Media Scanner. +- [**Sofie Chef**](https://github.com/nrkno/sofie-chef) A simple Chromium based renderer, used for kiosk mode rendering of web pages. +- [**Media Manager**](https://github.com/nrkno/sofie-media-management) _(deprecated)_ Handles media transfer and media file management for pulling new files and deleting expired files on playout devices. +- [**Quantel Browser Plugin**](https://github.com/nrkno/sofie-quantel-browser-plugin) MOS-compatible Quantel video clip browser for use with Sofie. +- [**Sisyfos Audio Controller**](https://github.com/nrkno/sofie-sisyfos-audio-controller) _developed by [*olzzon*](https://github.com/olzzon/)_ +- [**Quantel Gateway**](https://github.com/nrkno/sofie-quantel-gateway) CORBA to REST gateway for _Quantel/ISA_ playback. diff --git a/packages/documentation/versioned_docs/version-1.49.0/user-guide/concepts-and-architecture.md b/packages/documentation/versioned_docs/version-1.49.0/user-guide/concepts-and-architecture.md index b01cdbb2a6..3f03f9d178 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/user-guide/concepts-and-architecture.md +++ b/packages/documentation/versioned_docs/version-1.49.0/user-guide/concepts-and-architecture.md @@ -11,7 +11,7 @@ sidebar_position: 1 ### Sofie Core **Sofie Core** is a web server which handle business logic and serves the web GUI. -It is a [NodeJS](https://nodejs.org/) process backed up by a [MongoDB](https://www.mongodb.com/) database and based on the framework [Meteor](http://meteor.com/). +It is a [NodeJS](https://nodejs.org/) process backed up by a [MongoDB](https://www.mongodb.com/) database and based on the framework [Meteor](http://meteor.com/). ### Gateways @@ -87,8 +87,6 @@ An AdLib isn't added to the Part in the GUI until it starts playing, instead you Being a web-based system, Sofie has a number of customisable, user-facing web [views](features/sofie-views.mdx) used for control and monitoring. - - ## Blueprints Blueprints are plug-ins that run in Sofie Core. They interpret the data coming in from the rundowns and transform them into a rich set of playable elements \(Segments, Parts, AdLibs etc\). @@ -134,7 +132,7 @@ The [Playout Gateway](../for-developers/libraries.md) picks up the timeline from The Sofie system is made to work with a modern web- and IT-based approach in mind. Therefore, the Sofie Core can be run either on-site, or in an off-site cloud. -![Sofie Core can run in the cloud](/img/docs/main/features/sofie-web-architecture.png) +![Sofie Core can run in the cloud](/img/docs/main/features/sofie-web-architecture.png) One drawback of running in a cloud over the public internet is the - sometimes unpredictable - latency. The Timeline overcomes this by moving all the immediate control of the playout devices to the Playout Gateway, which is intended to run on a local network, close to the hardware it controls. This also gives the system a simple way of load-balancing - since the number of web-clients or load on Sofie Core won't affect the playout. diff --git a/packages/documentation/versioned_docs/version-1.49.0/user-guide/configuration/_category_.json b/packages/documentation/versioned_docs/version-1.49.0/user-guide/configuration/_category_.json index d2aee9ef5b..c4e45c2347 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/user-guide/configuration/_category_.json +++ b/packages/documentation/versioned_docs/version-1.49.0/user-guide/configuration/_category_.json @@ -1,4 +1,4 @@ { - "label": "Configuration", - "position": 4 -} \ No newline at end of file + "label": "Configuration", + "position": 4 +} diff --git a/packages/documentation/versioned_docs/version-1.49.0/user-guide/configuration/settings-view.md b/packages/documentation/versioned_docs/version-1.49.0/user-guide/configuration/settings-view.md index 2a4a3e6a25..3734ab3761 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/user-guide/configuration/settings-view.md +++ b/packages/documentation/versioned_docs/version-1.49.0/user-guide/configuration/settings-view.md @@ -1,6 +1,7 @@ --- sidebar_position: 2 --- + # Settings View :::caution @@ -54,9 +55,9 @@ The clean up process in Sofie will search the database for unused data and index A _Studio_ in Sofie-terms is a physical location, with a specific set of devices and equipment. Only one show can be on air in a studio at the same time. The _studio_ settings are settings for that specific studio, and contains settings related to hardware and playout, such as: -* **Attached devices** - the Gateways related to this studio -* **Blueprint configuration** - custom config option defined by the blueprints -* **Layer Mappings** - Maps the logical _timeline layers_ to physical devices and outputs +- **Attached devices** - the Gateways related to this studio +- **Blueprint configuration** - custom config option defined by the blueprints +- **Layer Mappings** - Maps the logical _timeline layers_ to physical devices and outputs The Studio uses a studio-blueprint, which handles things like mapping up an incoming rundown to a Showstyle. @@ -84,9 +85,9 @@ In order to allow the Producer to reconfigure the automation from the Switchboar A Route Set is essentially a distinct set of Layer Mappings, which can modify the settings already configured by the Layer Mappings, but can be turned On and Off. Called Routes, these can change: -* the Layer ID to a new Layer ID -* change the Device being controlled by the Layer -* change the aspect of the Device that's being controlled. +- the Layer ID to a new Layer ID +- change the Device being controlled by the Layer +- change the aspect of the Device that's being controlled. Route Sets can be grouped into Exclusivity Groups, in which only a single Route Set can be enabled at a time. When activating a Route Set within an Exclusivity Group, all other Route Sets in that group will be deactivated. This in turn, allows the System Administrator to create entire sections of exclusive automation control within the Studio that the Producer can then switch between. One such example could be switching between Primary and Backup playout servers, or switching between Primary and Backup talent microphone. @@ -115,10 +116,10 @@ Route Sets can also be configured with a _Default State_. This can be used to co A _Showstyle_ is related to the looks and logic of a _show_, which in contrast to the _studio_ is not directly related to the hardware. The Showstyle contains settings like -* **Source Layers** - Groups different types of content in the GUI -* **Output Channels** - Indicates different output targets \(such as the _Program_ or _back-screen in the studio_\) -* **Action Triggers** - Select how actions can be started on a per-show basis, outside of the on-screen controls -* **Blueprint configuration** - custom config option defined by the blueprints +- **Source Layers** - Groups different types of content in the GUI +- **Output Channels** - Indicates different output targets \(such as the _Program_ or _back-screen in the studio_\) +- **Action Triggers** - Select how actions can be started on a per-show basis, outside of the on-screen controls +- **Blueprint configuration** - custom config option defined by the blueprints :::caution Please note the difference between _Source Layers_ and _timeline-layers_: @@ -128,12 +129,12 @@ Please note the difference between _Source Layers_ and _timeline-layers_: [Timeline-objects](../concepts-and-architecture.md#timeline-object) \(inside of the [Pieces](../concepts-and-architecture.md#piece)\) are put onto timeline-layers, which are \(through the Mappings in the studio\) mapped to physical devices and outputs. The exact timeline-layer is never exposed to the user, but instead used on the technical level to control playout. -An example of the difference could be when playing a VT \(that's a Source Layer\), which could involve all of the timeline-layers _video\_player0_, _audio\_fader\_video_, _audio\_fader\_host_ and _mixer\_pgm._ +An example of the difference could be when playing a VT \(that's a Source Layer\), which could involve all of the timeline-layers _video_player0_, _audio_fader_video_, _audio_fader_host_ and _mixer_pgm._ ::: ### Action Triggers -This is a way to set up how - outside of the Point-and-Click Graphical User Interface - actions can be performed in the User Interface. Commonly, these are the *hotkey combinations* that can be used to either trigger AdLib content or other actions in the larger system. This is done by creating sets of Triggers and Actions to be triggered by them. These pairs can be set at the Show Style level or at the _Sofie Core_ (System) level, for common actions such as doing a Take or activating a Rundown, where you want a shared method of operation. _Sofie Core_ migrations will set up a base set of basic, system-wide Action Triggers for interacting with rundowns, but they can be changed by the System blueprint. +This is a way to set up how - outside of the Point-and-Click Graphical User Interface - actions can be performed in the User Interface. Commonly, these are the _hotkey combinations_ that can be used to either trigger AdLib content or other actions in the larger system. This is done by creating sets of Triggers and Actions to be triggered by them. These pairs can be set at the Show Style level or at the _Sofie Core_ (System) level, for common actions such as doing a Take or activating a Rundown, where you want a shared method of operation. _Sofie Core_ migrations will set up a base set of basic, system-wide Action Triggers for interacting with rundowns, but they can be changed by the System blueprint. ![Action triggers define modes of interacting with a Rundown](/img/docs/main/features/action_triggers_3.png) @@ -141,9 +142,9 @@ This is a way to set up how - outside of the Point-and-Click Graphical User Inte The triggers are designed to be either client-specific or issued by a peripheral device module. -Currently, the Action Triggers system supports setting up two types of triggeers: Hotkeys and Device Triggers. +Currently, the Action Triggers system supports setting up two types of triggeers: Hotkeys and Device Triggers. -Hotkeys are valid in the scope of a browser window and can be either a single key, a combination of keys (*combo*) or a *chord* - a sequnece of key combinations pressed in a particular order. *Chords* are popular in some text editing applications and vastly expand the amount of actions that can be triggered from a keyboard, at the expense of the time needed to execute them. Currently, the Hotkey editor in Sofie does not support creating *Chords*, but they can be specified by Blueprints during migrations. +Hotkeys are valid in the scope of a browser window and can be either a single key, a combination of keys (_combo_) or a _chord_ - a sequnece of key combinations pressed in a particular order. _Chords_ are popular in some text editing applications and vastly expand the amount of actions that can be triggered from a keyboard, at the expense of the time needed to execute them. Currently, the Hotkey editor in Sofie does not support creating _Chords_, but they can be specified by Blueprints during migrations. To edit a given trigger, click on the trigger pill on the left of the Trigger-Action set. When hovering, a **+** sign will appear, allowing you to add a new trigger to the set. @@ -151,9 +152,9 @@ Device Triggers are valid in the scope of a Studio and will be evaluated on the #### Actions -The actions are built using a base *action* (such as *Activate a Rundown* or *AdLib*) and a set of *filters*, limiting the scope of the *action*. Optionally, some of these *actions* can take additional *parameters*. These filters can operate on various types of objects, depending on the action in question. All actions currently require that the chain of filters starts with scoping out the Rundown the action is supposed to affect. Currently, there is only one type of Rundown-level filter supported: "The Rundown currently in view". +The actions are built using a base _action_ (such as _Activate a Rundown_ or _AdLib_) and a set of _filters_, limiting the scope of the _action_. Optionally, some of these _actions_ can take additional _parameters_. These filters can operate on various types of objects, depending on the action in question. All actions currently require that the chain of filters starts with scoping out the Rundown the action is supposed to affect. Currently, there is only one type of Rundown-level filter supported: "The Rundown currently in view". -The Action Triggers user interface guides the user in a wizzard-like fashion through the available *filter* options on a given *action*. +The Action Triggers user interface guides the user in a wizzard-like fashion through the available _filter_ options on a given _action_. ![Actions can take additional parameters](/img/docs/main/features/action_triggers_2.png) @@ -161,7 +162,7 @@ If the action provides a preview of the triggered items and there is an availabl ![A preview of the action, as scoped by the filters](/img/docs/main/features/action_triggers_4.png) -Clicking on the action and filter pills allows you to edit the action parameters and filter parameters. *Limit* limits the amount of objects to only the first *N* objects matched - this can significantly improve performance on large data sets. *Pick* and *Pick last* filters end the chain of the filters by selecting a single item from the filtered set of objects (the *N-th* object from the beginning or the end, respectively). *Pick* implicitly contains a *Limit* for the performance improvement. This is not true for *Pick last*, though. +Clicking on the action and filter pills allows you to edit the action parameters and filter parameters. _Limit_ limits the amount of objects to only the first _N_ objects matched - this can significantly improve performance on large data sets. _Pick_ and _Pick last_ filters end the chain of the filters by selecting a single item from the filtered set of objects (the _N-th_ object from the beginning or the end, respectively). _Pick_ implicitly contains a _Limit_ for the performance improvement. This is not true for _Pick last_, though. ## Migrations @@ -170,4 +171,3 @@ The migrations are automatic setup-scripts that help you during initial setup an There are system-migrations that comes directly from the version of _Sofie Core_ you're running, and there are also migrations added by the different blueprints. It is mandatory to run migrations when you've upgraded _Sofie Core_ to a new version, or upgraded your blueprints. - diff --git a/packages/documentation/versioned_docs/version-1.49.0/user-guide/faq.md b/packages/documentation/versioned_docs/version-1.49.0/user-guide/faq.md index e832a36f5c..fb47871bb4 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/user-guide/faq.md +++ b/packages/documentation/versioned_docs/version-1.49.0/user-guide/faq.md @@ -8,10 +8,9 @@ All main components are using the [MIT license](https://opensource.org/licenses/ Everything needed to install and configure a fully functioning Sofie system is publicly available, with the following exceptions: -* A rundown data set describing the actual TV show and of media assets. -* Blueprints for your specific show. +- A rundown data set describing the actual TV show and of media assets. +- Blueprints for your specific show. ## When will feature _y_ become available? Check out the [issues page](https://github.com/nrkno/Sofie-TV-automation/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3ARelease), where there are notes on current and upcoming releases. - diff --git a/packages/documentation/versioned_docs/version-1.49.0/user-guide/features/_category_.json b/packages/documentation/versioned_docs/version-1.49.0/user-guide/features/_category_.json index 0dd70d8b0e..785c16360b 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/user-guide/features/_category_.json +++ b/packages/documentation/versioned_docs/version-1.49.0/user-guide/features/_category_.json @@ -1,4 +1,4 @@ { - "label": "Features", - "position": 2 -} \ No newline at end of file + "label": "Features", + "position": 2 +} diff --git a/packages/documentation/versioned_docs/version-1.49.0/user-guide/features/access-levels.md b/packages/documentation/versioned_docs/version-1.49.0/user-guide/features/access-levels.md index 50307f970e..3415b35bfe 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/user-guide/features/access-levels.md +++ b/packages/documentation/versioned_docs/version-1.49.0/user-guide/features/access-levels.md @@ -1,6 +1,7 @@ --- sidebar_position: 3 --- + # Access Levels A variety of access levels can be set via the URL. By default, a user cannot edit settings, nor play out anything. Some of the access levels provide additional administrative pages or helpful tool tips for new users. These modes are persistent between sessions and will need to be manually disabled by replacing the _1_ with a _0_ in the URL. Below is a quick reference to the modes and what they have access to. @@ -9,11 +10,10 @@ If user accounts are enabled \(`enableUserAccounts` in [_Sofie Core_ settin The access level is persisted in browser's Local Storage. To disable, visit`?theaccessmode=0`. -| Access area | Basic Mode | Configuration Mode | Studio Mode | Admin Mode | -| :--- | :--- | :--- | :--- | :--- | -| **Rundowns** | View Only | View Only | Yes, playout | Yes, playout | -| **Settings** | No | Yes | No | Yes | - +| Access area | Basic Mode | Configuration Mode | Studio Mode | Admin Mode | +| :----------- | :--------- | :----------------- | :----------- | :----------- | +| **Rundowns** | View Only | View Only | Yes, playout | Yes, playout | +| **Settings** | No | Yes | No | Yes | ### Basic mode diff --git a/packages/documentation/versioned_docs/version-1.49.0/user-guide/features/language.md b/packages/documentation/versioned_docs/version-1.49.0/user-guide/features/language.md index 9fe03d816e..3c61fb16c3 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/user-guide/features/language.md +++ b/packages/documentation/versioned_docs/version-1.49.0/user-guide/features/language.md @@ -1,9 +1,10 @@ --- sidebar_position: 7 --- + # Language -_Sofie_ uses the [i18n internationalisation framework](https://www.i18next.com/) that allows you to present user-facing views in multiple languages. +_Sofie_ uses the [i18n internationalisation framework](https://www.i18next.com/) that allows you to present user-facing views in multiple languages. ## Language selection @@ -14,10 +15,11 @@ The UI will automatically detect user browser's default matching and select the This choice is persisted in browser's local storage, and the same language will be used until a new forced language is chosen using this method. _Sofie_ currently supports three languages: -* English _(default)_ `en` -* Norwegian bokmål `nb` -* Norwegian nynorsk `nn` + +- English _(default)_ `en` +- Norwegian bokmål `nb` +- Norwegian nynorsk `nn` ## Further Reading -* [List of language tags](https://en.wikipedia.org/wiki/IETF_language_tag) \ No newline at end of file +- [List of language tags](https://en.wikipedia.org/wiki/IETF_language_tag) diff --git a/packages/documentation/versioned_docs/version-1.49.0/user-guide/features/prompter.md b/packages/documentation/versioned_docs/version-1.49.0/user-guide/features/prompter.md index 893e43f7af..086afa2e35 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/user-guide/features/prompter.md +++ b/packages/documentation/versioned_docs/version-1.49.0/user-guide/features/prompter.md @@ -28,7 +28,7 @@ The prompter UI can be configured using query parameters: | `showmarker` | 0 / 1 | If the marker is not set to "hide", control if the marker is hidden or not | `1` | | `showscroll` | 0 / 1 | Whether the scroll bar should be shown | `1` | | `followtake` | 0 / 1 | Whether the prompter should automatically scroll to current segment when the operator TAKE:s it | `1` | -| `showoverunder` | 0 / 1 | The timer in the top-right of the prompter, showing the overtime/undertime of the current show. | `1` | +| `showoverunder` | 0 / 1 | The timer in the top-right of the prompter, showing the overtime/undertime of the current show. | `1` | | `debug` | 0 / 1 | Whether to display a debug box showing controller input values and the calculated speed the prompter is currently scrolling at. Used to tweak speedMaps and ranges. | `0` | Example: [http://127.0.0.1/prompter/studio0/?mode=mouse&followtake=0&fontsize=20](http://127.0.0.1/prompter/studio0/?mode=mouse&followtake=0&fontsize=20) @@ -37,9 +37,9 @@ Example: [http://127.0.0.1/prompter/studio0/?mode=mouse&followtake=0&fontsize=20 The prompter can be controlled by different types of controllers. The control mode is set by a query parameter, like so: `?mode=mouse`. -| Query parameter | Description | -| :---------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| Default | Controlled by both mouse and keyboard | +| Query parameter | Description | +| :---------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Default | Controlled by both mouse and keyboard | | `?mode=mouse` | Controlled by mouse only. [See configuration details](prompter.md#control-using-mouse-scroll-wheel) | | `?mode=keyboard` | Controlled by keyboard only. [See configuration details](prompter.md#control-using-keyboard) | | `?mode=shuttlekeyboard` | Controlled by a Contour Design ShuttleXpress, X-keys Jog and Shuttle or any compatible, configured as keyboard-ish device. [See configuration details](prompter.md#control-using-contour-shuttlexpress-or-x-keys) | @@ -117,7 +117,7 @@ If you want to use traditional analogue pedals with 5 volt TRS connection, a con - `pedal_rangeNeutralMax` has to be greater than `pedal_rangeNeutralMin` - `pedal_rangeFwdMax` has to be greater than `pedal_rangeNeutralMax` -![Yamaha FC7 mapped for both a forward \(80-127\) and backwards \(0-35\) range.](/img/docs/main/features/yamaha-fc7.jpg) +![Yamaha FC7 mapped for both a forward (80-127) and backwards (0-35) range.](/img/docs/main/features/yamaha-fc7.jpg) The default values allow for both going forwards and backwards. This matches the _Yamaha FC7_ expression pedal. The default values create a forward-range from 80-127, a neutral zone from 35-80 and a reverse-range from 0-35. diff --git a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/_category_.json b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/_category_.json index 2f3c7f2a9f..b6be4c9d35 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/_category_.json +++ b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/_category_.json @@ -1,4 +1,4 @@ { - "label": "Installation", - "position": 3 -} \ No newline at end of file + "label": "Installation", + "position": 3 +} diff --git a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/initial-sofie-core-setup.md b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/initial-sofie-core-setup.md index c0672b3e55..91ed165f89 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/initial-sofie-core-setup.md +++ b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/initial-sofie-core-setup.md @@ -6,7 +6,7 @@ sidebar_position: 3 #### Prerequisites -* [Installed and running _Sofie Core_](installing-sofie-server-core.md) +- [Installed and running _Sofie Core_](installing-sofie-server-core.md) Once _Sofie Core_ has been installed and is running you can begin setting it up. The first step is to navigate to the _Settings page_. Please review the [Sofie Access Level](../features/access-levels.md) page for assistance getting there. diff --git a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-a-gateway/_category_.json b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-a-gateway/_category_.json index 7fa55d484d..e83c1db9e5 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-a-gateway/_category_.json +++ b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-a-gateway/_category_.json @@ -1,4 +1,4 @@ { - "label": "Installing a Gateway", - "position": 5 -} \ No newline at end of file + "label": "Installing a Gateway", + "position": 5 +} diff --git a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-a-gateway/intro.md b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-a-gateway/intro.md index 03bc8a5339..d8c6539cae 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-a-gateway/intro.md +++ b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-a-gateway/intro.md @@ -2,11 +2,12 @@ sidebar_label: Introduction sidebar_position: 1 --- + # Introduction: Installing a Gateway #### Prerequisites -* [Installed and running Sofie Core](../installing-sofie-server-core.md) +- [Installed and running Sofie Core](../installing-sofie-server-core.md) The _Sofie Core_ is the primary application for managing the broadcast, but it doesn't play anything out on it's own. A Gateway will establish the connection from _Sofie Core_ to other pieces of hardware or remote software. A basic setup may include the [Spreadsheet Gateway](rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support.md) which will ingest a rundown from Google Sheets then, use the [Playout Gateway](playout-gateway.md) send commands to a CasparCG Server graphics playout, an ATEM vision mixer, and / or the [Sisyfos audio controller](https://github.com/olzzon/sisyfos-audio-controller). @@ -14,12 +15,11 @@ Installing a gateway is a two part process. To begin, you will [add the required ### Rundown & Newsroom Gateways -* [Google Spreadsheet Gateway](rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support.md) -* [iNEWS Gateway](rundown-or-newsroom-system-connection/inews-gateway.md) -* [MOS Gateway](rundown-or-newsroom-system-connection/mos-gateway.md) +- [Google Spreadsheet Gateway](rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support.md) +- [iNEWS Gateway](rundown-or-newsroom-system-connection/inews-gateway.md) +- [MOS Gateway](rundown-or-newsroom-system-connection/mos-gateway.md) ### Playout & Media Manager Gateways -* [Playout Gateway](playout-gateway.md) -* [Media Manager](../media-manager.md) - +- [Playout Gateway](playout-gateway.md) +- [Media Manager](../media-manager.md) diff --git a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-a-gateway/playout-gateway.md b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-a-gateway/playout-gateway.md index 0fd5f47626..0d90911760 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-a-gateway/playout-gateway.md +++ b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-a-gateway/playout-gateway.md @@ -1,6 +1,7 @@ --- sidebar_position: 3 --- + # Playout Gateway The _Playout Gateway_ handles interacting external pieces of hardware or software by sending commands that will playout rundown content. This gateway used to be a separate installation but it has since been moved into the main _Sofie Core_ component. diff --git a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json index b4c4ffc34d..ae77b5c6a7 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json +++ b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json @@ -1,4 +1,4 @@ { "label": "Rundown or Newsroom System Connection", "position": 4 -} \ No newline at end of file +} diff --git a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md index 48659251a6..0d67551638 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md +++ b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md @@ -4,9 +4,8 @@ The iNEWS Gateway communicates with an iNEWS system to ingest and remain in sync ### Installing iNEWS for Sofie -The iNEWS Gateway allows you to create rundowns from within iNEWS and sync them with the _Sofie Core_. The rundowns will update in real time and any changes made will be seen from within your Playout Timeline. +The iNEWS Gateway allows you to create rundowns from within iNEWS and sync them with the _Sofie Core_. The rundowns will update in real time and any changes made will be seen from within your Playout Timeline. The setup for the iNEWS Gateway is already in the Docker Compose file you downloaded earlier. Remove the _\#_ symbol from the start of the line labeled `image: tv2/inews-ftp-gateway:develop` and add a _\#_ to the other ingest gateway that was being used. Although the iNEWS Gateway is available free of charge, an iNEWS license is not. Visit [Avid's website](https://www.avid.com/products/inews/how-to-buy) to find an iNEWS reseller that handles your geographic area. - diff --git a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md index cf2c62a508..dcdc7db5b6 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md +++ b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md @@ -2,13 +2,10 @@ Sofie Core doesn't talk directly to the newsroom systems, but instead via one of the Gateways. -The Google Spreadsheet Gateway, iNEWS Gateway, and the MOS \( [Media Object Server Communications Protocol](http://mosprotocol.com/) \) Gateway which can handle interacting with any system that communicates via MOS. +The Google Spreadsheet Gateway, iNEWS Gateway, and the MOS \( [Media Object Server Communications Protocol](http://mosprotocol.com/) \) Gateway which can handle interacting with any system that communicates via MOS. ### Further Reading -* [MOS Protocol Overview & Documentation](http://mosprotocol.com/) -* [iNEWS on Avid's Website](https://www.avid.com/products/inews/how-to-buy) -* [ENPS on The Associated Press' Website](https://www.ap.org/enps/support) - - - +- [MOS Protocol Overview & Documentation](http://mosprotocol.com/) +- [iNEWS on Avid's Website](https://www.avid.com/products/inews/how-to-buy) +- [ENPS on The Associated Press' Website](https://www.ap.org/enps/support) diff --git a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md index 8a2a60145c..9f1aa88995 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md +++ b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md @@ -5,5 +5,3 @@ The MOS Gateway communicates with a device that supports the [MOS protocol](http The setup for the MOS Gateway is handled in the Docker Compose in the [Quick Install](../../installing-sofie-server-core.md) page. One thing to note if managing the mos-gateway manually: It needs a few ports open \(10540, 10541\) for MOS-messages to be pushed to it from the NCS. - - diff --git a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-connections-and-additional-hardware/README.md b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-connections-and-additional-hardware/README.md index 4d35fb277d..a2205dd173 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-connections-and-additional-hardware/README.md +++ b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-connections-and-additional-hardware/README.md @@ -2,34 +2,40 @@ #### Prerequisites -* [Installed and running Sofie Core](../installing-sofie-server-core.md) -* [Installed Playout Gateway](../installing-a-gateway/playout-gateway.md) -* [Installed and configured Studio Blueprints](../installing-blueprints.md#installing-a-studio-blueprint) +- [Installed and running Sofie Core](../installing-sofie-server-core.md) +- [Installed Playout Gateway](../installing-a-gateway/playout-gateway.md) +- [Installed and configured Studio Blueprints](../installing-blueprints.md#installing-a-studio-blueprint) The following pages are broken up by equipment type that is supported by Sofie's Gateways. ## Playout & Recording -* [CasparCG Graphics and Video Server](casparcg-server-installation.md) - _Graphics / Playout / Recording_ -* [Blackmagic Design's HyperDeck](https://www.blackmagicdesign.com/products/hyperdeckstudio) - _Recording_ -* [Quantel](http://www.quantel.com) Solutions - _Playout_ -* [Vizrt](https://www.vizrt.com/) Graphics Solutions - _Graphics / Playout_ + +- [CasparCG Graphics and Video Server](casparcg-server-installation.md) - _Graphics / Playout / Recording_ +- [Blackmagic Design's HyperDeck](https://www.blackmagicdesign.com/products/hyperdeckstudio) - _Recording_ +- [Quantel](http://www.quantel.com) Solutions - _Playout_ +- [Vizrt](https://www.vizrt.com/) Graphics Solutions - _Graphics / Playout_ ## Vision Mixers -* [Blackmagic's ATEM](https://www.blackmagicdesign.com/products/atem) hardware vision mixers -* [vMix](https://www.vmix.com/) software vision mixer \(coming soon\) + +- [Blackmagic's ATEM](https://www.blackmagicdesign.com/products/atem) hardware vision mixers +- [vMix](https://www.vmix.com/) software vision mixer \(coming soon\) ## Audio Mixers -* [Sisyfos](https://github.com/olzzon/sisyfos-audio-controller) audio controller -* [Lawo sound mixers_,_](https://www.lawo.com/applications/broadcast-production/audio-consoles.html) _using emberplus protocol_ -* Generic OSC \(open sound control\) + +- [Sisyfos](https://github.com/olzzon/sisyfos-audio-controller) audio controller +- [Lawo sound mixers*,*](https://www.lawo.com/applications/broadcast-production/audio-consoles.html) _using emberplus protocol_ +- Generic OSC \(open sound control\) ## PTZ Cameras -* [Panasonic PTZ](https://pro-av.panasonic.net/en/products/ptz_camera_systems.html) cameras + +- [Panasonic PTZ](https://pro-av.panasonic.net/en/products/ptz_camera_systems.html) cameras ## Lights -* [Pharos](https://www.pharoscontrols.com/) light control + +- [Pharos](https://www.pharoscontrols.com/) light control ## Other -* Generic OSC \(open sound control\) -* Generic HTTP requests \(to control http-REST interfaces\) -* Generic TCP-socket + +- Generic OSC \(open sound control\) +- Generic HTTP requests \(to control http-REST interfaces\) +- Generic TCP-socket diff --git a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-connections-and-additional-hardware/_category_.json b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-connections-and-additional-hardware/_category_.json index d3e1e8979e..4d800e9a88 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-connections-and-additional-hardware/_category_.json +++ b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-connections-and-additional-hardware/_category_.json @@ -1,4 +1,4 @@ { - "label": "Installing Connections and Additional Hardware", - "position": 6 -} \ No newline at end of file + "label": "Installing Connections and Additional Hardware", + "position": 6 +} diff --git a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md index 1515b08840..5c3c9b0234 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md +++ b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md @@ -1,6 +1,6 @@ # Configuring Vision Mixers -## ATEM – Blackmagic Design +## ATEM – Blackmagic Design The [Playout Gateway](../installing-a-gateway/playout-gateway.md) supports communicating with the entire line up of Blackmagic Design's ATEM vision mixers. @@ -11,4 +11,3 @@ Once your ATEM is properly configured on the network, you can add it as a device ### Additional Information Sofie does not support connecting to a vision mixer hardware panels. All interacts with the vision mixers must be handled within a Rundown. - diff --git a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-input-gateway.md b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-input-gateway.md index 5d809d74af..a433a34fde 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-input-gateway.md +++ b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-input-gateway.md @@ -14,21 +14,20 @@ If not connecting over HTTPS, remove the `--https` flag. Input Gateway can be launched from [CasparCG Launcher](./installing-connections-and-additional-hardware/casparcg-server-installation#installing-the-casparcg-launcher). This will make management and log collection easier on a production system. -You can now open the _Sofie Core_, `http://localhost:3000`, and navigate to the _Settings page_. You will see your _Input Gateway_ under the _Devices_ section of the menu. In _Input Devices_ you can add devices that this instance of Input Gateway should handle. Some of the device integrations will allow you to customize the Feedback behavior. The *Device ID* property will identify a given Input Device in the Studio, so this property can be used for fail-over purposes. +You can now open the _Sofie Core_, `http://localhost:3000`, and navigate to the _Settings page_. You will see your _Input Gateway_ under the _Devices_ section of the menu. In _Input Devices_ you can add devices that this instance of Input Gateway should handle. Some of the device integrations will allow you to customize the Feedback behavior. The _Device ID_ property will identify a given Input Device in the Studio, so this property can be used for fail-over purposes. ## Supported devices and protocols Currently, input gateway supports: -* Stream Deck panels -* Skaarhoj panels - _TCP Raw Panel_ mode -* X-Keys panels -* MIDI controllers -* OSC -* HTTP +- Stream Deck panels +- Skaarhoj panels - _TCP Raw Panel_ mode +- X-Keys panels +- MIDI controllers +- OSC +- HTTP ### Further Reading -* [Input Gateway Releases on GitHub](https://github.com/nrkno/sofie-input-gateway/releases) -* [Input Gateway GitHub Page for Developers](https://github.com/nrkno/sofie-input-gateway) - +- [Input Gateway Releases on GitHub](https://github.com/nrkno/sofie-input-gateway/releases) +- [Input Gateway GitHub Page for Developers](https://github.com/nrkno/sofie-input-gateway) diff --git a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-package-manager.md b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-package-manager.md index bd6cbf3a15..677a583a5e 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-package-manager.md +++ b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/installing-package-manager.md @@ -49,7 +49,6 @@ To setup, go into Core and add this device to a Studio This first run is necessary to get the Package Manager device registered with _Sofie Core_. We'll restart Package Manager later on in the [Configuration](#configuration) instructions. - ## Installation In Production We provide pre-built executables for Windows (x64) systems that can be used in production environments. These can be found on the [Releases](https://github.com/nrkno/sofie-package-manager/releases) GitHub repository page for Package Manager. For a minimal installation, you'll need the `package-manager-single-app.exe` and `worker.exe`. Put them in a folder of your choice. You can also place `ffmpeg.exe` and `ffprobe.exe` alongside them, if you don't want to make them available in `PATH`. diff --git a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/intro.md b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/intro.md index c3a14c218b..8ac8fdf3d6 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/intro.md +++ b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/intro.md @@ -1,37 +1,35 @@ --- sidebar_position: 1 --- + # Getting Started _Sofie_ can be installed in many different ways, depending on which platforms, needs, and features you desire. The _Sofie_ system consists of several applications that work together to provide complete broadcast automation system. Each of these components' installation will be covered in this guide. Additional information about the products or services mentioned alongside the Sofie Installation can be found on the [Further Reading](../further-reading.md). There are four minimum required components to get a Sofie system up and running. First you need the [_Sofie Core_](installing-sofie-server-core.md), which is the brains of the operation. Then a set of [_Blueprints_](installing-blueprints.md) to handle and interpret incoming and outgoing data. Next, an [_Ingest Gateway_](installing-a-gateway/rundown-or-newsroom-system-connection/intro.md) to fetch the data for the Blueprints. Then finally, a [_Playout Gateway_](installing-a-gateway/playout-gateway.md) to send the data to your playout device of choice. - - ## Sofie Core View -The _Rundowns_ view will display all the active rundowns that the _Sofie Core_ has access to. +The _Rundowns_ view will display all the active rundowns that the _Sofie Core_ has access to. ![Rundown View](/img/docs/getting-started/rundowns-in-sofie.png) The _Status_ views displays the current status for the attached devices and gateways. -![Status View – Describes the state of _Sofie Core_](/img/docs/getting-started/status-page.jpg) +![Status View – Describes the state of _Sofie Core_](/img/docs/getting-started/status-page.jpg) -The _Settings_ views contains various settings for the studio, show styles, blueprints etc.. If the link to the settings view is not visible in your application, check your [Access Levels](../features/access-levels.md). More info on specific parts of the _Settings_ view can be found in their corresponding guide sections. +The _Settings_ views contains various settings for the studio, show styles, blueprints etc.. If the link to the settings view is not visible in your application, check your [Access Levels](../features/access-levels.md). More info on specific parts of the _Settings_ view can be found in their corresponding guide sections. -![Settings View – Describes how the _Sofie Core_ is configured](/img/docs/getting-started/settings-page.jpg) +![Settings View – Describes how the _Sofie Core_ is configured](/img/docs/getting-started/settings-page.jpg) ## Sofie Core Overview -The _Sofie Core_ is the primary application for managing the broadcast but, it doesn't play anything out on it's own. You need to use Gateways to establish the connection from the _Sofie Core_ to other pieces of hardware or remote software. +The _Sofie Core_ is the primary application for managing the broadcast but, it doesn't play anything out on it's own. You need to use Gateways to establish the connection from the _Sofie Core_ to other pieces of hardware or remote software. ### Gateways -Gateways are separate applications that bridge the gap between the _Sofie Core_ and other pieces of hardware or services. At minimum, you will need a _Playout Gateway_ so your timeline can interact with your playout system of choice. To install the _Playout Gateway_, visit the [Installing a Gateway](installing-a-gateway/intro.md) section of this guide and for a more in-depth look, please see [Gateways](../concepts-and-architecture.md#gateways). +Gateways are separate applications that bridge the gap between the _Sofie Core_ and other pieces of hardware or services. At minimum, you will need a _Playout Gateway_ so your timeline can interact with your playout system of choice. To install the _Playout Gateway_, visit the [Installing a Gateway](installing-a-gateway/intro.md) section of this guide and for a more in-depth look, please see [Gateways](../concepts-and-architecture.md#gateways). ### Blueprints Blueprints can be described as the logic that determines how a studio and show should interact with one another. They interpret the data coming in from the rundowns and transform them into a rich set of playable elements \(_Segments_, _Parts_, _AdLibs,_ etcetera\). The _Sofie Core_ has three main blueprint types, _System Blueprints_, _Studio Blueprints_, and _Showstyle Blueprints_. Installing _Sofie_ does not require you understand what these blueprints do, just that they are required for the _Sofie Core_ to work. If you would like to gain a deeper understand of how _Blueprints_ work, please visit the [Blueprints](#blueprints) section. - diff --git a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/media-manager.md b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/media-manager.md index c286df52c3..5c966aec57 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/media-manager.md +++ b/packages/documentation/versioned_docs/version-1.49.0/user-guide/installation/media-manager.md @@ -10,12 +10,11 @@ Media Manager is deprecated and is not recommended for new deployments. There ar ::: -The Media Manager handles the media, or files, that make up the rundown content. To install it, begin by downloading the latest release of [Media Manager from GitHub](https://github.com/nrkno/sofie-media-management/releases). You can now run the `media-manager.exe` file inside the extracted folder. A warning window may popup about the app being unrecognized. You can get around this by selecting _More Info_ and clicking _Run Anyways_. A terminal window will open and begin running the application. +The Media Manager handles the media, or files, that make up the rundown content. To install it, begin by downloading the latest release of [Media Manager from GitHub](https://github.com/nrkno/sofie-media-management/releases). You can now run the `media-manager.exe` file inside the extracted folder. A warning window may popup about the app being unrecognized. You can get around this by selecting _More Info_ and clicking _Run Anyways_. A terminal window will open and begin running the application. -You can now open the _Sofie Core_, `http://localhost:3000`, and navigate to the _Settings page_. You will see your _Media Manager_ under the _Devices_ section of the menu. The four main sections, general properties, attached storage, media flows, monitors, as well as attached subdivides, all contribute to how the media is handled within the Sofie Core. +You can now open the _Sofie Core_, `http://localhost:3000`, and navigate to the _Settings page_. You will see your _Media Manager_ under the _Devices_ section of the menu. The four main sections, general properties, attached storage, media flows, monitors, as well as attached subdivides, all contribute to how the media is handled within the Sofie Core. ### Further Reading -* [Media Manager Releases on GitHub](https://github.com/nrkno/sofie-media-management/releases) -* [Media Manager GitHub Page for Developers](https://github.com/nrkno/sofie-media-management) - +- [Media Manager Releases on GitHub](https://github.com/nrkno/sofie-media-management/releases) +- [Media Manager GitHub Page for Developers](https://github.com/nrkno/sofie-media-management) diff --git a/packages/documentation/versioned_docs/version-1.49.0/user-guide/supported-devices.md b/packages/documentation/versioned_docs/version-1.49.0/user-guide/supported-devices.md index 55f27cd5ab..b49c1a4e41 100644 --- a/packages/documentation/versioned_docs/version-1.49.0/user-guide/supported-devices.md +++ b/packages/documentation/versioned_docs/version-1.49.0/user-guide/supported-devices.md @@ -1,6 +1,7 @@ --- sidebar_position: 1.5 --- + # Supported Playout Devices All playout devices are essentially driven through the _timeline_, which passes through _Sofie Core_ into the Playout Gateway where it is processed by the timeline-state-resolver. This page details which devices and what parts of the devices can be controlled through the timeline-state-resolver library. In general a blueprints developer can use the [timeline-state-resolver-types package](https://www.npmjs.com/package/timeline-state-resolver-types) to see the interfaces for the timeline objects used to control the devices. @@ -9,110 +10,110 @@ All playout devices are essentially driven through the _timeline_, which passes We support almost all features of these devices except fairlight audio, camera controls and streaming capabilities. A non-inclusive list: -* Control of camera inputs -* Transitions -* Full control of keyers -* Full control of DVE's -* Control of media pools -* Control of auxilliaries +- Control of camera inputs +- Transitions +- Full control of keyers +- Full control of DVE's +- Control of media pools +- Control of auxilliaries ## CasparCG Server Tested and developed against [a fork of version 2.1](https://github.com/nrkno/sofie-casparcg-server) with more support for version 2.3 being added in the future. -* Video playback -* Graphics playback -* Recording / streaming -* Mixer parameters -* Transitions +- Video playback +- Graphics playback +- Recording / streaming +- Mixer parameters +- Transitions ## HTTP Protocol -* GET/POST/PUT/DELETE methods -* Interval based watcher for status monitoring +- GET/POST/PUT/DELETE methods +- Interval based watcher for status monitoring ## Blackmagic Design HyperDeck -* Recording +- Recording ## Lawo Powercore & MC2 Series -* Control over faders - * Using the ramp function on the powercore -* Control of parameters in the ember tree +- Control over faders + - Using the ramp function on the powercore +- Control of parameters in the ember tree ## OSC protocol -* Sending of integers, floats, strings, blobs -* Tweening \(transitioning between\) values +- Sending of integers, floats, strings, blobs +- Tweening \(transitioning between\) values Can be configured in TCP or UDP mode. ## Panasonic PTZ Cameras -* Recalling presets -* Setting zoom, zoom speed and recall speed +- Recalling presets +- Setting zoom, zoom speed and recall speed ## Pharos Lighting Control -* Recalling scenes -* Recalling timelines +- Recalling scenes +- Recalling timelines ## Grass Valley SQ Media Servers -* Control of playback -* Looping -* Cloning +- Control of playback +- Looping +- Cloning _Note: some features are controlled through the Package Manager_ ## Shotoku Camera Robotics -* Cutting to shots -* Fading to shots +- Cutting to shots +- Fading to shots ## Singular Live -* Control nodes +- Control nodes _Note: this is not currently used in production by anyone we know of_ ## Sisyfos -* On-air controls -* Fader levels -* Labels -* Hide / show channels +- On-air controls +- Fader levels +- Labels +- Hide / show channels ## TCP Protocol -* Sending messages +- Sending messages ## VizRT Viz MSE -* Pilot elements -* Continue commands -* Loading all elements -* Clearing all elements +- Pilot elements +- Continue commands +- Loading all elements +- Clearing all elements ## vMix -* Full M/E control -* Audio control -* Streaming / recording control -* Fade to black -* Overlays -* Transforms -* Transitions +- Full M/E control +- Audio control +- Streaming / recording control +- Fade to black +- Overlays +- Transforms +- Transitions ## OBS -*Through OBS WebSocket v4 RPC API* +_Through OBS WebSocket v4 RPC API_ -* Current / Preview Scene -* Current Transition -* Recording -* Streaming -* Scene Item visibility -* Source Settings (FFmpeg source) -* Source Mute +- Current / Preview Scene +- Current Transition +- Recording +- Streaming +- Scene Item visibility +- Source Settings (FFmpeg source) +- Source Mute diff --git a/packages/documentation/versioned_docs/version-1.50.0/about-sofie.md b/packages/documentation/versioned_docs/version-1.50.0/about-sofie.md index 363475f108..0c022bcb7e 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/about-sofie.md +++ b/packages/documentation/versioned_docs/version-1.50.0/about-sofie.md @@ -19,4 +19,4 @@ _**Sofie**_ is a web-based TV automation system for studios and live shows, used - Modular data-ingest architecture, supports MOS and Google spreadsheets - Plug-in architecture for programming shows -_The NRK logo is a registered trademark of Norsk rikskringkasting AS. The license does not grant any right to use, in any way, any trademarks, service marks or logos of Norsk rikskringkasting AS._ \ No newline at end of file +_The NRK logo is a registered trademark of Norsk rikskringkasting AS. The license does not grant any right to use, in any way, any trademarks, service marks or logos of Norsk rikskringkasting AS._ diff --git a/packages/documentation/versioned_docs/version-1.50.0/for-developers/contribution-guidelines.md b/packages/documentation/versioned_docs/version-1.50.0/for-developers/contribution-guidelines.md index 4e6ffadc97..e878321ac8 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/for-developers/contribution-guidelines.md +++ b/packages/documentation/versioned_docs/version-1.50.0/for-developers/contribution-guidelines.md @@ -17,7 +17,6 @@ The Sofie team at NRK is responsible for development and maintenance. We also do The Sofie team welcomes open source contributions and will actively work towards enabling contributions to become mergeable into the Sofie repositories. However, as main stakeholder and maintainer we reserve the right to refuse any contributions. - ## About Contributions Thank you for considering contributing to the Sofie project! @@ -36,6 +35,7 @@ However, Sofie is a big project with many differing users and use cases. **Large 4. The contributor references the RFC when a pull request is ready. ### Base contributions on the in-development branch (or the master branch) + In order to facilitate merging, we ask that contributions are based on the latest (at the time of the pull request) _in-development_ branch (often named `release*`), alternatively the stable (eg. `master`) branch. NRK will take responsibility for rebasing stable contributions to the latest in-development branch if needed. See **CONTRIBUTING.md** in each official repository for details on which branch to use as a base for contributions. @@ -59,12 +59,13 @@ We rely on two types of documentation; the [Sofie documentation](https://nrkno.g We don't aim to have the "absolute perfect documentation possible", BUT we do try to improve and add documentation to have a good-enough-to-be-comprehensible standard. We think that: -* _What_ something does is not as important – we can read the code for that. -* _Why_ something does something, **is** important. Implied usage, side-effects, descriptions of the context etcetera... +- _What_ something does is not as important – we can read the code for that. +- _Why_ something does something, **is** important. Implied usage, side-effects, descriptions of the context etcetera... When you contribute, we ask you to also update any documentation where needed. ### Updating Dependencies​ + When updating dependencies in a library, it is preferred to do so via `yarn upgrade-interactive --latest` whenever possible. This is so that the versions in `package.json` are also updated as we have no guarantee that the library will work with versions lower than that used in the `yarn.lock` file, even if it is compatible with the semver range in `package.json`. After this, a `yarn upgrade` can be used to update any child dependencies Be careful when bumping across major versions. @@ -84,13 +85,12 @@ When logging, we try to adher to the following guideliness: Usage of `console.log` and `console.error` directly is discouraged (except for quick debugging locally). Instead, use one of the logger libraries (to output json logs which are easier to index). When logging, use one of the **log level** described below: -| Level | Description | Examples | -| ------- | ----------- | -- | -| `silly` | For very detailed logs (rarely used). | - | -| `debug` | Logging of info that could be useful for developers when debugging certain issues in production. | `"payload: {>JSON<} "`

`"Reloading data X from DB"` | -| `verbose` | Logging of common events. | `"File X updated"` | -| `info` | Logging of significant / uncommon events.

_Note: If an event happens often or many times, use `verbose` instead._ | `"Initializing TSR..."`

`"Starting nightly cronjob..."`

`"Snapshot X restored"`

`"Not allowing removal of current playing segment 'xyz', making segment unsynced instead"`

`"PeripheralDevice X connected"` | -| `warn` | Used when something unexpected happened, but not necessarily due to an application bug.

These logs don't have to be acted upon directly, but could be useful to provide context to a dev/sysadmin while troubleshooting an issue. | `"PeripheralDevice X disconnected"`

`"User Error: Cannot activate Rundown (Rundown not found)" `

`"mosRoItemDelete NOT SUPPORTED"` | -| `error` | Used when something went _wrong_, preventing something from functioning.

A logged `error` should always result in a sysadmin / developer looking into the issue.

_Note: Don't use `error` for things that are out of the app's control, such as user error._ | `"Cannot read property 'length' of undefined"`

`"Failed to save Part 'X' to DB"`| -| `crit` | Fatal errors (rarely used) | - | - +| Level | Description | Examples | +| --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `silly` | For very detailed logs (rarely used). | - | +| `debug` | Logging of info that could be useful for developers when debugging certain issues in production. | `"payload: {>JSON<} "`

`"Reloading data X from DB"` | +| `verbose` | Logging of common events. | `"File X updated"` | +| `info` | Logging of significant / uncommon events.

_Note: If an event happens often or many times, use `verbose` instead._ | `"Initializing TSR..."`

`"Starting nightly cronjob..."`

`"Snapshot X restored"`

`"Not allowing removal of current playing segment 'xyz', making segment unsynced instead"`

`"PeripheralDevice X connected"` | +| `warn` | Used when something unexpected happened, but not necessarily due to an application bug.

These logs don't have to be acted upon directly, but could be useful to provide context to a dev/sysadmin while troubleshooting an issue. | `"PeripheralDevice X disconnected"`

`"User Error: Cannot activate Rundown (Rundown not found)" `

`"mosRoItemDelete NOT SUPPORTED"` | +| `error` | Used when something went _wrong_, preventing something from functioning.

A logged `error` should always result in a sysadmin / developer looking into the issue.

_Note: Don't use `error` for things that are out of the app's control, such as user error._ | `"Cannot read property 'length' of undefined"`

`"Failed to save Part 'X' to DB"` | +| `crit` | Fatal errors (rarely used) | - | diff --git a/packages/documentation/versioned_docs/version-1.50.0/for-developers/data-model.md b/packages/documentation/versioned_docs/version-1.50.0/for-developers/data-model.md index 975f29747c..5c6496dc34 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/for-developers/data-model.md +++ b/packages/documentation/versioned_docs/version-1.50.0/for-developers/data-model.md @@ -24,7 +24,7 @@ Currently, there is not a very clearly defined flow for modifying these document This includes: - [Blueprints](https://github.com/nrkno/sofie-core/blob/master/packages/corelib/src/dataModel/Blueprint.ts) -- [Buckets](https://github.com/nrkno/sofie-core/blob/master/meteor/lib/collections/Buckets.ts) +- [Buckets](https://github.com/nrkno/sofie-core/blob/master/packages/corelib/src/dataModel/Bucket.ts) - [CoreSystem](https://github.com/nrkno/sofie-core/blob/master/meteor/lib/collections/CoreSystem.ts) - [Evaluations](https://github.com/nrkno/sofie-core/blob/master/meteor/lib/collections/Evaluations.ts) - [ExternalMessageQueue](https://github.com/nrkno/sofie-core/blob/master/packages/corelib/src/dataModel/ExternalMessageQueue.ts) diff --git a/packages/documentation/versioned_docs/version-1.50.0/for-developers/device-integrations/_category_.json b/packages/documentation/versioned_docs/version-1.50.0/for-developers/device-integrations/_category_.json index 5f6541c2b5..c5a2693b0e 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/for-developers/device-integrations/_category_.json +++ b/packages/documentation/versioned_docs/version-1.50.0/for-developers/device-integrations/_category_.json @@ -1,4 +1,4 @@ { - "label": "Device Integrations", - "position": 5 -} \ No newline at end of file + "label": "Device Integrations", + "position": 5 +} diff --git a/packages/documentation/versioned_docs/version-1.50.0/for-developers/device-integrations/intro.md b/packages/documentation/versioned_docs/version-1.50.0/for-developers/device-integrations/intro.md index 1604538523..71c204b6ed 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/for-developers/device-integrations/intro.md +++ b/packages/documentation/versioned_docs/version-1.50.0/for-developers/device-integrations/intro.md @@ -4,10 +4,10 @@ Device integrations in Sofie are part of the Timeline State Resolver (TSR) libra In order to understand all about writing TSR integrations there are some concepts to familiarise yourself with, in this documentation we will attempt to explain these. - - [Options and mappings](./options-and-mappings.html) - - [TSR Integration API](./tsr-api.html) - - [TSR Types package](./tsr-types.html) - - [TSR Actions](./tsr-actions.html) +- [Options and mappings](./options-and-mappings.html) +- [TSR Integration API](./tsr-api.html) +- [TSR Types package](./tsr-types.html) +- [TSR Actions](./tsr-actions.html) But to start of we will explain the general structure of the TSR. Any user of the TSR will interface primarily with the Conductor class. Primarily the user will input device configurations, mappings and timelines into the TSR. The timeline describes the entire state of all of the devices over time. It does this by putting objects on timeline layers. Every timeline layer maps to a specific part of the device, this is configured throught the mappings. @@ -15,4 +15,4 @@ The timeline is converted into disctinct states at different points in time, and :::info The information in this section is not a conclusive guide on writing an integration, it should be use more as a guide to use while looking at a TSR integration such as the [OSC integration](https://github.com/nrkno/sofie-timeline-state-resolver/tree/master/packages/timeline-state-resolver/src/integrations/osc). -::: \ No newline at end of file +::: diff --git a/packages/documentation/versioned_docs/version-1.50.0/for-developers/device-integrations/options-and-mappings.md b/packages/documentation/versioned_docs/version-1.50.0/for-developers/device-integrations/options-and-mappings.md index 1bb182f155..7975218c50 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/for-developers/device-integrations/options-and-mappings.md +++ b/packages/documentation/versioned_docs/version-1.50.0/for-developers/device-integrations/options-and-mappings.md @@ -8,4 +8,4 @@ Options are for any configuration the user needs to make for your device integra ## Mappings -A mappings is essentially an addresses into the device you are integrating with. For example, a mapping for CasparCG contains a channel and a layer. And a mapping for an Atem can be a mix effect or a downstream keyer. It is entirely possible for the user to define 2 mappings pointing to the same bit of hardware so keep that in mind while writing your integration. The granularity of the mappings influences both how you write your device as well as the shape of the timeline objects. If, for example, we had not included the layer number in the CasparCG mapping, we would have had to define this separately on every timeline object. \ No newline at end of file +A mappings is essentially an addresses into the device you are integrating with. For example, a mapping for CasparCG contains a channel and a layer. And a mapping for an Atem can be a mix effect or a downstream keyer. It is entirely possible for the user to define 2 mappings pointing to the same bit of hardware so keep that in mind while writing your integration. The granularity of the mappings influences both how you write your device as well as the shape of the timeline objects. If, for example, we had not included the layer number in the CasparCG mapping, we would have had to define this separately on every timeline object. diff --git a/packages/documentation/versioned_docs/version-1.50.0/for-developers/device-integrations/tsr-api.md b/packages/documentation/versioned_docs/version-1.50.0/for-developers/device-integrations/tsr-api.md index e68424455e..f09e0f43a0 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/for-developers/device-integrations/tsr-api.md +++ b/packages/documentation/versioned_docs/version-1.50.0/for-developers/device-integrations/tsr-api.md @@ -12,7 +12,7 @@ Regarding status there are 2 important methods to be implemented, one is a gette ## State and commands -The second part is where the bulk of the work happens. First your implementation for `convertTimelineStateToDeviceState` will be called with a Timeline State and the mappings for your integration. You are ought to return a "Device State" here which is an object representing the state of your device as inferred from the Timeline State and mappings. Then the next implementation is of the `diffStates` method, which will be called with 2 Device States as you've generated them earlier. The purpose of this method is to generate commands such that a state change from Device State A to Device State B can be executed. Hence it is called a "diff". The last important method here is `sendCommand` which will be called with the commands you've generated earlier when the TSR wants to transitition from State A to State B. +The second part is where the bulk of the work happens. First your implementation for `convertTimelineStateToDeviceState` will be called with a Timeline State and the mappings for your integration. You are ought to return a "Device State" here which is an object representing the state of your device as inferred from the Timeline State and mappings. Then the next implementation is of the `diffStates` method, which will be called with 2 Device States as you've generated them earlier. The purpose of this method is to generate commands such that a state change from Device State A to Device State B can be executed. Hence it is called a "diff". The last important method here is `sendCommand` which will be called with the commands you've generated earlier when the TSR wants to transitition from State A to State B. Another thing to implement is the `actions` property. You can leave it as an empty object initially or read more about it in [TSR Actions](./tsr-actions.md). @@ -22,7 +22,7 @@ Logging is done through an event emitter as is described in the DeviceEvents int ## Best practices - - The `init` method is asynchronous but you should not use it to wait for timeouts in your connection to reject it. Instead the rest of your integration should gracefully deal with a (initially) disconnected device. - - The result of the `getStatus` method is displayed in the UI of Sofie so try to put helpful information in the messages and only elevate to a "bad" status if something is really wrong, like being fully disconnected from a device. - - Be aware for side effects in your implementations of `convertTimelineStateToDeviceState` and `diffStates` they are _not_ guaranteed to be chronological and the states changes may never actually be executed. - - If you need to do any time aware commands (such as seeking in a media file) use the time from the Timeline State to do your calculations for these \ No newline at end of file +- The `init` method is asynchronous but you should not use it to wait for timeouts in your connection to reject it. Instead the rest of your integration should gracefully deal with a (initially) disconnected device. +- The result of the `getStatus` method is displayed in the UI of Sofie so try to put helpful information in the messages and only elevate to a "bad" status if something is really wrong, like being fully disconnected from a device. +- Be aware for side effects in your implementations of `convertTimelineStateToDeviceState` and `diffStates` they are _not_ guaranteed to be chronological and the states changes may never actually be executed. +- If you need to do any time aware commands (such as seeking in a media file) use the time from the Timeline State to do your calculations for these diff --git a/packages/documentation/versioned_docs/version-1.50.0/for-developers/for-blueprint-developers/_category_.json b/packages/documentation/versioned_docs/version-1.50.0/for-developers/for-blueprint-developers/_category_.json index c4c3c8c242..b4dd4fcee1 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/for-developers/for-blueprint-developers/_category_.json +++ b/packages/documentation/versioned_docs/version-1.50.0/for-developers/for-blueprint-developers/_category_.json @@ -1,4 +1,4 @@ { - "label": "For Blueprint Developers", - "position": 4 -} \ No newline at end of file + "label": "For Blueprint Developers", + "position": 4 +} diff --git a/packages/documentation/versioned_docs/version-1.50.0/for-developers/for-blueprint-developers/hold.md b/packages/documentation/versioned_docs/version-1.50.0/for-developers/for-blueprint-developers/hold.md index 35d8dde7e4..c535462fce 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/for-developers/for-blueprint-developers/hold.md +++ b/packages/documentation/versioned_docs/version-1.50.0/for-developers/for-blueprint-developers/hold.md @@ -37,7 +37,7 @@ Some unanswered questions we have are: - Should _Hold_ be rewritten to be done with adlib-actions instead to allow for more complex scenarios? - Should there be a way to more intelligently check if _Hold_ can be done between two Parts? (perhaps a new blueprint method?) -::: + ::: The blueprints have to label parts as supporting _Hold_. You can do this with the [`holdMode`](https://nrkno.github.io/sofie-core/typedoc/interfaces/_sofie_automation_blueprints_integration.IBlueprintPart.html#holdMode) property, and labelling it possible to _Hold_ from or to the part. diff --git a/packages/documentation/versioned_docs/version-1.50.0/for-developers/libraries.md b/packages/documentation/versioned_docs/version-1.50.0/for-developers/libraries.md index 2352cc0ed8..5ab41c84dc 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/for-developers/libraries.md +++ b/packages/documentation/versioned_docs/version-1.50.0/for-developers/libraries.md @@ -13,50 +13,44 @@ sidebar_position: 5 Together with the _Sofie Core_ there are several _gateways_ which are separate applications, but which connect to _Sofie Core_ and are managed from within the Core's web UI. -* [**Playout Gateway**](https://github.com/nrkno/sofie-core/tree/master/packages/playout-gateway) Handles the playout from _Sofie_. Connects to and controls a multitude of devices, such as vision mixers, graphics, light controllers, audio mixers etc.. -* [**MOS Gateway**](https://github.com/nrkno/sofie-core/tree/master/packages/mos-gateway) Connects _Sofie_ to a newsroom system \(NRCS\) and ingests rundowns via the [MOS protocol](http://mosprotocol.com/). -* [**Live Status Gateway**](https://github.com/nrkno/sofie-core/tree/master/packages/live-status-gateway) Allows external systems to subscribe to state changes in Sofie. -* [**iNEWS Gateway**](https://github.com/tv2/inews-ftp-gateway) Connects _Sofie_ to an Avid iNEWS newsroom system. -* [**Spreadsheet Gateway**](https://github.com/SuperFlyTV/spreadsheet-gateway) Connects _Sofie_ to a _Google Drive_ folder and ingests rundowns from _Google Sheets_. -* [**Input Gateway**](https://github.com/nrkno/sofie-input-gateway) Connects _Sofie_ to various input devices, allowing triggering _User-Actions_ using these devices. -* [**Package Manager**](https://github.com/nrkno/sofie-package-manager) Handles media asset transfer and media file management for pulling new files, deleting expired files on playout devices and generating additional metadata (previews, thumbnails, automated QA checks) in a more performant, and possibly distributed, way. Can smartly figure out how to get a file on storage A to playout server B. - +- [**Playout Gateway**](https://github.com/nrkno/sofie-core/tree/master/packages/playout-gateway) Handles the playout from _Sofie_. Connects to and controls a multitude of devices, such as vision mixers, graphics, light controllers, audio mixers etc.. +- [**MOS Gateway**](https://github.com/nrkno/sofie-core/tree/master/packages/mos-gateway) Connects _Sofie_ to a newsroom system \(NRCS\) and ingests rundowns via the [MOS protocol](http://mosprotocol.com/). +- [**Live Status Gateway**](https://github.com/nrkno/sofie-core/tree/master/packages/live-status-gateway) Allows external systems to subscribe to state changes in Sofie. +- [**iNEWS Gateway**](https://github.com/tv2/inews-ftp-gateway) Connects _Sofie_ to an Avid iNEWS newsroom system. +- [**Spreadsheet Gateway**](https://github.com/SuperFlyTV/spreadsheet-gateway) Connects _Sofie_ to a _Google Drive_ folder and ingests rundowns from _Google Sheets_. +- [**Input Gateway**](https://github.com/nrkno/sofie-input-gateway) Connects _Sofie_ to various input devices, allowing triggering _User-Actions_ using these devices. +- [**Package Manager**](https://github.com/nrkno/sofie-package-manager) Handles media asset transfer and media file management for pulling new files, deleting expired files on playout devices and generating additional metadata (previews, thumbnails, automated QA checks) in a more performant, and possibly distributed, way. Can smartly figure out how to get a file on storage A to playout server B. ## Libraries There are a number of libraries used in the Sofie ecosystem: -* [**ATEM Connection**](https://github.com/nrkno/sofie-atem-connection) Library for communicating with Blackmagic Design's ATEM mixers -* [**ATEM State**](https://github.com/nrkno/sofie-atem-state) Used in TSR to tracks the state of ATEMs and generate commands to control them. -* [**CasparCG Server Connection**](https://github.com/SuperFlyTV/casparcg-connection) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Library to connect and interact with CasparCG Servers. -* [**CasparCG State**](https://github.com/superflytv/casparcg-state) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Used in TSR to tracks the state of CasparCG Servers and generate commands to control them. -* [**Ember+ Connection**](https://github.com/nrkno/sofie-emberplus-connection) Library to communicate with _Ember+_ control protocol -* [**HyperDeck Connection**](https://github.com/nrkno/sofie-hyperdeck-connection) Library for connecting to Blackmagic Design's HyperDeck recorders. -* [**MOS Connection**](https://github.com/nrkno/sofie-mos-connection/) A [_MOS protocol_](http://mosprotocol.com/) library for acting as a MOS device and connecting to an newsroom control system. -* [**Quantel Gateway Client**](https://github.com/nrkno/sofie-quantel-gateway-client) An interface that talks to the Quantel-Gateway application. -* [**Sofie Core Integration**](https://github.com/nrkno/sofie-core-integration) Used to connect to the [Sofie Core](https://github.com/nrkno/sofie-core) by the Gateways. -* [**Sofie Blueprints Integration**](https://github.com/nrkno/sofie-sofie-blueprints-integration) Common types and interfaces used by both Sofie Core and the user-defined blueprints. -* [**SuperFly-Timeline**](https://github.com/SuperFlyTV/supertimeline) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Resolver and rules for placing objects on a virtual timeline. -* [**ThreadedClass**](https://github.com/nytamin/threadedClass) developed by **[_Nytamin_](https://github.com/nytamin)** Used in TSR to spawn device controllers in separate processes. -* [**Timeline State Resolver**](https://github.com/nrkno/sofie-timeline-state-resolver) \(TSR\) The main driver in **Playout Gateway,** handles connections to playout-devices and sends commands based on a **Timeline** received from **Core**. - - +- [**ATEM Connection**](https://github.com/nrkno/sofie-atem-connection) Library for communicating with Blackmagic Design's ATEM mixers +- [**ATEM State**](https://github.com/nrkno/sofie-atem-state) Used in TSR to tracks the state of ATEMs and generate commands to control them. +- [**CasparCG Server Connection**](https://github.com/SuperFlyTV/casparcg-connection) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Library to connect and interact with CasparCG Servers. +- [**CasparCG State**](https://github.com/superflytv/casparcg-state) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Used in TSR to tracks the state of CasparCG Servers and generate commands to control them. +- [**Ember+ Connection**](https://github.com/nrkno/sofie-emberplus-connection) Library to communicate with _Ember+_ control protocol +- [**HyperDeck Connection**](https://github.com/nrkno/sofie-hyperdeck-connection) Library for connecting to Blackmagic Design's HyperDeck recorders. +- [**MOS Connection**](https://github.com/nrkno/sofie-mos-connection/) A [_MOS protocol_](http://mosprotocol.com/) library for acting as a MOS device and connecting to an newsroom control system. +- [**Quantel Gateway Client**](https://github.com/nrkno/sofie-quantel-gateway-client) An interface that talks to the Quantel-Gateway application. +- [**Sofie Core Integration**](https://github.com/nrkno/sofie-core-integration) Used to connect to the [Sofie Core](https://github.com/nrkno/sofie-core) by the Gateways. +- [**Sofie Blueprints Integration**](https://github.com/nrkno/sofie-sofie-blueprints-integration) Common types and interfaces used by both Sofie Core and the user-defined blueprints. +- [**SuperFly-Timeline**](https://github.com/SuperFlyTV/supertimeline) developed by **[_SuperFly.tv_](https://github.com/SuperFlyTV)** Resolver and rules for placing objects on a virtual timeline. +- [**ThreadedClass**](https://github.com/nytamin/threadedClass) developed by **[_Nytamin_](https://github.com/nytamin)** Used in TSR to spawn device controllers in separate processes. +- [**Timeline State Resolver**](https://github.com/nrkno/sofie-timeline-state-resolver) \(TSR\) The main driver in **Playout Gateway,** handles connections to playout-devices and sends commands based on a **Timeline** received from **Core**. There are also a few typings-only libraries that define interfaces between applications: -* [**Blueprints Integration**](https://www.npmjs.com/package/@sofie-automation/blueprints-integration) Defines the interface between [**Blueprints**](../user-guide/concepts-and-architecture.md#blueprints) and **Sofie Core**. -* [**Timeline State Resolver types**](https://www.npmjs.com/package/timeline-state-resolver-types) Defines the interface between [**Blueprints**](../user-guide/concepts-and-architecture.md#blueprints) and the timeline that will be fed into **TSR** for playout. +- [**Blueprints Integration**](https://www.npmjs.com/package/@sofie-automation/blueprints-integration) Defines the interface between [**Blueprints**](../user-guide/concepts-and-architecture.md#blueprints) and **Sofie Core**. +- [**Timeline State Resolver types**](https://www.npmjs.com/package/timeline-state-resolver-types) Defines the interface between [**Blueprints**](../user-guide/concepts-and-architecture.md#blueprints) and the timeline that will be fed into **TSR** for playout. ## Other Sofie-related Repositories -* [**CasparCG Server** \(NRK fork\)](https://github.com/nrkno/sofie-casparcg-server) Sofie-specific fork of CasparCG Server. -* [**CasparCG Launcher**](https://github.com/nrkno/sofie-casparcg-launcher) Launcher, controller, and logger for CasparCG Server. -* [**CasparCG Media Scanner** \(NRK fork\)](https://github.com/nrkno/sofie-casparcg-server) Sofie-specific fork of CasparCG Server 2.2 Media Scanner. -* [**Sofie Chef**](https://github.com/nrkno/sofie-chef) A simple Chromium based renderer, used for kiosk mode rendering of web pages. -* [**Media Manager**](https://github.com/nrkno/sofie-media-management) *(deprecated)* Handles media transfer and media file management for pulling new files and deleting expired files on playout devices. -* [**Quantel Browser Plugin**](https://github.com/nrkno/sofie-quantel-browser-plugin) MOS-compatible Quantel video clip browser for use with Sofie. -* [**Sisyfos Audio Controller**](https://github.com/nrkno/sofie-sisyfos-audio-controller) *developed by [_olzzon_](https://github.com/olzzon/)* -* [**Quantel Gateway**](https://github.com/nrkno/sofie-quantel-gateway) CORBA to REST gateway for _Quantel/ISA_ playback. - - - +- [**CasparCG Server** \(NRK fork\)](https://github.com/nrkno/sofie-casparcg-server) Sofie-specific fork of CasparCG Server. +- [**CasparCG Launcher**](https://github.com/nrkno/sofie-casparcg-launcher) Launcher, controller, and logger for CasparCG Server. +- [**CasparCG Media Scanner** \(NRK fork\)](https://github.com/nrkno/sofie-casparcg-server) Sofie-specific fork of CasparCG Server 2.2 Media Scanner. +- [**Sofie Chef**](https://github.com/nrkno/sofie-chef) A simple Chromium based renderer, used for kiosk mode rendering of web pages. +- [**Media Manager**](https://github.com/nrkno/sofie-media-management) _(deprecated)_ Handles media transfer and media file management for pulling new files and deleting expired files on playout devices. +- [**Quantel Browser Plugin**](https://github.com/nrkno/sofie-quantel-browser-plugin) MOS-compatible Quantel video clip browser for use with Sofie. +- [**Sisyfos Audio Controller**](https://github.com/nrkno/sofie-sisyfos-audio-controller) _developed by [*olzzon*](https://github.com/olzzon/)_ +- [**Quantel Gateway**](https://github.com/nrkno/sofie-quantel-gateway) CORBA to REST gateway for _Quantel/ISA_ playback. diff --git a/packages/documentation/versioned_docs/version-1.50.0/user-guide/concepts-and-architecture.md b/packages/documentation/versioned_docs/version-1.50.0/user-guide/concepts-and-architecture.md index bce331a9f7..a40b58ad27 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/user-guide/concepts-and-architecture.md +++ b/packages/documentation/versioned_docs/version-1.50.0/user-guide/concepts-and-architecture.md @@ -28,7 +28,7 @@ To be able to facilitate various workflows and to Here's a short explanation abo - The **Organization** \(only available if user accounts are enabled\) defines things that are common for an organization. An organization consists of: **Users, Studios** and **ShowStyles**. - The **Studio** contains things that are related to the "hardware" or "rig". Technically, a Studio is defined as an entity that can have one \(or none\) rundown active at any given time. In most cases, this will be a representation of your gallery, with cameras, video playback and graphics systems, external inputs, sound mixers, lighting controls and so on. A single System can easily control multiple Studios. - The **Show Style** contains settings for the "show", for example if there's a "Morning Show" and an "Afternoon Show" - produced in the same gallery - they might be two different Show Styles \(played in the same Studio\). Most importantly, the Show Style decides the "look and feel" of the Show towards the producer/director, dictating how data ingested from the NRCS will be interpreted and how the user will interact with the system during playback (see: [Show Style](../configuration/settings-view#show-style) in Settings). - * A **Show Style Variant** is a set of Show Style _Blueprint_ configuration values, that allows to use the same interaction model across multiple Shows with potentially different assets, changing the outward look of the Show: for example news programs with different hosts produced from the same Studio, but with different light setups, backscreen and overlay graphics. + - A **Show Style Variant** is a set of Show Style _Blueprint_ configuration values, that allows to use the same interaction model across multiple Shows with potentially different assets, changing the outward look of the Show: for example news programs with different hosts produced from the same Studio, but with different light setups, backscreen and overlay graphics. ![Sofie Architecture Venn Diagram](/img/docs/main/features/sofie-venn-diagram.png) @@ -127,7 +127,7 @@ Documentation on the interface to be exposed by the Blueprint: ## `PartInstances` and `PieceInstances` -In order to be able to facilitate ingesting changes from the NRCS while continuing to provide a stable and predictable playback of the Rundowns, Sofie internally uses a concept of ["instantiation"](https://en.wikipedia.org/wiki/Instance_(computer_science)) of key Rundown elements. Before playback of a Part can begin, the Part and it's Pieces are copied into an Instance of a Part: a `PartInstance`. This protects the contents of the _Next_ and _On Air_ part, preventing accidental changes that could surprise the producer/director. This also makes it possible to inspect the "as played" state of the Rundown, independently of the "as planned" state ingested from the NRCS. +In order to be able to facilitate ingesting changes from the NRCS while continuing to provide a stable and predictable playback of the Rundowns, Sofie internally uses a concept of ["instantiation"]() of key Rundown elements. Before playback of a Part can begin, the Part and it's Pieces are copied into an Instance of a Part: a `PartInstance`. This protects the contents of the _Next_ and _On Air_ part, preventing accidental changes that could surprise the producer/director. This also makes it possible to inspect the "as played" state of the Rundown, independently of the "as planned" state ingested from the NRCS. The blueprints can optionally allow some changes to the Parts and Pieces to be forwarded onto these `PartInstances`: [https://github.com/nrkno/sofie-core/blob/master/packages/blueprints-integration/src/api.ts#L190](https://github.com/nrkno/sofie-core/blob/master/packages/blueprints-integration/src/api.ts#L190) diff --git a/packages/documentation/versioned_docs/version-1.50.0/user-guide/configuration/_category_.json b/packages/documentation/versioned_docs/version-1.50.0/user-guide/configuration/_category_.json index d2aee9ef5b..c4e45c2347 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/user-guide/configuration/_category_.json +++ b/packages/documentation/versioned_docs/version-1.50.0/user-guide/configuration/_category_.json @@ -1,4 +1,4 @@ { - "label": "Configuration", - "position": 4 -} \ No newline at end of file + "label": "Configuration", + "position": 4 +} diff --git a/packages/documentation/versioned_docs/version-1.50.0/user-guide/configuration/settings-view.md b/packages/documentation/versioned_docs/version-1.50.0/user-guide/configuration/settings-view.md index 2a4a3e6a25..3734ab3761 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/user-guide/configuration/settings-view.md +++ b/packages/documentation/versioned_docs/version-1.50.0/user-guide/configuration/settings-view.md @@ -1,6 +1,7 @@ --- sidebar_position: 2 --- + # Settings View :::caution @@ -54,9 +55,9 @@ The clean up process in Sofie will search the database for unused data and index A _Studio_ in Sofie-terms is a physical location, with a specific set of devices and equipment. Only one show can be on air in a studio at the same time. The _studio_ settings are settings for that specific studio, and contains settings related to hardware and playout, such as: -* **Attached devices** - the Gateways related to this studio -* **Blueprint configuration** - custom config option defined by the blueprints -* **Layer Mappings** - Maps the logical _timeline layers_ to physical devices and outputs +- **Attached devices** - the Gateways related to this studio +- **Blueprint configuration** - custom config option defined by the blueprints +- **Layer Mappings** - Maps the logical _timeline layers_ to physical devices and outputs The Studio uses a studio-blueprint, which handles things like mapping up an incoming rundown to a Showstyle. @@ -84,9 +85,9 @@ In order to allow the Producer to reconfigure the automation from the Switchboar A Route Set is essentially a distinct set of Layer Mappings, which can modify the settings already configured by the Layer Mappings, but can be turned On and Off. Called Routes, these can change: -* the Layer ID to a new Layer ID -* change the Device being controlled by the Layer -* change the aspect of the Device that's being controlled. +- the Layer ID to a new Layer ID +- change the Device being controlled by the Layer +- change the aspect of the Device that's being controlled. Route Sets can be grouped into Exclusivity Groups, in which only a single Route Set can be enabled at a time. When activating a Route Set within an Exclusivity Group, all other Route Sets in that group will be deactivated. This in turn, allows the System Administrator to create entire sections of exclusive automation control within the Studio that the Producer can then switch between. One such example could be switching between Primary and Backup playout servers, or switching between Primary and Backup talent microphone. @@ -115,10 +116,10 @@ Route Sets can also be configured with a _Default State_. This can be used to co A _Showstyle_ is related to the looks and logic of a _show_, which in contrast to the _studio_ is not directly related to the hardware. The Showstyle contains settings like -* **Source Layers** - Groups different types of content in the GUI -* **Output Channels** - Indicates different output targets \(such as the _Program_ or _back-screen in the studio_\) -* **Action Triggers** - Select how actions can be started on a per-show basis, outside of the on-screen controls -* **Blueprint configuration** - custom config option defined by the blueprints +- **Source Layers** - Groups different types of content in the GUI +- **Output Channels** - Indicates different output targets \(such as the _Program_ or _back-screen in the studio_\) +- **Action Triggers** - Select how actions can be started on a per-show basis, outside of the on-screen controls +- **Blueprint configuration** - custom config option defined by the blueprints :::caution Please note the difference between _Source Layers_ and _timeline-layers_: @@ -128,12 +129,12 @@ Please note the difference between _Source Layers_ and _timeline-layers_: [Timeline-objects](../concepts-and-architecture.md#timeline-object) \(inside of the [Pieces](../concepts-and-architecture.md#piece)\) are put onto timeline-layers, which are \(through the Mappings in the studio\) mapped to physical devices and outputs. The exact timeline-layer is never exposed to the user, but instead used on the technical level to control playout. -An example of the difference could be when playing a VT \(that's a Source Layer\), which could involve all of the timeline-layers _video\_player0_, _audio\_fader\_video_, _audio\_fader\_host_ and _mixer\_pgm._ +An example of the difference could be when playing a VT \(that's a Source Layer\), which could involve all of the timeline-layers _video_player0_, _audio_fader_video_, _audio_fader_host_ and _mixer_pgm._ ::: ### Action Triggers -This is a way to set up how - outside of the Point-and-Click Graphical User Interface - actions can be performed in the User Interface. Commonly, these are the *hotkey combinations* that can be used to either trigger AdLib content or other actions in the larger system. This is done by creating sets of Triggers and Actions to be triggered by them. These pairs can be set at the Show Style level or at the _Sofie Core_ (System) level, for common actions such as doing a Take or activating a Rundown, where you want a shared method of operation. _Sofie Core_ migrations will set up a base set of basic, system-wide Action Triggers for interacting with rundowns, but they can be changed by the System blueprint. +This is a way to set up how - outside of the Point-and-Click Graphical User Interface - actions can be performed in the User Interface. Commonly, these are the _hotkey combinations_ that can be used to either trigger AdLib content or other actions in the larger system. This is done by creating sets of Triggers and Actions to be triggered by them. These pairs can be set at the Show Style level or at the _Sofie Core_ (System) level, for common actions such as doing a Take or activating a Rundown, where you want a shared method of operation. _Sofie Core_ migrations will set up a base set of basic, system-wide Action Triggers for interacting with rundowns, but they can be changed by the System blueprint. ![Action triggers define modes of interacting with a Rundown](/img/docs/main/features/action_triggers_3.png) @@ -141,9 +142,9 @@ This is a way to set up how - outside of the Point-and-Click Graphical User Inte The triggers are designed to be either client-specific or issued by a peripheral device module. -Currently, the Action Triggers system supports setting up two types of triggeers: Hotkeys and Device Triggers. +Currently, the Action Triggers system supports setting up two types of triggeers: Hotkeys and Device Triggers. -Hotkeys are valid in the scope of a browser window and can be either a single key, a combination of keys (*combo*) or a *chord* - a sequnece of key combinations pressed in a particular order. *Chords* are popular in some text editing applications and vastly expand the amount of actions that can be triggered from a keyboard, at the expense of the time needed to execute them. Currently, the Hotkey editor in Sofie does not support creating *Chords*, but they can be specified by Blueprints during migrations. +Hotkeys are valid in the scope of a browser window and can be either a single key, a combination of keys (_combo_) or a _chord_ - a sequnece of key combinations pressed in a particular order. _Chords_ are popular in some text editing applications and vastly expand the amount of actions that can be triggered from a keyboard, at the expense of the time needed to execute them. Currently, the Hotkey editor in Sofie does not support creating _Chords_, but they can be specified by Blueprints during migrations. To edit a given trigger, click on the trigger pill on the left of the Trigger-Action set. When hovering, a **+** sign will appear, allowing you to add a new trigger to the set. @@ -151,9 +152,9 @@ Device Triggers are valid in the scope of a Studio and will be evaluated on the #### Actions -The actions are built using a base *action* (such as *Activate a Rundown* or *AdLib*) and a set of *filters*, limiting the scope of the *action*. Optionally, some of these *actions* can take additional *parameters*. These filters can operate on various types of objects, depending on the action in question. All actions currently require that the chain of filters starts with scoping out the Rundown the action is supposed to affect. Currently, there is only one type of Rundown-level filter supported: "The Rundown currently in view". +The actions are built using a base _action_ (such as _Activate a Rundown_ or _AdLib_) and a set of _filters_, limiting the scope of the _action_. Optionally, some of these _actions_ can take additional _parameters_. These filters can operate on various types of objects, depending on the action in question. All actions currently require that the chain of filters starts with scoping out the Rundown the action is supposed to affect. Currently, there is only one type of Rundown-level filter supported: "The Rundown currently in view". -The Action Triggers user interface guides the user in a wizzard-like fashion through the available *filter* options on a given *action*. +The Action Triggers user interface guides the user in a wizzard-like fashion through the available _filter_ options on a given _action_. ![Actions can take additional parameters](/img/docs/main/features/action_triggers_2.png) @@ -161,7 +162,7 @@ If the action provides a preview of the triggered items and there is an availabl ![A preview of the action, as scoped by the filters](/img/docs/main/features/action_triggers_4.png) -Clicking on the action and filter pills allows you to edit the action parameters and filter parameters. *Limit* limits the amount of objects to only the first *N* objects matched - this can significantly improve performance on large data sets. *Pick* and *Pick last* filters end the chain of the filters by selecting a single item from the filtered set of objects (the *N-th* object from the beginning or the end, respectively). *Pick* implicitly contains a *Limit* for the performance improvement. This is not true for *Pick last*, though. +Clicking on the action and filter pills allows you to edit the action parameters and filter parameters. _Limit_ limits the amount of objects to only the first _N_ objects matched - this can significantly improve performance on large data sets. _Pick_ and _Pick last_ filters end the chain of the filters by selecting a single item from the filtered set of objects (the _N-th_ object from the beginning or the end, respectively). _Pick_ implicitly contains a _Limit_ for the performance improvement. This is not true for _Pick last_, though. ## Migrations @@ -170,4 +171,3 @@ The migrations are automatic setup-scripts that help you during initial setup an There are system-migrations that comes directly from the version of _Sofie Core_ you're running, and there are also migrations added by the different blueprints. It is mandatory to run migrations when you've upgraded _Sofie Core_ to a new version, or upgraded your blueprints. - diff --git a/packages/documentation/versioned_docs/version-1.50.0/user-guide/faq.md b/packages/documentation/versioned_docs/version-1.50.0/user-guide/faq.md index e832a36f5c..fb47871bb4 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/user-guide/faq.md +++ b/packages/documentation/versioned_docs/version-1.50.0/user-guide/faq.md @@ -8,10 +8,9 @@ All main components are using the [MIT license](https://opensource.org/licenses/ Everything needed to install and configure a fully functioning Sofie system is publicly available, with the following exceptions: -* A rundown data set describing the actual TV show and of media assets. -* Blueprints for your specific show. +- A rundown data set describing the actual TV show and of media assets. +- Blueprints for your specific show. ## When will feature _y_ become available? Check out the [issues page](https://github.com/nrkno/Sofie-TV-automation/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3ARelease), where there are notes on current and upcoming releases. - diff --git a/packages/documentation/versioned_docs/version-1.50.0/user-guide/features/_category_.json b/packages/documentation/versioned_docs/version-1.50.0/user-guide/features/_category_.json index 0dd70d8b0e..785c16360b 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/user-guide/features/_category_.json +++ b/packages/documentation/versioned_docs/version-1.50.0/user-guide/features/_category_.json @@ -1,4 +1,4 @@ { - "label": "Features", - "position": 2 -} \ No newline at end of file + "label": "Features", + "position": 2 +} diff --git a/packages/documentation/versioned_docs/version-1.50.0/user-guide/features/access-levels.md b/packages/documentation/versioned_docs/version-1.50.0/user-guide/features/access-levels.md index 50307f970e..3415b35bfe 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/user-guide/features/access-levels.md +++ b/packages/documentation/versioned_docs/version-1.50.0/user-guide/features/access-levels.md @@ -1,6 +1,7 @@ --- sidebar_position: 3 --- + # Access Levels A variety of access levels can be set via the URL. By default, a user cannot edit settings, nor play out anything. Some of the access levels provide additional administrative pages or helpful tool tips for new users. These modes are persistent between sessions and will need to be manually disabled by replacing the _1_ with a _0_ in the URL. Below is a quick reference to the modes and what they have access to. @@ -9,11 +10,10 @@ If user accounts are enabled \(`enableUserAccounts` in [_Sofie Core_ settin The access level is persisted in browser's Local Storage. To disable, visit`?theaccessmode=0`. -| Access area | Basic Mode | Configuration Mode | Studio Mode | Admin Mode | -| :--- | :--- | :--- | :--- | :--- | -| **Rundowns** | View Only | View Only | Yes, playout | Yes, playout | -| **Settings** | No | Yes | No | Yes | - +| Access area | Basic Mode | Configuration Mode | Studio Mode | Admin Mode | +| :----------- | :--------- | :----------------- | :----------- | :----------- | +| **Rundowns** | View Only | View Only | Yes, playout | Yes, playout | +| **Settings** | No | Yes | No | Yes | ### Basic mode diff --git a/packages/documentation/versioned_docs/version-1.50.0/user-guide/features/language.md b/packages/documentation/versioned_docs/version-1.50.0/user-guide/features/language.md index 9fe03d816e..3c61fb16c3 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/user-guide/features/language.md +++ b/packages/documentation/versioned_docs/version-1.50.0/user-guide/features/language.md @@ -1,9 +1,10 @@ --- sidebar_position: 7 --- + # Language -_Sofie_ uses the [i18n internationalisation framework](https://www.i18next.com/) that allows you to present user-facing views in multiple languages. +_Sofie_ uses the [i18n internationalisation framework](https://www.i18next.com/) that allows you to present user-facing views in multiple languages. ## Language selection @@ -14,10 +15,11 @@ The UI will automatically detect user browser's default matching and select the This choice is persisted in browser's local storage, and the same language will be used until a new forced language is chosen using this method. _Sofie_ currently supports three languages: -* English _(default)_ `en` -* Norwegian bokmål `nb` -* Norwegian nynorsk `nn` + +- English _(default)_ `en` +- Norwegian bokmål `nb` +- Norwegian nynorsk `nn` ## Further Reading -* [List of language tags](https://en.wikipedia.org/wiki/IETF_language_tag) \ No newline at end of file +- [List of language tags](https://en.wikipedia.org/wiki/IETF_language_tag) diff --git a/packages/documentation/versioned_docs/version-1.50.0/user-guide/features/prompter.md b/packages/documentation/versioned_docs/version-1.50.0/user-guide/features/prompter.md index 893e43f7af..086afa2e35 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/user-guide/features/prompter.md +++ b/packages/documentation/versioned_docs/version-1.50.0/user-guide/features/prompter.md @@ -28,7 +28,7 @@ The prompter UI can be configured using query parameters: | `showmarker` | 0 / 1 | If the marker is not set to "hide", control if the marker is hidden or not | `1` | | `showscroll` | 0 / 1 | Whether the scroll bar should be shown | `1` | | `followtake` | 0 / 1 | Whether the prompter should automatically scroll to current segment when the operator TAKE:s it | `1` | -| `showoverunder` | 0 / 1 | The timer in the top-right of the prompter, showing the overtime/undertime of the current show. | `1` | +| `showoverunder` | 0 / 1 | The timer in the top-right of the prompter, showing the overtime/undertime of the current show. | `1` | | `debug` | 0 / 1 | Whether to display a debug box showing controller input values and the calculated speed the prompter is currently scrolling at. Used to tweak speedMaps and ranges. | `0` | Example: [http://127.0.0.1/prompter/studio0/?mode=mouse&followtake=0&fontsize=20](http://127.0.0.1/prompter/studio0/?mode=mouse&followtake=0&fontsize=20) @@ -37,9 +37,9 @@ Example: [http://127.0.0.1/prompter/studio0/?mode=mouse&followtake=0&fontsize=20 The prompter can be controlled by different types of controllers. The control mode is set by a query parameter, like so: `?mode=mouse`. -| Query parameter | Description | -| :---------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| Default | Controlled by both mouse and keyboard | +| Query parameter | Description | +| :---------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Default | Controlled by both mouse and keyboard | | `?mode=mouse` | Controlled by mouse only. [See configuration details](prompter.md#control-using-mouse-scroll-wheel) | | `?mode=keyboard` | Controlled by keyboard only. [See configuration details](prompter.md#control-using-keyboard) | | `?mode=shuttlekeyboard` | Controlled by a Contour Design ShuttleXpress, X-keys Jog and Shuttle or any compatible, configured as keyboard-ish device. [See configuration details](prompter.md#control-using-contour-shuttlexpress-or-x-keys) | @@ -117,7 +117,7 @@ If you want to use traditional analogue pedals with 5 volt TRS connection, a con - `pedal_rangeNeutralMax` has to be greater than `pedal_rangeNeutralMin` - `pedal_rangeFwdMax` has to be greater than `pedal_rangeNeutralMax` -![Yamaha FC7 mapped for both a forward \(80-127\) and backwards \(0-35\) range.](/img/docs/main/features/yamaha-fc7.jpg) +![Yamaha FC7 mapped for both a forward (80-127) and backwards (0-35) range.](/img/docs/main/features/yamaha-fc7.jpg) The default values allow for both going forwards and backwards. This matches the _Yamaha FC7_ expression pedal. The default values create a forward-range from 80-127, a neutral zone from 35-80 and a reverse-range from 0-35. diff --git a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/_category_.json b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/_category_.json index 2f3c7f2a9f..b6be4c9d35 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/_category_.json +++ b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/_category_.json @@ -1,4 +1,4 @@ { - "label": "Installation", - "position": 3 -} \ No newline at end of file + "label": "Installation", + "position": 3 +} diff --git a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/initial-sofie-core-setup.md b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/initial-sofie-core-setup.md index c0672b3e55..91ed165f89 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/initial-sofie-core-setup.md +++ b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/initial-sofie-core-setup.md @@ -6,7 +6,7 @@ sidebar_position: 3 #### Prerequisites -* [Installed and running _Sofie Core_](installing-sofie-server-core.md) +- [Installed and running _Sofie Core_](installing-sofie-server-core.md) Once _Sofie Core_ has been installed and is running you can begin setting it up. The first step is to navigate to the _Settings page_. Please review the [Sofie Access Level](../features/access-levels.md) page for assistance getting there. diff --git a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-a-gateway/_category_.json b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-a-gateway/_category_.json index 7fa55d484d..e83c1db9e5 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-a-gateway/_category_.json +++ b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-a-gateway/_category_.json @@ -1,4 +1,4 @@ { - "label": "Installing a Gateway", - "position": 5 -} \ No newline at end of file + "label": "Installing a Gateway", + "position": 5 +} diff --git a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-a-gateway/intro.md b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-a-gateway/intro.md index 03bc8a5339..d8c6539cae 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-a-gateway/intro.md +++ b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-a-gateway/intro.md @@ -2,11 +2,12 @@ sidebar_label: Introduction sidebar_position: 1 --- + # Introduction: Installing a Gateway #### Prerequisites -* [Installed and running Sofie Core](../installing-sofie-server-core.md) +- [Installed and running Sofie Core](../installing-sofie-server-core.md) The _Sofie Core_ is the primary application for managing the broadcast, but it doesn't play anything out on it's own. A Gateway will establish the connection from _Sofie Core_ to other pieces of hardware or remote software. A basic setup may include the [Spreadsheet Gateway](rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support.md) which will ingest a rundown from Google Sheets then, use the [Playout Gateway](playout-gateway.md) send commands to a CasparCG Server graphics playout, an ATEM vision mixer, and / or the [Sisyfos audio controller](https://github.com/olzzon/sisyfos-audio-controller). @@ -14,12 +15,11 @@ Installing a gateway is a two part process. To begin, you will [add the required ### Rundown & Newsroom Gateways -* [Google Spreadsheet Gateway](rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support.md) -* [iNEWS Gateway](rundown-or-newsroom-system-connection/inews-gateway.md) -* [MOS Gateway](rundown-or-newsroom-system-connection/mos-gateway.md) +- [Google Spreadsheet Gateway](rundown-or-newsroom-system-connection/installing-sofie-with-google-spreadsheet-support.md) +- [iNEWS Gateway](rundown-or-newsroom-system-connection/inews-gateway.md) +- [MOS Gateway](rundown-or-newsroom-system-connection/mos-gateway.md) ### Playout & Media Manager Gateways -* [Playout Gateway](playout-gateway.md) -* [Media Manager](../media-manager.md) - +- [Playout Gateway](playout-gateway.md) +- [Media Manager](../media-manager.md) diff --git a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-a-gateway/playout-gateway.md b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-a-gateway/playout-gateway.md index 0fd5f47626..0d90911760 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-a-gateway/playout-gateway.md +++ b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-a-gateway/playout-gateway.md @@ -1,6 +1,7 @@ --- sidebar_position: 3 --- + # Playout Gateway The _Playout Gateway_ handles interacting external pieces of hardware or software by sending commands that will playout rundown content. This gateway used to be a separate installation but it has since been moved into the main _Sofie Core_ component. diff --git a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json index b4c4ffc34d..ae77b5c6a7 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json +++ b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/_category_.json @@ -1,4 +1,4 @@ { "label": "Rundown or Newsroom System Connection", "position": 4 -} \ No newline at end of file +} diff --git a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md index 48659251a6..0d67551638 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md +++ b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/inews-gateway.md @@ -4,9 +4,8 @@ The iNEWS Gateway communicates with an iNEWS system to ingest and remain in sync ### Installing iNEWS for Sofie -The iNEWS Gateway allows you to create rundowns from within iNEWS and sync them with the _Sofie Core_. The rundowns will update in real time and any changes made will be seen from within your Playout Timeline. +The iNEWS Gateway allows you to create rundowns from within iNEWS and sync them with the _Sofie Core_. The rundowns will update in real time and any changes made will be seen from within your Playout Timeline. The setup for the iNEWS Gateway is already in the Docker Compose file you downloaded earlier. Remove the _\#_ symbol from the start of the line labeled `image: tv2/inews-ftp-gateway:develop` and add a _\#_ to the other ingest gateway that was being used. Although the iNEWS Gateway is available free of charge, an iNEWS license is not. Visit [Avid's website](https://www.avid.com/products/inews/how-to-buy) to find an iNEWS reseller that handles your geographic area. - diff --git a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md index cf2c62a508..dcdc7db5b6 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md +++ b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/intro.md @@ -2,13 +2,10 @@ Sofie Core doesn't talk directly to the newsroom systems, but instead via one of the Gateways. -The Google Spreadsheet Gateway, iNEWS Gateway, and the MOS \( [Media Object Server Communications Protocol](http://mosprotocol.com/) \) Gateway which can handle interacting with any system that communicates via MOS. +The Google Spreadsheet Gateway, iNEWS Gateway, and the MOS \( [Media Object Server Communications Protocol](http://mosprotocol.com/) \) Gateway which can handle interacting with any system that communicates via MOS. ### Further Reading -* [MOS Protocol Overview & Documentation](http://mosprotocol.com/) -* [iNEWS on Avid's Website](https://www.avid.com/products/inews/how-to-buy) -* [ENPS on The Associated Press' Website](https://www.ap.org/enps/support) - - - +- [MOS Protocol Overview & Documentation](http://mosprotocol.com/) +- [iNEWS on Avid's Website](https://www.avid.com/products/inews/how-to-buy) +- [ENPS on The Associated Press' Website](https://www.ap.org/enps/support) diff --git a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md index 8a2a60145c..9f1aa88995 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md +++ b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-a-gateway/rundown-or-newsroom-system-connection/mos-gateway.md @@ -5,5 +5,3 @@ The MOS Gateway communicates with a device that supports the [MOS protocol](http The setup for the MOS Gateway is handled in the Docker Compose in the [Quick Install](../../installing-sofie-server-core.md) page. One thing to note if managing the mos-gateway manually: It needs a few ports open \(10540, 10541\) for MOS-messages to be pushed to it from the NCS. - - diff --git a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-connections-and-additional-hardware/README.md b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-connections-and-additional-hardware/README.md index 4d35fb277d..a2205dd173 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-connections-and-additional-hardware/README.md +++ b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-connections-and-additional-hardware/README.md @@ -2,34 +2,40 @@ #### Prerequisites -* [Installed and running Sofie Core](../installing-sofie-server-core.md) -* [Installed Playout Gateway](../installing-a-gateway/playout-gateway.md) -* [Installed and configured Studio Blueprints](../installing-blueprints.md#installing-a-studio-blueprint) +- [Installed and running Sofie Core](../installing-sofie-server-core.md) +- [Installed Playout Gateway](../installing-a-gateway/playout-gateway.md) +- [Installed and configured Studio Blueprints](../installing-blueprints.md#installing-a-studio-blueprint) The following pages are broken up by equipment type that is supported by Sofie's Gateways. ## Playout & Recording -* [CasparCG Graphics and Video Server](casparcg-server-installation.md) - _Graphics / Playout / Recording_ -* [Blackmagic Design's HyperDeck](https://www.blackmagicdesign.com/products/hyperdeckstudio) - _Recording_ -* [Quantel](http://www.quantel.com) Solutions - _Playout_ -* [Vizrt](https://www.vizrt.com/) Graphics Solutions - _Graphics / Playout_ + +- [CasparCG Graphics and Video Server](casparcg-server-installation.md) - _Graphics / Playout / Recording_ +- [Blackmagic Design's HyperDeck](https://www.blackmagicdesign.com/products/hyperdeckstudio) - _Recording_ +- [Quantel](http://www.quantel.com) Solutions - _Playout_ +- [Vizrt](https://www.vizrt.com/) Graphics Solutions - _Graphics / Playout_ ## Vision Mixers -* [Blackmagic's ATEM](https://www.blackmagicdesign.com/products/atem) hardware vision mixers -* [vMix](https://www.vmix.com/) software vision mixer \(coming soon\) + +- [Blackmagic's ATEM](https://www.blackmagicdesign.com/products/atem) hardware vision mixers +- [vMix](https://www.vmix.com/) software vision mixer \(coming soon\) ## Audio Mixers -* [Sisyfos](https://github.com/olzzon/sisyfos-audio-controller) audio controller -* [Lawo sound mixers_,_](https://www.lawo.com/applications/broadcast-production/audio-consoles.html) _using emberplus protocol_ -* Generic OSC \(open sound control\) + +- [Sisyfos](https://github.com/olzzon/sisyfos-audio-controller) audio controller +- [Lawo sound mixers*,*](https://www.lawo.com/applications/broadcast-production/audio-consoles.html) _using emberplus protocol_ +- Generic OSC \(open sound control\) ## PTZ Cameras -* [Panasonic PTZ](https://pro-av.panasonic.net/en/products/ptz_camera_systems.html) cameras + +- [Panasonic PTZ](https://pro-av.panasonic.net/en/products/ptz_camera_systems.html) cameras ## Lights -* [Pharos](https://www.pharoscontrols.com/) light control + +- [Pharos](https://www.pharoscontrols.com/) light control ## Other -* Generic OSC \(open sound control\) -* Generic HTTP requests \(to control http-REST interfaces\) -* Generic TCP-socket + +- Generic OSC \(open sound control\) +- Generic HTTP requests \(to control http-REST interfaces\) +- Generic TCP-socket diff --git a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-connections-and-additional-hardware/_category_.json b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-connections-and-additional-hardware/_category_.json index d3e1e8979e..4d800e9a88 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-connections-and-additional-hardware/_category_.json +++ b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-connections-and-additional-hardware/_category_.json @@ -1,4 +1,4 @@ { - "label": "Installing Connections and Additional Hardware", - "position": 6 -} \ No newline at end of file + "label": "Installing Connections and Additional Hardware", + "position": 6 +} diff --git a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md index 1515b08840..5c3c9b0234 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md +++ b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-connections-and-additional-hardware/vision-mixers.md @@ -1,6 +1,6 @@ # Configuring Vision Mixers -## ATEM – Blackmagic Design +## ATEM – Blackmagic Design The [Playout Gateway](../installing-a-gateway/playout-gateway.md) supports communicating with the entire line up of Blackmagic Design's ATEM vision mixers. @@ -11,4 +11,3 @@ Once your ATEM is properly configured on the network, you can add it as a device ### Additional Information Sofie does not support connecting to a vision mixer hardware panels. All interacts with the vision mixers must be handled within a Rundown. - diff --git a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-input-gateway.md b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-input-gateway.md index 5d809d74af..a433a34fde 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-input-gateway.md +++ b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-input-gateway.md @@ -14,21 +14,20 @@ If not connecting over HTTPS, remove the `--https` flag. Input Gateway can be launched from [CasparCG Launcher](./installing-connections-and-additional-hardware/casparcg-server-installation#installing-the-casparcg-launcher). This will make management and log collection easier on a production system. -You can now open the _Sofie Core_, `http://localhost:3000`, and navigate to the _Settings page_. You will see your _Input Gateway_ under the _Devices_ section of the menu. In _Input Devices_ you can add devices that this instance of Input Gateway should handle. Some of the device integrations will allow you to customize the Feedback behavior. The *Device ID* property will identify a given Input Device in the Studio, so this property can be used for fail-over purposes. +You can now open the _Sofie Core_, `http://localhost:3000`, and navigate to the _Settings page_. You will see your _Input Gateway_ under the _Devices_ section of the menu. In _Input Devices_ you can add devices that this instance of Input Gateway should handle. Some of the device integrations will allow you to customize the Feedback behavior. The _Device ID_ property will identify a given Input Device in the Studio, so this property can be used for fail-over purposes. ## Supported devices and protocols Currently, input gateway supports: -* Stream Deck panels -* Skaarhoj panels - _TCP Raw Panel_ mode -* X-Keys panels -* MIDI controllers -* OSC -* HTTP +- Stream Deck panels +- Skaarhoj panels - _TCP Raw Panel_ mode +- X-Keys panels +- MIDI controllers +- OSC +- HTTP ### Further Reading -* [Input Gateway Releases on GitHub](https://github.com/nrkno/sofie-input-gateway/releases) -* [Input Gateway GitHub Page for Developers](https://github.com/nrkno/sofie-input-gateway) - +- [Input Gateway Releases on GitHub](https://github.com/nrkno/sofie-input-gateway/releases) +- [Input Gateway GitHub Page for Developers](https://github.com/nrkno/sofie-input-gateway) diff --git a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-package-manager.md b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-package-manager.md index bd6cbf3a15..677a583a5e 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-package-manager.md +++ b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/installing-package-manager.md @@ -49,7 +49,6 @@ To setup, go into Core and add this device to a Studio This first run is necessary to get the Package Manager device registered with _Sofie Core_. We'll restart Package Manager later on in the [Configuration](#configuration) instructions. - ## Installation In Production We provide pre-built executables for Windows (x64) systems that can be used in production environments. These can be found on the [Releases](https://github.com/nrkno/sofie-package-manager/releases) GitHub repository page for Package Manager. For a minimal installation, you'll need the `package-manager-single-app.exe` and `worker.exe`. Put them in a folder of your choice. You can also place `ffmpeg.exe` and `ffprobe.exe` alongside them, if you don't want to make them available in `PATH`. diff --git a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/intro.md b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/intro.md index c3a14c218b..8ac8fdf3d6 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/intro.md +++ b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/intro.md @@ -1,37 +1,35 @@ --- sidebar_position: 1 --- + # Getting Started _Sofie_ can be installed in many different ways, depending on which platforms, needs, and features you desire. The _Sofie_ system consists of several applications that work together to provide complete broadcast automation system. Each of these components' installation will be covered in this guide. Additional information about the products or services mentioned alongside the Sofie Installation can be found on the [Further Reading](../further-reading.md). There are four minimum required components to get a Sofie system up and running. First you need the [_Sofie Core_](installing-sofie-server-core.md), which is the brains of the operation. Then a set of [_Blueprints_](installing-blueprints.md) to handle and interpret incoming and outgoing data. Next, an [_Ingest Gateway_](installing-a-gateway/rundown-or-newsroom-system-connection/intro.md) to fetch the data for the Blueprints. Then finally, a [_Playout Gateway_](installing-a-gateway/playout-gateway.md) to send the data to your playout device of choice. - - ## Sofie Core View -The _Rundowns_ view will display all the active rundowns that the _Sofie Core_ has access to. +The _Rundowns_ view will display all the active rundowns that the _Sofie Core_ has access to. ![Rundown View](/img/docs/getting-started/rundowns-in-sofie.png) The _Status_ views displays the current status for the attached devices and gateways. -![Status View – Describes the state of _Sofie Core_](/img/docs/getting-started/status-page.jpg) +![Status View – Describes the state of _Sofie Core_](/img/docs/getting-started/status-page.jpg) -The _Settings_ views contains various settings for the studio, show styles, blueprints etc.. If the link to the settings view is not visible in your application, check your [Access Levels](../features/access-levels.md). More info on specific parts of the _Settings_ view can be found in their corresponding guide sections. +The _Settings_ views contains various settings for the studio, show styles, blueprints etc.. If the link to the settings view is not visible in your application, check your [Access Levels](../features/access-levels.md). More info on specific parts of the _Settings_ view can be found in their corresponding guide sections. -![Settings View – Describes how the _Sofie Core_ is configured](/img/docs/getting-started/settings-page.jpg) +![Settings View – Describes how the _Sofie Core_ is configured](/img/docs/getting-started/settings-page.jpg) ## Sofie Core Overview -The _Sofie Core_ is the primary application for managing the broadcast but, it doesn't play anything out on it's own. You need to use Gateways to establish the connection from the _Sofie Core_ to other pieces of hardware or remote software. +The _Sofie Core_ is the primary application for managing the broadcast but, it doesn't play anything out on it's own. You need to use Gateways to establish the connection from the _Sofie Core_ to other pieces of hardware or remote software. ### Gateways -Gateways are separate applications that bridge the gap between the _Sofie Core_ and other pieces of hardware or services. At minimum, you will need a _Playout Gateway_ so your timeline can interact with your playout system of choice. To install the _Playout Gateway_, visit the [Installing a Gateway](installing-a-gateway/intro.md) section of this guide and for a more in-depth look, please see [Gateways](../concepts-and-architecture.md#gateways). +Gateways are separate applications that bridge the gap between the _Sofie Core_ and other pieces of hardware or services. At minimum, you will need a _Playout Gateway_ so your timeline can interact with your playout system of choice. To install the _Playout Gateway_, visit the [Installing a Gateway](installing-a-gateway/intro.md) section of this guide and for a more in-depth look, please see [Gateways](../concepts-and-architecture.md#gateways). ### Blueprints Blueprints can be described as the logic that determines how a studio and show should interact with one another. They interpret the data coming in from the rundowns and transform them into a rich set of playable elements \(_Segments_, _Parts_, _AdLibs,_ etcetera\). The _Sofie Core_ has three main blueprint types, _System Blueprints_, _Studio Blueprints_, and _Showstyle Blueprints_. Installing _Sofie_ does not require you understand what these blueprints do, just that they are required for the _Sofie Core_ to work. If you would like to gain a deeper understand of how _Blueprints_ work, please visit the [Blueprints](#blueprints) section. - diff --git a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/media-manager.md b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/media-manager.md index c286df52c3..5c966aec57 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/media-manager.md +++ b/packages/documentation/versioned_docs/version-1.50.0/user-guide/installation/media-manager.md @@ -10,12 +10,11 @@ Media Manager is deprecated and is not recommended for new deployments. There ar ::: -The Media Manager handles the media, or files, that make up the rundown content. To install it, begin by downloading the latest release of [Media Manager from GitHub](https://github.com/nrkno/sofie-media-management/releases). You can now run the `media-manager.exe` file inside the extracted folder. A warning window may popup about the app being unrecognized. You can get around this by selecting _More Info_ and clicking _Run Anyways_. A terminal window will open and begin running the application. +The Media Manager handles the media, or files, that make up the rundown content. To install it, begin by downloading the latest release of [Media Manager from GitHub](https://github.com/nrkno/sofie-media-management/releases). You can now run the `media-manager.exe` file inside the extracted folder. A warning window may popup about the app being unrecognized. You can get around this by selecting _More Info_ and clicking _Run Anyways_. A terminal window will open and begin running the application. -You can now open the _Sofie Core_, `http://localhost:3000`, and navigate to the _Settings page_. You will see your _Media Manager_ under the _Devices_ section of the menu. The four main sections, general properties, attached storage, media flows, monitors, as well as attached subdivides, all contribute to how the media is handled within the Sofie Core. +You can now open the _Sofie Core_, `http://localhost:3000`, and navigate to the _Settings page_. You will see your _Media Manager_ under the _Devices_ section of the menu. The four main sections, general properties, attached storage, media flows, monitors, as well as attached subdivides, all contribute to how the media is handled within the Sofie Core. ### Further Reading -* [Media Manager Releases on GitHub](https://github.com/nrkno/sofie-media-management/releases) -* [Media Manager GitHub Page for Developers](https://github.com/nrkno/sofie-media-management) - +- [Media Manager Releases on GitHub](https://github.com/nrkno/sofie-media-management/releases) +- [Media Manager GitHub Page for Developers](https://github.com/nrkno/sofie-media-management) diff --git a/packages/documentation/versioned_docs/version-1.50.0/user-guide/supported-devices.md b/packages/documentation/versioned_docs/version-1.50.0/user-guide/supported-devices.md index 55f27cd5ab..b49c1a4e41 100644 --- a/packages/documentation/versioned_docs/version-1.50.0/user-guide/supported-devices.md +++ b/packages/documentation/versioned_docs/version-1.50.0/user-guide/supported-devices.md @@ -1,6 +1,7 @@ --- sidebar_position: 1.5 --- + # Supported Playout Devices All playout devices are essentially driven through the _timeline_, which passes through _Sofie Core_ into the Playout Gateway where it is processed by the timeline-state-resolver. This page details which devices and what parts of the devices can be controlled through the timeline-state-resolver library. In general a blueprints developer can use the [timeline-state-resolver-types package](https://www.npmjs.com/package/timeline-state-resolver-types) to see the interfaces for the timeline objects used to control the devices. @@ -9,110 +10,110 @@ All playout devices are essentially driven through the _timeline_, which passes We support almost all features of these devices except fairlight audio, camera controls and streaming capabilities. A non-inclusive list: -* Control of camera inputs -* Transitions -* Full control of keyers -* Full control of DVE's -* Control of media pools -* Control of auxilliaries +- Control of camera inputs +- Transitions +- Full control of keyers +- Full control of DVE's +- Control of media pools +- Control of auxilliaries ## CasparCG Server Tested and developed against [a fork of version 2.1](https://github.com/nrkno/sofie-casparcg-server) with more support for version 2.3 being added in the future. -* Video playback -* Graphics playback -* Recording / streaming -* Mixer parameters -* Transitions +- Video playback +- Graphics playback +- Recording / streaming +- Mixer parameters +- Transitions ## HTTP Protocol -* GET/POST/PUT/DELETE methods -* Interval based watcher for status monitoring +- GET/POST/PUT/DELETE methods +- Interval based watcher for status monitoring ## Blackmagic Design HyperDeck -* Recording +- Recording ## Lawo Powercore & MC2 Series -* Control over faders - * Using the ramp function on the powercore -* Control of parameters in the ember tree +- Control over faders + - Using the ramp function on the powercore +- Control of parameters in the ember tree ## OSC protocol -* Sending of integers, floats, strings, blobs -* Tweening \(transitioning between\) values +- Sending of integers, floats, strings, blobs +- Tweening \(transitioning between\) values Can be configured in TCP or UDP mode. ## Panasonic PTZ Cameras -* Recalling presets -* Setting zoom, zoom speed and recall speed +- Recalling presets +- Setting zoom, zoom speed and recall speed ## Pharos Lighting Control -* Recalling scenes -* Recalling timelines +- Recalling scenes +- Recalling timelines ## Grass Valley SQ Media Servers -* Control of playback -* Looping -* Cloning +- Control of playback +- Looping +- Cloning _Note: some features are controlled through the Package Manager_ ## Shotoku Camera Robotics -* Cutting to shots -* Fading to shots +- Cutting to shots +- Fading to shots ## Singular Live -* Control nodes +- Control nodes _Note: this is not currently used in production by anyone we know of_ ## Sisyfos -* On-air controls -* Fader levels -* Labels -* Hide / show channels +- On-air controls +- Fader levels +- Labels +- Hide / show channels ## TCP Protocol -* Sending messages +- Sending messages ## VizRT Viz MSE -* Pilot elements -* Continue commands -* Loading all elements -* Clearing all elements +- Pilot elements +- Continue commands +- Loading all elements +- Clearing all elements ## vMix -* Full M/E control -* Audio control -* Streaming / recording control -* Fade to black -* Overlays -* Transforms -* Transitions +- Full M/E control +- Audio control +- Streaming / recording control +- Fade to black +- Overlays +- Transforms +- Transitions ## OBS -*Through OBS WebSocket v4 RPC API* +_Through OBS WebSocket v4 RPC API_ -* Current / Preview Scene -* Current Transition -* Recording -* Streaming -* Scene Item visibility -* Source Settings (FFmpeg source) -* Source Mute +- Current / Preview Scene +- Current Transition +- Recording +- Streaming +- Scene Item visibility +- Source Settings (FFmpeg source) +- Source Mute diff --git a/packages/documentation/versioned_sidebars/version-1.49.0-sidebars.json b/packages/documentation/versioned_sidebars/version-1.49.0-sidebars.json index d7c19231b4..f9b82fa92b 100644 --- a/packages/documentation/versioned_sidebars/version-1.49.0-sidebars.json +++ b/packages/documentation/versioned_sidebars/version-1.49.0-sidebars.json @@ -1,14 +1,14 @@ { - "userGuide": [ - { - "type": "autogenerated", - "dirName": "user-guide" - } - ], - "forDevelopers": [ - { - "type": "autogenerated", - "dirName": "for-developers" - } - ] + "userGuide": [ + { + "type": "autogenerated", + "dirName": "user-guide" + } + ], + "forDevelopers": [ + { + "type": "autogenerated", + "dirName": "for-developers" + } + ] } diff --git a/packages/documentation/versioned_sidebars/version-1.50.0-sidebars.json b/packages/documentation/versioned_sidebars/version-1.50.0-sidebars.json index d7c19231b4..f9b82fa92b 100644 --- a/packages/documentation/versioned_sidebars/version-1.50.0-sidebars.json +++ b/packages/documentation/versioned_sidebars/version-1.50.0-sidebars.json @@ -1,14 +1,14 @@ { - "userGuide": [ - { - "type": "autogenerated", - "dirName": "user-guide" - } - ], - "forDevelopers": [ - { - "type": "autogenerated", - "dirName": "for-developers" - } - ] + "userGuide": [ + { + "type": "autogenerated", + "dirName": "user-guide" + } + ], + "forDevelopers": [ + { + "type": "autogenerated", + "dirName": "for-developers" + } + ] } diff --git a/packages/documentation/versions.json b/packages/documentation/versions.json index 7a89066bfc..6f580bcd82 100644 --- a/packages/documentation/versions.json +++ b/packages/documentation/versions.json @@ -7,4 +7,4 @@ "1.41.0", "1.38.0", "1.37.0" -] \ No newline at end of file +] diff --git a/packages/job-worker/.eslintrc.json b/packages/job-worker/.eslintrc.json deleted file mode 100644 index 3b809efa88..0000000000 --- a/packages/job-worker/.eslintrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "../node_modules/@sofie-automation/code-standard-preset/eslint/main" -} diff --git a/packages/job-worker/eslint.config.mjs b/packages/job-worker/eslint.config.mjs new file mode 100644 index 0000000000..b9e5a88fd8 --- /dev/null +++ b/packages/job-worker/eslint.config.mjs @@ -0,0 +1,3 @@ +import { generateEslintConfig } from '@sofie-automation/code-standard-preset/eslint/main.mjs' + +export default generateEslintConfig({}) diff --git a/packages/job-worker/jest.config.js b/packages/job-worker/jest.config.js index 48dd87ece3..c534a7fb39 100644 --- a/packages/job-worker/jest.config.js +++ b/packages/job-worker/jest.config.js @@ -22,6 +22,9 @@ module.exports = { ], '^.+\\.(js|jsx|mjs)$': path.resolve('./scripts/babel-jest.mjs'), }, + moduleNameMapper: { + '(.+)\\.js$': '$1', + }, transformIgnorePatterns: ['node_modules/(?!(debounce-fn|p-queue|p-timeout)/)', '\\.pnp\\.[^\\/]+$'], globalSetup: './src/__mocks__/global-setup.js', setupFilesAfterEnv: ['./src/__mocks__/_setupMocks.ts'], diff --git a/packages/job-worker/package.json b/packages/job-worker/package.json index d2ba0bfae1..ff6c406b3c 100644 --- a/packages/job-worker/package.json +++ b/packages/job-worker/package.json @@ -1,6 +1,6 @@ { "name": "@sofie-automation/job-worker", - "version": "1.52.0", + "version": "1.53.0-in-development", "description": "Worker for things", "main": "dist/index.js", "license": "MIT", @@ -19,7 +19,7 @@ "dev:debug": "run -T nodemon --config nodemon.json --inspect-brk src/index.ts", "build": "run -T rimraf dist && run build:main", "build:main": "run -T tsc -p tsconfig.build.json", - "lint:raw": "run -T eslint --ext .ts --ext .js --ignore-pattern dist", + "lint:raw": "run -T eslint", "lint": "run lint:raw .", "unit": "run -T jest", "test": "run lint && run unit", @@ -31,7 +31,7 @@ "license-validate": "run -T sofie-licensecheck" }, "engines": { - "node": ">=22.11" + "node": ">=22.13.1" }, "files": [ "/dist", @@ -41,9 +41,9 @@ ], "dependencies": { "@slack/webhook": "^7.0.4", - "@sofie-automation/blueprints-integration": "1.52.0", - "@sofie-automation/corelib": "1.52.0", - "@sofie-automation/shared-lib": "1.52.0", + "@sofie-automation/blueprints-integration": "1.53.0-in-development", + "@sofie-automation/corelib": "1.53.0-in-development", + "@sofie-automation/shared-lib": "1.53.0-in-development", "amqplib": "^0.10.5", "deepmerge": "^4.3.1", "elastic-apm-node": "^4.11.0", @@ -67,6 +67,8 @@ }, "packageManager": "yarn@4.6.0", "devDependencies": { - "jest-mock-extended": "^3.0.7" + "jest": "^29.7.0", + "jest-mock-extended": "^3.0.7", + "typescript": "~5.7.3" } } diff --git a/packages/job-worker/scripts/babel-jest.mjs b/packages/job-worker/scripts/babel-jest.mjs index 910e6a26e2..4d78261737 100644 --- a/packages/job-worker/scripts/babel-jest.mjs +++ b/packages/job-worker/scripts/babel-jest.mjs @@ -1,4 +1,4 @@ -// eslint-disable-next-line node/no-extraneous-import +// eslint-disable-next-line n/no-extraneous-import import babelJest from 'babel-jest' export default babelJest.default.createTransformer({ diff --git a/packages/job-worker/src/__mocks__/_extendJest.ts b/packages/job-worker/src/__mocks__/_extendJest.ts index 37a8bc421e..e375ae1eb7 100644 --- a/packages/job-worker/src/__mocks__/_extendJest.ts +++ b/packages/job-worker/src/__mocks__/_extendJest.ts @@ -14,14 +14,14 @@ expect.extend({ const pass = received instanceof UserError && - received.message.key === expectedError.message.key && - (args === undefined || JSON.stringify(args) === JSON.stringify(received.message.args)) + received.userMessage.key === expectedError.userMessage.key && + (args === undefined || JSON.stringify(args) === JSON.stringify(received.userMessage.args)) return { message: () => `expected ${JSON.stringify( - received instanceof UserError ? received.message : received - )} to match ${JSON.stringify(expectedError.message)}`, + received instanceof UserError ? received.userMessage : received + )} to match ${JSON.stringify(expectedError.userMessage)}`, pass: pass, } }, diff --git a/packages/job-worker/src/__mocks__/_setupMocks.ts b/packages/job-worker/src/__mocks__/_setupMocks.ts index c466dc9217..1d4e7d392e 100644 --- a/packages/job-worker/src/__mocks__/_setupMocks.ts +++ b/packages/job-worker/src/__mocks__/_setupMocks.ts @@ -1,15 +1,15 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ +/* eslint-disable @typescript-eslint/no-require-imports */ -import './_extendJest' +import './_extendJest.js' // This file is run before all tests start. // Mock random ids to be predictable. Imports have to be relative, not via package nmmes for some reason.. jest.mock('nanoid') -jest.mock('../lib/time', (...args) => require('./time').setup(args), { +jest.mock('../lib/time.js', (...args) => require('./time').setup(args), { virtual: true, }) -jest.mock('../events/integration/rabbitMQ', (...args) => require('./rabbitMQ').setup(args), { virtual: true }) -jest.mock('../events/integration/slack', (...args) => require('./slack').setup(args), { virtual: true }) +jest.mock('../events/integration/rabbitMQ.js', (...args) => require('./rabbitMQ').setup(args), { virtual: true }) +jest.mock('../events/integration/slack.js', (...args) => require('./slack').setup(args), { virtual: true }) diff --git a/packages/job-worker/src/__mocks__/collection.ts b/packages/job-worker/src/__mocks__/collection.ts index 5038a12d3c..0c63527d77 100644 --- a/packages/job-worker/src/__mocks__/collection.ts +++ b/packages/job-worker/src/__mocks__/collection.ts @@ -34,9 +34,15 @@ import { import { ProtectedString } from '@sofie-automation/corelib/dist/protectedString' import { AnyBulkWriteOperation, Collection, CountOptions, FindOptions } from 'mongodb' import { ReadonlyDeep } from 'type-fest' -import { IChangeStream, IChangeStreamEvents, ICollection, IDirectCollections, MongoModifier, MongoQuery } from '../db' -import _ = require('underscore') -import { ExpectedMediaItem } from '@sofie-automation/corelib/dist/dataModel/ExpectedMediaItem' +import { + IChangeStream, + IChangeStreamEvents, + ICollection, + IDirectCollections, + MongoModifier, + MongoQuery, +} from '../db/index.js' +import _ from 'underscore' import { RundownBaselineAdLibItem } from '@sofie-automation/corelib/dist/dataModel/RundownBaselineAdLibPiece' import { ExternalMessageQueueObj } from '@sofie-automation/corelib/dist/dataModel/ExternalMessageQueue' import { MediaObjects } from '@sofie-automation/corelib/dist/dataModel/MediaObjects' @@ -283,7 +289,6 @@ export function getMockCollections(): { Blueprints: new MockMongoCollection(CollectionName.Blueprints), BucketAdLibActions: new MockMongoCollection(CollectionName.BucketAdLibActions), BucketAdLibPieces: new MockMongoCollection(CollectionName.BucketAdLibPieces), - ExpectedMediaItems: new MockMongoCollection(CollectionName.ExpectedMediaItems), ExpectedPlayoutItems: new MockMongoCollection(CollectionName.ExpectedPlayoutItems), Notifications: new MockMongoCollection(CollectionName.Notifications), SofieIngestDataCache: new MockMongoCollection(CollectionName.SofieIngestDataCache), @@ -341,7 +346,6 @@ export interface IMockCollections { Blueprints: MockMongoCollection BucketAdLibActions: MockMongoCollection BucketAdLibPieces: MockMongoCollection - ExpectedMediaItems: MockMongoCollection ExpectedPlayoutItems: MockMongoCollection Notifications: MockMongoCollection SofieIngestDataCache: MockMongoCollection diff --git a/packages/job-worker/src/__mocks__/context.ts b/packages/job-worker/src/__mocks__/context.ts index 52df23225e..0a96d7aa02 100644 --- a/packages/job-worker/src/__mocks__/context.ts +++ b/packages/job-worker/src/__mocks__/context.ts @@ -31,14 +31,14 @@ import { EventsJobFunc } from '@sofie-automation/corelib/dist/worker/events' import { IngestJobFunc } from '@sofie-automation/corelib/dist/worker/ingest' import { StudioJobFunc } from '@sofie-automation/corelib/dist/worker/studio' import { ReadonlyDeep } from 'type-fest' -import { WrappedShowStyleBlueprint, WrappedStudioBlueprint } from '../blueprints/cache' +import { WrappedShowStyleBlueprint, WrappedStudioBlueprint } from '../blueprints/cache.js' import { ProcessedShowStyleConfig, ProcessedStudioConfig, preprocessShowStyleConfig, preprocessStudioConfig, -} from '../blueprints/config' -import { IDirectCollections } from '../db' +} from '../blueprints/config.js' +import { IDirectCollections } from '../db/index.js' import { ApmSpan, JobContext, @@ -46,18 +46,18 @@ import { ProcessedShowStyleBase, ProcessedShowStyleCompound, ProcessedShowStyleVariant, -} from '../jobs' -import { PlaylistLock, RundownLock } from '../jobs/lock' -import { BaseModel } from '../modelBase' -import { createShowStyleCompound } from '../showStyles' -import { IMockCollections, getMockCollections } from './collection' -// import _ = require('underscore') +} from '../jobs/index.js' +import { PlaylistLock, RundownLock } from '../jobs/lock.js' +import { BaseModel } from '../modelBase.js' +import { createShowStyleCompound } from '../showStyles.js' +import { IMockCollections, getMockCollections } from './collection.js' +// import _ from 'underscore' import { TimelineComplete } from '@sofie-automation/corelib/dist/dataModel/Timeline' import { JSONBlobStringify } from '@sofie-automation/shared-lib/dist/lib/JSONBlob' -import { removeRundownPlaylistFromDb } from '../ingest/__tests__/lib' -import { processShowStyleBase, processShowStyleVariant } from '../jobs/showStyle' -import { defaultStudio } from './defaultCollectionObjects' -import { convertStudioToJobStudio } from '../jobs/studio' +import { removeRundownPlaylistFromDb } from '../ingest/__tests__/lib.js' +import { processShowStyleBase, processShowStyleVariant } from '../jobs/showStyle.js' +import { defaultStudio } from './defaultCollectionObjects.js' +import { convertStudioToJobStudio } from '../jobs/studio.js' export function setupDefaultJobEnvironment(studioId?: StudioId): MockJobContext { const { mockCollections, jobCollections } = getMockCollections() diff --git a/packages/job-worker/src/__mocks__/defaultCollectionObjects.ts b/packages/job-worker/src/__mocks__/defaultCollectionObjects.ts index 5d476afed9..f45471d0da 100644 --- a/packages/job-worker/src/__mocks__/defaultCollectionObjects.ts +++ b/packages/job-worker/src/__mocks__/defaultCollectionObjects.ts @@ -20,8 +20,8 @@ import { DBStudio } from '@sofie-automation/corelib/dist/dataModel/Studio' import { unprotectString } from '@sofie-automation/corelib/dist/protectedString' import { wrapDefaultObject } from '@sofie-automation/corelib/dist/settings/objectWithOverrides' import { DEFAULT_MINIMUM_TAKE_SPAN } from '@sofie-automation/shared-lib/dist/core/constants' -import { getRundownId } from '../ingest/lib' -import { getCurrentTime } from '../lib' +import { getRundownId } from '../ingest/lib.js' +import { getCurrentTime } from '../lib/index.js' export function defaultRundownPlaylist(_id: RundownPlaylistId, studioId: StudioId): DBRundownPlaylist { return { @@ -86,10 +86,10 @@ export function defaultRundown( type: 'nrcs', peripheralDeviceId: ingestDeviceId, nrcsName: 'mock', - } + } : { type: 'http', - }, + }, } } diff --git a/packages/job-worker/src/__mocks__/helpers/snapshot.ts b/packages/job-worker/src/__mocks__/helpers/snapshot.ts index 4b1400f506..95b143b6fc 100644 --- a/packages/job-worker/src/__mocks__/helpers/snapshot.ts +++ b/packages/job-worker/src/__mocks__/helpers/snapshot.ts @@ -7,7 +7,7 @@ import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/Rund import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment' import { TimelineObjGeneric, TimelineComplete } from '@sofie-automation/corelib/dist/dataModel/Timeline' import { clone } from '@sofie-automation/corelib/dist/lib' -import * as _ from 'underscore' +import _ from 'underscore' // About snapshot testing: https://jestjs.io/docs/en/snapshot-testing diff --git a/packages/job-worker/src/__mocks__/presetCollections.ts b/packages/job-worker/src/__mocks__/presetCollections.ts index 9fd120815f..d098736544 100644 --- a/packages/job-worker/src/__mocks__/presetCollections.ts +++ b/packages/job-worker/src/__mocks__/presetCollections.ts @@ -9,7 +9,7 @@ import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' import { EmptyPieceTimelineObjectsBlob, Piece } from '@sofie-automation/corelib/dist/dataModel/Piece' import { RundownBaselineAdLibItem } from '@sofie-automation/corelib/dist/dataModel/RundownBaselineAdLibPiece' import { protectString } from '@sofie-automation/corelib/dist/protectedString' -import { getCurrentTime, getSystemVersion } from '../lib' +import { getCurrentTime, getSystemVersion } from '../lib/index.js' import { IBlueprintPieceType, IOutputLayer, @@ -19,12 +19,12 @@ import { SourceLayerType, StatusCode, } from '@sofie-automation/blueprints-integration' -import { ProcessedShowStyleCompound } from '../jobs' +import { ProcessedShowStyleCompound } from '../jobs/index.js' import { DBShowStyleBase } from '@sofie-automation/corelib/dist/dataModel/ShowStyleBase' import { DBShowStyleVariant } from '@sofie-automation/corelib/dist/dataModel/ShowStyleVariant' import { getRandomId, literal, normalizeArray } from '@sofie-automation/corelib/dist/lib' -import _ = require('underscore') -import { defaultRundownPlaylist } from './defaultCollectionObjects' +import _ from 'underscore' +import { defaultRundownPlaylist } from './defaultCollectionObjects.js' import { PeripheralDeviceCategory, PeripheralDeviceType, @@ -32,12 +32,12 @@ import { PeripheralDeviceSubType, PERIPHERAL_SUBTYPE_PROCESS, } from '@sofie-automation/corelib/dist/dataModel/PeripheralDevice' -import { createShowStyleCompound } from '../showStyles' +import { createShowStyleCompound } from '../showStyles.js' import { ReadonlyDeep } from 'type-fest' import { wrapDefaultObject } from '@sofie-automation/corelib/dist/settings/objectWithOverrides' -import { processShowStyleBase, processShowStyleVariant } from '../jobs/showStyle' +import { processShowStyleBase, processShowStyleVariant } from '../jobs/showStyle.js' import { JSONBlobStringify } from '@sofie-automation/shared-lib/dist/lib/JSONBlob' -import { MockJobContext } from './context' +import { MockJobContext } from './context.js' export enum LAYER_IDS { SOURCE_CAM0 = 'cam0', diff --git a/packages/job-worker/src/__tests__/rundown-updatePartInstanceRanks.test.ts b/packages/job-worker/src/__tests__/rundown-updatePartInstanceRanks.test.ts index 663964a937..f8409dc1b5 100644 --- a/packages/job-worker/src/__tests__/rundown-updatePartInstanceRanks.test.ts +++ b/packages/job-worker/src/__tests__/rundown-updatePartInstanceRanks.test.ts @@ -1,20 +1,19 @@ /* eslint-disable @typescript-eslint/unbound-method */ import { RundownId, SegmentId, PartId, PartInstanceId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { protectString } from '@sofie-automation/corelib/dist/protectedString' -import { updatePartInstanceRanksAndOrphanedState } from '../updatePartInstanceRanksAndOrphanedState' +import { updatePartInstanceRanksAndOrphanedState } from '../updatePartInstanceRanksAndOrphanedState.js' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' -import { JobContext } from '../jobs' -import { BeforePartMapItem } from '../ingest/commit' -// eslint-disable-next-line node/no-extraneous-import +import { JobContext } from '../jobs/index.js' +import { BeforePartMapItem } from '../ingest/commit.js' import { mock } from 'jest-mock-extended' -import { ICollection } from '../db' -import { IngestModel } from '../ingest/model/IngestModel' -import { IngestSegmentModel } from '../ingest/model/IngestSegmentModel' +import { ICollection } from '../db/index.js' +import { IngestModel } from '../ingest/model/IngestModel.js' +import { IngestSegmentModel } from '../ingest/model/IngestSegmentModel.js' import { clone } from '@sofie-automation/corelib/dist/lib' -import { IngestPartModel } from '../ingest/model/IngestPartModel' +import { IngestPartModel } from '../ingest/model/IngestPartModel.js' import { AnyBulkWriteOperation } from 'mongodb' -import _ = require('underscore') +import _ from 'underscore' const mockOptions = { fallbackMockImplementation: () => { @@ -208,12 +207,12 @@ describe('updatePartInstanceRanks', () => { ...(newRank !== null ? { 'part._rank': newRank, - } + } : ''), ...(orphaned ? { orphaned: orphaned, - } + } : ''), }, ...(orphaned === undefined @@ -221,7 +220,7 @@ describe('updatePartInstanceRanks', () => { $unset: { orphaned: 1, }, - } + } : ''), }, }, diff --git a/packages/job-worker/src/__tests__/rundownPlaylist.test.ts b/packages/job-worker/src/__tests__/rundownPlaylist.test.ts index d2a256734d..73e3952715 100644 --- a/packages/job-worker/src/__tests__/rundownPlaylist.test.ts +++ b/packages/job-worker/src/__tests__/rundownPlaylist.test.ts @@ -3,19 +3,19 @@ import { RundownPlaylistId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { Rundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { protectString, protectStringArray } from '@sofie-automation/corelib/dist/protectedString' -import { ProcessedShowStyleCompound } from '../jobs' +import { ProcessedShowStyleCompound } from '../jobs/index.js' import { ReadonlyDeep } from 'type-fest' import { handleMoveRundownIntoPlaylist, produceRundownPlaylistInfoFromRundown, handleRestoreRundownsInPlaylistToDefaultOrder, -} from '../rundownPlaylists' -import { MockJobContext, setupDefaultJobEnvironment } from '../__mocks__/context' +} from '../rundownPlaylists.js' +import { MockJobContext, setupDefaultJobEnvironment } from '../__mocks__/context.js' import { setupDefaultRundownPlaylist, setupDefaultRundown, setupMockShowStyleCompound, -} from '../__mocks__/presetCollections' +} from '../__mocks__/presetCollections.js' describe('Rundown', () => { let context: MockJobContext diff --git a/packages/job-worker/src/blueprints/__tests__/config.test.ts b/packages/job-worker/src/blueprints/__tests__/config.test.ts index f1616eb38f..c1c6d523f6 100644 --- a/packages/job-worker/src/blueprints/__tests__/config.test.ts +++ b/packages/job-worker/src/blueprints/__tests__/config.test.ts @@ -1,8 +1,8 @@ import { protectString } from '@sofie-automation/corelib/dist/protectedString' -import { setupMockShowStyleCompound } from '../../__mocks__/presetCollections' -import { setupDefaultJobEnvironment } from '../../__mocks__/context' -import { preprocessStudioConfig, retrieveBlueprintConfigRefs } from '../config' -import { getShowStyleConfigRef, getStudioConfigRef } from '../configRefs' +import { setupMockShowStyleCompound } from '../../__mocks__/presetCollections.js' +import { setupDefaultJobEnvironment } from '../../__mocks__/context.js' +import { preprocessStudioConfig, retrieveBlueprintConfigRefs } from '../config.js' +import { getShowStyleConfigRef, getStudioConfigRef } from '../configRefs.js' import { wrapDefaultObject } from '@sofie-automation/corelib/dist/settings/objectWithOverrides' import { DEFAULT_MINIMUM_TAKE_SPAN } from '@sofie-automation/shared-lib/dist/core/constants' diff --git a/packages/job-worker/src/blueprints/__tests__/context-OnSetAsNextContext.test.ts b/packages/job-worker/src/blueprints/__tests__/context-OnSetAsNextContext.test.ts index a132dc5efb..09f06a5689 100644 --- a/packages/job-worker/src/blueprints/__tests__/context-OnSetAsNextContext.test.ts +++ b/packages/job-worker/src/blueprints/__tests__/context-OnSetAsNextContext.test.ts @@ -1,14 +1,14 @@ -/* eslint-disable @typescript-eslint/no-non-null-assertion, @typescript-eslint/unbound-method */ +/* eslint-disable @typescript-eslint/unbound-method */ import { IBlueprintMutatablePart, IBlueprintPiece } from '@sofie-automation/blueprints-integration' -import { PlayoutModel } from '../../playout/model/PlayoutModel' -import { WatchedPackagesHelper } from '../context/watchedPackages' -import { JobContext, ProcessedShowStyleCompound } from '../../jobs' +import { PlayoutModel } from '../../playout/model/PlayoutModel.js' +import { WatchedPackagesHelper } from '../context/watchedPackages.js' +import { JobContext, ProcessedShowStyleCompound } from '../../jobs/index.js' import { mock } from 'jest-mock-extended' -import { PartAndPieceInstanceActionService } from '../context/services/PartAndPieceInstanceActionService' -import { OnSetAsNextContext } from '../context' +import { PartAndPieceInstanceActionService } from '../context/services/PartAndPieceInstanceActionService.js' +import { OnSetAsNextContext } from '../context/index.js' describe('Test blueprint api context', () => { - async function getTestee() { + async function getTestee(setManually = false) { const mockActionService = mock() const context = new OnSetAsNextContext( { @@ -19,7 +19,8 @@ describe('Test blueprint api context', () => { mock(), mock(), mock(), - mockActionService + mockActionService, + setManually ) return { @@ -28,7 +29,7 @@ describe('Test blueprint api context', () => { } } - describe('ActionExecutionContext', () => { + describe('OnSetAsNextContext', () => { test('getPartInstance', async () => { const { context, mockActionService } = await getTestee() @@ -53,6 +54,14 @@ describe('Test blueprint api context', () => { expect(mockActionService.getResolvedPieceInstances).toHaveBeenCalledWith('current') }) + test('getSegment', async () => { + const { context, mockActionService } = await getTestee() + + await context.getSegment('current') + expect(mockActionService.getSegment).toHaveBeenCalledTimes(1) + expect(mockActionService.getSegment).toHaveBeenCalledWith('current') + }) + test('findLastPieceOnLayer', async () => { const { context, mockActionService } = await getTestee() @@ -126,5 +135,17 @@ describe('Test blueprint api context', () => { expect(mockActionService.updatePartInstance).toHaveBeenCalledTimes(1) expect(mockActionService.updatePartInstance).toHaveBeenCalledWith('next', { title: 'My Part' }) }) + + test('manuallySelected when false', async () => { + const { context } = await getTestee(false) + + expect(context.manuallySelected).toBe(false) + }) + + test('manuallySelected when true', async () => { + const { context } = await getTestee(true) + + expect(context.manuallySelected).toBe(true) + }) }) }) diff --git a/packages/job-worker/src/blueprints/__tests__/context-OnTakeContext.test.ts b/packages/job-worker/src/blueprints/__tests__/context-OnTakeContext.test.ts index 77f8a94d93..2a7877bde9 100644 --- a/packages/job-worker/src/blueprints/__tests__/context-OnTakeContext.test.ts +++ b/packages/job-worker/src/blueprints/__tests__/context-OnTakeContext.test.ts @@ -1,11 +1,11 @@ -/* eslint-disable @typescript-eslint/no-non-null-assertion, @typescript-eslint/unbound-method */ +/* eslint-disable @typescript-eslint/unbound-method */ import { IBlueprintMutatablePart, IBlueprintPiece } from '@sofie-automation/blueprints-integration' -import { PlayoutModel } from '../../playout/model/PlayoutModel' -import { WatchedPackagesHelper } from '../context/watchedPackages' -import { JobContext, ProcessedShowStyleCompound } from '../../jobs' +import { PlayoutModel } from '../../playout/model/PlayoutModel.js' +import { WatchedPackagesHelper } from '../context/watchedPackages.js' +import { JobContext, ProcessedShowStyleCompound } from '../../jobs/index.js' import { mock } from 'jest-mock-extended' -import { PartAndPieceInstanceActionService } from '../context/services/PartAndPieceInstanceActionService' -import { OnTakeContext } from '../context' +import { PartAndPieceInstanceActionService } from '../context/services/PartAndPieceInstanceActionService.js' +import { OnTakeContext } from '../context/index.js' describe('Test blueprint api context', () => { async function getTestee() { @@ -53,6 +53,14 @@ describe('Test blueprint api context', () => { expect(mockActionService.getResolvedPieceInstances).toHaveBeenCalledWith('current') }) + test('getSegment', async () => { + const { context, mockActionService } = await getTestee() + + await context.getSegment('current') + expect(mockActionService.getSegment).toHaveBeenCalledTimes(1) + expect(mockActionService.getSegment).toHaveBeenCalledWith('current') + }) + test('findLastPieceOnLayer', async () => { const { context, mockActionService } = await getTestee() diff --git a/packages/job-worker/src/blueprints/__tests__/context-adlibActions.test.ts b/packages/job-worker/src/blueprints/__tests__/context-adlibActions.test.ts index 46e0fe1d6f..cf940dc356 100644 --- a/packages/job-worker/src/blueprints/__tests__/context-adlibActions.test.ts +++ b/packages/job-worker/src/blueprints/__tests__/context-adlibActions.test.ts @@ -1,12 +1,12 @@ -/* eslint-disable @typescript-eslint/no-non-null-assertion, @typescript-eslint/unbound-method */ +/* eslint-disable @typescript-eslint/unbound-method */ import { IBlueprintMutatablePart, IBlueprintPart, IBlueprintPiece } from '@sofie-automation/blueprints-integration' -import { ActionExecutionContext } from '../context/adlibActions' -import { PlayoutModel } from '../../playout/model/PlayoutModel' -import { WatchedPackagesHelper } from '../context/watchedPackages' -import { JobContext, ProcessedShowStyleCompound } from '../../jobs' +import { ActionExecutionContext } from '../context/adlibActions.js' +import { PlayoutModel } from '../../playout/model/PlayoutModel.js' +import { WatchedPackagesHelper } from '../context/watchedPackages.js' +import { JobContext, ProcessedShowStyleCompound } from '../../jobs/index.js' import { mock } from 'jest-mock-extended' -import { PartAndPieceInstanceActionService } from '../context/services/PartAndPieceInstanceActionService' -import { ProcessedShowStyleConfig } from '../config' +import { PartAndPieceInstanceActionService } from '../context/services/PartAndPieceInstanceActionService.js' +import { ProcessedShowStyleConfig } from '../config.js' describe('Test blueprint api context', () => { async function getTestee() { @@ -55,6 +55,14 @@ describe('Test blueprint api context', () => { expect(mockActionService.getResolvedPieceInstances).toHaveBeenCalledWith('current') }) + test('getSegment', async () => { + const { context, mockActionService } = await getTestee() + + await context.getSegment('current') + expect(mockActionService.getSegment).toHaveBeenCalledTimes(1) + expect(mockActionService.getSegment).toHaveBeenCalledWith('current') + }) + test('findLastPieceOnLayer', async () => { const { context, mockActionService } = await getTestee() diff --git a/packages/job-worker/src/blueprints/__tests__/context-events.test.ts b/packages/job-worker/src/blueprints/__tests__/context-events.test.ts index ee51108643..ba5e7ac60b 100644 --- a/packages/job-worker/src/blueprints/__tests__/context-events.test.ts +++ b/packages/job-worker/src/blueprints/__tests__/context-events.test.ts @@ -1,19 +1,19 @@ import { IBlueprintSegmentDB } from '@sofie-automation/blueprints-integration' -import { PartEventContext, RundownDataChangedEventContext, RundownTimingEventContext } from '../context' +import { PartEventContext, RundownDataChangedEventContext, RundownTimingEventContext } from '../context/index.js' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' import { PieceInstance } from '@sofie-automation/corelib/dist/dataModel/PieceInstance' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { getRandomId } from '@sofie-automation/corelib/dist/lib' import { protectString, unprotectString } from '@sofie-automation/corelib/dist/protectedString' -import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context' -import { setupDefaultRundownPlaylist, setupMockShowStyleCompound } from '../../__mocks__/presetCollections' +import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context.js' +import { setupDefaultRundownPlaylist, setupMockShowStyleCompound } from '../../__mocks__/presetCollections.js' import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' -import { wrapPartToTemporaryInstance } from '../../__mocks__/partinstance' +import { wrapPartToTemporaryInstance } from '../../__mocks__/partinstance.js' import { ReadonlyDeep } from 'type-fest' -import { convertPartInstanceToBlueprints } from '../context/lib' +import { convertPartInstanceToBlueprints } from '../context/lib.js' import { EmptyPieceTimelineObjectsBlob } from '@sofie-automation/corelib/dist/dataModel/Piece' -import { ProcessedShowStyleCompound } from '../../jobs' +import { ProcessedShowStyleCompound } from '../../jobs/index.js' describe('Test blueprint api context', () => { async function generateSparsePieceInstances(rundown: DBRundown) { diff --git a/packages/job-worker/src/blueprints/__tests__/context.test.ts b/packages/job-worker/src/blueprints/__tests__/context.test.ts index 5388b21303..0b233d2ee1 100644 --- a/packages/job-worker/src/blueprints/__tests__/context.test.ts +++ b/packages/job-worker/src/blueprints/__tests__/context.test.ts @@ -1,10 +1,10 @@ import { getHash } from '@sofie-automation/corelib/dist/lib' import { unprotectString } from '@sofie-automation/corelib/dist/protectedString' -import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context' -import { getShowStyleConfigRef, getStudioConfigRef } from '../configRefs' -import { CommonContext } from '../context/CommonContext' -import { StudioContext } from '../context/StudioContext' -import { ShowStyleContext } from '../context/ShowStyleContext' +import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context.js' +import { getShowStyleConfigRef, getStudioConfigRef } from '../configRefs.js' +import { CommonContext } from '../context/CommonContext.js' +import { StudioContext } from '../context/StudioContext.js' +import { ShowStyleContext } from '../context/ShowStyleContext.js' describe('Test blueprint api context', () => { let jobContext: MockJobContext diff --git a/packages/job-worker/src/blueprints/__tests__/postProcess.test.ts b/packages/job-worker/src/blueprints/__tests__/postProcess.test.ts index 82ce7e1108..dd6cbb149c 100644 --- a/packages/job-worker/src/blueprints/__tests__/postProcess.test.ts +++ b/packages/job-worker/src/blueprints/__tests__/postProcess.test.ts @@ -1,10 +1,10 @@ -import * as _ from 'underscore' +import _ from 'underscore' import { postProcessAdLibPieces, postProcessPieces, postProcessRundownBaselineItems, postProcessStudioBaselineObjects, -} from '../postProcess' +} from '../postProcess.js' import { IBlueprintAdLibPiece, IBlueprintPiece, @@ -13,7 +13,7 @@ import { TSR, IBlueprintPieceType, } from '@sofie-automation/blueprints-integration' -import { setupDefaultJobEnvironment } from '../../__mocks__/context' +import { setupDefaultJobEnvironment } from '../../__mocks__/context.js' import { clone, literal, omit } from '@sofie-automation/corelib/dist/lib' import { protectString } from '@sofie-automation/corelib/dist/protectedString' import { TimelineObjGeneric, TimelineObjType } from '@sofie-automation/corelib/dist/dataModel/Timeline' @@ -111,7 +111,7 @@ describe('Test blueprint post-process', () => { // Certain fields should be defined by simple rules expect(res.filter((r) => r.id === '')).toHaveLength(0) - expect(res.filter((r) => r.objectType !== 'rundown')).toHaveLength(0) + expect(res.filter((r) => r.objectType !== TimelineObjType.RUNDOWN)).toHaveLength(0) // Ensure no ids were duplicates const ids = res.map((obj) => obj.id) @@ -229,7 +229,7 @@ describe('Test blueprint post-process', () => { // Certain fields should be defined by simple rules expect(res.filter((r) => r.id === '')).toHaveLength(0) - expect(res.filter((r) => r.objectType !== 'rundown')).toHaveLength(0) + expect(res.filter((r) => r.objectType !== TimelineObjType.RUNDOWN)).toHaveLength(0) // Ensure getHash was called as expected expect(getHashMock).toHaveBeenCalledTimes(2) diff --git a/packages/job-worker/src/blueprints/config.ts b/packages/job-worker/src/blueprints/config.ts index 78b755419f..e663af0d46 100644 --- a/packages/job-worker/src/blueprints/config.ts +++ b/packages/job-worker/src/blueprints/config.ts @@ -8,12 +8,12 @@ import { } from '@sofie-automation/blueprints-integration' import { getSofieHostUrl, objectPathGet } from '@sofie-automation/corelib/dist/lib' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' -import _ = require('underscore') -import { logger } from '../logging' -import { CommonContext } from './context' +import _ from 'underscore' +import { logger } from '../logging.js' +import { CommonContext } from './context/index.js' import { IStudioSettings } from '@sofie-automation/corelib/dist/dataModel/Studio' import { protectString } from '@sofie-automation/corelib/dist/protectedString' -import { JobStudio, ProcessedShowStyleCompound, StudioCacheContext } from '../jobs' +import { JobStudio, ProcessedShowStyleCompound, StudioCacheContext } from '../jobs/index.js' /** * Parse a string containing BlueprintConfigRefs (`${studio.studio0.myConfigField}`) to replace the refs with the current values @@ -34,6 +34,7 @@ export async function retrieveBlueprintConfigRefs( const refs = stringWithReferences.match(/\$\{[^}]+\}/g) || [] for (const ref of refs) { if (ref) { + // eslint-disable-next-line @typescript-eslint/no-base-to-string let value = (await retrieveBlueprintConfigRef(context, ref, bailOnError)) + '' if (value) { if (modifier) value = modifier(value) diff --git a/packages/job-worker/src/blueprints/context/CommonContext.ts b/packages/job-worker/src/blueprints/context/CommonContext.ts index 7a0c929941..85527c45e3 100644 --- a/packages/job-worker/src/blueprints/context/CommonContext.ts +++ b/packages/job-worker/src/blueprints/context/CommonContext.ts @@ -1,5 +1,5 @@ import { ICommonContext, NoteSeverity } from '@sofie-automation/blueprints-integration' -import { logger } from '../../logging' +import { logger } from '../../logging.js' import { assertNever, getHash } from '@sofie-automation/corelib/dist/lib' export interface ContextInfo { diff --git a/packages/job-worker/src/blueprints/context/GetRundownContext.ts b/packages/job-worker/src/blueprints/context/GetRundownContext.ts index 694fff768b..88a4f32eff 100644 --- a/packages/job-worker/src/blueprints/context/GetRundownContext.ts +++ b/packages/job-worker/src/blueprints/context/GetRundownContext.ts @@ -4,12 +4,12 @@ import { unprotectString } from '@sofie-automation/corelib/dist/protectedString' import { getRandomString } from '@sofie-automation/corelib/dist/lib' import { Rundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' -import { WatchedPackagesHelper } from './watchedPackages' -import { JobContext, ProcessedShowStyleCompound } from '../../jobs' +import { WatchedPackagesHelper } from './watchedPackages.js' +import { JobContext, ProcessedShowStyleCompound } from '../../jobs/index.js' import { ReadonlyObjectDeep } from 'type-fest/source/readonly-deep' -import { ContextInfo } from './CommonContext' -import { ShowStyleUserContext } from './ShowStyleUserContext' -import { convertRundownPlaylistToBlueprints } from './lib' +import { ContextInfo } from './CommonContext.js' +import { ShowStyleUserContext } from './ShowStyleUserContext.js' +import { convertRundownPlaylistToBlueprints } from './lib.js' export class GetRundownContext extends ShowStyleUserContext implements IGetRundownContext { private cachedPlaylistsInStudio: Promise[]> | undefined diff --git a/packages/job-worker/src/blueprints/context/OnSetAsNextContext.ts b/packages/job-worker/src/blueprints/context/OnSetAsNextContext.ts index 43a3b5f0d3..fb1e7956ef 100644 --- a/packages/job-worker/src/blueprints/context/OnSetAsNextContext.ts +++ b/packages/job-worker/src/blueprints/context/OnSetAsNextContext.ts @@ -1,6 +1,6 @@ -import { JobContext, ProcessedShowStyleCompound } from '../../jobs' -import { ContextInfo } from './CommonContext' -import { ShowStyleUserContext } from './ShowStyleUserContext' +import { JobContext, ProcessedShowStyleCompound } from '../../jobs/index.js' +import { ContextInfo } from './CommonContext.js' +import { ShowStyleUserContext } from './ShowStyleUserContext.js' import { IBlueprintMutatablePart, IBlueprintPart, @@ -9,6 +9,7 @@ import { IBlueprintPieceDB, IBlueprintPieceInstance, IBlueprintResolvedPieceInstance, + IBlueprintSegment, IEventContext, IOnSetAsNextContext, } from '@sofie-automation/blueprints-integration' @@ -16,15 +17,15 @@ import { ActionPartChange, IPartAndPieceInstanceActionContext, PartAndPieceInstanceActionService, -} from './services/PartAndPieceInstanceActionService' -import { WatchedPackagesHelper } from './watchedPackages' -import { PlayoutModel } from '../../playout/model/PlayoutModel' +} from './services/PartAndPieceInstanceActionService.js' +import { WatchedPackagesHelper } from './watchedPackages.js' +import { PlayoutModel } from '../../playout/model/PlayoutModel.js' import { ReadonlyDeep } from 'type-fest' -import { getCurrentTime } from '../../lib' +import { getCurrentTime } from '../../lib/index.js' import { protectString } from '@sofie-automation/corelib/dist/protectedString' import { BlueprintQuickLookInfo } from '@sofie-automation/blueprints-integration/dist/context/quickLoopInfo' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' -import { selectNewPartWithOffsets } from '../../playout/moveNextPart' +import { selectNewPartWithOffsets } from '../../playout/moveNextPart.js' export class OnSetAsNextContext extends ShowStyleUserContext @@ -38,7 +39,8 @@ export class OnSetAsNextContext private playoutModel: PlayoutModel, showStyle: ReadonlyDeep, watchedPackages: WatchedPackagesHelper, - private partAndPieceInstanceService: PartAndPieceInstanceActionService + private partAndPieceInstanceService: PartAndPieceInstanceActionService, + public readonly manuallySelected: boolean ) { super(contextInfo, context, showStyle, watchedPackages) } @@ -67,6 +69,10 @@ export class OnSetAsNextContext return this.partAndPieceInstanceService.getResolvedPieceInstances(part) } + async getSegment(segment: 'current' | 'next'): Promise { + return this.partAndPieceInstanceService.getSegment(segment) + } + async findLastPieceOnLayer( sourceLayerId0: string | string[], options?: { diff --git a/packages/job-worker/src/blueprints/context/OnTakeContext.ts b/packages/job-worker/src/blueprints/context/OnTakeContext.ts index 45c7523a3d..578f038c33 100644 --- a/packages/job-worker/src/blueprints/context/OnTakeContext.ts +++ b/packages/job-worker/src/blueprints/context/OnTakeContext.ts @@ -12,17 +12,18 @@ import { TSR, IBlueprintPlayoutDevice, IOnTakeContext, + IBlueprintSegment, } from '@sofie-automation/blueprints-integration' import { PeripheralDeviceId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { ReadonlyDeep } from 'type-fest' -import { PlayoutModel } from '../../playout/model/PlayoutModel' -import { ContextInfo } from './CommonContext' -import { ShowStyleUserContext } from './ShowStyleUserContext' -import { WatchedPackagesHelper } from './watchedPackages' -import { getCurrentTime } from '../../lib' -import { JobContext, ProcessedShowStyleCompound } from '../../jobs' -import { executePeripheralDeviceAction, listPlayoutDevices } from '../../peripheralDevice' -import { ActionPartChange, PartAndPieceInstanceActionService } from './services/PartAndPieceInstanceActionService' +import { PlayoutModel } from '../../playout/model/PlayoutModel.js' +import { ContextInfo } from './CommonContext.js' +import { ShowStyleUserContext } from './ShowStyleUserContext.js' +import { WatchedPackagesHelper } from './watchedPackages.js' +import { getCurrentTime } from '../../lib/index.js' +import { JobContext, ProcessedShowStyleCompound } from '../../jobs/index.js' +import { executePeripheralDeviceAction, listPlayoutDevices } from '../../peripheralDevice.js' +import { ActionPartChange, PartAndPieceInstanceActionService } from './services/PartAndPieceInstanceActionService.js' import { BlueprintQuickLookInfo } from '@sofie-automation/blueprints-integration/dist/context/quickLoopInfo' export class OnTakeContext extends ShowStyleUserContext implements IOnTakeContext, IEventContext { @@ -64,6 +65,9 @@ export class OnTakeContext extends ShowStyleUserContext implements IOnTakeContex async getResolvedPieceInstances(part: 'current' | 'next'): Promise { return this.partAndPieceInstanceService.getResolvedPieceInstances(part) } + async getSegment(segment: 'current' | 'next'): Promise { + return this.partAndPieceInstanceService.getSegment(segment) + } async findLastPieceOnLayer( sourceLayerId0: string | string[], @@ -111,10 +115,10 @@ export class OnTakeContext extends ShowStyleUserContext implements IOnTakeContex return this.partAndPieceInstanceService.updatePartInstance(part, props) } - async stopPiecesOnLayers(sourceLayerIds: string[], timeOffset?: number | undefined): Promise { + async stopPiecesOnLayers(sourceLayerIds: string[], timeOffset?: number): Promise { return this.partAndPieceInstanceService.stopPiecesOnLayers(sourceLayerIds, timeOffset) } - async stopPieceInstances(pieceInstanceIds: string[], timeOffset?: number | undefined): Promise { + async stopPieceInstances(pieceInstanceIds: string[], timeOffset?: number): Promise { return this.partAndPieceInstanceService.stopPieceInstances(pieceInstanceIds, timeOffset) } async removePieceInstances(part: 'current' | 'next', pieceInstanceIds: string[]): Promise { diff --git a/packages/job-worker/src/blueprints/context/OnTimelineGenerateContext.ts b/packages/job-worker/src/blueprints/context/OnTimelineGenerateContext.ts index c71a4d33fe..c718d6bf51 100644 --- a/packages/job-worker/src/blueprints/context/OnTimelineGenerateContext.ts +++ b/packages/job-worker/src/blueprints/context/OnTimelineGenerateContext.ts @@ -9,14 +9,14 @@ import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartIns import { clone } from '@sofie-automation/corelib/dist/lib' import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' import { ABSessionInfo, DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' -import { getCurrentTime } from '../../lib' +import { getCurrentTime } from '../../lib/index.js' import { PieceInstance, ResolvedPieceInstance } from '@sofie-automation/corelib/dist/dataModel/PieceInstance' -import { ProcessedStudioConfig, ProcessedShowStyleConfig } from '../config' -import _ = require('underscore') -import { JobStudio, ProcessedShowStyleCompound } from '../../jobs' -import { convertPartInstanceToBlueprints, createBlueprintQuickLoopInfo } from './lib' -import { RundownContext } from './RundownContext' -import { AbSessionHelper } from '../../playout/abPlayback/abSessionHelper' +import { ProcessedStudioConfig, ProcessedShowStyleConfig } from '../config.js' +import _ from 'underscore' +import { JobStudio, ProcessedShowStyleCompound } from '../../jobs/index.js' +import { convertPartInstanceToBlueprints, createBlueprintQuickLoopInfo } from './lib.js' +import { RundownContext } from './RundownContext.js' +import { AbSessionHelper } from '../../playout/abPlayback/abSessionHelper.js' import { protectString } from '@sofie-automation/corelib/dist/protectedString' import { PieceInstanceId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { BlueprintQuickLookInfo } from '@sofie-automation/blueprints-integration/dist/context/quickLoopInfo' diff --git a/packages/job-worker/src/blueprints/context/PartEventContext.ts b/packages/job-worker/src/blueprints/context/PartEventContext.ts index 34722ec3ac..c8c107b44b 100644 --- a/packages/job-worker/src/blueprints/context/PartEventContext.ts +++ b/packages/job-worker/src/blueprints/context/PartEventContext.ts @@ -2,11 +2,11 @@ import { IBlueprintPartInstance, IPartEventContext } from '@sofie-automation/blu import { ReadonlyDeep } from 'type-fest' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' -import { getCurrentTime } from '../../lib' -import { ProcessedStudioConfig, ProcessedShowStyleConfig } from '../config' -import { JobStudio, ProcessedShowStyleCompound } from '../../jobs' -import { convertPartInstanceToBlueprints } from './lib' -import { RundownContext } from './RundownContext' +import { getCurrentTime } from '../../lib/index.js' +import { ProcessedStudioConfig, ProcessedShowStyleConfig } from '../config.js' +import { JobStudio, ProcessedShowStyleCompound } from '../../jobs/index.js' +import { convertPartInstanceToBlueprints } from './lib.js' +import { RundownContext } from './RundownContext.js' export class PartEventContext extends RundownContext implements IPartEventContext { readonly part: Readonly diff --git a/packages/job-worker/src/blueprints/context/ProcessIngestDataContext.ts b/packages/job-worker/src/blueprints/context/ProcessIngestDataContext.ts index d42e18738e..2fa77a8e45 100644 --- a/packages/job-worker/src/blueprints/context/ProcessIngestDataContext.ts +++ b/packages/job-worker/src/blueprints/context/ProcessIngestDataContext.ts @@ -7,9 +7,12 @@ import type { MutableIngestRundown, NrcsIngestChangeDetails, } from '@sofie-automation/blueprints-integration' -import { StudioContext } from './StudioContext' -import { defaultApplyIngestChanges } from '../ingest/defaultApplyIngestChanges' -import { groupMosPartsIntoIngestSegments, groupPartsInRundownAndChanges } from '../ingest/groupPartsInRundownAndChanges' +import { StudioContext } from './StudioContext.js' +import { defaultApplyIngestChanges } from '../ingest/defaultApplyIngestChanges.js' +import { + groupMosPartsIntoIngestSegments, + groupPartsInRundownAndChanges, +} from '../ingest/groupPartsInRundownAndChanges.js' /** * Provides a context for blueprints while running the blueprints.processIngestData() method. diff --git a/packages/job-worker/src/blueprints/context/RundownActivationContext.ts b/packages/job-worker/src/blueprints/context/RundownActivationContext.ts index cda732d42a..7ffe281b1b 100644 --- a/packages/job-worker/src/blueprints/context/RundownActivationContext.ts +++ b/packages/job-worker/src/blueprints/context/RundownActivationContext.ts @@ -6,12 +6,12 @@ import { } from '@sofie-automation/blueprints-integration' import { PeripheralDeviceId } from '@sofie-automation/shared-lib/dist/core/model/Ids' import { ReadonlyDeep } from 'type-fest' -import { JobContext, ProcessedShowStyleCompound } from '../../jobs' -import { executePeripheralDeviceAction, listPlayoutDevices } from '../../peripheralDevice' -import { PlayoutModel } from '../../playout/model/PlayoutModel' -import { RundownEventContext } from './RundownEventContext' +import { JobContext, ProcessedShowStyleCompound } from '../../jobs/index.js' +import { executePeripheralDeviceAction, listPlayoutDevices } from '../../peripheralDevice.js' +import { PlayoutModel } from '../../playout/model/PlayoutModel.js' +import { RundownEventContext } from './RundownEventContext.js' import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' -import { setTimelineDatastoreValue, removeTimelineDatastoreValue } from '../../playout/datastore' +import { setTimelineDatastoreValue, removeTimelineDatastoreValue } from '../../playout/datastore.js' export class RundownActivationContext extends RundownEventContext implements IRundownActivationContext { private readonly _playoutModel: PlayoutModel diff --git a/packages/job-worker/src/blueprints/context/RundownContext.ts b/packages/job-worker/src/blueprints/context/RundownContext.ts index c84a27ac70..98092fbc2d 100644 --- a/packages/job-worker/src/blueprints/context/RundownContext.ts +++ b/packages/job-worker/src/blueprints/context/RundownContext.ts @@ -2,11 +2,11 @@ import { IRundownContext, IBlueprintSegmentRundown } from '@sofie-automation/blu import { ReadonlyDeep } from 'type-fest' import { unprotectString } from '@sofie-automation/corelib/dist/protectedString' import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' -import { ProcessedStudioConfig, ProcessedShowStyleConfig } from '../config' -import { JobStudio, ProcessedShowStyleCompound } from '../../jobs' -import { convertRundownToBlueprintSegmentRundown } from './lib' -import { ContextInfo } from './CommonContext' -import { ShowStyleContext } from './ShowStyleContext' +import { ProcessedStudioConfig, ProcessedShowStyleConfig } from '../config.js' +import { JobStudio, ProcessedShowStyleCompound } from '../../jobs/index.js' +import { convertRundownToBlueprintSegmentRundown } from './lib.js' +import { ContextInfo } from './CommonContext.js' +import { ShowStyleContext } from './ShowStyleContext.js' /** Rundown */ diff --git a/packages/job-worker/src/blueprints/context/RundownDataChangedEventContext.ts b/packages/job-worker/src/blueprints/context/RundownDataChangedEventContext.ts index 45addeaedd..cab73e5700 100644 --- a/packages/job-worker/src/blueprints/context/RundownDataChangedEventContext.ts +++ b/packages/job-worker/src/blueprints/context/RundownDataChangedEventContext.ts @@ -6,10 +6,10 @@ import { ReadonlyDeep } from 'type-fest' import { unprotectObjectArray } from '@sofie-automation/corelib/dist/protectedString' import { formatDateAsTimecode, formatDurationAsTimecode } from '@sofie-automation/corelib/dist/lib' import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' -import { getCurrentTime } from '../../lib' -import { JobContext, ProcessedShowStyleCompound } from '../../jobs' -import { ContextInfo } from './CommonContext' -import { RundownContext } from './RundownContext' +import { getCurrentTime } from '../../lib/index.js' +import { JobContext, ProcessedShowStyleCompound } from '../../jobs/index.js' +import { ContextInfo } from './CommonContext.js' +import { RundownContext } from './RundownContext.js' export class RundownDataChangedEventContext extends RundownContext implements IRundownDataChangedEventContext { constructor( diff --git a/packages/job-worker/src/blueprints/context/RundownEventContext.ts b/packages/job-worker/src/blueprints/context/RundownEventContext.ts index 9852e0dd72..40ca530230 100644 --- a/packages/job-worker/src/blueprints/context/RundownEventContext.ts +++ b/packages/job-worker/src/blueprints/context/RundownEventContext.ts @@ -1,10 +1,10 @@ import { IEventContext } from '@sofie-automation/blueprints-integration' import { ReadonlyDeep } from 'type-fest' import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' -import { getCurrentTime } from '../../lib' -import { ProcessedStudioConfig, ProcessedShowStyleConfig } from '../config' -import { JobStudio, ProcessedShowStyleCompound } from '../../jobs' -import { RundownContext } from './RundownContext' +import { getCurrentTime } from '../../lib/index.js' +import { ProcessedStudioConfig, ProcessedShowStyleConfig } from '../config.js' +import { JobStudio, ProcessedShowStyleCompound } from '../../jobs/index.js' +import { RundownContext } from './RundownContext.js' export class RundownEventContext extends RundownContext implements IEventContext { constructor( diff --git a/packages/job-worker/src/blueprints/context/RundownTimingEventContext.ts b/packages/job-worker/src/blueprints/context/RundownTimingEventContext.ts index 8b25072596..f13442b64b 100644 --- a/packages/job-worker/src/blueprints/context/RundownTimingEventContext.ts +++ b/packages/job-worker/src/blueprints/context/RundownTimingEventContext.ts @@ -9,11 +9,11 @@ import { protectString, protectStringArray, unDeepString } from '@sofie-automati import { PartInstanceId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' -import { JobContext, ProcessedShowStyleCompound } from '../../jobs' -import { MongoQuery } from '../../db' -import { convertPartInstanceToBlueprints, convertPieceInstanceToBlueprints, convertSegmentToBlueprints } from './lib' -import { ContextInfo } from './CommonContext' -import { RundownDataChangedEventContext } from './RundownDataChangedEventContext' +import { JobContext, ProcessedShowStyleCompound } from '../../jobs/index.js' +import { MongoQuery } from '../../db/index.js' +import { convertPartInstanceToBlueprints, convertPieceInstanceToBlueprints, convertSegmentToBlueprints } from './lib.js' +import { ContextInfo } from './CommonContext.js' +import { RundownDataChangedEventContext } from './RundownDataChangedEventContext.js' export class RundownTimingEventContext extends RundownDataChangedEventContext implements IRundownTimingEventContext { readonly previousPart: Readonly> | undefined diff --git a/packages/job-worker/src/blueprints/context/RundownUserContext.ts b/packages/job-worker/src/blueprints/context/RundownUserContext.ts index 5ab0648e7e..bcb2826ba8 100644 --- a/packages/job-worker/src/blueprints/context/RundownUserContext.ts +++ b/packages/job-worker/src/blueprints/context/RundownUserContext.ts @@ -1,6 +1,6 @@ import { NoteSeverity, IRundownUserContext } from '@sofie-automation/blueprints-integration' import { INoteBase } from '@sofie-automation/corelib/dist/dataModel/Notes' -import { RundownContext } from './RundownContext' +import { RundownContext } from './RundownContext.js' export class RundownUserContext extends RundownContext implements IRundownUserContext { public readonly notes: INoteBase[] = [] diff --git a/packages/job-worker/src/blueprints/context/SegmentUserContext.ts b/packages/job-worker/src/blueprints/context/SegmentUserContext.ts index 9af2a4d83a..ccc0d26c8c 100644 --- a/packages/job-worker/src/blueprints/context/SegmentUserContext.ts +++ b/packages/job-worker/src/blueprints/context/SegmentUserContext.ts @@ -1,12 +1,12 @@ import { PackageInfo, ISegmentUserContext, NoteSeverity } from '@sofie-automation/blueprints-integration' import { ReadonlyDeep } from 'type-fest' import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' -import { WatchedPackagesHelper } from './watchedPackages' -import { JobContext, ProcessedShowStyleCompound } from '../../jobs' -import { ContextInfo } from './CommonContext' -import { RundownContext } from './RundownContext' +import { WatchedPackagesHelper } from './watchedPackages.js' +import { JobContext, ProcessedShowStyleCompound } from '../../jobs/index.js' +import { ContextInfo } from './CommonContext.js' +import { RundownContext } from './RundownContext.js' import { INoteBase } from '@sofie-automation/corelib/dist/dataModel/Notes' -import { getMediaObjectDuration } from './lib' +import { getMediaObjectDuration } from './lib.js' export interface RawPartNote extends INoteBase { partExternalId: string | undefined diff --git a/packages/job-worker/src/blueprints/context/ShowStyleContext.ts b/packages/job-worker/src/blueprints/context/ShowStyleContext.ts index 1310c72f72..0223e726fb 100644 --- a/packages/job-worker/src/blueprints/context/ShowStyleContext.ts +++ b/packages/job-worker/src/blueprints/context/ShowStyleContext.ts @@ -1,10 +1,10 @@ import { IOutputLayer, IShowStyleContext, ISourceLayer } from '@sofie-automation/blueprints-integration' import { ReadonlyDeep } from 'type-fest' -import { ProcessedStudioConfig, ProcessedShowStyleConfig } from '../config' -import { getShowStyleConfigRef } from '../configRefs' -import { JobStudio, ProcessedShowStyleCompound } from '../../jobs' -import { ContextInfo } from './CommonContext' -import { StudioContext } from './StudioContext' +import { ProcessedStudioConfig, ProcessedShowStyleConfig } from '../config.js' +import { getShowStyleConfigRef } from '../configRefs.js' +import { JobStudio, ProcessedShowStyleCompound } from '../../jobs/index.js' +import { ContextInfo } from './CommonContext.js' +import { StudioContext } from './StudioContext.js' /** Show Style Variant */ diff --git a/packages/job-worker/src/blueprints/context/ShowStyleUserContext.ts b/packages/job-worker/src/blueprints/context/ShowStyleUserContext.ts index be6d264c1f..09d803536a 100644 --- a/packages/job-worker/src/blueprints/context/ShowStyleUserContext.ts +++ b/packages/job-worker/src/blueprints/context/ShowStyleUserContext.ts @@ -1,11 +1,11 @@ import { PackageInfo, IShowStyleUserContext, NoteSeverity } from '@sofie-automation/blueprints-integration' import { ReadonlyDeep } from 'type-fest' -import { WatchedPackagesHelper } from './watchedPackages' +import { WatchedPackagesHelper } from './watchedPackages.js' import { INoteBase } from '@sofie-automation/corelib/dist/dataModel/Notes' -import { JobContext, ProcessedShowStyleCompound } from '../../jobs' -import { ContextInfo } from './CommonContext' -import { ShowStyleContext } from './ShowStyleContext' -import { getMediaObjectDuration } from './lib' +import { JobContext, ProcessedShowStyleCompound } from '../../jobs/index.js' +import { ContextInfo } from './CommonContext.js' +import { ShowStyleContext } from './ShowStyleContext.js' +import { getMediaObjectDuration } from './lib.js' export class ShowStyleUserContext extends ShowStyleContext implements IShowStyleUserContext { public readonly notes: INoteBase[] = [] diff --git a/packages/job-worker/src/blueprints/context/StudioBaselineContext.ts b/packages/job-worker/src/blueprints/context/StudioBaselineContext.ts index db93eb3cc3..89c3a4d1a3 100644 --- a/packages/job-worker/src/blueprints/context/StudioBaselineContext.ts +++ b/packages/job-worker/src/blueprints/context/StudioBaselineContext.ts @@ -1,9 +1,9 @@ import { PackageInfo, IStudioBaselineContext } from '@sofie-automation/blueprints-integration' -import { WatchedPackagesHelper } from './watchedPackages' -import { JobContext } from '../../jobs' -import { ContextInfo } from './CommonContext' -import { StudioContext } from './StudioContext' -import { getMediaObjectDuration } from './lib' +import { WatchedPackagesHelper } from './watchedPackages.js' +import { JobContext } from '../../jobs/index.js' +import { ContextInfo } from './CommonContext.js' +import { StudioContext } from './StudioContext.js' +import { getMediaObjectDuration } from './lib.js' export class StudioBaselineContext extends StudioContext implements IStudioBaselineContext { private readonly jobContext: JobContext diff --git a/packages/job-worker/src/blueprints/context/StudioContext.ts b/packages/job-worker/src/blueprints/context/StudioContext.ts index 8d5915d338..47c25a76af 100644 --- a/packages/job-worker/src/blueprints/context/StudioContext.ts +++ b/packages/job-worker/src/blueprints/context/StudioContext.ts @@ -2,10 +2,10 @@ import { IStudioContext, BlueprintMappings } from '@sofie-automation/blueprints- import { ReadonlyDeep } from 'type-fest' import { unprotectString } from '@sofie-automation/corelib/dist/protectedString' import { StudioId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { ProcessedStudioConfig } from '../config' -import { getStudioConfigRef } from '../configRefs' -import { CommonContext, ContextInfo } from './CommonContext' -import { JobStudio } from '../../jobs' +import { ProcessedStudioConfig } from '../config.js' +import { getStudioConfigRef } from '../configRefs.js' +import { CommonContext, ContextInfo } from './CommonContext.js' +import { JobStudio } from '../../jobs/index.js' /** Studio */ diff --git a/packages/job-worker/src/blueprints/context/StudioUserContext.ts b/packages/job-worker/src/blueprints/context/StudioUserContext.ts index fff5232cd1..1d13a45564 100644 --- a/packages/job-worker/src/blueprints/context/StudioUserContext.ts +++ b/packages/job-worker/src/blueprints/context/StudioUserContext.ts @@ -1,10 +1,10 @@ import { IStudioUserContext, NoteSeverity } from '@sofie-automation/blueprints-integration' import { ReadonlyDeep } from 'type-fest' -import { ProcessedStudioConfig } from '../config' +import { ProcessedStudioConfig } from '../config.js' import { INoteBase } from '@sofie-automation/corelib/dist/dataModel/Notes' -import { ContextInfo } from './CommonContext' -import { StudioContext } from './StudioContext' -import { JobStudio } from '../../jobs' +import { ContextInfo } from './CommonContext.js' +import { StudioContext } from './StudioContext.js' +import { JobStudio } from '../../jobs/index.js' export class StudioUserContext extends StudioContext implements IStudioUserContext { public readonly notes: INoteBase[] = [] diff --git a/packages/job-worker/src/blueprints/context/SyncIngestUpdateToPartInstanceContext.ts b/packages/job-worker/src/blueprints/context/SyncIngestUpdateToPartInstanceContext.ts index 6fef3f1904..d8289be7d9 100644 --- a/packages/job-worker/src/blueprints/context/SyncIngestUpdateToPartInstanceContext.ts +++ b/packages/job-worker/src/blueprints/context/SyncIngestUpdateToPartInstanceContext.ts @@ -2,11 +2,11 @@ import { PieceInstanceId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { PieceInstance } from '@sofie-automation/corelib/dist/dataModel/PieceInstance' import { normalizeArrayToMap, omit } from '@sofie-automation/corelib/dist/lib' import { protectString, protectStringArray, unprotectStringArray } from '@sofie-automation/corelib/dist/protectedString' -import { PlayoutPartInstanceModel } from '../../playout/model/PlayoutPartInstanceModel' +import { PlayoutPartInstanceModel } from '../../playout/model/PlayoutPartInstanceModel.js' import { ReadonlyDeep } from 'type-fest' -import _ = require('underscore') -import { ContextInfo } from './CommonContext' -import { RundownUserContext } from './RundownUserContext' +import _ from 'underscore' +import { ContextInfo } from './CommonContext.js' +import { RundownUserContext } from './RundownUserContext.js' import { ISyncIngestUpdateToPartInstanceContext, IBlueprintPiece, @@ -17,21 +17,21 @@ import { SomeContent, WithTimeline, } from '@sofie-automation/blueprints-integration' -import { postProcessPieces, postProcessTimelineObjects } from '../postProcess' +import { postProcessPieces, postProcessTimelineObjects } from '../postProcess.js' import { IBlueprintPieceObjectsSampleKeys, convertPieceInstanceToBlueprints, convertPartInstanceToBlueprints, convertPartialBlueprintMutablePartToCore, -} from './lib' +} from './lib.js' import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' -import { JobContext, JobStudio, ProcessedShowStyleCompound } from '../../jobs' +import { JobContext, JobStudio, ProcessedShowStyleCompound } from '../../jobs/index.js' import { PieceTimelineObjectsBlob, serializePieceTimelineObjectsBlob, } from '@sofie-automation/corelib/dist/dataModel/Piece' import { EXPECTED_INGEST_TO_PLAYOUT_TIME } from '@sofie-automation/shared-lib/dist/core/constants' -import { getCurrentTime } from '../../lib' +import { getCurrentTime } from '../../lib/index.js' export class SyncIngestUpdateToPartInstanceContext extends RundownUserContext @@ -96,7 +96,7 @@ export class SyncIngestUpdateToPartInstanceContext this.partInstance.partInstance.segmentId, this.partInstance.partInstance.part._id, this.playStatus === 'current' - )[0] + )[0] : proposedPieceInstance.piece const newPieceInstance: ReadonlyDeep = { diff --git a/packages/job-worker/src/blueprints/context/adlibActions.ts b/packages/job-worker/src/blueprints/context/adlibActions.ts index e42d6d1617..60a8aa328e 100644 --- a/packages/job-worker/src/blueprints/context/adlibActions.ts +++ b/packages/job-worker/src/blueprints/context/adlibActions.ts @@ -14,23 +14,24 @@ import { TSR, IBlueprintPlayoutDevice, StudioRouteSet, + IBlueprintSegment, } from '@sofie-automation/blueprints-integration' import { PartInstanceId, PeripheralDeviceId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { ReadonlyDeep } from 'type-fest' -import { PlayoutModel } from '../../playout/model/PlayoutModel' -import { ContextInfo } from './CommonContext' -import { ShowStyleUserContext } from './ShowStyleUserContext' -import { WatchedPackagesHelper } from './watchedPackages' -import { getCurrentTime } from '../../lib' -import { JobContext, ProcessedShowStyleCompound } from '../../jobs' -import { selectNewPartWithOffsets } from '../../playout/moveNextPart' -import { ProcessedShowStyleConfig } from '../config' +import { PlayoutModel } from '../../playout/model/PlayoutModel.js' +import { ContextInfo } from './CommonContext.js' +import { ShowStyleUserContext } from './ShowStyleUserContext.js' +import { WatchedPackagesHelper } from './watchedPackages.js' +import { getCurrentTime } from '../../lib/index.js' +import { JobContext, ProcessedShowStyleCompound } from '../../jobs/index.js' +import { selectNewPartWithOffsets } from '../../playout/moveNextPart.js' +import { ProcessedShowStyleConfig } from '../config.js' import { DatastorePersistenceMode } from '@sofie-automation/shared-lib/dist/core/model/TimelineDatastore' -import { removeTimelineDatastoreValue, setTimelineDatastoreValue } from '../../playout/datastore' -import { executePeripheralDeviceAction, listPlayoutDevices } from '../../peripheralDevice' -import { ActionPartChange, PartAndPieceInstanceActionService } from './services/PartAndPieceInstanceActionService' +import { removeTimelineDatastoreValue, setTimelineDatastoreValue } from '../../playout/datastore.js' +import { executePeripheralDeviceAction, listPlayoutDevices } from '../../peripheralDevice.js' +import { ActionPartChange, PartAndPieceInstanceActionService } from './services/PartAndPieceInstanceActionService.js' import { BlueprintQuickLookInfo } from '@sofie-automation/blueprints-integration/dist/context/quickLoopInfo' -import { setNextPartFromPart } from '../../playout/setNext' +import { setNextPartFromPart } from '../../playout/setNext.js' export class DatastoreActionExecutionContext extends ShowStyleUserContext @@ -113,6 +114,10 @@ export class ActionExecutionContext extends ShowStyleUserContext implements IAct return this.partAndPieceInstanceService.getResolvedPieceInstances(part) } + async getSegment(segment: 'current' | 'next'): Promise { + return this.partAndPieceInstanceService.getSegment(segment) + } + async findLastPieceOnLayer( sourceLayerId0: string | string[], options?: { @@ -175,11 +180,11 @@ export class ActionExecutionContext extends ShowStyleUserContext implements IAct return this.partAndPieceInstanceService.updatePartInstance(part, props) } - async stopPiecesOnLayers(sourceLayerIds: string[], timeOffset?: number | undefined): Promise { + async stopPiecesOnLayers(sourceLayerIds: string[], timeOffset?: number): Promise { return this.partAndPieceInstanceService.stopPiecesOnLayers(sourceLayerIds, timeOffset) } - async stopPieceInstances(pieceInstanceIds: string[], timeOffset?: number | undefined): Promise { + async stopPieceInstances(pieceInstanceIds: string[], timeOffset?: number): Promise { return this.partAndPieceInstanceService.stopPieceInstances(pieceInstanceIds, timeOffset) } diff --git a/packages/job-worker/src/blueprints/context/index.ts b/packages/job-worker/src/blueprints/context/index.ts index c13d880bc6..71b9f72e84 100644 --- a/packages/job-worker/src/blueprints/context/index.ts +++ b/packages/job-worker/src/blueprints/context/index.ts @@ -1,19 +1,19 @@ -export * from './adlibActions' -export * from './CommonContext' -export * from './GetRundownContext' -export * from './OnSetAsNextContext' -export * from './OnTakeContext' -export * from './OnTimelineGenerateContext' -export * from './PartEventContext' -export * from './ProcessIngestDataContext' -export * from './RundownContext' -export * from './RundownDataChangedEventContext' -export * from './RundownEventContext' -export * from './RundownTimingEventContext' -export * from './SegmentUserContext' -export * from './ShowStyleContext' -export * from './ShowStyleUserContext' -export * from './StudioBaselineContext' -export * from './StudioContext' -export * from './StudioUserContext' -export * from './SyncIngestUpdateToPartInstanceContext' +export * from './adlibActions.js' +export * from './CommonContext.js' +export * from './GetRundownContext.js' +export * from './OnSetAsNextContext.js' +export * from './OnTakeContext.js' +export * from './OnTimelineGenerateContext.js' +export * from './PartEventContext.js' +export * from './ProcessIngestDataContext.js' +export * from './RundownContext.js' +export * from './RundownDataChangedEventContext.js' +export * from './RundownEventContext.js' +export * from './RundownTimingEventContext.js' +export * from './SegmentUserContext.js' +export * from './ShowStyleContext.js' +export * from './ShowStyleUserContext.js' +export * from './StudioBaselineContext.js' +export * from './StudioContext.js' +export * from './StudioUserContext.js' +export * from './SyncIngestUpdateToPartInstanceContext.js' diff --git a/packages/job-worker/src/blueprints/context/lib.ts b/packages/job-worker/src/blueprints/context/lib.ts index 8d3c68708d..b1bd5dea2b 100644 --- a/packages/job-worker/src/blueprints/context/lib.ts +++ b/packages/job-worker/src/blueprints/context/lib.ts @@ -17,7 +17,7 @@ import { CoreUserEditingDefinitionSofie, } from '@sofie-automation/corelib/dist/dataModel/UserEditingDefinitions' import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment' -import { assertNever, clone, Complete, literal, omit } from '@sofie-automation/corelib/dist/lib' +import { assertNever, clone, cloneObject, Complete, literal, omit } from '@sofie-automation/corelib/dist/lib' import { unprotectString, unprotectStringArray } from '@sofie-automation/corelib/dist/protectedString' import { ReadonlyDeep } from 'type-fest' import { @@ -49,9 +49,9 @@ import { PieceAbSessionInfo, RundownPlaylistTiming, } from '@sofie-automation/blueprints-integration' -import { JobContext, ProcessedShowStyleBase, ProcessedShowStyleVariant } from '../../jobs' +import { JobContext, ProcessedShowStyleBase, ProcessedShowStyleVariant } from '../../jobs/index.js' import { DBRundownPlaylist, QuickLoopMarkerType } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' -import _ = require('underscore') +import _ from 'underscore' import { BlueprintId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { wrapTranslatableMessageFromBlueprints } from '@sofie-automation/corelib/dist/TranslatableMessage' import { @@ -62,7 +62,7 @@ import { UserEditingDefinitionSofieDefault, UserEditingType, } from '@sofie-automation/blueprints-integration/dist/userEditing' -import type { PlayoutMutatablePart } from '../../playout/model/PlayoutPartInstanceModel' +import type { PlayoutMutatablePart } from '../../playout/model/PlayoutPartInstanceModel.js' import { BlueprintQuickLookInfo } from '@sofie-automation/blueprints-integration/dist/context/quickLoopInfo' /** @@ -150,7 +150,7 @@ function convertPieceInstanceToBlueprintsInner( fromHold: pieceInstance.infinite.fromHold, fromPreviousPart: pieceInstance.infinite.fromPreviousPart, fromPreviousPlayhead: pieceInstance.infinite.fromPreviousPlayhead, - }) + }) : undefined, piece: convertPieceToBlueprints(pieceInstance.piece), } @@ -222,7 +222,7 @@ function convertPieceGenericToBlueprintsInner(piece: ReadonlyDeep) expectedPackages: clone(piece.expectedPackages), hasSideEffects: piece.hasSideEffects, content: { - ...clone(piece.content), + ...cloneObject(piece.content), timelineObjects: deserializePieceTimelineObjectsBlob(piece.timelineObjectsString), }, abSessions: clone(piece.abSessions), @@ -522,8 +522,8 @@ function translateUserEditsToBlueprint( type: UserEditingType.ACTION, id: userEdit.id, label: omit(userEdit.label, 'namespaces'), - svgIcon: userEdit.svgIcon, - svgIconInactive: userEdit.svgIconInactive, + icon: userEdit.icon, + iconInactive: userEdit.iconInactive, isActive: userEdit.isActive, } satisfies Complete case UserEditingType.FORM: @@ -562,10 +562,10 @@ function translateUserEditPropertiesToBlueprint( type: UserEditingType.ACTION, id: userEdit.id, label: omit(userEdit.label, 'namespaces'), - svgIcon: userEdit.svgIcon, - svgIconInactive: userEdit.svgIconInactive, + icon: userEdit.icon, + iconInactive: userEdit.iconInactive, isActive: userEdit.isActive, - } satisfies Complete) + }) satisfies Complete ), } } @@ -584,8 +584,8 @@ export function translateUserEditsFromBlueprint( type: UserEditingType.ACTION, id: userEdit.id, label: wrapTranslatableMessageFromBlueprints(userEdit.label, blueprintIds), - svgIcon: userEdit.svgIcon, - svgIconInactive: userEdit.svgIconInactive, + icon: userEdit.icon, + iconInactive: userEdit.iconInactive, isActive: userEdit.isActive, } satisfies Complete case UserEditingType.FORM: @@ -626,10 +626,10 @@ export function translateUserEditPropertiesFromBlueprint( type: UserEditingType.ACTION, id: userEdit.id, label: wrapTranslatableMessageFromBlueprints(userEdit.label, blueprintIds), - svgIcon: userEdit.svgIcon, - svgIconInactive: userEdit.svgIconInactive, + icon: userEdit.icon, + iconInactive: userEdit.iconInactive, isActive: userEdit.isActive, - } satisfies Complete) + }) satisfies Complete ), translationNamespaces: blueprintIds.map((id) => `blueprint_${id}`), diff --git a/packages/job-worker/src/blueprints/context/services/PartAndPieceInstanceActionService.ts b/packages/job-worker/src/blueprints/context/services/PartAndPieceInstanceActionService.ts index ac80dff3da..2e183391ae 100644 --- a/packages/job-worker/src/blueprints/context/services/PartAndPieceInstanceActionService.ts +++ b/packages/job-worker/src/blueprints/context/services/PartAndPieceInstanceActionService.ts @@ -1,6 +1,6 @@ -import { JobContext, ProcessedShowStyleCompound } from '../../../jobs' -import { PlayoutModel } from '../../../playout/model/PlayoutModel' -import { PlayoutPartInstanceModel } from '../../../playout/model/PlayoutPartInstanceModel' +import { JobContext, ProcessedShowStyleCompound } from '../../../jobs/index.js' +import { PlayoutModel } from '../../../playout/model/PlayoutModel.js' +import { PlayoutPartInstanceModel } from '../../../playout/model/PlayoutPartInstanceModel.js' import { IBlueprintMutatablePart, IBlueprintPart, @@ -9,6 +9,7 @@ import { IBlueprintPieceDB, IBlueprintPieceInstance, IBlueprintResolvedPieceInstance, + IBlueprintSegment, OmitId, SomeContent, Time, @@ -22,10 +23,11 @@ import { convertPieceInstanceToBlueprints, convertPieceToBlueprints, convertResolvedPieceInstanceToBlueprints, + convertSegmentToBlueprints, createBlueprintQuickLoopInfo, getMediaObjectDuration, -} from '../lib' -import { getResolvedPiecesForCurrentPartInstance } from '../../../playout/resolvedPieces' +} from '../lib.js' +import { getResolvedPiecesForCurrentPartInstance } from '../../../playout/resolvedPieces.js' import { ReadonlyDeep } from 'type-fest' import { MongoQuery } from '@sofie-automation/corelib/dist/mongo' import { PieceInstance } from '@sofie-automation/corelib/dist/dataModel/PieceInstance' @@ -34,9 +36,9 @@ import { innerFindLastScriptedPieceOnLayer, innerStopPieces, insertQueuedPartWithPieces, -} from '../../../playout/adlibUtils' +} from '../../../playout/adlibUtils.js' import { assertNever, getRandomId, omit } from '@sofie-automation/corelib/dist/lib' -import { logger } from '../../../logging' +import { logger } from '../../../logging.js' import { Piece, PieceTimelineObjectsBlob, @@ -49,13 +51,13 @@ import { protectStringArray, unprotectStringArray, } from '@sofie-automation/corelib/dist/protectedString' -import { postProcessPieces, postProcessTimelineObjects } from '../../postProcess' -import { getCurrentTime } from '../../../lib' -import _ = require('underscore') -import { syncPlayheadInfinitesForNextPartInstance } from '../../../playout/infinites' -import { validateAdlibTestingPartInstanceProperties } from '../../../playout/adlibTesting' +import { postProcessPieces, postProcessTimelineObjects } from '../../postProcess.js' +import { getCurrentTime } from '../../../lib/index.js' +import _ from 'underscore' +import { syncPlayheadInfinitesForNextPartInstance } from '../../../playout/infinites.js' +import { validateAdlibTestingPartInstanceProperties } from '../../../playout/adlibTesting.js' import { DBPart, isPartPlayable } from '@sofie-automation/corelib/dist/dataModel/Part' -import { PlayoutRundownModel } from '../../../playout/model/PlayoutRundownModel' +import { PlayoutRundownModel } from '../../../playout/model/PlayoutRundownModel.js' import { BlueprintQuickLookInfo } from '@sofie-automation/blueprints-integration/dist/context/quickLoopInfo' export enum ActionPartChange { @@ -138,6 +140,14 @@ export class PartAndPieceInstanceActionService { ) return resolvedInstances.map(convertResolvedPieceInstanceToBlueprints) } + getSegment(segment: 'current' | 'next'): IBlueprintSegment | undefined { + const partInstance = this.#getPartInstance(segment) + if (!partInstance) return undefined + + const segmentModel = this._playoutModel.findSegment(partInstance.partInstance.segmentId) + + return segmentModel?.segment ? convertSegmentToBlueprints(segmentModel?.segment) : undefined + } async findLastPieceOnLayer( sourceLayerId0: string | string[], diff --git a/packages/job-worker/src/blueprints/context/services/PersistantStateStore.ts b/packages/job-worker/src/blueprints/context/services/PersistantStateStore.ts new file mode 100644 index 0000000000..6150eac095 --- /dev/null +++ b/packages/job-worker/src/blueprints/context/services/PersistantStateStore.ts @@ -0,0 +1,32 @@ +import type { TimelinePersistentState } from '@sofie-automation/blueprints-integration' +import type { BlueprintPlayoutPersistentStore } from '@sofie-automation/blueprints-integration/dist/context/playoutStore' +import { clone } from '@sofie-automation/corelib/dist/lib' + +export class PersistentPlayoutStateStore implements BlueprintPlayoutPersistentStore { + #state: TimelinePersistentState | undefined + #hasChanges = false + + get hasChanges(): boolean { + return this.#hasChanges + } + + constructor(state: TimelinePersistentState | undefined) { + this.#state = clone(state) + } + + getAll(): Partial { + return this.#state || {} + } + getKey(k: K): unknown { + return this.#state?.[k] + } + setKey(k: K, v: unknown): void { + if (!this.#state) this.#state = {} + ;(this.#state as any)[k] = v + this.#hasChanges = true + } + setAll(obj: unknown): void { + this.#state = obj + this.#hasChanges = true + } +} diff --git a/packages/job-worker/src/blueprints/context/services/__tests__/PartAndPieceInstanceActionService.test.ts b/packages/job-worker/src/blueprints/context/services/__tests__/PartAndPieceInstanceActionService.test.ts index e9c7c3f47f..ebee49813b 100644 --- a/packages/job-worker/src/blueprints/context/services/__tests__/PartAndPieceInstanceActionService.test.ts +++ b/packages/job-worker/src/blueprints/context/services/__tests__/PartAndPieceInstanceActionService.test.ts @@ -1,15 +1,15 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ -import * as _ from 'underscore' +import _ from 'underscore' import { IBlueprintPart, IBlueprintPiece, IBlueprintPieceType, PieceLifespan, } from '@sofie-automation/blueprints-integration' -import { PlayoutModel } from '../../../../playout/model/PlayoutModel' -import { MockJobContext, setupDefaultJobEnvironment } from '../../../../__mocks__/context' -import { runJobWithPlayoutModel } from '../../../../playout/lock' -import { defaultRundownPlaylist } from '../../../../__mocks__/defaultCollectionObjects' +import { PlayoutModel } from '../../../../playout/model/PlayoutModel.js' +import { MockJobContext, setupDefaultJobEnvironment } from '../../../../__mocks__/context.js' +import { runJobWithPlayoutModel } from '../../../../playout/lock.js' +import { defaultRundownPlaylist } from '../../../../__mocks__/defaultCollectionObjects.js' import { protectString, unprotectString } from '@sofie-automation/corelib/dist/protectedString' import { clone, getRandomId, literal, normalizeArrayToMapFunc, omit } from '@sofie-automation/corelib/dist/lib' import { @@ -18,26 +18,26 @@ import { RundownPlaylistActivationId, RundownPlaylistId, } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { setupDefaultRundown, setupMockShowStyleCompound } from '../../../../__mocks__/presetCollections' +import { setupDefaultRundown, setupMockShowStyleCompound } from '../../../../__mocks__/presetCollections.js' import { SourceLayers } from '@sofie-automation/corelib/dist/dataModel/ShowStyleBase' -import { JobContext } from '../../../../jobs' +import { JobContext } from '../../../../jobs/index.js' import { PieceInstance } from '@sofie-automation/corelib/dist/dataModel/PieceInstance' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' -import { getCurrentTime } from '../../../../lib' +import { getCurrentTime } from '../../../../lib/index.js' import { EmptyPieceTimelineObjectsBlob, Piece, serializePieceTimelineObjectsBlob, } from '@sofie-automation/corelib/dist/dataModel/Piece' -import { PlayoutPartInstanceModel } from '../../../../playout/model/PlayoutPartInstanceModel' -import { convertPartInstanceToBlueprints, convertPieceInstanceToBlueprints } from '../../lib' +import { PlayoutPartInstanceModel } from '../../../../playout/model/PlayoutPartInstanceModel.js' +import { convertPartInstanceToBlueprints, convertPieceInstanceToBlueprints } from '../../lib.js' import { TimelineObjRundown, TimelineObjType } from '@sofie-automation/corelib/dist/dataModel/Timeline' -import { PlayoutPartInstanceModelImpl } from '../../../../playout/model/implementation/PlayoutPartInstanceModelImpl' -import { writePartInstancesAndPieceInstances } from '../../../../playout/model/implementation/SavePlayoutModel' -import { PlayoutPieceInstanceModel } from '../../../../playout/model/PlayoutPieceInstanceModel' -import { DatabasePersistedModel } from '../../../../modelBase' +import { PlayoutPartInstanceModelImpl } from '../../../../playout/model/implementation/PlayoutPartInstanceModelImpl.js' +import { writePartInstancesAndPieceInstances } from '../../../../playout/model/implementation/SavePlayoutModel.js' +import { PlayoutPieceInstanceModel } from '../../../../playout/model/PlayoutPieceInstanceModel.js' +import { DatabasePersistedModel } from '../../../../modelBase.js' -import * as PlayoutAdlib from '../../../../playout/adlibUtils' +import * as PlayoutAdlib from '../../../../playout/adlibUtils.js' type TinnerStopPieces = jest.MockedFunction const innerStopPiecesMock = jest.spyOn(PlayoutAdlib, 'innerStopPieces') as TinnerStopPieces const insertQueuedPartWithPiecesOrig = PlayoutAdlib.insertQueuedPartWithPieces @@ -48,16 +48,16 @@ const insertQueuedPartWithPiecesMock = jest.spyOn( ) as TinsertQueuedPartWithPieces jest.mock('../../../../playout/resolvedPieces') -import { getResolvedPiecesForCurrentPartInstance } from '../../../../playout/resolvedPieces' +import { getResolvedPiecesForCurrentPartInstance } from '../../../../playout/resolvedPieces.js' type TgetResolvedPiecesForCurrentPartInstance = jest.MockedFunction const getResolvedPiecesForCurrentPartInstanceMock = getResolvedPiecesForCurrentPartInstance as TgetResolvedPiecesForCurrentPartInstance jest.mock('../../../postProcess') -import { postProcessPieces, postProcessTimelineObjects } from '../../../postProcess' -import { ActionPartChange, PartAndPieceInstanceActionService } from '../PartAndPieceInstanceActionService' +import { postProcessPieces, postProcessTimelineObjects } from '../../../postProcess.js' +import { ActionPartChange, PartAndPieceInstanceActionService } from '../PartAndPieceInstanceActionService.js' import { mock } from 'jest-mock-extended' -import { QuickLoopService } from '../../../../playout/model/services/QuickLoopService' +import { QuickLoopService } from '../../../../playout/model/services/QuickLoopService.js' const { postProcessPieces: postProcessPiecesOrig, postProcessTimelineObjects: postProcessTimelineObjectsOrig } = jest.requireActual('../../../postProcess') @@ -1676,7 +1676,6 @@ describe('Test blueprint api context', () => { await expect(service.removePieceInstances('next', [])).resolves.toEqual([]) await expect( - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion service.removePieceInstances('next', [unprotectString(pieceInstanceFromOther._id)]) ).resolves.toEqual([]) // Try and remove something belonging to a different part expectCountsToEqual(getPieceInstanceCounts(playoutModel), beforePieceInstancesCounts) diff --git a/packages/job-worker/src/blueprints/context/watchedPackages.ts b/packages/job-worker/src/blueprints/context/watchedPackages.ts index 3ae20ec9fe..29d1e8901f 100644 --- a/packages/job-worker/src/blueprints/context/watchedPackages.ts +++ b/packages/job-worker/src/blueprints/context/watchedPackages.ts @@ -4,12 +4,12 @@ import { ExpectedPackageFromRundown, } from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages' import { PackageInfoDB } from '@sofie-automation/corelib/dist/dataModel/PackageInfos' -import { JobContext } from '../../jobs' +import { JobContext } from '../../jobs/index.js' import { ExpectedPackageId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { Filter as FilterQuery } from 'mongodb' import { PackageInfo } from '@sofie-automation/blueprints-integration' import { unprotectObjectArray } from '@sofie-automation/corelib/dist/protectedString' -import { ExpectedPackageForIngestModel, IngestModelReadonly } from '../../ingest/model/IngestModel' +import { ExpectedPackageForIngestModel, IngestModelReadonly } from '../../ingest/model/IngestModel.js' import { ReadonlyDeep } from 'type-fest' /** @@ -116,7 +116,7 @@ export class WatchedPackagesHelper { ? await context.directCollections.PackageInfos.findFetch({ studioId: context.studio._id, packageId: { $in: packages.map((p) => p._id) }, - }) + }) : [] return new WatchedPackagesHelper(packages, watchedPackageInfos) diff --git a/packages/job-worker/src/blueprints/ingest/MutableIngestPartImpl.ts b/packages/job-worker/src/blueprints/ingest/MutableIngestPartImpl.ts index e35c397f94..068eefddd6 100644 --- a/packages/job-worker/src/blueprints/ingest/MutableIngestPartImpl.ts +++ b/packages/job-worker/src/blueprints/ingest/MutableIngestPartImpl.ts @@ -1,7 +1,7 @@ import type { SofieIngestPart, MutableIngestPart } from '@sofie-automation/blueprints-integration' import { clone } from '@sofie-automation/corelib/dist/lib' import { ReadonlyDeep } from 'type-fest' -import _ = require('underscore') +import _ from 'underscore' export class MutableIngestPartImpl implements MutableIngestPart { readonly #ingestPart: Omit, 'rank'> @@ -51,7 +51,6 @@ export class MutableIngestPartImpl implements MutableIng } if (this.#hasChanges || !_.isEqual(this.#ingestPart.payload[key], value)) { - // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion ;(this.#ingestPart.payload as any)[key] = clone(value) this.#hasChanges = true } diff --git a/packages/job-worker/src/blueprints/ingest/MutableIngestRundownImpl.ts b/packages/job-worker/src/blueprints/ingest/MutableIngestRundownImpl.ts index 8752db4f9a..4a7b286d43 100644 --- a/packages/job-worker/src/blueprints/ingest/MutableIngestRundownImpl.ts +++ b/packages/job-worker/src/blueprints/ingest/MutableIngestRundownImpl.ts @@ -7,15 +7,15 @@ import type { } from '@sofie-automation/blueprints-integration' import { Complete, clone, omit } from '@sofie-automation/corelib/dist/lib' import { ReadonlyDeep } from 'type-fest' -import _ = require('underscore') -import { MutableIngestSegmentImpl } from './MutableIngestSegmentImpl' +import _ from 'underscore' +import { MutableIngestSegmentImpl } from './MutableIngestSegmentImpl.js' import { SofieIngestDataCacheObjId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { SofieIngestRundownDataCacheGenerator } from '../../ingest/sofieIngestCache' +import { SofieIngestRundownDataCacheGenerator } from '../../ingest/sofieIngestCache.js' import { SofieIngestDataCacheObj, SofieIngestRundownWithSource, } from '@sofie-automation/corelib/dist/dataModel/SofieIngestDataCache' -import type { ComputedIngestChangeObject } from '../../ingest/runOperation' +import type { ComputedIngestChangeObject } from '../../ingest/runOperation.js' import { RundownSource } from '@sofie-automation/corelib/dist/dataModel/Rundown' export interface MutableIngestRundownChanges { @@ -117,7 +117,6 @@ export class MutableIngestRundownImpl { diff --git a/packages/job-worker/src/blueprints/ingest/__tests__/MutableIngestRundownImpl.spec.ts b/packages/job-worker/src/blueprints/ingest/__tests__/MutableIngestRundownImpl.spec.ts index a8030891b1..f24ff4b9cb 100644 --- a/packages/job-worker/src/blueprints/ingest/__tests__/MutableIngestRundownImpl.spec.ts +++ b/packages/job-worker/src/blueprints/ingest/__tests__/MutableIngestRundownImpl.spec.ts @@ -1,10 +1,10 @@ import { clone } from '@sofie-automation/corelib/dist/lib' -import { MutableIngestRundownChanges, MutableIngestRundownImpl } from '../MutableIngestRundownImpl' -import { SofieIngestRundownDataCacheGenerator } from '../../../ingest/sofieIngestCache' +import { MutableIngestRundownChanges, MutableIngestRundownImpl } from '../MutableIngestRundownImpl.js' +import { SofieIngestRundownDataCacheGenerator } from '../../../ingest/sofieIngestCache.js' import { protectString } from '@sofie-automation/corelib/dist/protectedString' -import { getSegmentId } from '../../../ingest/lib' +import { getSegmentId } from '../../../ingest/lib.js' import { SofieIngestDataCacheObjId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { MutableIngestSegmentImpl } from '../MutableIngestSegmentImpl' +import { MutableIngestSegmentImpl } from '../MutableIngestSegmentImpl.js' import { IngestRundown, IngestSegment, SofieIngestSegment } from '@sofie-automation/blueprints-integration' import { SofieIngestRundownWithSource } from '@sofie-automation/corelib/dist/dataModel/SofieIngestDataCache' diff --git a/packages/job-worker/src/blueprints/ingest/__tests__/MutableIngestSegmentImpl.spec.ts b/packages/job-worker/src/blueprints/ingest/__tests__/MutableIngestSegmentImpl.spec.ts index 3d53c7849d..5ab56ecb46 100644 --- a/packages/job-worker/src/blueprints/ingest/__tests__/MutableIngestSegmentImpl.spec.ts +++ b/packages/job-worker/src/blueprints/ingest/__tests__/MutableIngestSegmentImpl.spec.ts @@ -1,9 +1,9 @@ import { clone } from '@sofie-automation/corelib/dist/lib' -import { MutableIngestSegmentChanges, MutableIngestSegmentImpl } from '../MutableIngestSegmentImpl' -import { SofieIngestRundownDataCacheGenerator } from '../../../ingest/sofieIngestCache' +import { MutableIngestSegmentChanges, MutableIngestSegmentImpl } from '../MutableIngestSegmentImpl.js' +import { SofieIngestRundownDataCacheGenerator } from '../../../ingest/sofieIngestCache.js' import { protectString } from '@sofie-automation/corelib/dist/protectedString' -import { getSegmentId } from '../../../ingest/lib' -import { MutableIngestPartImpl } from '../MutableIngestPartImpl' +import { getSegmentId } from '../../../ingest/lib.js' +import { MutableIngestPartImpl } from '../MutableIngestPartImpl.js' import { IngestPart, IngestSegment, SofieIngestSegment } from '@sofie-automation/blueprints-integration' describe('MutableIngestSegmentImpl', () => { diff --git a/packages/job-worker/src/blueprints/ingest/__tests__/defaultApplyIngestChanges.spec.ts b/packages/job-worker/src/blueprints/ingest/__tests__/defaultApplyIngestChanges.spec.ts index 4d5d91440c..82bd18ae62 100644 --- a/packages/job-worker/src/blueprints/ingest/__tests__/defaultApplyIngestChanges.spec.ts +++ b/packages/job-worker/src/blueprints/ingest/__tests__/defaultApplyIngestChanges.spec.ts @@ -1,6 +1,6 @@ import { IngestRundownWithSource } from '@sofie-automation/corelib/dist/dataModel/NrcsIngestDataCache' -import { MutableIngestRundownImpl } from '../MutableIngestRundownImpl' -import { defaultApplyIngestChanges } from '../defaultApplyIngestChanges' +import { MutableIngestRundownImpl } from '../MutableIngestRundownImpl.js' +import { defaultApplyIngestChanges } from '../defaultApplyIngestChanges.js' import { NrcsIngestChangeDetails, NrcsIngestPartChangeDetails, @@ -14,7 +14,7 @@ import { IngestChangeType, } from '@sofie-automation/blueprints-integration' import { clone } from '@sofie-automation/corelib/dist/lib' -import { toSofieIngestRundown } from './util' +import { toSofieIngestRundown } from './util.js' describe('defaultApplyIngestChanges', () => { function createBasicIngestRundown(): IngestRundownWithSource { @@ -769,9 +769,8 @@ describe('defaultApplyIngestChanges', () => { describe('partsChanges', () => { it('mix of operations', async () => { - const { mutableIngestRundown, defaultOptions, mockCalls } = createMutableIngestRundown( - createMediumIngestRundown() - ) + const { mutableIngestRundown, defaultOptions, mockCalls } = + createMutableIngestRundown(createMediumIngestRundown()) // include some changes, which should be ignored const modifiedRundown = createMediumIngestRundown() diff --git a/packages/job-worker/src/blueprints/ingest/__tests__/groupPartsInMosRundownAndChanges.spec.ts b/packages/job-worker/src/blueprints/ingest/__tests__/groupPartsInMosRundownAndChanges.spec.ts index 18dfc9c39a..4786c4f45f 100644 --- a/packages/job-worker/src/blueprints/ingest/__tests__/groupPartsInMosRundownAndChanges.spec.ts +++ b/packages/job-worker/src/blueprints/ingest/__tests__/groupPartsInMosRundownAndChanges.spec.ts @@ -8,8 +8,8 @@ import { IngestChangeType, } from '@sofie-automation/blueprints-integration' import { Complete, clone } from '@sofie-automation/corelib/dist/lib' -import { groupMosPartsIntoIngestSegments, groupPartsInRundownAndChanges } from '../groupPartsInRundownAndChanges' -import { updateRanksBasedOnOrder } from '../../../ingest/mosDevice/lib' +import { groupMosPartsIntoIngestSegments, groupPartsInRundownAndChanges } from '../groupPartsInRundownAndChanges.js' +import { updateRanksBasedOnOrder } from '../../../ingest/mosDevice/lib.js' describe('groupPartsInMosRundownAndChanges', () => { function groupMosPartsInRundownAndChanges( diff --git a/packages/job-worker/src/blueprints/ingest/defaultApplyIngestChanges.ts b/packages/job-worker/src/blueprints/ingest/defaultApplyIngestChanges.ts index b4ea1bee33..4b1b2c0367 100644 --- a/packages/job-worker/src/blueprints/ingest/defaultApplyIngestChanges.ts +++ b/packages/job-worker/src/blueprints/ingest/defaultApplyIngestChanges.ts @@ -12,6 +12,7 @@ import { NrcsIngestPartChangeDetails, IngestPart, MutableIngestPart, + IngestChangeType, } from '@sofie-automation/blueprints-integration' import { assertNever, normalizeArrayToMap } from '@sofie-automation/corelib/dist/lib' import { ReadonlyDeep } from 'type-fest' @@ -29,7 +30,7 @@ export function defaultApplyIngestChanges ): void { - if (ingestChanges.source !== 'ingest') + if (ingestChanges.source !== IngestChangeType.Ingest) throw new Error(`Changes passed to defaultApplyIngestChanges must be from ingest source`) const payloadTransformers = new PayloadTransformers(options, mutableIngestRundown) @@ -186,7 +187,7 @@ function applyAllSegmentChanges( segmentsToInsert.sort((a, b) => nrcsSegmentIds.indexOf(b.externalId) - nrcsSegmentIds.indexOf(a.externalId)) for (const nrcsSegment of segmentsToInsert) { const segmentIndex = nrcsSegmentIds.indexOf(nrcsSegment.externalId) - const beforeSegmentId = segmentIndex !== -1 ? nrcsSegmentIds[segmentIndex + 1] ?? null : null + const beforeSegmentId = segmentIndex !== -1 ? (nrcsSegmentIds[segmentIndex + 1] ?? null) : null mutableIngestRundown.replaceSegment( payloadTransformers.transformPayloadsOnSegmentAndParts( @@ -274,7 +275,7 @@ function applyChangesObjectForSingleSegment nrcsPartIds.indexOf(b.externalId) - nrcsPartIds.indexOf(a.externalId)) for (const nrcsPart of partsToInsert) { const partIndex = nrcsPartIds.indexOf(nrcsPart.externalId) - const beforePartId = partIndex !== -1 ? nrcsPartIds[partIndex + 1] ?? null : null + const beforePartId = partIndex !== -1 ? (nrcsPartIds[partIndex + 1] ?? null) : null mutableSegment.replacePart( payloadTransformers.transformPayloadOnPart(nrcsPart, mutableSegment.getPart(nrcsPart.externalId)), diff --git a/packages/job-worker/src/blueprints/ingest/groupPartsInRundownAndChanges.ts b/packages/job-worker/src/blueprints/ingest/groupPartsInRundownAndChanges.ts index 18f44a373a..d7aaf82a74 100644 --- a/packages/job-worker/src/blueprints/ingest/groupPartsInRundownAndChanges.ts +++ b/packages/job-worker/src/blueprints/ingest/groupPartsInRundownAndChanges.ts @@ -11,7 +11,7 @@ import { NrcsIngestSegmentChangeDetailsEnum, } from '@sofie-automation/blueprints-integration' import { Complete, normalizeArrayToMap } from '@sofie-automation/corelib/dist/lib' -import _ = require('underscore') +import _ from 'underscore' /** * Groups parts in a MOS rundown into segments, using a separator of the part names. @@ -48,7 +48,7 @@ export function groupMosPartsIntoIngestSegments( rank: i, parts: partGroup.parts.map((part, i) => ({ ...part, rank: i })), payload: undefined, - } satisfies IngestSegment) + }) satisfies IngestSegment ) } diff --git a/packages/job-worker/src/blueprints/postProcess.ts b/packages/job-worker/src/blueprints/postProcess.ts index 90afdb2fc9..5ec47e2f4f 100644 --- a/packages/job-worker/src/blueprints/postProcess.ts +++ b/packages/job-worker/src/blueprints/postProcess.ts @@ -15,15 +15,16 @@ import { ITranslatableMessage, } from '@sofie-automation/blueprints-integration' import { - AdLibActionId, BlueprintId, + BucketAdLibActionId, + BucketAdLibId, BucketId, PartId, PieceId, RundownId, SegmentId, } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { JobContext, ProcessedShowStyleCompound } from '../jobs' +import { JobContext, ProcessedShowStyleCompound } from '../jobs/index.js' import { EmptyPieceTimelineObjectsBlob, Piece, @@ -40,11 +41,11 @@ import { interpollateTranslation, wrapTranslatableMessageFromBlueprints, } from '@sofie-automation/corelib/dist/TranslatableMessage' -import { setDefaultIdOnExpectedPackages } from '../ingest/expectedPackages' -import { logger } from '../logging' +import { setDefaultIdOnExpectedPackages } from '../ingest/expectedPackages.js' +import { logger } from '../logging.js' import { validateTimeline } from 'superfly-timeline' import { ReadonlyDeep } from 'type-fest' -import { translateUserEditPropertiesFromBlueprint, translateUserEditsFromBlueprint } from './context/lib' +import { translateUserEditPropertiesFromBlueprint, translateUserEditsFromBlueprint } from './context/lib.js' function getIdHash(docType: string, usedIds: Map, uniqueId: string): string { const count = usedIds.get(uniqueId) @@ -161,7 +162,7 @@ function isNow(enable: TimelineObjectCoreExt['enable']): boolean { * @param timelineUniqueIds Optional Set of ids that are not allowed. Ids of processed objects will be added to ths set */ export function postProcessTimelineObjects( - pieceId: PieceId, + pieceId: PieceId | BucketAdLibId, blueprintId: BlueprintId, timelineObjects: TimelineObjectCoreExt[], timelineUniqueIds: Set = new Set() @@ -334,7 +335,7 @@ export function postProcessAdLibActions( return adlibActions.map((action) => { if (!action.externalId) throw new Error( - `Error in blueprint "${blueprintId}" externalId not set for adlib action in ${partId}! ("${action.display.label}")` + `Error in blueprint "${blueprintId}" externalId not set for adlib action in ${partId}! ("${typeof action.display.label === 'string' ? action.display.label : action.display.label.key}")` ) const docId = getIdHash( @@ -403,7 +404,7 @@ export function postProcessBucketAdLib( name: string | undefined, importVersions: RundownImportVersions ): BucketAdLib { - const id: PieceId = protectString( + const id: BucketAdLibId = protectString( getHash( `${showStyleCompound.showStyleVariantId}_${context.studioId}_${bucketId}_bucket_adlib_${ingestInfo.payload.externalId}` ) @@ -454,7 +455,7 @@ export function postProcessBucketAction( label: string | undefined, importVersions: RundownImportVersions ): BucketAdLibAction { - const id: AdLibActionId = protectString( + const id: BucketAdLibActionId = protectString( getHash( `${showStyleCompound.showStyleVariantId}_${context.studioId}_${bucketId}_bucket_adlib_${ingestInfo.payload.externalId}` ) @@ -503,7 +504,7 @@ function processAdLibActionITranslatableMessages< } })[] }, - T extends IBlueprintActionManifest + T extends IBlueprintActionManifest, >(itemOrig: T, blueprintId: BlueprintId, rank?: number, label?: string): Pick { return { display: { diff --git a/packages/job-worker/src/db/changes.ts b/packages/job-worker/src/db/changes.ts index dbf75daaf8..fff12e20dd 100644 --- a/packages/job-worker/src/db/changes.ts +++ b/packages/job-worker/src/db/changes.ts @@ -1,9 +1,9 @@ import { ProtectedString } from '@sofie-automation/corelib/dist/protectedString' import { AnyBulkWriteOperation } from 'mongodb' -import { ICollection, MongoQuery } from './collections' -import _ = require('underscore') +import { ICollection, MongoQuery } from './collections.js' +import _ from 'underscore' import { deleteAllUndefinedProperties, normalizeArrayToMap } from '@sofie-automation/corelib/dist/lib' -import { JobContext } from '../jobs' +import { JobContext } from '../jobs/index.js' /** * Object describe a collection write event diff --git a/packages/job-worker/src/db/collection.ts b/packages/job-worker/src/db/collection.ts index bcb783fe82..54925c82ee 100644 --- a/packages/job-worker/src/db/collection.ts +++ b/packages/job-worker/src/db/collection.ts @@ -1,9 +1,9 @@ import { ProtectedString, unprotectString } from '@sofie-automation/corelib/dist/protectedString' import { EventEmitter } from 'events' import { AnyBulkWriteOperation, ChangeStream, Collection as MongoCollection, FindOptions, CountOptions } from 'mongodb' -import { IChangeStreamEvents } from '.' -import { startSpanManual } from '../profiler' -import { IChangeStream, ICollection, MongoModifier, MongoQuery } from './collections' +import { IChangeStreamEvents } from './index.js' +import { startSpanManual } from '../profiler.js' +import { IChangeStream, ICollection, MongoModifier, MongoQuery } from './collections.js' /** Wrap some APM and better error small query modifications around a Mongo.Collection */ class WrappedCollection }> implements ICollection { diff --git a/packages/job-worker/src/db/collections.ts b/packages/job-worker/src/db/collections.ts index b295785da9..d833d25a47 100644 --- a/packages/job-worker/src/db/collections.ts +++ b/packages/job-worker/src/db/collections.ts @@ -9,13 +9,12 @@ import { ChangeStreamDocument, CountOptions, } from 'mongodb' -import { wrapMongoCollection } from './collection' +import { wrapMongoCollection } from './collection.js' import { AdLibAction } from '@sofie-automation/corelib/dist/dataModel/AdlibAction' import { AdLibPiece } from '@sofie-automation/corelib/dist/dataModel/AdLibPiece' import { Blueprint } from '@sofie-automation/corelib/dist/dataModel/Blueprint' import { BucketAdLibAction } from '@sofie-automation/corelib/dist/dataModel/BucketAdLibAction' import { BucketAdLib } from '@sofie-automation/corelib/dist/dataModel/BucketAdLibPiece' -import { ExpectedMediaItem } from '@sofie-automation/corelib/dist/dataModel/ExpectedMediaItem' import { ExpectedPlayoutItem } from '@sofie-automation/corelib/dist/dataModel/ExpectedPlayoutItem' import { NrcsIngestDataCacheObj } from '@sofie-automation/corelib/dist/dataModel/NrcsIngestDataCache' import { SofieIngestDataCacheObj } from '@sofie-automation/corelib/dist/dataModel/SofieIngestDataCache' @@ -97,7 +96,6 @@ export interface IDirectCollections { Blueprints: ICollection BucketAdLibActions: ICollection BucketAdLibPieces: ICollection - ExpectedMediaItems: ICollection ExpectedPlayoutItems: ICollection Notifications: ICollection SofieIngestDataCache: ICollection @@ -154,10 +152,6 @@ export function getMongoCollections( database.collection(CollectionName.BucketAdLibPieces), allowWatchers ), - ExpectedMediaItems: wrapMongoCollection( - database.collection(CollectionName.ExpectedMediaItems), - allowWatchers - ), ExpectedPlayoutItems: wrapMongoCollection( database.collection(CollectionName.ExpectedPlayoutItems), allowWatchers diff --git a/packages/job-worker/src/db/index.ts b/packages/job-worker/src/db/index.ts index 38d3922373..4052ddba1f 100644 --- a/packages/job-worker/src/db/index.ts +++ b/packages/job-worker/src/db/index.ts @@ -1,7 +1,7 @@ import { MongoClient } from 'mongodb' -export * from './collections' -export * from './collection' +export * from './collections.js' +export * from './collection.js' export async function createMongoConnection(mongoUri: string): Promise { const client = new MongoClient(mongoUri, { diff --git a/packages/job-worker/src/events/ExternalMessageQueue.ts b/packages/job-worker/src/events/ExternalMessageQueue.ts index 13accd115f..ffb4e8f8ce 100644 --- a/packages/job-worker/src/events/ExternalMessageQueue.ts +++ b/packages/job-worker/src/events/ExternalMessageQueue.ts @@ -4,17 +4,17 @@ import { Time, } from '@sofie-automation/blueprints-integration' import { ExternalMessageQueueObj } from '@sofie-automation/corelib/dist/dataModel/ExternalMessageQueue' -import { IChangeStream, IDirectCollections } from '../db' -import { getCurrentTime } from '../lib' -import { sendRabbitMQMessage } from './integration/rabbitMQ' +import { IChangeStream, IDirectCollections } from '../db/index.js' +import { getCurrentTime } from '../lib/index.js' +import { sendRabbitMQMessage } from './integration/rabbitMQ.js' import { stringify } from 'querystring' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' -import { sendSlackMessageToWebhook } from './integration/slack' -import { StudioCacheContext } from '../jobs' -import { InvalidateWorkerDataCache, WorkerDataCacheWrapper } from '../workers/caches' +import { sendSlackMessageToWebhook } from './integration/slack.js' +import { StudioCacheContext } from '../jobs/index.js' +import { InvalidateWorkerDataCache, WorkerDataCacheWrapper } from '../workers/caches.js' import { ReadonlyDeep } from 'type-fest' -import pTimeout = require('p-timeout') -import { logger } from '../logging' +import pTimeout from 'p-timeout' +import { logger } from '../logging.js' const TRIGGER_DELAY_DEFAULT = 1000 // TODO: Now that this is in its own thread, does it need a delay? const TRIGGER_DELAY_STARTUP = 5000 diff --git a/packages/job-worker/src/events/__tests__/externalMessageQueue.test.ts b/packages/job-worker/src/events/__tests__/externalMessageQueue.test.ts index 51d53812c3..67b7b080aa 100644 --- a/packages/job-worker/src/events/__tests__/externalMessageQueue.test.ts +++ b/packages/job-worker/src/events/__tests__/externalMessageQueue.test.ts @@ -5,20 +5,20 @@ import { } from '@sofie-automation/blueprints-integration' import { DBRundown, Rundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' import { protectString } from '@sofie-automation/corelib/dist/protectedString' -import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context' -import { getCurrentTime } from '../../lib' -import { queueExternalMessages } from '../handle' -import { setupMockShowStyleCompound } from '../../__mocks__/presetCollections' +import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context.js' +import { getCurrentTime } from '../../lib/index.js' +import { queueExternalMessages } from '../handle.js' +import { setupMockShowStyleCompound } from '../../__mocks__/presetCollections.js' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { getRandomId, omit } from '@sofie-automation/corelib/dist/lib' -import { ExternalMessageQueueRunner } from '../ExternalMessageQueue' -import { InvalidateWorkerDataCache, WorkerDataCacheWrapper } from '../../workers/caches' +import { ExternalMessageQueueRunner } from '../ExternalMessageQueue.js' +import { InvalidateWorkerDataCache, WorkerDataCacheWrapper } from '../../workers/caches.js' import { StudioId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { ReadonlyObjectDeep } from 'type-fest/source/readonly-deep' -import { StudioCacheContext } from '../../jobs' -import { defer, MockMongoCollection } from '../../__mocks__/collection' +import { StudioCacheContext } from '../../jobs/index.js' +import { defer, MockMongoCollection } from '../../__mocks__/collection.js' import { ExternalMessageQueueObj } from '@sofie-automation/corelib/dist/dataModel/ExternalMessageQueue' -import { sendSlackMessageToWebhook } from '../integration/slack' +import { sendSlackMessageToWebhook } from '../integration/slack.js' import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' describe('Test external message queue static methods', () => { diff --git a/packages/job-worker/src/events/__tests__/lib.test.ts b/packages/job-worker/src/events/__tests__/lib.test.ts index 12e453deb6..0c50f45909 100644 --- a/packages/job-worker/src/events/__tests__/lib.test.ts +++ b/packages/job-worker/src/events/__tests__/lib.test.ts @@ -1,4 +1,4 @@ -import { escapeHtml } from '../lib' +import { escapeHtml } from '../lib.js' describe('lib', () => { test('escapeHtml', () => { diff --git a/packages/job-worker/src/events/handle.ts b/packages/job-worker/src/events/handle.ts index e195e1641e..7103a6e800 100644 --- a/packages/job-worker/src/events/handle.ts +++ b/packages/job-worker/src/events/handle.ts @@ -3,29 +3,29 @@ import { PartInstanceTimingsProps, RundownDataChangedProps, } from '@sofie-automation/corelib/dist/worker/events' -import { getCurrentTime } from '../lib' -import { JobContext } from '../jobs' -import { logger } from '../logging' +import { getCurrentTime } from '../lib/index.js' +import { JobContext } from '../jobs/index.js' +import { logger } from '../logging.js' import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' import { ReadonlyDeep } from 'type-fest' -import { RundownDataChangedEventContext, RundownTimingEventContext } from '../blueprints/context' +import { RundownDataChangedEventContext, RundownTimingEventContext } from '../blueprints/context/index.js' import { IBlueprintExternalMessageQueueObj } from '@sofie-automation/blueprints-integration' import { protectString, unDeepString } from '@sofie-automation/corelib/dist/protectedString' -import _ = require('underscore') +import _ from 'underscore' import { getRandomId, omit, removeNullyProperties } from '@sofie-automation/corelib/dist/lib' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' import { ExternalMessageQueueObj } from '@sofie-automation/corelib/dist/dataModel/ExternalMessageQueue' -import { ICollection, MongoModifier } from '../db' +import { ICollection, MongoModifier } from '../db/index.js' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { ExternalMessageQueueObjId, PeripheralDeviceId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { runWithRundownLock } from '../ingest/lock' +import { runWithRundownLock } from '../ingest/lock.js' import { PeripheralDevice, PeripheralDeviceCategory, PeripheralDeviceType, } from '@sofie-automation/corelib/dist/dataModel/PeripheralDevice' import { MOS } from '@sofie-automation/corelib' -import { executePeripheralDeviceFunction } from '../peripheralDevice' +import { executePeripheralDeviceFunction } from '../peripheralDevice.js' import { DEFAULT_MOS_TIMEOUT_TIME } from '@sofie-automation/shared-lib/dist/core/constants' async function getBlueprintAndDependencies(context: JobContext, rundown: ReadonlyDeep) { diff --git a/packages/job-worker/src/events/integration/rabbitMQ.ts b/packages/job-worker/src/events/integration/rabbitMQ.ts index f37b3a227d..f57197452a 100644 --- a/packages/job-worker/src/events/integration/rabbitMQ.ts +++ b/packages/job-worker/src/events/integration/rabbitMQ.ts @@ -1,15 +1,15 @@ -import * as _ from 'underscore' +import _ from 'underscore' import * as AMQP from 'amqplib' -import { logger } from '../../logging' +import { logger } from '../../logging.js' import { ExternalMessageQueueObjRabbitMQ } from '@sofie-automation/blueprints-integration' import { ExternalMessageQueueObjId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { createManualPromise, ManualPromise } from '@sofie-automation/corelib/dist/lib' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' import { unprotectString } from '@sofie-automation/corelib/dist/protectedString' -import { FatalExternalMessageError } from '../ExternalMessageQueue' +import { FatalExternalMessageError } from '../ExternalMessageQueue.js' import { ExternalMessageQueueObj } from '@sofie-automation/corelib/dist/dataModel/ExternalMessageQueue' -import { retrieveBlueprintConfigRefs } from '../../blueprints/config' -import { StudioCacheContext } from '../../jobs' +import { retrieveBlueprintConfigRefs } from '../../blueprints/config.js' +import { StudioCacheContext } from '../../jobs/index.js' interface Message { _id: ExternalMessageQueueObjId diff --git a/packages/job-worker/src/influx.ts b/packages/job-worker/src/influx.ts index a453f1bfde..efd86f6480 100644 --- a/packages/job-worker/src/influx.ts +++ b/packages/job-worker/src/influx.ts @@ -1,4 +1,4 @@ -import { getSystemVersion } from './lib' +import { getSystemVersion } from './lib/index.js' import { initInfluxdb } from '@sofie-automation/corelib/dist/influxdb' const config = { diff --git a/packages/job-worker/src/ingest/__tests__/expectedPackages.test.ts b/packages/job-worker/src/ingest/__tests__/expectedPackages.test.ts index ec920872bd..8b5cb99a12 100644 --- a/packages/job-worker/src/ingest/__tests__/expectedPackages.test.ts +++ b/packages/job-worker/src/ingest/__tests__/expectedPackages.test.ts @@ -3,13 +3,13 @@ import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' import { Piece } from '@sofie-automation/corelib/dist/dataModel/Piece' import { literal } from '@sofie-automation/corelib/dist/lib' import { protectString } from '@sofie-automation/corelib/dist/protectedString' -import { defaultPart, defaultPiece, defaultAdLibPiece } from '../../__mocks__/defaultCollectionObjects' -import { LAYER_IDS } from '../../__mocks__/presetCollections' +import { defaultPart, defaultPiece, defaultAdLibPiece } from '../../__mocks__/defaultCollectionObjects.js' +import { LAYER_IDS } from '../../__mocks__/presetCollections.js' import { ExpectedPackage, PieceLifespan, VTContent } from '@sofie-automation/blueprints-integration' -import { updateExpectedPackagesForPartModel } from '../expectedPackages' -import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context' +import { updateExpectedPackagesForPartModel } from '../expectedPackages.js' +import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context.js' import { ReadonlyDeep } from 'type-fest' -import { IngestPartModel } from '../model/IngestPartModel' +import { IngestPartModel } from '../model/IngestPartModel.js' describe('Expected Media Items', () => { let context: MockJobContext @@ -44,9 +44,6 @@ describe('Expected Media Items', () => { const mockFileName1 = 'mockFileName1' const mockPath1 = mockBase + mockFileName1 - const mockFlow0 = 'mockFlow0' - const mockFlow1 = 'mockFlow1' - const part: ReadonlyDeep = literal({ ...defaultPart(protectString('mockPart0'), protectString(''), protectString('')), _rank: 1, @@ -68,7 +65,6 @@ describe('Expected Media Items', () => { content: literal({ fileName: mockFileName0, path: mockPath0, - mediaFlowIds: [mockFlow0, mockFlow1], sourceDuration: 0, }), expectedPackages: [getExpectedPackage('id0', mockPath0), getExpectedPackage('id1', mockPath0)], @@ -88,7 +84,6 @@ describe('Expected Media Items', () => { content: literal({ fileName: mockFileName1, path: mockPath1, - mediaFlowIds: [mockFlow0], sourceDuration: 0, }), expectedPackages: [getExpectedPackage('id0', mockPath1)], @@ -107,7 +102,6 @@ describe('Expected Media Items', () => { content: literal({ fileName: mockFileName1, path: mockPath1, - mediaFlowIds: [mockFlow0], sourceDuration: 0, }), expectedPackages: [getExpectedPackage('id0', mockPath1)], @@ -117,8 +111,7 @@ describe('Expected Media Items', () => { return { part, pieces, adLibPieces } } - test('Generates ExpectedPackages(/ExpectedMediaItems) for a Part', async () => { - const setExpectedMediaItems = jest.fn() + test('Generates ExpectedPackages for a Part', async () => { const setExpectedPlayoutItems = jest.fn() const setExpectedPackages = jest.fn() @@ -129,11 +122,9 @@ describe('Expected Media Items', () => { pieces, adLibActions: [], adLibPieces, - expectedMediaItems: [], expectedPlayoutItems: [], expectedPackages: [], - setExpectedMediaItems, setExpectedPlayoutItems, setExpectedPackages, setInvalid: function (_invalid: boolean): void { @@ -148,9 +139,5 @@ describe('Expected Media Items', () => { expect(setExpectedPlayoutItems).toHaveBeenCalledTimes(1) expect(setExpectedPlayoutItems).toHaveBeenCalledWith([]) - - // to be deprecated: - expect(setExpectedMediaItems).toHaveBeenCalledTimes(1) - expect(setExpectedMediaItems.mock.calls[0][0]).toHaveLength(4) }) }) diff --git a/packages/job-worker/src/ingest/__tests__/ingest.test.ts b/packages/job-worker/src/ingest/__tests__/ingest.test.ts index de32649b27..1e207ac14f 100644 --- a/packages/job-worker/src/ingest/__tests__/ingest.test.ts +++ b/packages/job-worker/src/ingest/__tests__/ingest.test.ts @@ -1,5 +1,4 @@ -/* eslint-disable @typescript-eslint/unbound-method */ -import '../../__mocks__/_extendJest' +import '../../__mocks__/_extendJest.js' import { IBlueprintPiece, IngestPart, @@ -24,29 +23,33 @@ import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/Rund import { DBSegment, SegmentOrphanedReason } from '@sofie-automation/corelib/dist/dataModel/Segment' import { clone, getRandomString, literal } from '@sofie-automation/corelib/dist/lib' import { sortPartsInSortedSegments, sortSegmentsInRundowns } from '@sofie-automation/corelib/dist/playout/playlist' -import { MongoQuery } from '../../db' -import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context' -import { setupMockPeripheralDevice, setupMockShowStyleCompound } from '../../__mocks__/presetCollections' +import { MongoQuery } from '../../db/index.js' +import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context.js' +import { setupMockPeripheralDevice, setupMockShowStyleCompound } from '../../__mocks__/presetCollections.js' import { handleRemovedRundown, handleUpdatedRundown, handleUpdatedRundownMetaData, handleUserRemoveRundown, -} from '../../ingest/ingestRundownJobs' -import { handleRemovedPart, handleUpdatedPart } from '../../ingest/ingestPartJobs' -import { handleRemovedSegment, handleUpdatedSegment, handleUpdatedSegmentRanks } from '../../ingest/ingestSegmentJobs' -import { handleTakeNextPart } from '../../playout/take' -import { handleActivateRundownPlaylist } from '../../playout/activePlaylistJobs' +} from '../../ingest/ingestRundownJobs.js' +import { handleRemovedPart, handleUpdatedPart } from '../../ingest/ingestPartJobs.js' +import { + handleRemovedSegment, + handleUpdatedSegment, + handleUpdatedSegmentRanks, +} from '../../ingest/ingestSegmentJobs.js' +import { handleTakeNextPart } from '../../playout/take.js' +import { handleActivateRundownPlaylist } from '../../playout/activePlaylistJobs.js' import { PartInstanceId, SegmentId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { getSelectedPartInstances } from '../../playout/__tests__/lib' +import { getSelectedPartInstances } from '../../playout/__tests__/lib.js' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' -import { runJobWithPlayoutModel } from '../../playout/lock' +import { runJobWithPlayoutModel } from '../../playout/lock.js' import { protectString } from '@sofie-automation/corelib/dist/protectedString' -import { insertQueuedPartWithPieces } from '../../playout/adlibUtils' +import { insertQueuedPartWithPieces } from '../../playout/adlibUtils.js' import { UserErrorMessage } from '@sofie-automation/corelib/dist/error' -import { PlayoutPartInstanceModel } from '../../playout/model/PlayoutPartInstanceModel' +import { PlayoutPartInstanceModel } from '../../playout/model/PlayoutPartInstanceModel.js' import { NrcsIngestCacheType } from '@sofie-automation/corelib/dist/dataModel/NrcsIngestDataCache' -import { wrapGenericIngestJob, wrapGenericIngestJobWithPrecheck } from '../jobWrappers' +import { wrapGenericIngestJob, wrapGenericIngestJobWithPrecheck } from '../jobWrappers.js' import { wrapDefaultObject } from '@sofie-automation/corelib/dist/settings/objectWithOverrides' const handleRemovedRundownWrapped = wrapGenericIngestJob(handleRemovedRundown) diff --git a/packages/job-worker/src/ingest/__tests__/ingestPartJobs.spec.ts b/packages/job-worker/src/ingest/__tests__/ingestPartJobs.spec.ts index 8bebfab3f5..6e3cfc37cb 100644 --- a/packages/job-worker/src/ingest/__tests__/ingestPartJobs.spec.ts +++ b/packages/job-worker/src/ingest/__tests__/ingestPartJobs.spec.ts @@ -1,8 +1,8 @@ -import { setupDefaultJobEnvironment } from '../../__mocks__/context' -import { handleRemovedPart, handleUpdatedPart } from '../ingestPartJobs' +import { setupDefaultJobEnvironment } from '../../__mocks__/context.js' +import { handleRemovedPart, handleUpdatedPart } from '../ingestPartJobs.js' import { clone } from '@sofie-automation/corelib/dist/lib' import { IngestChangeType, IngestPart, NrcsIngestPartChangeDetails } from '@sofie-automation/blueprints-integration' -import { UpdateIngestRundownChange } from '../runOperation' +import { UpdateIngestRundownChange } from '../runOperation.js' import { IngestRundownWithSource } from '@sofie-automation/corelib/dist/dataModel/NrcsIngestDataCache' function getDefaultIngestRundown(): IngestRundownWithSource { @@ -288,27 +288,4 @@ describe('handleUpdatedPart', () => { }, } satisfies UpdateIngestRundownChange) }) - - // TODO: should this be a test case? - // it('part belongs to different segment', () => { - // const context = setupDefaultJobEnvironment() - - // const ingestRundown = getDefaultIngestRundown() - - // const newIngestPart2 = { ...newIngestPart, externalId: 'part0' } - - // expect(() => - // handleUpdatedPart( - // context, - // { - // peripheralDeviceId: null, - // rundownExternalId: 'rundown0', - // segmentExternalId: 'segment1', - // ingestPart: clone(newIngestPart2), - // isCreateAction: true, - // }, - // clone(ingestRundown) - // ) - // ).toThrow('TODO fill out this error') - // }) }) diff --git a/packages/job-worker/src/ingest/__tests__/ingestRundownJobs.spec.ts b/packages/job-worker/src/ingest/__tests__/ingestRundownJobs.spec.ts index 0d241dafdf..39d3d2c48b 100644 --- a/packages/job-worker/src/ingest/__tests__/ingestRundownJobs.spec.ts +++ b/packages/job-worker/src/ingest/__tests__/ingestRundownJobs.spec.ts @@ -1,14 +1,14 @@ -import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context' +import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context.js' import { clone } from '@sofie-automation/corelib/dist/lib' import { IngestChangeType, NrcsIngestRundownChangeDetails } from '@sofie-automation/blueprints-integration' -import { ComputedIngestChangeAction, UpdateIngestRundownChange } from '../runOperation' +import { ComputedIngestChangeAction, UpdateIngestRundownChange } from '../runOperation.js' import { handleRegenerateRundown, handleRemovedRundown, handleUpdatedRundown, handleUpdatedRundownMetaData, handleUserUnsyncRundown, -} from '../ingestRundownJobs' +} from '../ingestRundownJobs.js' import { RundownId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { protectString } from '@sofie-automation/corelib/dist/protectedString' import { DBRundown, RundownOrphanedReason } from '@sofie-automation/corelib/dist/dataModel/Rundown' diff --git a/packages/job-worker/src/ingest/__tests__/ingestSegmentJobs.spec.ts b/packages/job-worker/src/ingest/__tests__/ingestSegmentJobs.spec.ts index 7060dfce61..aac9b80c88 100644 --- a/packages/job-worker/src/ingest/__tests__/ingestSegmentJobs.spec.ts +++ b/packages/job-worker/src/ingest/__tests__/ingestSegmentJobs.spec.ts @@ -1,17 +1,17 @@ -import { setupDefaultJobEnvironment } from '../../__mocks__/context' +import { setupDefaultJobEnvironment } from '../../__mocks__/context.js' import { handleRegenerateSegment, handleRemovedSegment, handleUpdatedSegment, handleUpdatedSegmentRanks, -} from '../ingestSegmentJobs' +} from '../ingestSegmentJobs.js' import { clone } from '@sofie-automation/corelib/dist/lib' import { IngestChangeType, IngestSegment, NrcsIngestSegmentChangeDetailsEnum, } from '@sofie-automation/blueprints-integration' -import { UpdateIngestRundownChange } from '../runOperation' +import { UpdateIngestRundownChange } from '../runOperation.js' import { IngestRundownWithSource } from '@sofie-automation/corelib/dist/dataModel/NrcsIngestDataCache' function getDefaultIngestRundown(): IngestRundownWithSource { diff --git a/packages/job-worker/src/ingest/__tests__/lib.ts b/packages/job-worker/src/ingest/__tests__/lib.ts index faf88c63d8..6583b09bcd 100644 --- a/packages/job-worker/src/ingest/__tests__/lib.ts +++ b/packages/job-worker/src/ingest/__tests__/lib.ts @@ -1,8 +1,8 @@ -import { removeRundownFromDb } from '../../rundownPlaylists' -import { RundownLock } from '../../jobs/lock' +import { removeRundownFromDb } from '../../rundownPlaylists.js' +import { RundownLock } from '../../jobs/lock.js' import { RundownId, RundownPlaylistId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' -import { MockJobContext } from '../../__mocks__/context' +import { MockJobContext } from '../../__mocks__/context.js' class FakeRundownLock extends RundownLock { constructor(rundownId: RundownId) { diff --git a/packages/job-worker/src/ingest/__tests__/selectShowStyleVariant.test.ts b/packages/job-worker/src/ingest/__tests__/selectShowStyleVariant.test.ts index cb63251f09..1014f06174 100644 --- a/packages/job-worker/src/ingest/__tests__/selectShowStyleVariant.test.ts +++ b/packages/job-worker/src/ingest/__tests__/selectShowStyleVariant.test.ts @@ -1,10 +1,10 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ import { ExtendedIngestRundown, IBlueprintShowStyleBase } from '@sofie-automation/blueprints-integration' -import '../../__mocks__/_extendJest' -import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context' -import { selectShowStyleVariant } from '../selectShowStyleVariant' -import { StudioUserContext } from '../../blueprints/context' -import { setupMockShowStyleCompound, setupMockShowStyleVariant } from '../../__mocks__/presetCollections' +import '../../__mocks__/_extendJest.js' +import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context.js' +import { selectShowStyleVariant } from '../selectShowStyleVariant.js' +import { StudioUserContext } from '../../blueprints/context/index.js' +import { setupMockShowStyleCompound, setupMockShowStyleVariant } from '../../__mocks__/presetCollections.js' import { protectString, unprotectString } from '@sofie-automation/corelib/dist/protectedString' describe('selectShowStyleVariant', () => { diff --git a/packages/job-worker/src/ingest/__tests__/syncChangesToPartInstance.test.ts b/packages/job-worker/src/ingest/__tests__/syncChangesToPartInstance.test.ts index 0eb053ead7..498802d0d0 100644 --- a/packages/job-worker/src/ingest/__tests__/syncChangesToPartInstance.test.ts +++ b/packages/job-worker/src/ingest/__tests__/syncChangesToPartInstance.test.ts @@ -1,29 +1,33 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ /* eslint-disable @typescript-eslint/unbound-method */ -import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context' -import { setupMockShowStyleCompound } from '../../__mocks__/presetCollections' -import { findInstancesToSync, PartInstanceToSync, SyncChangesToPartInstancesWorker } from '../syncChangesToPartInstance' +import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context.js' +import { setupMockShowStyleCompound } from '../../__mocks__/presetCollections.js' +import { + findInstancesToSync, + PartInstanceToSync, + SyncChangesToPartInstancesWorker, +} from '../syncChangesToPartInstance.js' import { mock } from 'jest-mock-extended' -import type { PlayoutModel } from '../../playout/model/PlayoutModel' -import type { IngestModelReadonly } from '../model/IngestModel' -import type { PlayoutRundownModel } from '../../playout/model/PlayoutRundownModel' -import type { PlayoutPartInstanceModel } from '../../playout/model/PlayoutPartInstanceModel' +import type { PlayoutModel } from '../../playout/model/PlayoutModel.js' +import type { IngestModelReadonly } from '../model/IngestModel.js' +import type { PlayoutRundownModel } from '../../playout/model/PlayoutRundownModel.js' +import type { PlayoutPartInstanceModel } from '../../playout/model/PlayoutPartInstanceModel.js' import type { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' import { protectString } from '@sofie-automation/corelib/dist/protectedString' -import { PlayoutModelImpl } from '../../playout/model/implementation/PlayoutModelImpl' +import { PlayoutModelImpl } from '../../playout/model/implementation/PlayoutModelImpl.js' import { PlaylistTimingType, ShowStyleBlueprintManifest } from '@sofie-automation/blueprints-integration' import { RundownPlaylistId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { DBRundownPlaylist, SelectedPartInstance } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' -import { PlayoutRundownModelImpl } from '../../playout/model/implementation/PlayoutRundownModelImpl' +import { PlayoutRundownModelImpl } from '../../playout/model/implementation/PlayoutRundownModelImpl.js' import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment' -import { PlayoutSegmentModelImpl } from '../../playout/model/implementation/PlayoutSegmentModelImpl' +import { PlayoutSegmentModelImpl } from '../../playout/model/implementation/PlayoutSegmentModelImpl.js' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' -import { ProcessedShowStyleCompound } from '../../jobs' +import { ProcessedShowStyleCompound } from '../../jobs/index.js' import { PartialDeep, ReadonlyDeep } from 'type-fest' jest.mock('../../playout/adlibTesting') -import { validateAdlibTestingPartInstanceProperties } from '../../playout/adlibTesting' +import { validateAdlibTestingPartInstanceProperties } from '../../playout/adlibTesting.js' const mockOptions = { fallbackMockImplementation: () => { diff --git a/packages/job-worker/src/ingest/__tests__/updateNext.test.ts b/packages/job-worker/src/ingest/__tests__/updateNext.test.ts index e051cfddd3..b809a185b5 100644 --- a/packages/job-worker/src/ingest/__tests__/updateNext.test.ts +++ b/packages/job-worker/src/ingest/__tests__/updateNext.test.ts @@ -4,13 +4,13 @@ import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartIns import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment' import { literal } from '@sofie-automation/corelib/dist/lib' import { protectString } from '@sofie-automation/corelib/dist/protectedString' -import { saveIntoDb } from '../../db/changes' -import { ensureNextPartIsValid as ensureNextPartIsValidRaw } from '../updateNext' -import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context' -import { runJobWithPlayoutModel } from '../../playout/lock' +import { saveIntoDb } from '../../db/changes.js' +import { ensureNextPartIsValid as ensureNextPartIsValidRaw } from '../updateNext.js' +import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context.js' +import { runJobWithPlayoutModel } from '../../playout/lock.js' jest.mock('../../playout/setNext') -import { setNextPart } from '../../playout/setNext' +import { setNextPart } from '../../playout/setNext.js' type TsetNextPart = jest.MockedFunction const setNextPartMock = setNextPart as TsetNextPart setNextPartMock.mockImplementation(async () => Promise.resolve()) // Default mock @@ -326,7 +326,7 @@ describe('ensureNextPartIsValid', () => { rundownId, manuallySelected: nextPartManual || false, consumesQueuedSegmentId: false, - } + } : null, currentPartInfo: currentPartInstanceId ? { @@ -334,7 +334,7 @@ describe('ensureNextPartIsValid', () => { rundownId, manuallySelected: false, consumesQueuedSegmentId: false, - } + } : null, previousPartInfo: null, }, diff --git a/packages/job-worker/src/ingest/bucket/bucketAdlibs.ts b/packages/job-worker/src/ingest/bucket/bucketAdlibs.ts index 1790cac982..65c5973dcc 100644 --- a/packages/job-worker/src/ingest/bucket/bucketAdlibs.ts +++ b/packages/job-worker/src/ingest/bucket/bucketAdlibs.ts @@ -1,5 +1,5 @@ -import { PieceId, AdLibActionId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { JobContext } from '../../jobs' +import { BucketAdLibActionId, BucketAdLibId } from '@sofie-automation/corelib/dist/dataModel/Ids' +import { JobContext } from '../../jobs/index.js' import { BucketActionModifyProps, BucketActionRegenerateExpectedPackagesProps, @@ -13,18 +13,12 @@ import { cleanUpExpectedPackagesForBucketAdLibsActions, updateExpectedPackagesForBucketAdLibPiece, updateExpectedPackagesForBucketAdLibAction, -} from '../expectedPackages' -import { - cleanUpExpectedMediaItemForBucketAdLibActions, - cleanUpExpectedMediaItemForBucketAdLibPiece, - updateExpectedMediaItemForBucketAdLibAction, - updateExpectedMediaItemForBucketAdLibPiece, -} from '../expectedMediaItems' +} from '../expectedPackages.js' import { omit } from '@sofie-automation/corelib/dist/lib' import { BucketAdLib } from '@sofie-automation/corelib/dist/dataModel/BucketAdLibPiece' import { BucketAdLibAction } from '@sofie-automation/corelib/dist/dataModel/BucketAdLibAction' import { ExpectedPackageDBType } from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages' -import { MongoQuery } from '../../db' +import { MongoQuery } from '../../db/index.js' export async function handleBucketRemoveAdlibPiece( context: JobContext, @@ -34,13 +28,12 @@ export async function handleBucketRemoveAdlibPiece( if (!piece || piece.studioId !== context.studioId) throw new Error(`Bucket Piece "${data.pieceId}" not found in this studio`) - const idsToUpdate: PieceId[] = [piece._id] + const idsToUpdate: BucketAdLibId[] = [piece._id] // Also remove adlibs that are grouped together with this adlib in the GUI: ;(await getGroupedAdlibs(context, piece)).forEach(({ _id }) => idsToUpdate.push(_id)) await Promise.all([ context.directCollections.BucketAdLibPieces.remove({ _id: { $in: idsToUpdate } }), - cleanUpExpectedMediaItemForBucketAdLibPiece(context, idsToUpdate), cleanUpExpectedPackagesForBucketAdLibs(context, idsToUpdate), ]) } @@ -53,13 +46,12 @@ export async function handleBucketRemoveAdlibAction( if (!action || action.studioId !== context.studioId) throw new Error(`Bucket Action "${data.actionId}" not found in this studio`) - const idsToUpdate: AdLibActionId[] = [action._id] + const idsToUpdate: BucketAdLibActionId[] = [action._id] // Also remove adlibs that are grouped together with this adlib in the GUI: ;(await getGroupedAdlibActions(context, action)).forEach(({ _id }) => idsToUpdate.push(_id)) await Promise.all([ context.directCollections.BucketAdLibActions.remove({ _id: { $in: idsToUpdate } }), - cleanUpExpectedMediaItemForBucketAdLibActions(context, idsToUpdate), cleanUpExpectedPackagesForBucketAdLibsActions(context, idsToUpdate), ]) } @@ -70,7 +62,6 @@ export async function handleBucketEmpty(context: JobContext, data: BucketEmptyPr await Promise.all([ context.directCollections.BucketAdLibPieces.remove({ bucketId: id, studioId: context.studioId }), context.directCollections.BucketAdLibActions.remove({ bucketId: id, studioId: context.studioId }), - context.directCollections.ExpectedMediaItems.remove({ bucketId: id, studioId: context.studioId }), context.directCollections.ExpectedPackages.remove({ studioId: context.studioId, fromPieceType: ExpectedPackageDBType.BUCKET_ADLIB, @@ -92,10 +83,7 @@ export async function handleBucketActionRegenerateExpectedPackages( if (!action || action.studioId !== context.studioId) throw new Error(`Bucket Action "${data.actionId}" not found in this studio`) - await Promise.all([ - updateExpectedMediaItemForBucketAdLibAction(context, action), - updateExpectedPackagesForBucketAdLibAction(context, action), - ]) + await updateExpectedPackagesForBucketAdLibAction(context, action) } export async function handleBucketActionModify(context: JobContext, data: BucketActionModifyProps): Promise { @@ -123,7 +111,6 @@ export async function handleBucketActionModify(context: JobContext, data: Bucket context.directCollections.BucketAdLibActions.update(action._id, { $set: newProps, }), - updateExpectedMediaItemForBucketAdLibAction(context, newAction), updateExpectedPackagesForBucketAdLibAction(context, newAction), ]) } @@ -149,10 +136,7 @@ export async function handleBucketPieceModify(context: JobContext, data: BucketP ...newProps, } - await Promise.all([ - updateExpectedMediaItemForBucketAdLibPiece(context, newPiece), - updateExpectedPackagesForBucketAdLibPiece(context, newPiece), - ]) + await updateExpectedPackagesForBucketAdLibPiece(context, newPiece) } } /** Returns BucketAdlibActions that are grouped together with this adlib in the GUI */ diff --git a/packages/job-worker/src/ingest/bucket/import.ts b/packages/job-worker/src/ingest/bucket/import.ts index 56188a8e56..569bd05e78 100644 --- a/packages/job-worker/src/ingest/bucket/import.ts +++ b/packages/job-worker/src/ingest/bucket/import.ts @@ -1,35 +1,29 @@ import { RundownImportVersions } from '@sofie-automation/corelib/dist/dataModel/Rundown' -import { ShowStyleUserContext } from '../../blueprints/context' +import { ShowStyleUserContext } from '../../blueprints/context/index.js' import { IBlueprintActionManifest, IBlueprintAdLibPiece, IngestAdlib, NoteSeverity, } from '@sofie-automation/blueprints-integration' -import { WatchedPackagesHelper } from '../../blueprints/context/watchedPackages' -import { JobContext, ProcessedShowStyleCompound } from '../../jobs' -import { getSystemVersion } from '../../lib' +import { WatchedPackagesHelper } from '../../blueprints/context/watchedPackages.js' +import { JobContext, ProcessedShowStyleCompound } from '../../jobs/index.js' +import { getSystemVersion } from '../../lib/index.js' import { BucketItemImportProps, BucketItemRegenerateProps } from '@sofie-automation/corelib/dist/worker/ingest' import { cleanUpExpectedPackagesForBucketAdLibs, cleanUpExpectedPackagesForBucketAdLibsActions, updateExpectedPackagesForBucketAdLibPiece, updateExpectedPackagesForBucketAdLibAction, -} from '../expectedPackages' -import { - cleanUpExpectedMediaItemForBucketAdLibActions, - cleanUpExpectedMediaItemForBucketAdLibPiece, - updateExpectedMediaItemForBucketAdLibAction, - updateExpectedMediaItemForBucketAdLibPiece, -} from '../expectedMediaItems' -import { postProcessBucketAction, postProcessBucketAdLib } from '../../blueprints/postProcess' +} from '../expectedPackages.js' +import { postProcessBucketAction, postProcessBucketAdLib } from '../../blueprints/postProcess.js' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' import { BucketAdLib, BucketAdLibIngestInfo } from '@sofie-automation/corelib/dist/dataModel/BucketAdLibPiece' import { BucketAdLibAction } from '@sofie-automation/corelib/dist/dataModel/BucketAdLibAction' -import { logger } from '../../logging' -import { createShowStyleCompound } from '../../showStyles' -import { isAdlibAction } from './util' -import { WrappedShowStyleBlueprint } from '../../blueprints/cache' +import { logger } from '../../logging.js' +import { createShowStyleCompound } from '../../showStyles.js' +import { isAdlibAction } from './util.js' +import { WrappedShowStyleBlueprint } from '../../blueprints/cache.js' import { ReadonlyDeep } from 'type-fest' import { BucketId, ShowStyleBaseId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { ExpectedPackageDBType } from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages' @@ -195,7 +189,6 @@ async function regenerateBucketItemFromIngestInfo( ps.push( context.directCollections.BucketAdLibActions.replace(action), - updateExpectedMediaItemForBucketAdLibAction(context, action), updateExpectedPackagesForBucketAdLibAction(context, action) ) @@ -216,7 +209,6 @@ async function regenerateBucketItemFromIngestInfo( ps.push( context.directCollections.BucketAdLibPieces.replace(adlib), - updateExpectedMediaItemForBucketAdLibPiece(context, adlib), updateExpectedPackagesForBucketAdLibPiece(context, adlib) ) @@ -237,7 +229,6 @@ async function regenerateBucketItemFromIngestInfo( const adlibIdsToRemoveArray = Array.from(adlibIdsToRemove) ps.push( - cleanUpExpectedMediaItemForBucketAdLibPiece(context, adlibIdsToRemoveArray), cleanUpExpectedPackagesForBucketAdLibs(context, adlibIdsToRemoveArray), context.directCollections.BucketAdLibPieces.remove({ _id: { $in: adlibIdsToRemoveArray } }) ) @@ -246,7 +237,6 @@ async function regenerateBucketItemFromIngestInfo( const actionIdsToRemoveArray = Array.from(actionIdsToRemove) ps.push( - cleanUpExpectedMediaItemForBucketAdLibActions(context, actionIdsToRemoveArray), cleanUpExpectedPackagesForBucketAdLibsActions(context, actionIdsToRemoveArray), context.directCollections.BucketAdLibActions.remove({ _id: { $in: actionIdsToRemoveArray } }) ) diff --git a/packages/job-worker/src/ingest/commit.ts b/packages/job-worker/src/ingest/commit.ts index 4bd34ad3dd..8ea4d4680f 100644 --- a/packages/job-worker/src/ingest/commit.ts +++ b/packages/job-worker/src/ingest/commit.ts @@ -7,41 +7,41 @@ import { } from '@sofie-automation/corelib/dist/dataModel/Ids' import { DBRundown, RundownOrphanedReason } from '@sofie-automation/corelib/dist/dataModel/Rundown' import { unprotectString, protectString } from '@sofie-automation/corelib/dist/protectedString' -import { logger } from '../logging' -import { PlayoutModel } from '../playout/model/PlayoutModel' -import { PlayoutRundownModel } from '../playout/model/PlayoutRundownModel' -import { allowedToMoveRundownOutOfPlaylist } from '../rundown' -import { updatePartInstanceRanksAndOrphanedState } from '../updatePartInstanceRanksAndOrphanedState' +import { logger } from '../logging.js' +import { PlayoutModel } from '../playout/model/PlayoutModel.js' +import { PlayoutRundownModel } from '../playout/model/PlayoutRundownModel.js' +import { allowedToMoveRundownOutOfPlaylist } from '../rundown.js' +import { updatePartInstanceRanksAndOrphanedState } from '../updatePartInstanceRanksAndOrphanedState.js' import { getPlaylistIdFromExternalId, produceRundownPlaylistInfoFromRundown, removePlaylistFromDb, removeRundownFromDb, -} from '../rundownPlaylists' +} from '../rundownPlaylists.js' import { ReadonlyDeep } from 'type-fest' -import { IngestModel, IngestModelReadonly } from './model/IngestModel' -import { JobContext } from '../jobs' +import { IngestModel, IngestModelReadonly } from './model/IngestModel.js' +import { JobContext } from '../jobs/index.js' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' -import { runJobWithPlaylistLock, runWithPlayoutModel } from '../playout/lock' -import { CommitIngestData } from './lock' +import { runJobWithPlaylistLock, runWithPlayoutModel } from '../playout/lock.js' +import { CommitIngestData } from './lock.js' import { clone, groupByToMapFunc } from '@sofie-automation/corelib/dist/lib' -import { PlaylistLock } from '../jobs/lock' -import { syncChangesToPartInstances } from './syncChangesToPartInstance' -import { ensureNextPartIsValid } from './updateNext' +import { PlaylistLock } from '../jobs/lock.js' +import { syncChangesToPartInstances } from './syncChangesToPartInstance.js' +import { ensureNextPartIsValid } from './updateNext.js' import { StudioJobs } from '@sofie-automation/corelib/dist/worker/studio' -import { getTranslatedMessage, ServerTranslatedMesssages } from '../notes' -import _ = require('underscore') +import { getTranslatedMessage, ServerTranslatedMesssages } from '../notes.js' +import _ from 'underscore' import { EventsJobs } from '@sofie-automation/corelib/dist/worker/events' import { NoteSeverity } from '@sofie-automation/blueprints-integration' import { DBSegment, SegmentOrphanedReason } from '@sofie-automation/corelib/dist/dataModel/Segment' import { UserError, UserErrorMessage } from '@sofie-automation/corelib/dist/error' -import { PlayoutRundownModelImpl } from '../playout/model/implementation/PlayoutRundownModelImpl' -import { PlayoutSegmentModelImpl } from '../playout/model/implementation/PlayoutSegmentModelImpl' -import { createPlayoutModelFromIngestModel } from '../playout/model/implementation/LoadPlayoutModel' +import { PlayoutRundownModelImpl } from '../playout/model/implementation/PlayoutRundownModelImpl.js' +import { PlayoutSegmentModelImpl } from '../playout/model/implementation/PlayoutSegmentModelImpl.js' +import { createPlayoutModelFromIngestModel } from '../playout/model/implementation/LoadPlayoutModel.js' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' -import { DatabasePersistedModel } from '../modelBase' -import { updateSegmentIdsForAdlibbedPartInstances } from './commit/updateSegmentIdsForAdlibbedPartInstances' +import { DatabasePersistedModel } from '../modelBase.js' +import { updateSegmentIdsForAdlibbedPartInstances } from './commit/updateSegmentIdsForAdlibbedPartInstances.js' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' import { AnyBulkWriteOperation } from 'mongodb' @@ -81,7 +81,7 @@ export async function CommitIngestOperation( ? { id: beforeRundown.playlistId, externalId: null, // The id on the Rundown is not correct - } + } : undefined) ?? { id: getPlaylistIdFromExternalId(context.studioId, rundown.playlistExternalId ?? unprotectString(rundown._id)), externalId: rundown.playlistExternalId ?? unprotectString(rundown._id), @@ -656,7 +656,7 @@ async function getSelectedPartInstances( rundownId: { $in: rundownIds }, _id: { $in: ids }, reset: { $ne: true }, - }) + }) : [] const currentPartInstance = instances.find((inst) => inst._id === playlist.currentPartInfo?.partInstanceId) @@ -698,7 +698,7 @@ export async function removeRundownFromPlaylistAndUpdatePlaylist( ...(updatePlaylistIdIsSetInSofieTo !== undefined ? { playlistIdIsSetInSofie: updatePlaylistIdIsSetInSofieTo, - } + } : {}), }, }) diff --git a/packages/job-worker/src/ingest/commit/__tests__/updateSegmentIdsForAdlibbedPartInstances.test.ts b/packages/job-worker/src/ingest/commit/__tests__/updateSegmentIdsForAdlibbedPartInstances.test.ts index 27c2cda299..9168725d40 100644 --- a/packages/job-worker/src/ingest/commit/__tests__/updateSegmentIdsForAdlibbedPartInstances.test.ts +++ b/packages/job-worker/src/ingest/commit/__tests__/updateSegmentIdsForAdlibbedPartInstances.test.ts @@ -1,20 +1,19 @@ /* eslint-disable @typescript-eslint/unbound-method */ -import { updateSegmentIdsForAdlibbedPartInstances } from '../updateSegmentIdsForAdlibbedPartInstances' -import { BeforePartMapItem } from '../../commit' +import { updateSegmentIdsForAdlibbedPartInstances } from '../updateSegmentIdsForAdlibbedPartInstances.js' +import { BeforePartMapItem } from '../../commit.js' import { PartId, RundownId, SegmentId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { protectString } from '@sofie-automation/corelib/dist/protectedString' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment' -// eslint-disable-next-line node/no-extraneous-import import { mock } from 'jest-mock-extended' -import { ICollection } from '../../../db' -import { JobContext } from '../../../jobs' +import { ICollection } from '../../../db/index.js' +import { JobContext } from '../../../jobs/index.js' import { clone, literal } from '@sofie-automation/corelib/dist/lib' import { PartialDeep } from 'type-fest' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' -import { IngestModel } from '../../model/IngestModel' -import { IngestPartModel } from '../../model/IngestPartModel' -import _ = require('underscore') +import { IngestModel } from '../../model/IngestModel.js' +import { IngestPartModel } from '../../model/IngestPartModel.js' +import _ from 'underscore' import { AnyBulkWriteOperation } from 'mongodb' const mockOptions = { diff --git a/packages/job-worker/src/ingest/commit/updateSegmentIdsForAdlibbedPartInstances.ts b/packages/job-worker/src/ingest/commit/updateSegmentIdsForAdlibbedPartInstances.ts index 1795d79fa0..bfd03c6363 100644 --- a/packages/job-worker/src/ingest/commit/updateSegmentIdsForAdlibbedPartInstances.ts +++ b/packages/job-worker/src/ingest/commit/updateSegmentIdsForAdlibbedPartInstances.ts @@ -1,9 +1,9 @@ import { SegmentId, PartInstanceId, RundownId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { JobContext } from '../../jobs' +import { JobContext } from '../../jobs/index.js' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' -import { BeforeIngestOperationPartMap } from '../commit' -import { IngestModelReadonly } from '../model/IngestModel' +import { BeforeIngestOperationPartMap } from '../commit.js' +import { IngestModelReadonly } from '../model/IngestModel.js' async function fetchOrphanedPartInstancesInRundown(context: JobContext, rundownId: RundownId) { const orphanedPartInstances = (await context.directCollections.PartInstances.findFetch( diff --git a/packages/job-worker/src/ingest/createAdlibTestingRundown.ts b/packages/job-worker/src/ingest/createAdlibTestingRundown.ts index a01978f778..9337cec136 100644 --- a/packages/job-worker/src/ingest/createAdlibTestingRundown.ts +++ b/packages/job-worker/src/ingest/createAdlibTestingRundown.ts @@ -3,22 +3,22 @@ import type { CreateAdlibTestingRundownForShowStyleVariantProps, IngestUpdateRundownProps, } from '@sofie-automation/corelib/dist/worker/ingest' -import type { JobContext } from '../jobs' -import { convertShowStyleVariantToBlueprints } from '../blueprints/context/lib' -import { ShowStyleUserContext } from '../blueprints/context' -import { WatchedPackagesHelper } from '../blueprints/context/watchedPackages' +import type { JobContext } from '../jobs/index.js' +import { convertShowStyleVariantToBlueprints } from '../blueprints/context/lib.js' +import { ShowStyleUserContext } from '../blueprints/context/index.js' +import { WatchedPackagesHelper } from '../blueprints/context/watchedPackages.js' import type { IShowStyleUserContext, IBlueprintShowStyleVariant, IngestRundown, } from '@sofie-automation/blueprints-integration' -import { logger } from '../logging' -import { NotificationsModelHelper } from '../notifications/NotificationsModelHelper' +import { logger } from '../logging.js' +import { NotificationsModelHelper } from '../notifications/NotificationsModelHelper.js' import { unprotectString } from '@sofie-automation/corelib/dist/protectedString' -import { convertNoteToNotification } from '../notifications/util' +import { convertNoteToNotification } from '../notifications/util.js' import { RundownId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { handleUpdatedRundown } from './ingestRundownJobs' -import { runIngestUpdateOperation } from './runOperation' +import { handleUpdatedRundown } from './ingestRundownJobs.js' +import { runIngestUpdateOperation } from './runOperation.js' export async function handleCreateAdlibTestingRundownForShowStyleVariant( context: JobContext, diff --git a/packages/job-worker/src/ingest/expectedMediaItems.ts b/packages/job-worker/src/ingest/expectedMediaItems.ts deleted file mode 100644 index f694ab3bc7..0000000000 --- a/packages/job-worker/src/ingest/expectedMediaItems.ts +++ /dev/null @@ -1,279 +0,0 @@ -import { - ExpectedMediaItemBase, - ExpectedMediaItemBucketAction, - ExpectedMediaItemBucketPiece, - ExpectedMediaItemRundown, -} from '@sofie-automation/corelib/dist/dataModel/ExpectedMediaItem' -import { - AdLibActionId, - ExpectedMediaItemId, - PieceId, - RundownId, - StudioId, -} from '@sofie-automation/corelib/dist/dataModel/Ids' -import { ProtectedString, protectString } from '@sofie-automation/corelib/dist/protectedString' -import { getHash, Subtract } from '@sofie-automation/corelib/dist/lib' -import { - IBlueprintActionManifestDisplayContent, - SomeContent, - VTContent, -} from '@sofie-automation/blueprints-integration' -import { getCurrentTime } from '../lib' -import { AdLibAction } from '@sofie-automation/corelib/dist/dataModel/AdlibAction' -import { AdLibPiece } from '@sofie-automation/corelib/dist/dataModel/AdLibPiece' -import { Piece } from '@sofie-automation/corelib/dist/dataModel/Piece' -import { IngestModel } from './model/IngestModel' -import { JobContext } from '../jobs' -import { logger } from '../logging' -import { saveIntoDb } from '../db/changes' -import { BucketAdLibAction } from '@sofie-automation/corelib/dist/dataModel/BucketAdLibAction' -import { BucketAdLib } from '@sofie-automation/corelib/dist/dataModel/BucketAdLibPiece' -import { interpollateTranslation, translateMessage } from '@sofie-automation/corelib/dist/TranslatableMessage' -import { RundownBaselineAdLibAction } from '@sofie-automation/corelib/dist/dataModel/RundownBaselineAdLibAction' -import { ReadonlyDeep } from 'type-fest' -import { IngestPartModel } from './model/IngestPartModel' - -export enum PieceType { - PIECE = 'piece', - ADLIB = 'adlib', - ACTION = 'action', -} - -function generateExpectedMediaItems( - sourceId: ProtectedString, - commonProps: Subtract, - studioId: StudioId, - label: string, - content: Partial | undefined, - pieceType: string -): T[] { - const result: T[] = [] - - const pieceContent = content as Partial | undefined - if (pieceContent && pieceContent.fileName && pieceContent.path && pieceContent.mediaFlowIds) { - for (const flow of pieceContent.mediaFlowIds) { - const id = protectString( - getHash(pieceType + '_' + sourceId + '_' + JSON.stringify(commonProps) + '_' + flow) - ) - const baseObj: ExpectedMediaItemBase = { - _id: id, - studioId: studioId, - label: label, - disabled: false, - lastSeen: getCurrentTime(), - mediaFlowId: flow, - path: pieceContent.fileName, - url: pieceContent.path, - } - result.push({ - ...commonProps, - ...baseObj, - } as T) - } - } - - return result -} - -function generateExpectedMediaItemsFull( - studioId: StudioId, - rundownId: RundownId, - pieces: readonly ReadonlyDeep[], - adlibs: readonly ReadonlyDeep[], - actions: readonly (ReadonlyDeep | ReadonlyDeep)[] -): ExpectedMediaItemRundown[] { - const eMIs: ExpectedMediaItemRundown[] = [] - - pieces.forEach((doc) => - eMIs.push( - ...generateExpectedMediaItems( - doc._id, - { - partId: doc.startPartId, - rundownId: doc.startRundownId, - }, - studioId, - doc.name, - doc.content, - PieceType.PIECE - ) - ) - ) - adlibs.forEach((doc) => - eMIs.push( - ...generateExpectedMediaItems( - doc._id, - { - partId: doc.partId, - rundownId: rundownId, - }, - studioId, - doc.name, - doc.content, - PieceType.ADLIB - ) - ) - ) - actions.forEach((doc) => - eMIs.push( - ...generateExpectedMediaItems( - doc._id, - { - partId: doc.partId, - rundownId: rundownId, - }, - studioId, - translateMessage(doc.display.label, interpollateTranslation), - (doc.display as IBlueprintActionManifestDisplayContent | undefined)?.content, - PieceType.ACTION - ) - ) - ) - - return eMIs -} - -/** - * Remove any ExpectedMediaItems belonging to the provided Bucket adlib ids - * @param context Context for the job - * @param adLibIds Ids to remove documents matchig - */ -export async function cleanUpExpectedMediaItemForBucketAdLibPiece( - context: JobContext, - adLibIds: PieceId[] -): Promise { - if (adLibIds.length > 0) { - const removedItems = await context.directCollections.ExpectedMediaItems.remove({ - bucketAdLibPieceId: { - $in: adLibIds, - }, - }) - - logger.info(`Removed ${removedItems} expected media items for deleted bucket adLib items`) - } -} - -/** - * Remove any ExpectedMediaItems belonging to the provided Bucket action ids - * @param context Context for the job - * @param actionIds Ids to remove documents matchig - */ -export async function cleanUpExpectedMediaItemForBucketAdLibActions( - context: JobContext, - actionIds: AdLibActionId[] -): Promise { - if (actionIds.length > 0) { - const removedItems = await context.directCollections.ExpectedMediaItems.remove({ - bucketAdLibActionId: { - $in: actionIds, - }, - }) - - logger.info(`Removed ${removedItems} expected media items for deleted bucket adLib actions`) - } -} - -/** - * Regenerate the ExpectedMediaItems belonging to a BucketAdLib - * Writes result directly to database - * @param context Context for the Job - * @param piece BucketAdLib to regenerate for - */ -export async function updateExpectedMediaItemForBucketAdLibPiece( - context: JobContext, - piece: BucketAdLib -): Promise { - const result = generateExpectedMediaItems( - piece._id, - { - bucketId: piece.bucketId, - bucketAdLibPieceId: piece._id, - }, - piece.studioId, - piece.name, - piece.content, - PieceType.ADLIB - ) - - await saveIntoDb( - context, - context.directCollections.ExpectedMediaItems, - { - bucketAdLibPieceId: piece._id, - }, - result - ) -} - -/** - * Regenerate the ExpectedMediaItems belonging to a BucketAdLibAction - * Writes result directly to database - * @param context Context for the Job - * @param action BucketAdLibAction to regenerate for - */ -export async function updateExpectedMediaItemForBucketAdLibAction( - context: JobContext, - action: BucketAdLibAction -): Promise { - const result = generateExpectedMediaItems( - action._id, - { - bucketId: action.bucketId, - bucketAdLibActionId: action._id, - }, - action.studioId, - translateMessage(action.display.label, interpollateTranslation), - (action.display as IBlueprintActionManifestDisplayContent | undefined)?.content, - PieceType.ADLIB - ) - - await saveIntoDb( - context, - context.directCollections.ExpectedMediaItems, - { - bucketAdLibActionId: action._id, - }, - result - ) -} - -/** - * Regenerate the ExpectedMediaItems belonging to a Rundown - * @param context Context for the Job - * @param ingestModel Model containing the Rundown and resulting ExpectedMediaItems - */ -export async function updateExpectedMediaItemsForRundownBaseline( - context: JobContext, - ingestModel: IngestModel -): Promise { - const [baselineAdlibPieces, baselineAdlibActions] = await Promise.all([ - ingestModel.rundownBaselineAdLibPieces.get(), - ingestModel.rundownBaselineAdLibActions.get(), - ]) - - const expectedMediaItems = generateExpectedMediaItemsFull( - context.studio._id, - ingestModel.rundownId, - [], - baselineAdlibPieces, - baselineAdlibActions - ) - ingestModel.setExpectedMediaItemsForRundownBaseline(expectedMediaItems) -} - -/** - * Regenerate the ExpectedMediaItems belonging to a Part - * @param context Context for the Job - * @param part Model containing the Part and resulting ExpectedMediaItems - */ -export function updateExpectedMediaItemsForPartModel(context: JobContext, part: IngestPartModel): void { - const expectedMediaItems = generateExpectedMediaItemsFull( - context.studio._id, - part.part.rundownId, - part.pieces, - part.adLibPieces, - part.adLibActions - ) - - part.setExpectedMediaItems(expectedMediaItems) -} diff --git a/packages/job-worker/src/ingest/expectedPackages.ts b/packages/job-worker/src/ingest/expectedPackages.ts index b94c6498b9..164e602f61 100644 --- a/packages/job-worker/src/ingest/expectedPackages.ts +++ b/packages/job-worker/src/ingest/expectedPackages.ts @@ -30,24 +30,22 @@ import { import { Piece } from '@sofie-automation/corelib/dist/dataModel/Piece' import { RundownBaselineAdLibAction } from '@sofie-automation/corelib/dist/dataModel/RundownBaselineAdLibAction' import { RundownBaselineAdLibItem } from '@sofie-automation/corelib/dist/dataModel/RundownBaselineAdLibPiece' -import { saveIntoDb } from '../db/changes' -import { PlayoutModel } from '../playout/model/PlayoutModel' -import { StudioPlayoutModel } from '../studio/model/StudioPlayoutModel' +import { saveIntoDb } from '../db/changes.js' +import { PlayoutModel } from '../playout/model/PlayoutModel.js' +import { StudioPlayoutModel } from '../studio/model/StudioPlayoutModel.js' import { ReadonlyDeep } from 'type-fest' import { ExpectedPackage, BlueprintResultBaseline } from '@sofie-automation/blueprints-integration' -import { updateExpectedMediaItemsForPartModel, updateExpectedMediaItemsForRundownBaseline } from './expectedMediaItems' import { updateBaselineExpectedPlayoutItemsOnStudio, updateExpectedPlayoutItemsForPartModel, updateExpectedPlayoutItemsForRundownBaseline, -} from './expectedPlayoutItems' -import { JobContext, JobStudio } from '../jobs' -import { ExpectedPackageForIngestModelBaseline, IngestModel } from './model/IngestModel' -import { IngestPartModel } from './model/IngestPartModel' +} from './expectedPlayoutItems.js' +import { JobContext, JobStudio } from '../jobs/index.js' +import { ExpectedPackageForIngestModelBaseline, IngestModel } from './model/IngestModel.js' +import { IngestPartModel } from './model/IngestPartModel.js' import { clone } from '@sofie-automation/corelib/dist/lib' export function updateExpectedPackagesForPartModel(context: JobContext, part: IngestPartModel): void { - updateExpectedMediaItemsForPartModel(context, part) updateExpectedPlayoutItemsForPartModel(context, part) const expectedPackages: ExpectedPackageFromRundown[] = [ @@ -82,7 +80,6 @@ export async function updateExpectedPackagesForRundownBaseline( baseline: BlueprintResultBaseline | undefined, forceBaseline = false ): Promise { - await updateExpectedMediaItemsForRundownBaseline(context, ingestModel) await updateExpectedPlayoutItemsForRundownBaseline(context, ingestModel, baseline) const expectedPackages: ExpectedPackageForIngestModelBaseline[] = [] @@ -336,7 +333,10 @@ export async function updateExpectedPackagesForBucketAdLibAction( await saveIntoDb(context, context.directCollections.ExpectedPackages, { pieceId: action._id }, packages) } -export async function cleanUpExpectedPackagesForBucketAdLibs(context: JobContext, adLibIds: PieceId[]): Promise { +export async function cleanUpExpectedPackagesForBucketAdLibs( + context: JobContext, + adLibIds: BucketAdLibId[] +): Promise { if (adLibIds.length > 0) { await context.directCollections.ExpectedPackages.remove({ pieceId: { @@ -347,7 +347,7 @@ export async function cleanUpExpectedPackagesForBucketAdLibs(context: JobContext } export async function cleanUpExpectedPackagesForBucketAdLibsActions( context: JobContext, - adLibIds: AdLibActionId[] + adLibIds: BucketAdLibActionId[] ): Promise { if (adLibIds.length > 0) { await context.directCollections.ExpectedPackages.remove({ diff --git a/packages/job-worker/src/ingest/expectedPlayoutItems.ts b/packages/job-worker/src/ingest/expectedPlayoutItems.ts index 84d5b11a9f..6451f00b65 100644 --- a/packages/job-worker/src/ingest/expectedPlayoutItems.ts +++ b/packages/job-worker/src/ingest/expectedPlayoutItems.ts @@ -9,13 +9,13 @@ import { Piece } from '@sofie-automation/corelib/dist/dataModel/Piece' import { RundownBaselineAdLibAction } from '@sofie-automation/corelib/dist/dataModel/RundownBaselineAdLibAction' import { clone, getRandomId, literal } from '@sofie-automation/corelib/dist/lib' import { protectString } from '@sofie-automation/corelib/dist/protectedString' -import { PlayoutModel } from '../playout/model/PlayoutModel' -import { StudioPlayoutModel } from '../studio/model/StudioPlayoutModel' +import { PlayoutModel } from '../playout/model/PlayoutModel.js' +import { StudioPlayoutModel } from '../studio/model/StudioPlayoutModel.js' import { BlueprintResultBaseline, ExpectedPlayoutItemGeneric } from '@sofie-automation/blueprints-integration' -import { JobContext } from '../jobs' -import { IngestModel } from './model/IngestModel' +import { JobContext } from '../jobs/index.js' +import { IngestModel } from './model/IngestModel.js' import { ReadonlyDeep } from 'type-fest' -import { IngestPartModel } from './model/IngestPartModel' +import { IngestPartModel } from './model/IngestPartModel.js' function extractExpectedPlayoutItems( studioId: StudioId, diff --git a/packages/job-worker/src/ingest/generationRundown.ts b/packages/job-worker/src/ingest/generationRundown.ts index c327ded88f..fc5641faf2 100644 --- a/packages/job-worker/src/ingest/generationRundown.ts +++ b/packages/job-worker/src/ingest/generationRundown.ts @@ -5,27 +5,27 @@ import { serializePieceTimelineObjectsBlob } from '@sofie-automation/corelib/dis import { DBRundown, RundownSource } from '@sofie-automation/corelib/dist/dataModel/Rundown' import { literal } from '@sofie-automation/corelib/dist/lib' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' -import { WrappedShowStyleBlueprint } from '../blueprints/cache' -import { StudioUserContext, GetRundownContext } from '../blueprints/context' -import { WatchedPackagesHelper } from '../blueprints/context/watchedPackages' +import { WrappedShowStyleBlueprint } from '../blueprints/cache.js' +import { StudioUserContext, GetRundownContext } from '../blueprints/context/index.js' +import { WatchedPackagesHelper } from '../blueprints/context/watchedPackages.js' import { postProcessAdLibPieces, postProcessGlobalAdLibActions, postProcessRundownBaselineItems, -} from '../blueprints/postProcess' -import { logger } from '../logging' -import _ = require('underscore') -import { IngestModel } from './model/IngestModel' -import { extendIngestRundownCore, canRundownBeUpdated } from './lib' -import { JobContext } from '../jobs' -import { CommitIngestData } from './lock' -import { SelectedShowStyleVariant, selectShowStyleVariant } from './selectShowStyleVariant' -import { updateExpectedPackagesForRundownBaseline } from './expectedPackages' +} from '../blueprints/postProcess.js' +import { logger } from '../logging.js' +import _ from 'underscore' +import { IngestModel } from './model/IngestModel.js' +import { extendIngestRundownCore, canRundownBeUpdated } from './lib.js' +import { JobContext } from '../jobs/index.js' +import { CommitIngestData } from './lock.js' +import { SelectedShowStyleVariant, selectShowStyleVariant } from './selectShowStyleVariant.js' +import { updateExpectedPackagesForRundownBaseline } from './expectedPackages.js' import { ReadonlyDeep } from 'type-fest' import { BlueprintResultRundown, ExtendedIngestRundown } from '@sofie-automation/blueprints-integration' import { wrapTranslatableMessageFromBlueprints } from '@sofie-automation/corelib/dist/TranslatableMessage' -import { convertRundownToBlueprintSegmentRundown, translateUserEditsFromBlueprint } from '../blueprints/context/lib' -import { calculateSegmentsAndRemovalsFromIngestData } from './generationSegment' +import { convertRundownToBlueprintSegmentRundown, translateUserEditsFromBlueprint } from '../blueprints/context/lib.js' +import { calculateSegmentsAndRemovalsFromIngestData } from './generationSegment.js' import { SofieIngestRundownWithSource } from '@sofie-automation/corelib/dist/dataModel/SofieIngestDataCache' export enum GenerateRundownMode { @@ -70,7 +70,7 @@ export async function updateRundownFromIngestData( ingestModel, ingestRundown, regenerateAllContents.allRundownWatchedPackages - ) + ) : undefined logger.info(`Rundown ${ingestModel.rundownId} update complete`) diff --git a/packages/job-worker/src/ingest/generationSegment.ts b/packages/job-worker/src/ingest/generationSegment.ts index 5842047f3c..5b679eebe8 100644 --- a/packages/job-worker/src/ingest/generationSegment.ts +++ b/packages/job-worker/src/ingest/generationSegment.ts @@ -3,14 +3,14 @@ import { SegmentNote, PartNote } from '@sofie-automation/corelib/dist/dataModel/ import { DBSegment, SegmentOrphanedReason } from '@sofie-automation/corelib/dist/dataModel/Segment' import { literal } from '@sofie-automation/corelib/dist/lib' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' -import { RawPartNote, SegmentUserContext } from '../blueprints/context' -import { WatchedPackagesHelper } from '../blueprints/context/watchedPackages' -import { postProcessAdLibActions, postProcessAdLibPieces, postProcessPieces } from '../blueprints/postProcess' -import { logger } from '../logging' -import { IngestModel, IngestModelReadonly, IngestReplaceSegmentType } from './model/IngestModel' -import { getSegmentId, canSegmentBeUpdated } from './lib' -import { JobContext, ProcessedShowStyleCompound } from '../jobs' -import { CommitIngestData } from './lock' +import { RawPartNote, SegmentUserContext } from '../blueprints/context/index.js' +import { WatchedPackagesHelper } from '../blueprints/context/watchedPackages.js' +import { postProcessAdLibActions, postProcessAdLibPieces, postProcessPieces } from '../blueprints/postProcess.js' +import { logger } from '../logging.js' +import { IngestModel, IngestModelReadonly, IngestReplaceSegmentType } from './model/IngestModel.js' +import { getSegmentId, canSegmentBeUpdated } from './lib.js' +import { JobContext, ProcessedShowStyleCompound } from '../jobs/index.js' +import { CommitIngestData } from './lock.js' import { BlueprintResultPart, BlueprintResultSegment, @@ -19,12 +19,12 @@ import { SofieIngestSegment, } from '@sofie-automation/blueprints-integration' import { wrapTranslatableMessageFromBlueprints } from '@sofie-automation/corelib/dist/TranslatableMessage' -import { updateExpectedPackagesForPartModel } from './expectedPackages' -import { IngestReplacePartType, IngestSegmentModel } from './model/IngestSegmentModel' +import { updateExpectedPackagesForPartModel } from './expectedPackages.js' +import { IngestReplacePartType, IngestSegmentModel } from './model/IngestSegmentModel.js' import { ReadonlyDeep } from 'type-fest' import { Rundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' -import { WrappedShowStyleBlueprint } from '../blueprints/cache' -import { translateUserEditPropertiesFromBlueprint, translateUserEditsFromBlueprint } from '../blueprints/context/lib' +import { WrappedShowStyleBlueprint } from '../blueprints/cache.js' +import { translateUserEditPropertiesFromBlueprint, translateUserEditsFromBlueprint } from '../blueprints/context/lib.js' async function getWatchedPackagesHelper( context: JobContext, @@ -376,7 +376,7 @@ function updateModelWithGeneratedPart( message: wrapTranslatableMessageFromBlueprints(blueprintPart.part.invalidReason.message, [ blueprintId, ]), - } + } : undefined, userEditOperations: translateUserEditsFromBlueprint(blueprintPart.part.userEditOperations, [blueprintId]), userEditProperties: translateUserEditPropertiesFromBlueprint(blueprintPart.part.userEditProperties, [ diff --git a/packages/job-worker/src/ingest/ingestPartJobs.ts b/packages/job-worker/src/ingest/ingestPartJobs.ts index 5ed0b148bb..6e0245d208 100644 --- a/packages/job-worker/src/ingest/ingestPartJobs.ts +++ b/packages/job-worker/src/ingest/ingestPartJobs.ts @@ -1,6 +1,6 @@ -import { JobContext } from '../jobs' +import { JobContext } from '../jobs/index.js' import { IngestRemovePartProps, IngestUpdatePartProps } from '@sofie-automation/corelib/dist/worker/ingest' -import { UpdateIngestRundownChange } from './runOperation' +import { UpdateIngestRundownChange } from './runOperation.js' import { IngestChangeType, NrcsIngestPartChangeDetails } from '@sofie-automation/blueprints-integration' import { IngestRundownWithSource } from '@sofie-automation/corelib/dist/dataModel/NrcsIngestDataCache' diff --git a/packages/job-worker/src/ingest/ingestRundownJobs.ts b/packages/job-worker/src/ingest/ingestRundownJobs.ts index dc949929bb..8a43bd172c 100644 --- a/packages/job-worker/src/ingest/ingestRundownJobs.ts +++ b/packages/job-worker/src/ingest/ingestRundownJobs.ts @@ -1,8 +1,8 @@ -import { JobContext } from '../jobs' -import { logger } from '../logging' -import { runWithRundownLock } from './lock' -import { getRundownId } from './lib' -import { removeRundownFromDb } from '../rundownPlaylists' +import { JobContext } from '../jobs/index.js' +import { logger } from '../logging.js' +import { runWithRundownLock } from './lock.js' +import { getRundownId } from './lib.js' +import { removeRundownFromDb } from '../rundownPlaylists.js' import { DBRundown, RundownOrphanedReason } from '@sofie-automation/corelib/dist/dataModel/Rundown' import { IngestRegenerateRundownProps, @@ -12,13 +12,13 @@ import { UserRemoveRundownProps, UserUnsyncRundownProps, } from '@sofie-automation/corelib/dist/worker/ingest' -import { ComputedIngestChangeAction, UpdateIngestRundownChange, UpdateIngestRundownResult } from './runOperation' +import { ComputedIngestChangeAction, UpdateIngestRundownChange, UpdateIngestRundownResult } from './runOperation.js' import { IngestChangeType, IngestRundown, NrcsIngestRundownChangeDetails, } from '@sofie-automation/blueprints-integration' -import { wrapGenericIngestJob } from './jobWrappers' +import { wrapGenericIngestJob } from './jobWrappers.js' import { IngestRundownWithSource } from '@sofie-automation/corelib/dist/dataModel/NrcsIngestDataCache' /** diff --git a/packages/job-worker/src/ingest/ingestSegmentJobs.ts b/packages/job-worker/src/ingest/ingestSegmentJobs.ts index 06ac710f40..c56084320d 100644 --- a/packages/job-worker/src/ingest/ingestSegmentJobs.ts +++ b/packages/job-worker/src/ingest/ingestSegmentJobs.ts @@ -1,6 +1,6 @@ -import { JobContext } from '../jobs' -import { regenerateSegmentsFromIngestData } from './generationSegment' -import { CommitIngestData } from './lock' +import { JobContext } from '../jobs/index.js' +import { regenerateSegmentsFromIngestData } from './generationSegment.js' +import { CommitIngestData } from './lock.js' import { SegmentOrphanedReason } from '@sofie-automation/corelib/dist/dataModel/Segment' import { literal } from '@sofie-automation/corelib/dist/lib' import { @@ -10,13 +10,13 @@ import { IngestUpdateSegmentRanksProps, RemoveOrphanedSegmentsProps, } from '@sofie-automation/corelib/dist/worker/ingest' -import { IngestUpdateOperationFunction, UpdateIngestRundownChange, UpdateIngestRundownResult } from './runOperation' +import { IngestUpdateOperationFunction, UpdateIngestRundownChange, UpdateIngestRundownResult } from './runOperation.js' import { IngestChangeType, NrcsIngestSegmentChangeDetailsEnum, SofieIngestRundown, } from '@sofie-automation/blueprints-integration' -import { IngestModel } from './model/IngestModel' +import { IngestModel } from './model/IngestModel.js' import { IngestRundownWithSource } from '@sofie-automation/corelib/dist/dataModel/NrcsIngestDataCache' /** diff --git a/packages/job-worker/src/ingest/jobWrappers.ts b/packages/job-worker/src/ingest/jobWrappers.ts index c4fbc9024c..f28eec6a61 100644 --- a/packages/job-worker/src/ingest/jobWrappers.ts +++ b/packages/job-worker/src/ingest/jobWrappers.ts @@ -1,13 +1,13 @@ import { IngestPropsBase } from '@sofie-automation/corelib/dist/worker/ingest' -import { JobContext } from '../jobs' +import { JobContext } from '../jobs/index.js' import { IngestUpdateOperationFunction, UpdateIngestRundownResult, runCustomIngestUpdateOperation, runIngestUpdateOperation, -} from './runOperation' -import { CommitIngestData } from './lock' -import { IngestModel } from './model/IngestModel' +} from './runOperation.js' +import { CommitIngestData } from './lock.js' +import { IngestModel } from './model/IngestModel.js' import { IngestRundownWithSource } from '@sofie-automation/corelib/dist/dataModel/NrcsIngestDataCache' import { SofieIngestRundownWithSource } from '@sofie-automation/corelib/dist/dataModel/SofieIngestDataCache' diff --git a/packages/job-worker/src/ingest/lib.ts b/packages/job-worker/src/ingest/lib.ts index af031cce0f..f7e46f9427 100644 --- a/packages/job-worker/src/ingest/lib.ts +++ b/packages/job-worker/src/ingest/lib.ts @@ -3,11 +3,11 @@ import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' import { getHash } from '@sofie-automation/corelib/dist/lib' import { protectString } from '@sofie-automation/corelib/dist/protectedString' import { ReadonlyDeep } from 'type-fest' -import { logger } from '../logging' +import { logger } from '../logging.js' import { ExtendedIngestRundown, SofieIngestRundown } from '@sofie-automation/blueprints-integration' import { SegmentOrphanedReason } from '@sofie-automation/corelib/dist/dataModel/Segment' -import { convertRundownToBlueprints } from '../blueprints/context/lib' -import { IngestSegmentModel } from './model/IngestSegmentModel' +import { convertRundownToBlueprints } from '../blueprints/context/lib.js' +import { IngestSegmentModel } from './model/IngestSegmentModel.js' export function getRundownId(studioId: StudioId, rundownExternalId: string): RundownId { if (!studioId) throw new Error('getRundownId: studio not set!') diff --git a/packages/job-worker/src/ingest/lock.ts b/packages/job-worker/src/ingest/lock.ts index 95ec725ac4..dbee4c3f8e 100644 --- a/packages/job-worker/src/ingest/lock.ts +++ b/packages/job-worker/src/ingest/lock.ts @@ -1,7 +1,7 @@ import { SegmentId, RundownId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { JobContext } from '../jobs' +import { JobContext } from '../jobs/index.js' import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' -import { RundownLock } from '../jobs/lock' +import { RundownLock } from '../jobs/lock.js' /** * The result of the initial stage of an Ingest operation diff --git a/packages/job-worker/src/ingest/model/IngestModel.ts b/packages/job-worker/src/ingest/model/IngestModel.ts index bfd015e210..4919912cf6 100644 --- a/packages/job-worker/src/ingest/model/IngestModel.ts +++ b/packages/job-worker/src/ingest/model/IngestModel.ts @@ -1,4 +1,3 @@ -import { ExpectedMediaItemRundown } from '@sofie-automation/corelib/dist/dataModel/ExpectedMediaItem' import { ExpectedPackageDBFromBaselineAdLibAction, ExpectedPackageDBFromBaselineAdLibPiece, @@ -18,20 +17,20 @@ import { DBRundown, RundownOrphanedReason, RundownSource } from '@sofie-automati import { CoreUserEditingDefinition } from '@sofie-automation/corelib/dist/dataModel/UserEditingDefinitions' import { RundownBaselineAdLibAction } from '@sofie-automation/corelib/dist/dataModel/RundownBaselineAdLibAction' import { RundownBaselineAdLibItem } from '@sofie-automation/corelib/dist/dataModel/RundownBaselineAdLibPiece' -import { LazyInitialiseReadonly } from '../../lib/lazy' -import { RundownLock } from '../../jobs/lock' -import { IngestSegmentModel, IngestSegmentModelReadonly } from './IngestSegmentModel' -import { IngestPartModel, IngestPartModelReadonly } from './IngestPartModel' +import { LazyInitialiseReadonly } from '../../lib/lazy.js' +import { RundownLock } from '../../jobs/lock.js' +import { IngestSegmentModel, IngestSegmentModelReadonly } from './IngestSegmentModel.js' +import { IngestPartModel, IngestPartModelReadonly } from './IngestPartModel.js' import { ReadonlyDeep } from 'type-fest' -import { BaseModel } from '../../modelBase' +import { BaseModel } from '../../modelBase.js' import { Piece, PieceTimelineObjectsBlob } from '@sofie-automation/corelib/dist/dataModel/Piece' import { AdLibPiece } from '@sofie-automation/corelib/dist/dataModel/AdLibPiece' import { RundownNote } from '@sofie-automation/corelib/dist/dataModel/Notes' import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment' -import { ProcessedShowStyleBase, ProcessedShowStyleVariant } from '../../jobs/showStyle' -import { WrappedShowStyleBlueprint } from '../../blueprints/cache' +import { ProcessedShowStyleBase, ProcessedShowStyleVariant } from '../../jobs/showStyle.js' +import { WrappedShowStyleBlueprint } from '../../blueprints/cache.js' import { IBlueprintRundown } from '@sofie-automation/blueprints-integration' -import type { INotificationsModel } from '../../notifications/NotificationsModel' +import type { INotificationsModel } from '../../notifications/NotificationsModel.js' export type ExpectedPackageForIngestModelBaseline = | ExpectedPackageDBFromBaselineAdLibAction @@ -53,11 +52,6 @@ export interface IngestModelReadonly { */ readonly rundownLock: RundownLock - /** - * The ExpectedMediaItems for the baseline of this Rundown - */ - readonly expectedMediaItemsForRundownBaseline: ReadonlyDeep[] - /** * The ExpectedPlayoutItems for the baseline of this Rundown */ @@ -208,12 +202,6 @@ export interface IngestModel extends IngestModelReadonly, BaseModel, INotificati */ setExpectedPlayoutItemsForRundownBaseline(expectedPlayoutItems: ExpectedPlayoutItemRundown[]): void - /** - * Set the ExpectedMediaItems for the baseline of this Rundown - * @param expectedMediaItems The new ExpectedMediaItems - */ - setExpectedMediaItemsForRundownBaseline(expectedMediaItems: ExpectedMediaItemRundown[]): void - /** * Set the ExpectedPackages for the baseline of this Rundown * @param expectedPackages The new ExpectedPackages diff --git a/packages/job-worker/src/ingest/model/IngestPartModel.ts b/packages/job-worker/src/ingest/model/IngestPartModel.ts index 610be862c6..e047d08a94 100644 --- a/packages/job-worker/src/ingest/model/IngestPartModel.ts +++ b/packages/job-worker/src/ingest/model/IngestPartModel.ts @@ -2,7 +2,6 @@ import { ReadonlyDeep } from 'type-fest' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' import { AdLibPiece } from '@sofie-automation/corelib/dist/dataModel/AdLibPiece' import { AdLibAction } from '@sofie-automation/corelib/dist/dataModel/AdlibAction' -import { ExpectedMediaItemRundown } from '@sofie-automation/corelib/dist/dataModel/ExpectedMediaItem' import { ExpectedPackageFromRundown } from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages' import { ExpectedPlayoutItemRundown } from '@sofie-automation/corelib/dist/dataModel/ExpectedPlayoutItem' import { Piece } from '@sofie-automation/corelib/dist/dataModel/Piece' @@ -26,10 +25,6 @@ export interface IngestPartModelReadonly { */ readonly adLibActions: ReadonlyDeep[] - /** - * The ExpectedMediaItems belonging to this Part - */ - readonly expectedMediaItems: ReadonlyDeep[] /** * The ExpectedPlayoutItems belonging to this Part */ @@ -55,12 +50,6 @@ export interface IngestPartModel extends IngestPartModelReadonly { */ setExpectedPlayoutItems(expectedPlayoutItems: ExpectedPlayoutItemRundown[]): void - /** - * Set the ExpectedMediaItems for the contents of this Part - * @param expectedMediaItems The new ExpectedMediaItems - */ - setExpectedMediaItems(expectedMediaItems: ExpectedMediaItemRundown[]): void - /** * Set the ExpectedPackages for the contents of this Part * @param expectedPackages The new ExpectedPackages diff --git a/packages/job-worker/src/ingest/model/IngestSegmentModel.ts b/packages/job-worker/src/ingest/model/IngestSegmentModel.ts index 74010848d0..b740e561e5 100644 --- a/packages/job-worker/src/ingest/model/IngestSegmentModel.ts +++ b/packages/job-worker/src/ingest/model/IngestSegmentModel.ts @@ -1,7 +1,7 @@ import { PartId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { ReadonlyDeep } from 'type-fest' import { DBSegment, SegmentOrphanedReason } from '@sofie-automation/corelib/dist/dataModel/Segment' -import { IngestPartModel, IngestPartModelReadonly } from './IngestPartModel' +import { IngestPartModel, IngestPartModelReadonly } from './IngestPartModel.js' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' import { Piece } from '@sofie-automation/corelib/dist/dataModel/Piece' import { AdLibPiece } from '@sofie-automation/corelib/dist/dataModel/AdLibPiece' diff --git a/packages/job-worker/src/ingest/model/implementation/DocumentChangeTracker.ts b/packages/job-worker/src/ingest/model/implementation/DocumentChangeTracker.ts index 377784191c..c3396f04be 100644 --- a/packages/job-worker/src/ingest/model/implementation/DocumentChangeTracker.ts +++ b/packages/job-worker/src/ingest/model/implementation/DocumentChangeTracker.ts @@ -1,7 +1,7 @@ import { ProtectedString } from '@sofie-automation/corelib/dist/protectedString' import { AnyBulkWriteOperation } from 'mongodb' -import { LazyInitialise } from '../../../lib/lazy' -import { DocumentChanges, getDocumentChanges } from './utils' +import { LazyInitialise } from '../../../lib/lazy.js' +import { DocumentChanges, getDocumentChanges } from './utils.js' export async function generateWriteOpsForLazyDocuments }>( currentDocs: LazyInitialise, diff --git a/packages/job-worker/src/ingest/model/implementation/ExpectedPackagesStore.ts b/packages/job-worker/src/ingest/model/implementation/ExpectedPackagesStore.ts index 695cec75ac..9d79e27b74 100644 --- a/packages/job-worker/src/ingest/model/implementation/ExpectedPackagesStore.ts +++ b/packages/job-worker/src/ingest/model/implementation/ExpectedPackagesStore.ts @@ -1,8 +1,6 @@ -import { ExpectedMediaItemRundown } from '@sofie-automation/corelib/dist/dataModel/ExpectedMediaItem' import { ExpectedPackageDBBase } from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages' import { ExpectedPlayoutItemRundown } from '@sofie-automation/corelib/dist/dataModel/ExpectedPlayoutItem' import { - ExpectedMediaItemId, ExpectedPackageId, ExpectedPlayoutItemId, PartId, @@ -10,7 +8,7 @@ import { SegmentId, } from '@sofie-automation/corelib/dist/dataModel/Ids' import { ReadonlyDeep } from 'type-fest' -import { diffAndReturnLatestObjects, DocumentChanges, getDocumentChanges, setValuesAndTrackChanges } from './utils' +import { diffAndReturnLatestObjects, DocumentChanges, getDocumentChanges, setValuesAndTrackChanges } from './utils.js' function mutateExpectedPackage( oldObj: ExpectedPackageType, @@ -24,17 +22,12 @@ function mutateExpectedPackage { - #expectedMediaItems: ExpectedMediaItemRundown[] #expectedPlayoutItems: ExpectedPlayoutItemRundown[] #expectedPackages: ExpectedPackageType[] - #expectedMediaItemsWithChanges = new Set() #expectedPlayoutItemsWithChanges = new Set() #expectedPackagesWithChanges = new Set() - get expectedMediaItems(): ReadonlyDeep { - return this.#expectedMediaItems - } get expectedPlayoutItems(): ReadonlyDeep { return this.#expectedPlayoutItems } @@ -44,16 +37,9 @@ export class ExpectedPackagesStore 0 || - this.#expectedPlayoutItemsWithChanges.size > 0 || - this.#expectedPackagesWithChanges.size > 0 - ) + return this.#expectedPlayoutItemsWithChanges.size > 0 || this.#expectedPackagesWithChanges.size > 0 } - get expectedMediaItemsChanges(): DocumentChanges { - return getDocumentChanges(this.#expectedMediaItemsWithChanges, this.#expectedMediaItems) - } get expectedPlayoutItemsChanges(): DocumentChanges { return getDocumentChanges(this.#expectedPlayoutItemsWithChanges, this.#expectedPlayoutItems) } @@ -62,7 +48,6 @@ export class ExpectedPackagesStore ({ - ...item, - partId: this.#partId, - rundownId: this.#rundownId, - })) - - this.#expectedMediaItems = diffAndReturnLatestObjects( - this.#expectedMediaItemsWithChanges, - this.#expectedMediaItems, - newExpectedMediaItems - ) - } setExpectedPackages(expectedPackages: ExpectedPackageType[]): void { const newExpectedPackages: ExpectedPackageType[] = expectedPackages.map((pkg) => ({ ...pkg, diff --git a/packages/job-worker/src/ingest/model/implementation/IngestModelImpl.ts b/packages/job-worker/src/ingest/model/implementation/IngestModelImpl.ts index 15f33f777d..59b3681802 100644 --- a/packages/job-worker/src/ingest/model/implementation/IngestModelImpl.ts +++ b/packages/job-worker/src/ingest/model/implementation/IngestModelImpl.ts @@ -1,6 +1,5 @@ import { AdLibAction } from '@sofie-automation/corelib/dist/dataModel/AdlibAction' import { AdLibPiece } from '@sofie-automation/corelib/dist/dataModel/AdLibPiece' -import { ExpectedMediaItemRundown } from '@sofie-automation/corelib/dist/dataModel/ExpectedMediaItem' import { ExpectedPackageDB, ExpectedPackageDBType, @@ -25,13 +24,13 @@ import { RundownBaselineAdLibAction } from '@sofie-automation/corelib/dist/dataM import { RundownBaselineAdLibItem } from '@sofie-automation/corelib/dist/dataModel/RundownBaselineAdLibPiece' import { RundownBaselineObj } from '@sofie-automation/corelib/dist/dataModel/RundownBaselineObj' import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment' -import { JobContext, ProcessedShowStyleBase, ProcessedShowStyleVariant } from '../../../jobs' -import { LazyInitialise, LazyInitialiseReadonly } from '../../../lib/lazy' -import { getRundownId, getSegmentId } from '../../lib' -import { RundownLock } from '../../../jobs/lock' -import { IngestSegmentModel } from '../IngestSegmentModel' -import { IngestSegmentModelImpl } from './IngestSegmentModelImpl' -import { IngestPartModel } from '../IngestPartModel' +import { JobContext, ProcessedShowStyleBase, ProcessedShowStyleVariant } from '../../../jobs/index.js' +import { LazyInitialise, LazyInitialiseReadonly } from '../../../lib/lazy.js' +import { getRundownId, getSegmentId } from '../../lib.js' +import { RundownLock } from '../../../jobs/lock.js' +import { IngestSegmentModel } from '../IngestSegmentModel.js' +import { IngestSegmentModelImpl } from './IngestSegmentModelImpl.js' +import { IngestPartModel } from '../IngestPartModel.js' import { clone, Complete, @@ -40,28 +39,28 @@ import { groupByToMap, literal, } from '@sofie-automation/corelib/dist/lib' -import { IngestPartModelImpl } from './IngestPartModelImpl' -import { DatabasePersistedModel } from '../../../modelBase' -import { ExpectedPackagesStore } from './ExpectedPackagesStore' +import { IngestPartModelImpl } from './IngestPartModelImpl.js' +import { DatabasePersistedModel } from '../../../modelBase.js' +import { ExpectedPackagesStore } from './ExpectedPackagesStore.js' import { ReadonlyDeep } from 'type-fest' import { ExpectedPackageForIngestModel, ExpectedPackageForIngestModelBaseline, IngestModel, IngestReplaceSegmentType, -} from '../IngestModel' +} from '../IngestModel.js' import { RundownNote } from '@sofie-automation/corelib/dist/dataModel/Notes' -import { diffAndReturnLatestObjects } from './utils' -import _ = require('underscore') +import { diffAndReturnLatestObjects } from './utils.js' +import _ from 'underscore' import { protectString } from '@sofie-automation/corelib/dist/protectedString' import { IBlueprintRundown } from '@sofie-automation/blueprints-integration' -import { getCurrentTime, getSystemVersion } from '../../../lib' -import { WrappedShowStyleBlueprint } from '../../../blueprints/cache' -import { SaveIngestModelHelper } from './SaveIngestModel' -import { generateWriteOpsForLazyDocuments } from './DocumentChangeTracker' -import { IS_PRODUCTION } from '../../../environment' -import { logger } from '../../../logging' -import { NotificationsModelHelper } from '../../../notifications/NotificationsModelHelper' +import { getCurrentTime, getSystemVersion } from '../../../lib/index.js' +import { WrappedShowStyleBlueprint } from '../../../blueprints/cache.js' +import { SaveIngestModelHelper } from './SaveIngestModel.js' +import { generateWriteOpsForLazyDocuments } from './DocumentChangeTracker.js' +import { IS_PRODUCTION } from '../../../environment.js' +import { logger } from '../../../logging.js' +import { NotificationsModelHelper } from '../../../notifications/NotificationsModelHelper.js' export interface IngestModelImplExistingData { rundown: DBRundown @@ -70,7 +69,6 @@ export interface IngestModelImplExistingData { pieces: Piece[] adLibPieces: AdLibPiece[] adLibActions: AdLibAction[] - expectedMediaItems: ExpectedMediaItemRundown[] expectedPlayoutItems: ExpectedPlayoutItemRundown[] expectedPackages: ExpectedPackageDB[] } @@ -143,9 +141,6 @@ export class IngestModelImpl implements IngestModel, DatabasePersistedModel { return this.#rundownBaselineAdLibActions } - get expectedMediaItemsForRundownBaseline(): ReadonlyDeep[] { - return [...this.#rundownBaselineExpectedPackagesStore.expectedMediaItems] - } get expectedPlayoutItemsForRundownBaseline(): ReadonlyDeep[] { return [...this.#rundownBaselineExpectedPackagesStore.expectedPlayoutItems] } @@ -173,7 +168,6 @@ export class IngestModelImpl implements IngestModel, DatabasePersistedModel { const groupedAdLibPieces = groupByToMap(existingData.adLibPieces, 'partId') const groupedAdLibActions = groupByToMap(existingData.adLibActions, 'partId') - const groupedExpectedMediaItems = groupByToMap(existingData.expectedMediaItems, 'partId') const groupedExpectedPlayoutItems = groupByToMap(existingData.expectedPlayoutItems, 'partId') const rundownExpectedPackages = existingData.expectedPackages.filter( @@ -195,7 +189,6 @@ export class IngestModelImpl implements IngestModel, DatabasePersistedModel { this.rundownId, undefined, undefined, - groupedExpectedMediaItems.get(undefined) ?? [], groupedExpectedPlayoutItems.get(undefined) ?? [], baselineExpectedPackages ) @@ -213,7 +206,6 @@ export class IngestModelImpl implements IngestModel, DatabasePersistedModel { groupedPieces.get(part._id) ?? [], groupedAdLibPieces.get(part._id) ?? [], groupedAdLibActions.get(part._id) ?? [], - groupedExpectedMediaItems.get(part._id) ?? [], groupedExpectedPlayoutItems.get(part._id) ?? [], groupedExpectedPackages.get(part._id) ?? [] ) @@ -248,7 +240,6 @@ export class IngestModelImpl implements IngestModel, DatabasePersistedModel { undefined, undefined, [], - [], [] ) @@ -413,9 +404,6 @@ export class IngestModelImpl implements IngestModel, DatabasePersistedModel { setExpectedPlayoutItemsForRundownBaseline(expectedPlayoutItems: ExpectedPlayoutItemRundown[]): void { this.#rundownBaselineExpectedPackagesStore.setExpectedPlayoutItems(expectedPlayoutItems) } - setExpectedMediaItemsForRundownBaseline(expectedMediaItems: ExpectedMediaItemRundown[]): void { - this.#rundownBaselineExpectedPackagesStore.setExpectedMediaItems(expectedMediaItems) - } setExpectedPackagesForRundownBaseline(expectedPackages: ExpectedPackageForIngestModelBaseline[]): void { // Future: should these be here, or held as part of each adlib? this.#rundownBaselineExpectedPackagesStore.setExpectedPackages(expectedPackages) diff --git a/packages/job-worker/src/ingest/model/implementation/IngestPartModelImpl.ts b/packages/job-worker/src/ingest/model/implementation/IngestPartModelImpl.ts index a830b34cb4..b5b3c1e7c9 100644 --- a/packages/job-worker/src/ingest/model/implementation/IngestPartModelImpl.ts +++ b/packages/job-worker/src/ingest/model/implementation/IngestPartModelImpl.ts @@ -1,22 +1,21 @@ import { ReadonlyDeep } from 'type-fest' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' -import _ = require('underscore') -import { IngestPartModel } from '../IngestPartModel' +import _ from 'underscore' +import { IngestPartModel } from '../IngestPartModel.js' import { AdLibActionId, PieceId, RundownId, SegmentId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { AdLibPiece } from '@sofie-automation/corelib/dist/dataModel/AdLibPiece' import { AdLibAction } from '@sofie-automation/corelib/dist/dataModel/AdlibAction' -import { ExpectedMediaItemRundown } from '@sofie-automation/corelib/dist/dataModel/ExpectedMediaItem' import { ExpectedPlayoutItemRundown } from '@sofie-automation/corelib/dist/dataModel/ExpectedPlayoutItem' import { ExpectedPackageFromRundown } from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages' import { Piece } from '@sofie-automation/corelib/dist/dataModel/Piece' -import { ExpectedPackagesStore } from './ExpectedPackagesStore' +import { ExpectedPackagesStore } from './ExpectedPackagesStore.js' import { addManyToSet, diffAndReturnLatestObjects, DocumentChanges, getDocumentChanges, setValuesAndTrackChanges, -} from './utils' +} from './utils.js' export class IngestPartModelImpl implements IngestPartModel { readonly partImpl: DBPart @@ -84,9 +83,6 @@ export class IngestPartModelImpl implements IngestPartModel { return [...this.#adLibActions] } - get expectedMediaItems(): ReadonlyDeep[] { - return [...this.expectedPackagesStore.expectedMediaItems] - } get expectedPlayoutItems(): ReadonlyDeep[] { return [...this.expectedPackagesStore.expectedPlayoutItems] } @@ -138,7 +134,6 @@ export class IngestPartModelImpl implements IngestPartModel { pieces: Piece[], adLibPieces: AdLibPiece[], adLibActions: AdLibAction[], - expectedMediaItems: ExpectedMediaItemRundown[], expectedPlayoutItems: ExpectedPlayoutItemRundown[], expectedPackages: ExpectedPackageFromRundown[] ) { @@ -166,7 +161,6 @@ export class IngestPartModelImpl implements IngestPartModel { part.rundownId, part.segmentId, part._id, - expectedMediaItems, expectedPlayoutItems, expectedPackages ) @@ -231,9 +225,6 @@ export class IngestPartModelImpl implements IngestPartModel { setExpectedPlayoutItems(expectedPlayoutItems: ExpectedPlayoutItemRundown[]): void { this.expectedPackagesStore.setExpectedPlayoutItems(expectedPlayoutItems) } - setExpectedMediaItems(expectedMediaItems: ExpectedMediaItemRundown[]): void { - this.expectedPackagesStore.setExpectedMediaItems(expectedMediaItems) - } setExpectedPackages(expectedPackages: ExpectedPackageFromRundown[]): void { // Future: should these be here, or held as part of each adlib/piece? this.expectedPackagesStore.setExpectedPackages(expectedPackages) diff --git a/packages/job-worker/src/ingest/model/implementation/IngestSegmentModelImpl.ts b/packages/job-worker/src/ingest/model/implementation/IngestSegmentModelImpl.ts index aae742db65..5a965abf46 100644 --- a/packages/job-worker/src/ingest/model/implementation/IngestSegmentModelImpl.ts +++ b/packages/job-worker/src/ingest/model/implementation/IngestSegmentModelImpl.ts @@ -1,17 +1,17 @@ import { PartId, SegmentId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { ReadonlyDeep } from 'type-fest' import { DBSegment, SegmentOrphanedReason } from '@sofie-automation/corelib/dist/dataModel/Segment' -import { IngestReplacePartType, IngestSegmentModel } from '../IngestSegmentModel' -import _ = require('underscore') -import { IngestPartModelImpl } from './IngestPartModelImpl' -import { IngestPartModel } from '../IngestPartModel' +import { IngestReplacePartType, IngestSegmentModel } from '../IngestSegmentModel.js' +import _ from 'underscore' +import { IngestPartModelImpl } from './IngestPartModelImpl.js' +import { IngestPartModel } from '../IngestPartModel.js' import { AdLibAction } from '@sofie-automation/corelib/dist/dataModel/AdlibAction' import { AdLibPiece } from '@sofie-automation/corelib/dist/dataModel/AdLibPiece' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' import { Piece } from '@sofie-automation/corelib/dist/dataModel/Piece' import { calculatePartExpectedDurationWithTransition } from '@sofie-automation/corelib/dist/playout/timings' import { clone } from '@sofie-automation/corelib/dist/lib' -import { getPartId } from '../../lib' +import { getPartId } from '../../lib.js' /** * A light wrapper around the IngestPartModel, so that we can track the deletions while still accessing the contents @@ -231,7 +231,6 @@ export class IngestSegmentModelImpl implements IngestSegmentModel { clone(adLibPiece), clone(adLibActions), [], - [], [] ) partModel.setOwnerIds(this.segment.rundownId, this.segment._id) diff --git a/packages/job-worker/src/ingest/model/implementation/LoadIngestModel.ts b/packages/job-worker/src/ingest/model/implementation/LoadIngestModel.ts index 6ce4bced6f..628a1ce24c 100644 --- a/packages/job-worker/src/ingest/model/implementation/LoadIngestModel.ts +++ b/packages/job-worker/src/ingest/model/implementation/LoadIngestModel.ts @@ -1,16 +1,15 @@ import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' import { unprotectString } from '@sofie-automation/corelib/dist/protectedString' -import { JobContext } from '../../../jobs' +import { JobContext } from '../../../jobs/index.js' import { ReadonlyDeep } from 'type-fest' -import { RundownLock } from '../../../jobs/lock' -import { IngestModel } from '../IngestModel' -import { DatabasePersistedModel } from '../../../modelBase' -import { getRundownId } from '../../lib' -import { ExpectedMediaItemRundown } from '@sofie-automation/corelib/dist/dataModel/ExpectedMediaItem' +import { RundownLock } from '../../../jobs/lock.js' +import { IngestModel } from '../IngestModel.js' +import { DatabasePersistedModel } from '../../../modelBase.js' +import { getRundownId } from '../../lib.js' import { ExpectedPlayoutItemRundown } from '@sofie-automation/corelib/dist/dataModel/ExpectedPlayoutItem' import { RundownId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { SegmentOrphanedReason } from '@sofie-automation/corelib/dist/dataModel/Segment' -import { IngestModelImpl, IngestModelImplExistingData } from './IngestModelImpl' +import { IngestModelImpl, IngestModelImplExistingData } from './IngestModelImpl.js' import { clone } from '@sofie-automation/corelib/dist/lib' /** @@ -87,44 +86,33 @@ async function loadExistingRundownData( context: JobContext, rundownId: RundownId ): Promise> { - const [ - segments, - parts, - pieces, - adLibPieces, - adLibActions, - expectedMediaItems, - expectedPlayoutItems, - expectedPackages, - ] = await Promise.all([ - context.directCollections.Segments.findFetch({ - rundownId: rundownId, - orphaned: { $ne: SegmentOrphanedReason.ADLIB_TESTING }, - }), - context.directCollections.Parts.findFetch({ - rundownId: rundownId, - }), - context.directCollections.Pieces.findFetch({ - startRundownId: rundownId, - }), - - context.directCollections.AdLibPieces.findFetch({ - rundownId: rundownId, - }), - context.directCollections.AdLibActions.findFetch({ - rundownId: rundownId, - }), - - context.directCollections.ExpectedMediaItems.findFetch({ - rundownId: rundownId, - }) as Promise, - context.directCollections.ExpectedPlayoutItems.findFetch({ - rundownId: rundownId, - }) as Promise, - context.directCollections.ExpectedPackages.findFetch({ - rundownId: rundownId, - }), - ]) + const [segments, parts, pieces, adLibPieces, adLibActions, expectedPlayoutItems, expectedPackages] = + await Promise.all([ + context.directCollections.Segments.findFetch({ + rundownId: rundownId, + orphaned: { $ne: SegmentOrphanedReason.ADLIB_TESTING }, + }), + context.directCollections.Parts.findFetch({ + rundownId: rundownId, + }), + context.directCollections.Pieces.findFetch({ + startRundownId: rundownId, + }), + + context.directCollections.AdLibPieces.findFetch({ + rundownId: rundownId, + }), + context.directCollections.AdLibActions.findFetch({ + rundownId: rundownId, + }), + + context.directCollections.ExpectedPlayoutItems.findFetch({ + rundownId: rundownId, + }) as Promise, + context.directCollections.ExpectedPackages.findFetch({ + rundownId: rundownId, + }), + ]) return { segments, @@ -133,7 +121,6 @@ async function loadExistingRundownData( adLibPieces, adLibActions, - expectedMediaItems, expectedPlayoutItems, expectedPackages, } diff --git a/packages/job-worker/src/ingest/model/implementation/SaveIngestModel.ts b/packages/job-worker/src/ingest/model/implementation/SaveIngestModel.ts index 63dbd7fd7f..b3d8a391cc 100644 --- a/packages/job-worker/src/ingest/model/implementation/SaveIngestModel.ts +++ b/packages/job-worker/src/ingest/model/implementation/SaveIngestModel.ts @@ -1,23 +1,21 @@ import { AdLibAction } from '@sofie-automation/corelib/dist/dataModel/AdlibAction' import { AdLibPiece } from '@sofie-automation/corelib/dist/dataModel/AdLibPiece' -import { ExpectedMediaItem } from '@sofie-automation/corelib/dist/dataModel/ExpectedMediaItem' import { ExpectedPackageDB } from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages' import { ExpectedPlayoutItem } from '@sofie-automation/corelib/dist/dataModel/ExpectedPlayoutItem' import { RundownId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' import { Piece } from '@sofie-automation/corelib/dist/dataModel/Piece' import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment' -import { JobContext } from '../../../jobs' -import { ExpectedPackagesStore } from './ExpectedPackagesStore' -import { IngestSegmentModelImpl } from './IngestSegmentModelImpl' -import { DocumentChangeTracker } from './DocumentChangeTracker' -import { logger } from '../../../logging' +import { JobContext } from '../../../jobs/index.js' +import { ExpectedPackagesStore } from './ExpectedPackagesStore.js' +import { IngestSegmentModelImpl } from './IngestSegmentModelImpl.js' +import { DocumentChangeTracker } from './DocumentChangeTracker.js' +import { logger } from '../../../logging.js' import { ProtectedString } from '@sofie-automation/corelib/dist/protectedString' export class SaveIngestModelHelper { #expectedPackages = new DocumentChangeTracker() #expectedPlayoutItems = new DocumentChangeTracker() - #expectedMediaItems = new DocumentChangeTracker() #segments = new DocumentChangeTracker() #parts = new DocumentChangeTracker() @@ -31,7 +29,6 @@ export class SaveIngestModelHelper { ): void { this.#expectedPackages.addChanges(store.expectedPackagesChanges, deleteAll ?? false) this.#expectedPlayoutItems.addChanges(store.expectedPlayoutItemsChanges, deleteAll ?? false) - this.#expectedMediaItems.addChanges(store.expectedMediaItemsChanges, deleteAll ?? false) } addSegment(segment: IngestSegmentModelImpl, segmentIsDeleted: boolean): void { if (segmentIsDeleted) { @@ -61,7 +58,6 @@ export class SaveIngestModelHelper { const deletedIds: { [key: string]: ProtectedString[] } = { expectedPackages: this.#expectedPackages.getDeletedIds(), expectedPlayoutItems: this.#expectedPlayoutItems.getDeletedIds(), - expectedMediaItems: this.#expectedMediaItems.getDeletedIds(), segments: this.#segments.getDeletedIds(), parts: this.#parts.getDeletedIds(), pieces: this.#pieces.getDeletedIds(), @@ -77,7 +73,6 @@ export class SaveIngestModelHelper { return [ context.directCollections.ExpectedPackages.bulkWrite(this.#expectedPackages.generateWriteOps()), context.directCollections.ExpectedPlayoutItems.bulkWrite(this.#expectedPlayoutItems.generateWriteOps()), - context.directCollections.ExpectedMediaItems.bulkWrite(this.#expectedMediaItems.generateWriteOps()), context.directCollections.Segments.bulkWrite(this.#segments.generateWriteOps()), context.directCollections.Parts.bulkWrite(this.#parts.generateWriteOps()), diff --git a/packages/job-worker/src/ingest/model/implementation/__tests__/DocumentChangeTracker.test.ts b/packages/job-worker/src/ingest/model/implementation/__tests__/DocumentChangeTracker.test.ts index cdc84b9ed5..4052387bac 100644 --- a/packages/job-worker/src/ingest/model/implementation/__tests__/DocumentChangeTracker.test.ts +++ b/packages/job-worker/src/ingest/model/implementation/__tests__/DocumentChangeTracker.test.ts @@ -1,8 +1,8 @@ import { literal } from '@sofie-automation/corelib/dist/lib' import { ProtectedString, protectString } from '@sofie-automation/corelib/dist/protectedString' import { AnyBulkWriteOperation } from 'mongodb' -import { DocumentChangeTracker } from '../DocumentChangeTracker' -import { DocumentChanges } from '../utils' +import { DocumentChangeTracker } from '../DocumentChangeTracker.js' +import { DocumentChanges } from '../utils.js' interface Doc { _id: ProtectedString diff --git a/packages/job-worker/src/ingest/model/implementation/__tests__/getDocumentChanges.test.ts b/packages/job-worker/src/ingest/model/implementation/__tests__/getDocumentChanges.test.ts index 312c174962..23710328cd 100644 --- a/packages/job-worker/src/ingest/model/implementation/__tests__/getDocumentChanges.test.ts +++ b/packages/job-worker/src/ingest/model/implementation/__tests__/getDocumentChanges.test.ts @@ -1,5 +1,5 @@ import { ProtectedString, protectString } from '@sofie-automation/corelib/dist/protectedString' -import { getDocumentChanges } from '../utils' +import { getDocumentChanges } from '../utils.js' interface Doc { _id: ProtectedString diff --git a/packages/job-worker/src/ingest/model/implementation/utils.ts b/packages/job-worker/src/ingest/model/implementation/utils.ts index ce204b3dff..cec36172f1 100644 --- a/packages/job-worker/src/ingest/model/implementation/utils.ts +++ b/packages/job-worker/src/ingest/model/implementation/utils.ts @@ -1,6 +1,6 @@ import { normalizeArrayToMap } from '@sofie-automation/corelib/dist/lib' import { ProtectedString } from '@sofie-automation/corelib/dist/protectedString' -import _ = require('underscore') +import _ from 'underscore' /** * Perform a diff of a pair of arrays of documents diff --git a/packages/job-worker/src/ingest/mosDevice/__tests__/mosIngest.test.ts b/packages/job-worker/src/ingest/mosDevice/__tests__/mosIngest.test.ts index 9f1907ab44..c89d0ac8a6 100644 --- a/packages/job-worker/src/ingest/mosDevice/__tests__/mosIngest.test.ts +++ b/packages/job-worker/src/ingest/mosDevice/__tests__/mosIngest.test.ts @@ -1,4 +1,4 @@ -import { mockRO } from './mock-mos-data' +import { mockRO } from './mock-mos-data.js' import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment' import { RundownId, SegmentId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' @@ -11,30 +11,30 @@ import { handleMosInsertStories, handleMosMoveStories, handleMosSwapStories, -} from '../mosStoryJobs' -import { handleMosRundownData, handleMosRundownReadyToAir, handleMosRundownStatus } from '../mosRundownJobs' -import { getMosIngestSegmentExternalId, parseMosString } from '../lib' -import { MockJobContext, setupDefaultJobEnvironment } from '../../../__mocks__/context' -import { setupMockIngestDevice, setupMockShowStyleCompound } from '../../../__mocks__/presetCollections' -import { fixSnapshot } from '../../../__mocks__/helpers/snapshot' +} from '../mosStoryJobs.js' +import { handleMosRundownData, handleMosRundownReadyToAir, handleMosRundownStatus } from '../mosRundownJobs.js' +import { getMosIngestSegmentExternalId, parseMosString } from '../lib.js' +import { MockJobContext, setupDefaultJobEnvironment } from '../../../__mocks__/context.js' +import { setupMockIngestDevice, setupMockShowStyleCompound } from '../../../__mocks__/presetCollections.js' +import { fixSnapshot } from '../../../__mocks__/helpers/snapshot.js' import { DBRundown, RundownOrphanedReason, RundownSource } from '@sofie-automation/corelib/dist/dataModel/Rundown' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' -import { MongoQuery } from '../../../db' -import { handleRemovedRundown } from '../../ingestRundownJobs' +import { MongoQuery } from '../../../db/index.js' +import { handleRemovedRundown } from '../../ingestRundownJobs.js' import { MOS } from '@sofie-automation/corelib' import { groupByToMap, literal, normalizeArrayToMap, omit } from '@sofie-automation/corelib/dist/lib' import { NrcsIngestCacheType } from '@sofie-automation/corelib/dist/dataModel/NrcsIngestDataCache' -import { getPartId } from '../../lib' +import { getPartId } from '../../lib.js' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' -import { handleSetNextPart } from '../../../playout/setNextJobs' -import { handleTakeNextPart } from '../../../playout/take' -import { handleActivateRundownPlaylist, handleDeactivateRundownPlaylist } from '../../../playout/activePlaylistJobs' -import { removeRundownPlaylistFromDb } from '../../__tests__/lib' +import { handleSetNextPart } from '../../../playout/setNextJobs.js' +import { handleTakeNextPart } from '../../../playout/take.js' +import { handleActivateRundownPlaylist, handleDeactivateRundownPlaylist } from '../../../playout/activePlaylistJobs.js' +import { removeRundownPlaylistFromDb } from '../../__tests__/lib.js' import { UserErrorMessage } from '@sofie-automation/corelib/dist/error' -import { wrapCustomIngestJob, wrapGenericIngestJob, wrapMosIngestJob } from '../../jobWrappers' +import { wrapCustomIngestJob, wrapGenericIngestJob, wrapMosIngestJob } from '../../jobWrappers.js' jest.mock('../../updateNext') -import { ensureNextPartIsValid } from '../../updateNext' +import { ensureNextPartIsValid } from '../../updateNext.js' type TensureNextPartIsValid = jest.MockedFunction const ensureNextPartIsValidMock = ensureNextPartIsValid as TensureNextPartIsValid diff --git a/packages/job-worker/src/ingest/mosDevice/__tests__/mosStoryJobs.spec.ts b/packages/job-worker/src/ingest/mosDevice/__tests__/mosStoryJobs.spec.ts index e6182af5fe..ecfb27efe6 100644 --- a/packages/job-worker/src/ingest/mosDevice/__tests__/mosStoryJobs.spec.ts +++ b/packages/job-worker/src/ingest/mosDevice/__tests__/mosStoryJobs.spec.ts @@ -1,4 +1,4 @@ -import { setupDefaultJobEnvironment } from '../../../__mocks__/context' +import { setupDefaultJobEnvironment } from '../../../__mocks__/context.js' import { clone } from '@sofie-automation/corelib/dist/lib' import { IngestChangeType, @@ -12,8 +12,8 @@ import { handleMosInsertStories, handleMosMoveStories, handleMosSwapStories, -} from '../mosStoryJobs' -import { IngestUpdateOperationFunction, UpdateIngestRundownChange } from '../../runOperation' +} from '../mosStoryJobs.js' +import { IngestUpdateOperationFunction, UpdateIngestRundownChange } from '../../runOperation.js' import { IngestRundownWithSource } from '@sofie-automation/corelib/dist/dataModel/NrcsIngestDataCache' function getDefaultIngestRundown(): IngestRundownWithSource { diff --git a/packages/job-worker/src/ingest/mosDevice/lib.ts b/packages/job-worker/src/ingest/mosDevice/lib.ts index cde75a8de2..73008187b7 100644 --- a/packages/job-worker/src/ingest/mosDevice/lib.ts +++ b/packages/job-worker/src/ingest/mosDevice/lib.ts @@ -1,6 +1,6 @@ import { MOS } from '@sofie-automation/corelib' import { IngestRundown, IngestSegment } from '@sofie-automation/blueprints-integration' -import _ = require('underscore') +import _ from 'underscore' export function fixIllegalObject(o: unknown): void { if (_.isArray(o)) { diff --git a/packages/job-worker/src/ingest/mosDevice/mosRundownJobs.ts b/packages/job-worker/src/ingest/mosDevice/mosRundownJobs.ts index 445e52c0d0..a52fb8e56a 100644 --- a/packages/job-worker/src/ingest/mosDevice/mosRundownJobs.ts +++ b/packages/job-worker/src/ingest/mosDevice/mosRundownJobs.ts @@ -6,13 +6,13 @@ import { MosRundownStatusProps, MosRundownReadyToAirProps, } from '@sofie-automation/corelib/dist/worker/ingest' -import { JobContext } from '../../jobs' -import { getRundownId, canRundownBeUpdated } from '../lib' -import { CommitIngestData, runWithRundownLock } from '../lock' -import { mosStoryToIngestSegment, parseMosString, updateRanksBasedOnOrder } from './lib' -import { GenerateRundownMode, updateRundownFromIngestData } from '../generationRundown' -import { IngestUpdateOperationFunction } from '../runOperation' -import { IngestModel } from '../model/IngestModel' +import { JobContext } from '../../jobs/index.js' +import { getRundownId, canRundownBeUpdated } from '../lib.js' +import { CommitIngestData, runWithRundownLock } from '../lock.js' +import { mosStoryToIngestSegment, parseMosString, updateRanksBasedOnOrder } from './lib.js' +import { GenerateRundownMode, updateRundownFromIngestData } from '../generationRundown.js' +import { IngestUpdateOperationFunction } from '../runOperation.js' +import { IngestModel } from '../model/IngestModel.js' import { IngestRundownWithSource } from '@sofie-automation/corelib/dist/dataModel/NrcsIngestDataCache' import { SofieIngestRundownWithSource } from '@sofie-automation/corelib/dist/dataModel/SofieIngestDataCache' diff --git a/packages/job-worker/src/ingest/mosDevice/mosStoryJobs.ts b/packages/job-worker/src/ingest/mosDevice/mosStoryJobs.ts index b657bdf03f..7c5991823c 100644 --- a/packages/job-worker/src/ingest/mosDevice/mosStoryJobs.ts +++ b/packages/job-worker/src/ingest/mosDevice/mosStoryJobs.ts @@ -5,15 +5,15 @@ import { MosMoveStoryProps, MosSwapStoryProps, } from '@sofie-automation/corelib/dist/worker/ingest' -import { logger } from '../../logging' -import { JobContext } from '../../jobs' +import { logger } from '../../logging.js' +import { JobContext } from '../../jobs/index.js' import { fixIllegalObject, getMosIngestSegmentExternalId, mosStoryToIngestSegment, parseMosString, updateRanksBasedOnOrder, -} from './lib' +} from './lib.js' import { IngestChangeType, IngestSegment, @@ -22,7 +22,7 @@ import { NrcsIngestSegmentChangeDetails, NrcsIngestSegmentChangeDetailsEnum, } from '@sofie-automation/blueprints-integration' -import { IngestUpdateOperationFunction } from '../runOperation' +import { IngestUpdateOperationFunction } from '../runOperation.js' import { normalizeArrayToMap } from '@sofie-automation/corelib/dist/lib' import { IngestRundownWithSource } from '@sofie-automation/corelib/dist/dataModel/NrcsIngestDataCache' diff --git a/packages/job-worker/src/ingest/nrcsIngestCache.ts b/packages/job-worker/src/ingest/nrcsIngestCache.ts index 3a203451f8..f73b3cb427 100644 --- a/packages/job-worker/src/ingest/nrcsIngestCache.ts +++ b/packages/job-worker/src/ingest/nrcsIngestCache.ts @@ -8,16 +8,16 @@ import { IngestRundownWithSource, } from '@sofie-automation/corelib/dist/dataModel/NrcsIngestDataCache' import { ProtectedString, protectString, unprotectString } from '@sofie-automation/corelib/dist/protectedString' -import _ = require('underscore') +import _ from 'underscore' import { IngestPart, IngestSegment } from '@sofie-automation/blueprints-integration' -import { JobContext } from '../jobs' -import { getPartId, getSegmentId } from './lib' +import { JobContext } from '../jobs/index.js' +import { getPartId, getSegmentId } from './lib.js' import { SetOptional } from 'type-fest' import { groupByToMap, normalizeArrayToMap } from '@sofie-automation/corelib/dist/lib' import { AnyBulkWriteOperation } from 'mongodb' -import { diffAndReturnLatestObjects } from './model/implementation/utils' -import { ICollection } from '../db' -import { getCurrentTime } from '../lib' +import { diffAndReturnLatestObjects } from './model/implementation/utils.js' +import { ICollection } from '../db/index.js' +import { getCurrentTime } from '../lib/index.js' /** * Represents a Rundown in the NRCSIngestDataCache collection and provides methods for interacting with it. diff --git a/packages/job-worker/src/ingest/packageInfo.ts b/packages/job-worker/src/ingest/packageInfo.ts index 728c27069e..6816a9d4d4 100644 --- a/packages/job-worker/src/ingest/packageInfo.ts +++ b/packages/job-worker/src/ingest/packageInfo.ts @@ -4,13 +4,13 @@ import { ExpectedPackagesRegenerateProps, PackageInfosUpdatedRundownProps, } from '@sofie-automation/corelib/dist/worker/ingest' -import { logger } from '../logging' -import { JobContext } from '../jobs' -import { regenerateSegmentsFromIngestData } from './generationSegment' -import { runWithRundownLock } from './lock' -import { updateExpectedPackagesForPartModel, updateExpectedPackagesForRundownBaseline } from './expectedPackages' -import { loadIngestModelFromRundown } from './model/implementation/LoadIngestModel' -import { runCustomIngestUpdateOperation } from './runOperation' +import { logger } from '../logging.js' +import { JobContext } from '../jobs/index.js' +import { regenerateSegmentsFromIngestData } from './generationSegment.js' +import { runWithRundownLock } from './lock.js' +import { updateExpectedPackagesForPartModel, updateExpectedPackagesForRundownBaseline } from './expectedPackages.js' +import { loadIngestModelFromRundown } from './model/implementation/LoadIngestModel.js' +import { runCustomIngestUpdateOperation } from './runOperation.js' /** * Debug: Regenerate ExpectedPackages for a Rundown diff --git a/packages/job-worker/src/ingest/runOperation.ts b/packages/job-worker/src/ingest/runOperation.ts index b8db3c275f..86716a7bab 100644 --- a/packages/job-worker/src/ingest/runOperation.ts +++ b/packages/job-worker/src/ingest/runOperation.ts @@ -1,30 +1,35 @@ -import { IngestModel, IngestModelReadonly } from './model/IngestModel' -import { BeforeIngestOperationPartMap, CommitIngestOperation } from './commit' -import { SofieIngestRundownDataCache, SofieIngestRundownDataCacheGenerator } from './sofieIngestCache' -import { canRundownBeUpdated, getRundownId, getSegmentId } from './lib' -import { JobContext } from '../jobs' +import { IngestModel, IngestModelReadonly } from './model/IngestModel.js' +import { BeforeIngestOperationPartMap, CommitIngestOperation } from './commit.js' +import { SofieIngestRundownDataCache, SofieIngestRundownDataCacheGenerator } from './sofieIngestCache.js' +import { canRundownBeUpdated, getRundownId, getSegmentId } from './lib.js' +import { JobContext } from '../jobs/index.js' import { IngestPropsBase } from '@sofie-automation/corelib/dist/worker/ingest' import { UserError, UserErrorMessage } from '@sofie-automation/corelib/dist/error' -import { loadIngestModelFromRundownExternalId } from './model/implementation/LoadIngestModel' +import { loadIngestModelFromRundownExternalId } from './model/implementation/LoadIngestModel.js' import { Complete, clone } from '@sofie-automation/corelib/dist/lib' -import { CommitIngestData, runWithRundownLockWithoutFetchingRundown } from './lock' -import { DatabasePersistedModel } from '../modelBase' +import { CommitIngestData, runWithRundownLockWithoutFetchingRundown } from './lock.js' +import { DatabasePersistedModel } from '../modelBase.js' import { NrcsIngestChangeDetails, IngestRundown, UserOperationChange, SofieIngestSegment, + IngestChangeType, } from '@sofie-automation/blueprints-integration' -import { MutableIngestRundownImpl } from '../blueprints/ingest/MutableIngestRundownImpl' -import { ProcessIngestDataContext } from '../blueprints/context' +import { MutableIngestRundownImpl } from '../blueprints/ingest/MutableIngestRundownImpl.js' +import { ProcessIngestDataContext } from '../blueprints/context/index.js' import { PartId, RundownId, SegmentId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { GenerateRundownMode, updateRundownFromIngestData, updateRundownFromIngestDataInner } from './generationRundown' -import { calculateSegmentsAndRemovalsFromIngestData, calculateSegmentsFromIngestData } from './generationSegment' +import { + GenerateRundownMode, + updateRundownFromIngestData, + updateRundownFromIngestDataInner, +} from './generationRundown.js' +import { calculateSegmentsAndRemovalsFromIngestData, calculateSegmentsFromIngestData } from './generationSegment.js' import { SegmentOrphanedReason } from '@sofie-automation/corelib/dist/dataModel/Segment' import { IngestRundownWithSource } from '@sofie-automation/corelib/dist/dataModel/NrcsIngestDataCache' import { SofieIngestRundownWithSource } from '@sofie-automation/corelib/dist/dataModel/SofieIngestDataCache' -import { NrcsIngestRundownDataCache } from './nrcsIngestCache' -import { logger } from '../logging' +import { NrcsIngestRundownDataCache } from './nrcsIngestCache.js' +import { logger } from '../logging.js' export enum ComputedIngestChangeAction { DELETE = 'delete', @@ -275,7 +280,7 @@ async function updateSofieIngestRundown( rundownSource: nrcsIngestRundown.rundownSource, } satisfies Complete, false - ) + ) const blueprintContext = new ProcessIngestDataContext( { @@ -295,7 +300,7 @@ async function updateSofieIngestRundown( previousNrcsIngestRundown, ingestRundownChanges.changes ) - } else if (ingestRundownChanges.changes.source === 'ingest') { + } else if (ingestRundownChanges.changes.source === IngestChangeType.Ingest) { // Backwards compatible mode: Blueprints has not defined a processIngestData() // so we'll simply accept the incoming changes as-is: diff --git a/packages/job-worker/src/ingest/selectShowStyleVariant.ts b/packages/job-worker/src/ingest/selectShowStyleVariant.ts index 92b542628c..6072726bea 100644 --- a/packages/job-worker/src/ingest/selectShowStyleVariant.ts +++ b/packages/job-worker/src/ingest/selectShowStyleVariant.ts @@ -1,13 +1,18 @@ import { ExtendedIngestRundown } from '@sofie-automation/blueprints-integration' import { ShowStyleBaseId, ShowStyleVariantId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { protectString } from '@sofie-automation/corelib/dist/protectedString' -import { logger } from '../logging' -import { createShowStyleCompound } from '../showStyles' -import { StudioUserContext } from '../blueprints/context' -import { ProcessedShowStyleBase, ProcessedShowStyleVariant, JobContext, ProcessedShowStyleCompound } from '../jobs' +import { logger } from '../logging.js' +import { createShowStyleCompound } from '../showStyles.js' +import { StudioUserContext } from '../blueprints/context/index.js' +import { + ProcessedShowStyleBase, + ProcessedShowStyleVariant, + JobContext, + ProcessedShowStyleCompound, +} from '../jobs/index.js' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' import { ReadonlyDeep } from 'type-fest' -import { convertShowStyleBaseToBlueprints, convertShowStyleVariantToBlueprints } from '../blueprints/context/lib' +import { convertShowStyleBaseToBlueprints, convertShowStyleVariantToBlueprints } from '../blueprints/context/lib.js' import { RundownSource, RundownSourceTesting } from '@sofie-automation/corelib/dist/dataModel/Rundown' export interface SelectedShowStyleVariant { diff --git a/packages/job-worker/src/ingest/sofieIngestCache.ts b/packages/job-worker/src/ingest/sofieIngestCache.ts index 8340682fa5..43fb4e02ef 100644 --- a/packages/job-worker/src/ingest/sofieIngestCache.ts +++ b/packages/job-worker/src/ingest/sofieIngestCache.ts @@ -8,15 +8,15 @@ import { SofieIngestRundownWithSource, } from '@sofie-automation/corelib/dist/dataModel/SofieIngestDataCache' import { protectString, unprotectString } from '@sofie-automation/corelib/dist/protectedString' -import _ = require('underscore') +import _ from 'underscore' import { SofieIngestPart, SofieIngestSegment } from '@sofie-automation/blueprints-integration' -import { JobContext } from '../jobs' -import { getPartId, getSegmentId } from './lib' +import { JobContext } from '../jobs/index.js' +import { getPartId, getSegmentId } from './lib.js' import { SetOptional } from 'type-fest' import { groupByToMap, normalizeArrayToMap } from '@sofie-automation/corelib/dist/lib' import { AnyBulkWriteOperation } from 'mongodb' -import { ICollection } from '../db' -import { getCurrentTime } from '../lib' +import { ICollection } from '../db/index.js' +import { getCurrentTime } from '../lib/index.js' /** * Represents a Rundown in the SofieIngestDataCache collection and provides methods for interacting with it. diff --git a/packages/job-worker/src/ingest/syncChangesToPartInstance.ts b/packages/job-worker/src/ingest/syncChangesToPartInstance.ts index 9c02a758b4..9e87733c1b 100644 --- a/packages/job-worker/src/ingest/syncChangesToPartInstance.ts +++ b/packages/job-worker/src/ingest/syncChangesToPartInstance.ts @@ -3,37 +3,37 @@ import { BlueprintSyncIngestPartInstance, IBlueprintAdLibPieceDB, } from '@sofie-automation/blueprints-integration' -import { JobContext, ProcessedShowStyleCompound } from '../jobs' -import { PlayoutModel } from '../playout/model/PlayoutModel' -import { PlayoutPartInstanceModel } from '../playout/model/PlayoutPartInstanceModel' -import { IngestModelReadonly } from './model/IngestModel' +import { JobContext, ProcessedShowStyleCompound } from '../jobs/index.js' +import { PlayoutModel } from '../playout/model/PlayoutModel.js' +import { PlayoutPartInstanceModel } from '../playout/model/PlayoutPartInstanceModel.js' +import { IngestModelReadonly } from './model/IngestModel.js' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' -import { logger } from '../logging' +import { logger } from '../logging.js' import { fetchPiecesThatMayBeActiveForPart, getPieceInstancesForPart, syncPlayheadInfinitesForNextPartInstance, -} from '../playout/infinites' -import _ = require('underscore') -import { SyncIngestUpdateToPartInstanceContext } from '../blueprints/context' +} from '../playout/infinites.js' +import _ from 'underscore' +import { SyncIngestUpdateToPartInstanceContext } from '../blueprints/context/index.js' import { convertAdLibActionToBlueprints, convertAdLibPieceToBlueprints, convertPartInstanceToBlueprints, convertPartToBlueprints, convertPieceInstanceToBlueprints, -} from '../blueprints/context/lib' -import { validateAdlibTestingPartInstanceProperties } from '../playout/adlibTesting' +} from '../blueprints/context/lib.js' +import { validateAdlibTestingPartInstanceProperties } from '../playout/adlibTesting.js' import { ReadonlyDeep } from 'type-fest' -import { convertIngestModelToPlayoutRundownWithSegments } from './commit' -import { convertNoteToNotification } from '../notifications/util' -import { PlayoutRundownModel } from '../playout/model/PlayoutRundownModel' +import { convertIngestModelToPlayoutRundownWithSegments } from './commit.js' +import { convertNoteToNotification } from '../notifications/util.js' +import { PlayoutRundownModel } from '../playout/model/PlayoutRundownModel.js' import { PieceInstance } from '@sofie-automation/corelib/dist/dataModel/PieceInstance' -import { setNextPart } from '../playout/setNext' +import { setNextPart } from '../playout/setNext.js' import { PartId, RundownId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import type { WrappedShowStyleBlueprint } from '../blueprints/cache' +import type { WrappedShowStyleBlueprint } from '../blueprints/cache.js' type PlayStatus = 'previous' | 'current' | 'next' export interface PartInstanceToSync { diff --git a/packages/job-worker/src/ingest/updateNext.ts b/packages/job-worker/src/ingest/updateNext.ts index ba0d90a5ff..a6d4619843 100644 --- a/packages/job-worker/src/ingest/updateNext.ts +++ b/packages/job-worker/src/ingest/updateNext.ts @@ -1,7 +1,7 @@ -import { selectNextPart } from '../playout/selectNextPart' -import { PlayoutModel } from '../playout/model/PlayoutModel' -import { JobContext } from '../jobs' -import { setNextPart } from '../playout/setNext' +import { selectNextPart } from '../playout/selectNextPart.js' +import { PlayoutModel } from '../playout/model/PlayoutModel.js' +import { JobContext } from '../jobs/index.js' +import { setNextPart } from '../playout/setNext.js' import { isPartPlayable } from '@sofie-automation/corelib/dist/dataModel/Part' /** diff --git a/packages/job-worker/src/ingest/userOperation.ts b/packages/job-worker/src/ingest/userOperation.ts index c3e068715b..640c9d2675 100644 --- a/packages/job-worker/src/ingest/userOperation.ts +++ b/packages/job-worker/src/ingest/userOperation.ts @@ -1,6 +1,6 @@ import { UserExecuteChangeOperationProps } from '@sofie-automation/corelib/dist/worker/ingest' -import { JobContext } from '../jobs' -import { UpdateIngestRundownResult, runIngestUpdateOperationBase } from './runOperation' +import { JobContext } from '../jobs/index.js' +import { UpdateIngestRundownResult, runIngestUpdateOperationBase } from './runOperation.js' import { IngestChangeType } from '@sofie-automation/blueprints-integration' export async function handleUserExecuteChangeOperation( diff --git a/packages/job-worker/src/ipc.ts b/packages/job-worker/src/ipc.ts index 8e29d82e43..45fbf89324 100644 --- a/packages/job-worker/src/ipc.ts +++ b/packages/job-worker/src/ipc.ts @@ -1,7 +1,7 @@ import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' -import { interceptLogging, LogEntry, logger } from './logging' -import { FastTrackTimelineFunc, JobSpec, JobWorkerBase } from './main' -import { JobManager, JobStream } from './manager' +import { interceptLogging, LogEntry, logger } from './logging.js' +import { FastTrackTimelineFunc, JobSpec, JobWorkerBase } from './main.js' +import { JobManager, JobStream } from './manager.js' import { WorkerId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { getPrometheusMetricsString, setupPrometheusMetrics } from '@sofie-automation/corelib/dist/prometheus' diff --git a/packages/job-worker/src/jobs/index.ts b/packages/job-worker/src/jobs/index.ts index 586688a1f2..aebd415538 100644 --- a/packages/job-worker/src/jobs/index.ts +++ b/packages/job-worker/src/jobs/index.ts @@ -1,6 +1,6 @@ -import { IDirectCollections } from '../db' +import { IDirectCollections } from '../db/index.js' import { ReadonlyDeep } from 'type-fest' -import { WrappedShowStyleBlueprint, WrappedStudioBlueprint } from '../blueprints/cache' +import { WrappedShowStyleBlueprint, WrappedStudioBlueprint } from '../blueprints/cache.js' import { RundownId, RundownPlaylistId, @@ -8,17 +8,17 @@ import { ShowStyleVariantId, StudioId, } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { ApmSpan } from '../profiler' +import { ApmSpan } from '../profiler.js' import { IngestJobFunc } from '@sofie-automation/corelib/dist/worker/ingest' import { EventsJobFunc } from '@sofie-automation/corelib/dist/worker/events' import { DBStudio } from '@sofie-automation/corelib/dist/dataModel/Studio' -import { ProcessedShowStyleConfig, ProcessedStudioConfig } from '../blueprints/config' +import { ProcessedShowStyleConfig, ProcessedStudioConfig } from '../blueprints/config.js' import { StudioJobFunc } from '@sofie-automation/corelib/dist/worker/studio' -import { PlaylistLock, RundownLock } from './lock' -import { BaseModel } from '../modelBase' +import { PlaylistLock, RundownLock } from './lock.js' +import { BaseModel } from '../modelBase.js' import { TimelineComplete } from '@sofie-automation/corelib/dist/dataModel/Timeline' -import { ProcessedShowStyleBase, ProcessedShowStyleVariant, ProcessedShowStyleCompound } from './showStyle' -import { JobStudio } from './studio' +import { ProcessedShowStyleBase, ProcessedShowStyleVariant, ProcessedShowStyleCompound } from './showStyle.js' +import { JobStudio } from './studio.js' export { ApmSpan } export { ProcessedShowStyleVariant, ProcessedShowStyleBase, ProcessedShowStyleCompound } diff --git a/packages/job-worker/src/lib/index.ts b/packages/job-worker/src/lib/index.ts index c23e29a4f4..a3df32027c 100644 --- a/packages/job-worker/src/lib/index.ts +++ b/packages/job-worker/src/lib/index.ts @@ -1,7 +1,7 @@ import * as fs from 'fs' import * as path from 'path' -export * from './time' +export * from './time.js' const pkgInfoBuffer = fs.readFileSync(path.join(__dirname, '../../package.json')) const pkgInfo = JSON.parse(pkgInfoBuffer.toString()) diff --git a/packages/job-worker/src/lib/lazy.ts b/packages/job-worker/src/lib/lazy.ts index 050e7524f6..789ca9e951 100644 --- a/packages/job-worker/src/lib/lazy.ts +++ b/packages/job-worker/src/lib/lazy.ts @@ -1,4 +1,4 @@ -import PLazy = require('p-lazy') +import PLazy from 'p-lazy' export interface LazyInitialiseReadonly { /** Return the value, loading it if required */ diff --git a/packages/job-worker/src/locks.ts b/packages/job-worker/src/locks.ts index 512e560eee..f0f806407f 100644 --- a/packages/job-worker/src/locks.ts +++ b/packages/job-worker/src/locks.ts @@ -1,6 +1,6 @@ import { assertNever } from '@sofie-automation/corelib/dist/lib' -import { logger } from './logging' -import { AnyLockEvent } from './workers/locks' +import { logger } from './logging.js' +import { AnyLockEvent } from './workers/locks.js' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' type OwnerAndLockIds = [string, string] diff --git a/packages/job-worker/src/main.ts b/packages/job-worker/src/main.ts index 59a032fcd9..09c75484f2 100644 --- a/packages/job-worker/src/main.ts +++ b/packages/job-worker/src/main.ts @@ -1,15 +1,15 @@ -import { LeveledLogMethodFixed, LogEntry, logger } from './logging' +import { LeveledLogMethodFixed, LogEntry, logger } from './logging.js' import { protectStringArray } from '@sofie-automation/corelib/dist/protectedString' import { StudioId, WorkerId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { setupApmAgent } from './profiler' -import { createMongoConnection } from './db' -import { StudioWorkerSet } from './workers/worker-set' +import { setupApmAgent } from './profiler.js' +import { createMongoConnection } from './db/index.js' +import { StudioWorkerSet } from './workers/worker-set.js' import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' import { Db as MongoDb, MongoClient } from 'mongodb' -import { JobManager } from './manager' +import { JobManager } from './manager.js' import { TimelineComplete } from '@sofie-automation/corelib/dist/dataModel/Timeline' import { DBStudio } from '@sofie-automation/corelib/dist/dataModel/Studio' -import { setupInfluxDb } from './influx' +import { setupInfluxDb } from './influx.js' setupApmAgent() setupInfluxDb() @@ -75,7 +75,7 @@ export abstract class JobWorkerBase { logger.debug('Mongo connection closed. Forcing exit') // Note: This is terribele error handling, but it does the job. // If we start handling this more gracefully, then we will need to make sure to avoid/kill jobs being processed and flush all caches upon reconnection - // eslint-disable-next-line no-process-exit + // eslint-disable-next-line n/no-process-exit process.exit(0) }) @@ -150,14 +150,14 @@ async function getStudioIdsToRun(db: MongoDb): Promise> { // Something about the list of studios that exist has changed, lets restart // The easiest thing to do is to restart the process. This will happen so rarely, its probably not worth trying to improve on - // eslint-disable-next-line no-process-exit + // eslint-disable-next-line n/no-process-exit process.exit(1) } }) .on('end', () => { logger.warn(`Changes stream for Studios ended`) // Note: This is terribele error handling, but it does the job. - // eslint-disable-next-line no-process-exit + // eslint-disable-next-line n/no-process-exit process.exit(1) }) diff --git a/packages/job-worker/src/manager.ts b/packages/job-worker/src/manager.ts index fab6aee549..ef7bc8697d 100644 --- a/packages/job-worker/src/manager.ts +++ b/packages/job-worker/src/manager.ts @@ -1,13 +1,12 @@ import { WorkerId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { UserError } from '@sofie-automation/corelib/dist/error' -import { JobSpec } from './main' +import { JobSpec } from './main.js' export interface JobManager { jobFinished: ( id: string, startedTime: number, finishedTime: number, - error: null | Error | UserError, + error: null | string, // Stringified UserError result: any ) => Promise // getNextJob: (queueName: string) => Promise diff --git a/packages/job-worker/src/notifications/NotificationsModelHelper.ts b/packages/job-worker/src/notifications/NotificationsModelHelper.ts index 28092d902f..b1abd7a674 100644 --- a/packages/job-worker/src/notifications/NotificationsModelHelper.ts +++ b/packages/job-worker/src/notifications/NotificationsModelHelper.ts @@ -1,6 +1,6 @@ -import { getCurrentTime } from '../lib' -import type { JobContext } from '../jobs' -import type { INotificationsModel, INotificationTarget, INotificationWithTarget } from './NotificationsModel' +import { getCurrentTime } from '../lib/index.js' +import type { JobContext } from '../jobs/index.js' +import type { INotificationsModel, INotificationTarget, INotificationWithTarget } from './NotificationsModel.js' import { DBNotificationTarget, DBNotificationTargetType, diff --git a/packages/job-worker/src/notifications/__tests__/NotificationsModelHelper.spec.ts b/packages/job-worker/src/notifications/__tests__/NotificationsModelHelper.spec.ts index e0c44ed13a..134b78f82e 100644 --- a/packages/job-worker/src/notifications/__tests__/NotificationsModelHelper.spec.ts +++ b/packages/job-worker/src/notifications/__tests__/NotificationsModelHelper.spec.ts @@ -3,11 +3,11 @@ import { DBNotificationTarget, DBNotificationTargetType, } from '@sofie-automation/corelib/dist/dataModel/Notifications' -import { setupDefaultJobEnvironment } from '../../__mocks__/context' -import { NotificationsModelHelper } from '../NotificationsModelHelper' +import { setupDefaultJobEnvironment } from '../../__mocks__/context.js' +import { NotificationsModelHelper } from '../NotificationsModelHelper.js' import { protectString } from '@sofie-automation/corelib/dist/protectedString' import { NoteSeverity } from '@sofie-automation/blueprints-integration' -import { INotificationWithTarget } from '../NotificationsModel' +import { INotificationWithTarget } from '../NotificationsModel.js' import { generateTranslation } from '@sofie-automation/corelib/dist/lib' describe('NotificationsModelHelper', () => { diff --git a/packages/job-worker/src/notifications/util.ts b/packages/job-worker/src/notifications/util.ts index c75bd00d06..ecf2f933ce 100644 --- a/packages/job-worker/src/notifications/util.ts +++ b/packages/job-worker/src/notifications/util.ts @@ -1,5 +1,5 @@ import { wrapTranslatableMessageFromBlueprints } from '@sofie-automation/corelib/dist/TranslatableMessage' -import type { INotification } from './NotificationsModel' +import type { INotification } from './NotificationsModel.js' import { INoteBase } from '@sofie-automation/corelib/dist/dataModel/Notes' import { BlueprintId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { getHash } from '@sofie-automation/corelib/dist/hash' diff --git a/packages/job-worker/src/peripheralDevice.ts b/packages/job-worker/src/peripheralDevice.ts index 0b8b1c3639..65fa8118fb 100644 --- a/packages/job-worker/src/peripheralDevice.ts +++ b/packages/job-worker/src/peripheralDevice.ts @@ -8,10 +8,10 @@ import { getRandomId, normalizeArrayToMap, } from '@sofie-automation/corelib/dist/lib' -import { JobContext } from './jobs' -import { getCurrentTime } from './lib' -import { logger } from './logging' -import { PlayoutModel } from './playout/model/PlayoutModel' +import { JobContext } from './jobs/index.js' +import { getCurrentTime } from './lib/index.js' +import { logger } from './logging.js' +import { PlayoutModel } from './playout/model/PlayoutModel.js' import { literal } from '@sofie-automation/shared-lib/dist/lib/lib' import { SubdeviceAction } from '@sofie-automation/corelib/dist/deviceConfig' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' diff --git a/packages/job-worker/src/playout/__tests__/actions.test.ts b/packages/job-worker/src/playout/__tests__/actions.test.ts index 0650838932..bc381cdd0c 100644 --- a/packages/job-worker/src/playout/__tests__/actions.test.ts +++ b/packages/job-worker/src/playout/__tests__/actions.test.ts @@ -2,14 +2,14 @@ import { RundownPlaylistId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { SegmentOrphanedReason } from '@sofie-automation/corelib/dist/dataModel/Segment' import { protectString } from '@sofie-automation/corelib/dist/protectedString' -import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context' -import { setupDefaultRundownPlaylist, setupMockShowStyleCompound } from '../../__mocks__/presetCollections' -import { runWithRundownLock } from '../../ingest/lock' -import { executePeripheralDeviceFunction } from '../../peripheralDevice' -import { removeRundownFromDb } from '../../rundownPlaylists' -import { activateRundownPlaylist } from '../activePlaylistActions' -import { runJobWithPlayoutModel } from '../lock' -import { handleActivateAdlibTesting } from '../adlibTesting' +import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context.js' +import { setupDefaultRundownPlaylist, setupMockShowStyleCompound } from '../../__mocks__/presetCollections.js' +import { runWithRundownLock } from '../../ingest/lock.js' +import { executePeripheralDeviceFunction } from '../../peripheralDevice.js' +import { removeRundownFromDb } from '../../rundownPlaylists.js' +import { activateRundownPlaylist } from '../activePlaylistActions.js' +import { runJobWithPlayoutModel } from '../lock.js' +import { handleActivateAdlibTesting } from '../adlibTesting.js' jest.mock('../../peripheralDevice') type TexecutePeripheralDeviceFunction = jest.MockedFunction diff --git a/packages/job-worker/src/playout/__tests__/helpers/rundowns.ts b/packages/job-worker/src/playout/__tests__/helpers/rundowns.ts index deea4059bc..48f2a29726 100644 --- a/packages/job-worker/src/playout/__tests__/helpers/rundowns.ts +++ b/packages/job-worker/src/playout/__tests__/helpers/rundowns.ts @@ -6,9 +6,9 @@ import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment' import { protectString } from '@sofie-automation/corelib/dist/protectedString' import { ReadonlyDeep } from 'type-fest' -import { ProcessedShowStyleCompound } from '../../../jobs' -import { getCurrentTime } from '../../../lib' -import { MockJobContext } from '../../../__mocks__/context' +import { ProcessedShowStyleCompound } from '../../../jobs/index.js' +import { getCurrentTime } from '../../../lib/index.js' +import { MockJobContext } from '../../../__mocks__/context.js' export async function setupRundownBase( context: MockJobContext, diff --git a/packages/job-worker/src/playout/__tests__/infinites.test.ts b/packages/job-worker/src/playout/__tests__/infinites.test.ts index ad14b2c2e0..16b1a381e9 100644 --- a/packages/job-worker/src/playout/__tests__/infinites.test.ts +++ b/packages/job-worker/src/playout/__tests__/infinites.test.ts @@ -1,13 +1,13 @@ import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' -import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context' +import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context.js' import { ReadonlyDeep, SetRequired } from 'type-fest' -import { PlayoutModel } from '../model/PlayoutModel' -import { candidatePartIsAfterPreviewPartInstance } from '../infinites' -import { setupDefaultRundownPlaylist, setupMockShowStyleCompound } from '../../__mocks__/presetCollections' +import { PlayoutModel } from '../model/PlayoutModel.js' +import { candidatePartIsAfterPreviewPartInstance } from '../infinites.js' +import { setupDefaultRundownPlaylist, setupMockShowStyleCompound } from '../../__mocks__/presetCollections.js' import { getRandomId } from '@sofie-automation/corelib/dist/lib' import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' -import { runJobWithPlayoutModel } from '../lock' -import { wrapPartToTemporaryInstance } from '../../__mocks__/partinstance' +import { runJobWithPlayoutModel } from '../lock.js' +import { wrapPartToTemporaryInstance } from '../../__mocks__/partinstance.js' import { protectString } from '@sofie-automation/corelib/dist/protectedString' describe('canContinueAdlibOnEndInfinites', () => { diff --git a/packages/job-worker/src/playout/__tests__/lib.ts b/packages/job-worker/src/playout/__tests__/lib.ts index 2f0c26c05f..cc6073d581 100644 --- a/packages/job-worker/src/playout/__tests__/lib.ts +++ b/packages/job-worker/src/playout/__tests__/lib.ts @@ -4,7 +4,7 @@ import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartIns import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment' import { sortPartsInSortedSegments } from '@sofie-automation/corelib/dist/playout/playlist' -import { JobContext } from '../../jobs' +import { JobContext } from '../../jobs/index.js' export async function getSelectedPartInstances( context: JobContext, diff --git a/packages/job-worker/src/playout/__tests__/playout-executeAction.test.ts b/packages/job-worker/src/playout/__tests__/playout-executeAction.test.ts index 0f294660bc..ae64dc1480 100644 --- a/packages/job-worker/src/playout/__tests__/playout-executeAction.test.ts +++ b/packages/job-worker/src/playout/__tests__/playout-executeAction.test.ts @@ -1,21 +1,21 @@ import { RundownPlaylistId, AdLibActionId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { UserErrorMessage } from '@sofie-automation/corelib/dist/error' import { protectString } from '@sofie-automation/corelib/dist/protectedString' -import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context' -import { setupDefaultRundownPlaylist, setupMockShowStyleCompound } from '../../__mocks__/presetCollections' -import { handleTakeNextPart } from '../take' -import { handleExecuteAdlibAction } from '../adlibAction' -import { handleActivateRundownPlaylist } from '../activePlaylistJobs' -import { ActionExecutionContext } from '../../blueprints/context/adlibActions' -import { ActionPartChange } from '../../blueprints/context/services/PartAndPieceInstanceActionService' -import * as Infinites from '../../playout/infinites' -import * as TakeApi from '../../playout/take' +import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context.js' +import { setupDefaultRundownPlaylist, setupMockShowStyleCompound } from '../../__mocks__/presetCollections.js' +import { handleTakeNextPart } from '../take.js' +import { handleExecuteAdlibAction } from '../adlibAction.js' +import { handleActivateRundownPlaylist } from '../activePlaylistJobs.js' +import { ActionExecutionContext } from '../../blueprints/context/adlibActions.js' +import { ActionPartChange } from '../../blueprints/context/services/PartAndPieceInstanceActionService.js' +import * as Infinites from '../../playout/infinites.js' +import * as TakeApi from '../../playout/take.js' const syncPlayheadInfinitesForNextPartInstanceMock = jest.spyOn(Infinites, 'syncPlayheadInfinitesForNextPartInstance') const takeNextPartMock = jest.spyOn(TakeApi, 'performTakeToNextedPart') jest.mock('../timeline/generate') -import { updateTimeline } from '../timeline/generate' +import { updateTimeline } from '../timeline/generate.js' type TupdateTimeline = jest.MockedFunction const updateTimelineMock = updateTimeline as TupdateTimeline diff --git a/packages/job-worker/src/playout/__tests__/playout.test.ts b/packages/job-worker/src/playout/__tests__/playout.test.ts index 93ab3ef753..369f445397 100644 --- a/packages/job-worker/src/playout/__tests__/playout.test.ts +++ b/packages/job-worker/src/playout/__tests__/playout.test.ts @@ -8,23 +8,23 @@ import { setupDefaultRundownPlaylist, setupMockPeripheralDevice, setupMockShowStyleCompound, -} from '../../__mocks__/presetCollections' -import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context' +} from '../../__mocks__/presetCollections.js' +import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context.js' import { PartInstanceId, RundownId, RundownPlaylistId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { fixSnapshot } from '../../__mocks__/helpers/snapshot' +import { fixSnapshot } from '../../__mocks__/helpers/snapshot.js' import { sortPartsInSortedSegments, sortSegmentsInRundowns } from '@sofie-automation/corelib/dist/playout/playlist' -import { handleSetNextPart, handleMoveNextPart, handleSetNextSegment, handleQueueNextSegment } from '../setNextJobs' -import { handleTakeNextPart } from '../take' +import { handleSetNextPart, handleMoveNextPart, handleSetNextSegment, handleQueueNextSegment } from '../setNextJobs.js' +import { handleTakeNextPart } from '../take.js' import { handleActivateRundownPlaylist, handleDeactivateRundownPlaylist, handlePrepareRundownPlaylistForBroadcast, handleResetRundownPlaylist, -} from '../activePlaylistJobs' -import { getSelectedPartInstances } from './lib' +} from '../activePlaylistJobs.js' +import { getSelectedPartInstances } from './lib.js' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { UserErrorMessage } from '@sofie-automation/corelib/dist/error' -import * as peripheralDeviceLib from '../../peripheralDevice' +import * as peripheralDeviceLib from '../../peripheralDevice.js' import { protectString, unprotectString } from '@sofie-automation/corelib/dist/protectedString' import { AdLibPiece } from '@sofie-automation/corelib/dist/dataModel/AdLibPiece' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' @@ -38,14 +38,17 @@ import { defaultPart, defaultPiece, defaultAdLibPiece, -} from '../../__mocks__/defaultCollectionObjects' +} from '../../__mocks__/defaultCollectionObjects.js' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' import { ReadonlyDeep } from 'type-fest' -import { adjustFakeTime, getCurrentTime, useFakeCurrentTime } from '../../__mocks__/time' +import { adjustFakeTime, getCurrentTime, useFakeCurrentTime } from '../../__mocks__/time.js' import { PieceLifespan } from '@sofie-automation/blueprints-integration' -import { PlayoutChangedType } from '@sofie-automation/shared-lib/dist/peripheralDevice/peripheralDeviceAPI' -import { ProcessedShowStyleCompound } from '../../jobs' -import { handleOnPlayoutPlaybackChanged } from '../timings' +import { + PlayoutChangedResult, + PlayoutChangedType, +} from '@sofie-automation/shared-lib/dist/peripheralDevice/peripheralDeviceAPI' +import { ProcessedShowStyleCompound } from '../../jobs/index.js' +import { handleOnPlayoutPlaybackChanged } from '../timings/index.js' import { sleep } from '@sofie-automation/shared-lib/dist/lib/lib' import { wrapDefaultObject } from '@sofie-automation/corelib/dist/settings/objectWithOverrides' @@ -592,7 +595,7 @@ describe('Playout API', () => { time: now, }, }, - ...pieceInstances.map((pieceInstance) => { + ...pieceInstances.map((pieceInstance): PlayoutChangedResult => { return { type: PlayoutChangedType.PIECE_PLAYBACK_STARTED, objId: 'objectId', @@ -685,7 +688,7 @@ describe('Playout API', () => { time: now, }, }, - ...pieceInstances.map((pieceInstance) => { + ...pieceInstances.map((pieceInstance): PlayoutChangedResult => { return { type: PlayoutChangedType.PIECE_PLAYBACK_STOPPED, objId: 'objectId', diff --git a/packages/job-worker/src/playout/__tests__/resolvedPieces.test.ts b/packages/job-worker/src/playout/__tests__/resolvedPieces.test.ts index 32f6abde36..42da0af9e9 100644 --- a/packages/job-worker/src/playout/__tests__/resolvedPieces.test.ts +++ b/packages/job-worker/src/playout/__tests__/resolvedPieces.test.ts @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ -import { setupMockShowStyleCompound } from '../../__mocks__/presetCollections' -import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context' +import { setupMockShowStyleCompound } from '../../__mocks__/presetCollections.js' +import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context.js' import { SourceLayers } from '@sofie-automation/corelib/dist/dataModel/ShowStyleBase' import { ReadonlyDeep } from 'type-fest' import { protectString } from '@sofie-automation/shared-lib/dist/lib/protectedString' @@ -16,10 +16,10 @@ import { processAndPrunePieceInstanceTimings, resolvePrunedPieceInstance, } from '@sofie-automation/corelib/dist/playout/processAndPrune' -import { getResolvedPiecesForPartInstancesOnTimeline } from '../resolvedPieces' -import { SelectedPartInstanceTimelineInfo } from '../timeline/generate' +import { getResolvedPiecesForPartInstancesOnTimeline } from '../resolvedPieces.js' +import { SelectedPartInstanceTimelineInfo } from '../timeline/generate.js' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' -import { setupPieceInstanceInfiniteProperties } from '../pieces' +import { setupPieceInstanceInfiniteProperties } from '../pieces.js' import { getPartTimingsOrDefaults } from '@sofie-automation/corelib/dist/playout/timings' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' import { PieceInstanceId } from '@sofie-automation/corelib/dist/dataModel/Ids' @@ -412,6 +412,7 @@ describe('Resolved Pieces', () => { partStarted, // Approximate `calculatedTimings`, for the partInstances which already have it cached calculatedTimings: getPartTimingsOrDefaults(partInstance, pieceInstances), + regenerateTimelineAt: undefined, } } diff --git a/packages/job-worker/src/playout/__tests__/selectNextPart.test.ts b/packages/job-worker/src/playout/__tests__/selectNextPart.test.ts index f4efb9d410..fe4caad190 100644 --- a/packages/job-worker/src/playout/__tests__/selectNextPart.test.ts +++ b/packages/job-worker/src/playout/__tests__/selectNextPart.test.ts @@ -4,10 +4,10 @@ import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartIns import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment' import { protectString } from '@sofie-automation/corelib/dist/protectedString' import { ReadonlyDeep } from 'type-fest' -import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context' -import { PlayoutSegmentModelImpl } from '../model/implementation/PlayoutSegmentModelImpl' -import { PlayoutSegmentModel } from '../model/PlayoutSegmentModel' -import { selectNextPart } from '../selectNextPart' +import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context.js' +import { PlayoutSegmentModelImpl } from '../model/implementation/PlayoutSegmentModelImpl.js' +import { PlayoutSegmentModel } from '../model/PlayoutSegmentModel.js' +import { selectNextPart } from '../selectNextPart.js' import { QuickLoopMarkerType } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { ForceQuickLoopAutoNext } from '@sofie-automation/shared-lib/dist/core/model/StudioSettings' @@ -32,7 +32,10 @@ class MockPart { } } class MockSegment { - constructor(public _id: SegmentId, public _rank: number) {} + constructor( + public _id: SegmentId, + public _rank: number + ) {} } describe('selectNextPart', () => { diff --git a/packages/job-worker/src/playout/__tests__/timeline.test.ts b/packages/job-worker/src/playout/__tests__/timeline.test.ts index 6c5a6fe5b7..340c55ef11 100644 --- a/packages/job-worker/src/playout/__tests__/timeline.test.ts +++ b/packages/job-worker/src/playout/__tests__/timeline.test.ts @@ -8,17 +8,17 @@ import { setupDefaultRundownPlaylist, setupMockPeripheralDevice, setupMockShowStyleCompound, -} from '../../__mocks__/presetCollections' -import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context' +} from '../../__mocks__/presetCollections.js' +import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context.js' import { DBRundown, Rundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' -import { handleTakeNextPart } from '../take' -import { handleActivateHold } from '../holdJobs' -import { handleActivateRundownPlaylist, handleDeactivateRundownPlaylist } from '../activePlaylistJobs' -import { fixSnapshot } from '../../__mocks__/helpers/snapshot' -import { runJobWithPlayoutModel } from '../lock' -import { updateTimeline } from '../timeline/generate' -import { getSelectedPartInstances, getSortedPartsForRundown } from './lib' +import { handleTakeNextPart } from '../take.js' +import { handleActivateHold } from '../holdJobs.js' +import { handleActivateRundownPlaylist, handleDeactivateRundownPlaylist } from '../activePlaylistJobs.js' +import { fixSnapshot } from '../../__mocks__/helpers/snapshot.js' +import { runJobWithPlayoutModel } from '../lock.js' +import { updateTimeline } from '../timeline/generate.js' +import { getSelectedPartInstances, getSortedPartsForRundown } from './lib.js' import { PieceLifespan, IBlueprintPieceType, Time } from '@sofie-automation/blueprints-integration' import { AdLibPiece } from '@sofie-automation/corelib/dist/dataModel/AdLibPiece' import { RundownPlaylistId, RundownId, PartId, PartInstanceId } from '@sofie-automation/corelib/dist/dataModel/Ids' @@ -48,25 +48,25 @@ import { setupRundownWithOutTransitionAndInTransition, setupRundownWithOutTransitionEnableHold, setupRundownBase, -} from './helpers/rundowns' -import { defaultRundownPlaylist } from '../../__mocks__/defaultCollectionObjects' +} from './helpers/rundowns.js' +import { defaultRundownPlaylist } from '../../__mocks__/defaultCollectionObjects.js' import { ReadonlyDeep } from 'type-fest' -import { innerStartOrQueueAdLibPiece } from '../adlibUtils' +import { innerStartOrQueueAdLibPiece } from '../adlibUtils.js' import { EmptyPieceTimelineObjectsBlob } from '@sofie-automation/corelib/dist/dataModel/Piece' -import { adjustFakeTime, useFakeCurrentTime, useRealCurrentTime } from '../../__mocks__/time' -import { restartRandomId } from '../../__mocks__/nanoid' -import { ProcessedShowStyleCompound } from '../../jobs' -import { handleOnPlayoutPlaybackChanged, handleTimelineTriggerTime } from '../timings' +import { adjustFakeTime, useFakeCurrentTime, useRealCurrentTime } from '../../__mocks__/time.js' +import { restartRandomId } from '../../__mocks__/nanoid.js' +import { ProcessedShowStyleCompound } from '../../jobs/index.js' +import { handleOnPlayoutPlaybackChanged, handleTimelineTriggerTime } from '../timings/index.js' import { PlayoutChangedResult, PlayoutChangedType, } from '@sofie-automation/shared-lib/dist/peripheralDevice/peripheralDeviceAPI' -import * as _ from 'underscore' -import { PlayoutRundownModel } from '../model/PlayoutRundownModel' -import { PlayoutPartInstanceModel } from '../model/PlayoutPartInstanceModel' -import { PlayoutPartInstanceModelImpl } from '../model/implementation/PlayoutPartInstanceModelImpl' +import _ from 'underscore' +import { PlayoutRundownModel } from '../model/PlayoutRundownModel.js' +import { PlayoutPartInstanceModel } from '../model/PlayoutPartInstanceModel.js' +import { PlayoutPartInstanceModelImpl } from '../model/implementation/PlayoutPartInstanceModelImpl.js' import { mock } from 'jest-mock-extended' -import { QuickLoopService } from '../model/services/QuickLoopService' +import { QuickLoopService } from '../model/services/QuickLoopService.js' /** * An object used to represent the simplified timeline structure. @@ -217,7 +217,7 @@ function checkTimingsRaw( ? { childGroup: parsePieceGroupPrerollAndPostroll(pieceObj?.enable ?? []), controlObj: controlObj.enable, - } + } : null } else { const partGroupId = @@ -256,7 +256,7 @@ function checkTimingsRaw( ? { childGroup: parsePieceGroupPrerollAndPostroll(pieceObj?.enable ?? []), controlObj: controlObj.enable, - } + } : null } } @@ -352,21 +352,22 @@ async function doOnPlayoutPlaybackChanged( time: timings.baseTime, }, objId: getPartGroupId(timings.partId), - } + } : undefined, // The piece controlObjects start offset into the part, so need a manual offset - ...Object.entries(timings.pieceOffsets).map(([pieceInstanceId, offset]) => - offset !== null - ? { - type: PlayoutChangedType.PIECE_PLAYBACK_STARTED, - data: { - partInstanceId: timings.partId, - pieceInstanceId: protectString(pieceInstanceId), - time: timings.baseTime + offset, - }, - objId: getPieceControlObjectId(protectString(pieceInstanceId)), - } - : undefined + ...Object.entries(timings.pieceOffsets).map( + ([pieceInstanceId, offset]): PlayoutChangedResult | undefined => + offset !== null + ? { + type: PlayoutChangedType.PIECE_PLAYBACK_STARTED, + data: { + partInstanceId: timings.partId, + pieceInstanceId: protectString(pieceInstanceId), + time: timings.baseTime + offset, + }, + objId: getPieceControlObjectId(protectString(pieceInstanceId)), + } + : undefined ), ]), }) diff --git a/packages/job-worker/src/playout/abPlayback/__tests__/abPlayback.spec.ts b/packages/job-worker/src/playout/abPlayback/__tests__/abPlayback.spec.ts index e6ac20f779..754ee91994 100644 --- a/packages/job-worker/src/playout/abPlayback/__tests__/abPlayback.spec.ts +++ b/packages/job-worker/src/playout/abPlayback/__tests__/abPlayback.spec.ts @@ -11,9 +11,9 @@ import { ABSessionAssignments } from '@sofie-automation/corelib/dist/dataModel/R import { OnGenerateTimelineObjExt } from '@sofie-automation/corelib/dist/dataModel/Timeline' import { literal } from '@sofie-automation/corelib/dist/lib' import { protectString } from '@sofie-automation/corelib/dist/protectedString' -import { AssignmentResult, resolveAbAssignmentsFromRequests } from '../abPlaybackResolver' -import { calculateSessionTimeRanges } from '../abPlaybackSessions' -import { AbSessionHelper } from '../abSessionHelper' +import { AssignmentResult, resolveAbAssignmentsFromRequests } from '../abPlaybackResolver.js' +import { calculateSessionTimeRanges } from '../abPlaybackSessions.js' +import { AbSessionHelper } from '../abSessionHelper.js' const POOL_NAME = 'clip' @@ -33,7 +33,7 @@ function createBasicResolvedPieceInstance( const piece = literal({ _id: protectString(id), externalId: id, - name: id, + name: `name-${id}`, enable: { start, }, @@ -142,13 +142,37 @@ describe('resolveMediaPlayers', () => { [1, 2], 4500 ) - expect(assignments.failedRequired).toEqual(['inst_2_clip_ghi']) + expect(assignments.failedRequired).toEqual([{ id: 'inst_2_clip_ghi', name: 'ghi', pieceNames: ['name-2'] }]) expect(assignments.failedOptional).toHaveLength(0) expect(assignments.requests).toHaveLength(3) expect(assignments.requests).toEqual([ - { end: 5400, id: 'inst_0_clip_abc', playerId: 1, start: 400, optional: false }, - { end: 5400, id: 'inst_1_clip_def', playerId: 2, start: 400, optional: false }, - { end: 4800, id: 'inst_2_clip_ghi', playerId: undefined, start: 800, optional: false }, // Massive overlap + { + end: 5400, + id: 'inst_0_clip_abc', + name: 'abc', + playerId: 1, + start: 400, + optional: false, + pieceNames: ['name-0'], + }, + { + end: 5400, + id: 'inst_1_clip_def', + name: 'def', + playerId: 2, + start: 400, + optional: false, + pieceNames: ['name-1'], + }, + { + end: 4800, + id: 'inst_2_clip_ghi', + name: 'ghi', + playerId: undefined, + start: 800, + optional: false, + pieceNames: ['name-2'], + }, // Massive overlap ]) expect(mockGetPieceSessionId).toHaveBeenCalledTimes(3) @@ -189,13 +213,37 @@ describe('resolveMediaPlayers', () => { ['player1', 'player2'], 4500 ) - expect(assignments.failedRequired).toEqual(['inst_2_clip_ghi']) + expect(assignments.failedRequired).toEqual([{ id: 'inst_2_clip_ghi', name: 'ghi', pieceNames: ['name-2'] }]) expect(assignments.failedOptional).toHaveLength(0) expect(assignments.requests).toHaveLength(3) expect(assignments.requests).toEqual([ - { end: 5400, id: 'inst_0_clip_abc', playerId: 'player1', start: 400, optional: false }, - { end: 5400, id: 'inst_1_clip_def', playerId: 'player2', start: 400, optional: false }, - { end: 4800, id: 'inst_2_clip_ghi', playerId: undefined, start: 800, optional: false }, // Massive overlap + { + end: 5400, + id: 'inst_0_clip_abc', + name: 'abc', + playerId: 'player1', + start: 400, + optional: false, + pieceNames: ['name-0'], + }, + { + end: 5400, + id: 'inst_1_clip_def', + name: 'def', + playerId: 'player2', + start: 400, + optional: false, + pieceNames: ['name-1'], + }, + { + end: 4800, + id: 'inst_2_clip_ghi', + name: 'ghi', + playerId: undefined, + start: 800, + optional: false, + pieceNames: ['name-2'], + }, // Massive overlap ]) expect(mockGetPieceSessionId).toHaveBeenCalledTimes(3) @@ -236,13 +284,37 @@ describe('resolveMediaPlayers', () => { [1, 'player2'], 4500 ) - expect(assignments.failedRequired).toEqual(['inst_2_clip_ghi']) + expect(assignments.failedRequired).toEqual([{ id: 'inst_2_clip_ghi', name: 'ghi', pieceNames: ['name-2'] }]) expect(assignments.failedOptional).toHaveLength(0) expect(assignments.requests).toHaveLength(3) expect(assignments.requests).toEqual([ - { end: 5400, id: 'inst_0_clip_abc', playerId: 1, start: 400, optional: false }, - { end: 5400, id: 'inst_1_clip_def', playerId: 'player2', start: 400, optional: false }, - { end: 4800, id: 'inst_2_clip_ghi', playerId: undefined, start: 800, optional: false }, // Massive overlap + { + end: 5400, + id: 'inst_0_clip_abc', + name: 'abc', + playerId: 1, + start: 400, + optional: false, + pieceNames: ['name-0'], + }, + { + end: 5400, + id: 'inst_1_clip_def', + name: 'def', + playerId: 'player2', + start: 400, + optional: false, + pieceNames: ['name-1'], + }, + { + end: 4800, + id: 'inst_2_clip_ghi', + name: 'ghi', + playerId: undefined, + start: 800, + optional: false, + pieceNames: ['name-2'], + }, // Massive overlap ]) expect(mockGetPieceSessionId).toHaveBeenCalledTimes(3) @@ -286,7 +358,15 @@ describe('resolveMediaPlayers', () => { expect(assignments.failedOptional).toHaveLength(0) expect(assignments.requests).toHaveLength(1) expect(assignments.requests).toEqual([ - { end: 7400, id: 'tmp_clip_abc', playerId: 1, start: 400, optional: false }, + { + end: 7400, + id: 'tmp_clip_abc', + name: 'abc', + playerId: 1, + start: 400, + optional: false, + pieceNames: ['name-0', 'name-1', 'name-2', 'name-3'], + }, ]) expect(mockGetPieceSessionId).toHaveBeenCalledTimes(4) @@ -335,9 +415,33 @@ describe('resolveMediaPlayers', () => { expect(assignments.failedOptional).toHaveLength(0) expect(assignments.requests).toHaveLength(3) expect(assignments.requests).toEqual([ - { end: 5400, id: 'inst_0_clip_abc', playerId: 1, start: 400, optional: false }, - { end: 4800, id: 'inst_1_clip_def', playerId: 2, start: 800, optional: false }, - { end: 7400, id: 'inst_3_clip_ghi', playerId: 2, start: 6400, optional: false }, + { + end: 5400, + id: 'inst_0_clip_abc', + name: 'abc', + playerId: 1, + start: 400, + optional: false, + pieceNames: ['name-0'], + }, + { + end: 4800, + id: 'inst_1_clip_def', + name: 'def', + playerId: 2, + start: 800, + optional: false, + pieceNames: ['name-1'], + }, + { + end: 7400, + id: 'inst_3_clip_ghi', + name: 'ghi', + playerId: 2, + start: 6400, + optional: false, + pieceNames: ['name-3'], + }, ]) expect(mockGetPieceSessionId).toHaveBeenCalledTimes(3) @@ -382,9 +486,33 @@ describe('resolveMediaPlayers', () => { expect(assignments.failedOptional).toHaveLength(0) expect(assignments.requests).toHaveLength(3) expect(assignments.requests).toEqual([ - { end: 5400, id: 'inst_0_clip_abc', playerId: 1, start: 400, optional: false }, - { end: 6800, id: 'inst_1_clip_def', playerId: 2, start: 800, optional: false }, - { end: 6400, id: 'inst_3_clip_ghi', playerId: 1, start: 5400, optional: false }, + { + end: 5400, + id: 'inst_0_clip_abc', + name: 'abc', + playerId: 1, + start: 400, + optional: false, + pieceNames: ['name-0'], + }, + { + end: 6800, + id: 'inst_1_clip_def', + name: 'def', + playerId: 2, + start: 800, + optional: false, + pieceNames: ['name-1'], + }, + { + end: 6400, + id: 'inst_3_clip_ghi', + name: 'ghi', + playerId: 1, + start: 5400, + optional: false, + pieceNames: ['name-3'], + }, ]) expect(mockGetPieceSessionId).toHaveBeenCalledTimes(3) @@ -429,9 +557,33 @@ describe('resolveMediaPlayers', () => { expect(assignments.failedOptional).toHaveLength(0) expect(assignments.requests).toHaveLength(3) expect(assignments.requests).toEqual([ - { end: 5400, id: 'inst_0_clip_abc', playerId: 1, start: 400, optional: false }, - { end: 6800, id: 'inst_1_clip_def', playerId: 2, start: 800, optional: false }, - { end: 6400, id: 'inst_3_clip_ghi', playerId: 1, start: 5400, optional: false }, + { + end: 5400, + id: 'inst_0_clip_abc', + name: 'abc', + playerId: 1, + start: 400, + optional: false, + pieceNames: ['name-0'], + }, + { + end: 6800, + id: 'inst_1_clip_def', + name: 'def', + playerId: 2, + start: 800, + optional: false, + pieceNames: ['name-1'], + }, + { + end: 6400, + id: 'inst_3_clip_ghi', + name: 'ghi', + playerId: 1, + start: 5400, + optional: false, + pieceNames: ['name-3'], + }, ]) expect(mockGetPieceSessionId).toHaveBeenCalledTimes(3) @@ -454,11 +606,13 @@ describe('resolveMediaPlayers', () => { const previousAssignments: ABSessionAssignments = { inst_0_clip_abc: { sessionId: 'inst_0_clip_abc', + sessionName: 'abc', playerId: 5, lookahead: false, }, inst_1_clip_def: { sessionId: 'inst_1_clip_def', + sessionName: 'def', playerId: 1, lookahead: true, }, @@ -483,13 +637,37 @@ describe('resolveMediaPlayers', () => { [1, 2], 0 ) - expect(assignments.failedRequired).toEqual(['inst_2_clip_ghi']) + expect(assignments.failedRequired).toEqual([{ id: 'inst_2_clip_ghi', name: 'ghi', pieceNames: ['name-2'] }]) expect(assignments.failedOptional).toHaveLength(0) expect(assignments.requests).toHaveLength(3) expect(assignments.requests).toEqual([ - { end: 7400, id: 'inst_0_clip_abc', playerId: 2, start: 2400, optional: false }, - { end: 7400, id: 'inst_1_clip_def', playerId: 1, start: 2400, optional: false }, - { end: 6800, id: 'inst_2_clip_ghi', playerId: undefined, start: 2800, optional: false }, + { + end: 7400, + id: 'inst_0_clip_abc', + name: 'abc', + playerId: 2, + start: 2400, + optional: false, + pieceNames: ['name-0'], + }, + { + end: 7400, + id: 'inst_1_clip_def', + name: 'def', + playerId: 1, + start: 2400, + optional: false, + pieceNames: ['name-1'], + }, + { + end: 6800, + id: 'inst_2_clip_ghi', + name: 'ghi', + playerId: undefined, + start: 2800, + optional: false, + pieceNames: ['name-2'], + }, ]) expect(mockGetPieceSessionId).toHaveBeenCalledTimes(3) @@ -512,11 +690,13 @@ describe('resolveMediaPlayers', () => { const previousAssignments: ABSessionAssignments = { inst_0_clip_abc: { sessionId: 'inst_0_clip_abc', + sessionName: 'abc', playerId: 2, lookahead: false, }, inst_1_clip_def: { sessionId: 'inst_1_clip_def', + sessionName: 'def', playerId: 1, lookahead: false, }, @@ -542,12 +722,36 @@ describe('resolveMediaPlayers', () => { 0 ) expect(assignments.failedRequired).toHaveLength(0) - expect(assignments.failedOptional).toEqual(['inst_1_clip_def']) + expect(assignments.failedOptional).toEqual([{ id: 'inst_1_clip_def', name: 'def', pieceNames: ['name-1'] }]) expect(assignments.requests).toHaveLength(3) expect(assignments.requests).toEqual([ - { end: 7400, id: 'inst_0_clip_abc', playerId: 2, start: 2400, optional: false }, - { end: 7400, id: 'inst_1_clip_def', playerId: undefined, start: 2400, optional: true }, - { end: 6800, id: 'inst_2_clip_ghi', playerId: 1, start: 2800, optional: false }, + { + end: 7400, + id: 'inst_0_clip_abc', + name: 'abc', + playerId: 2, + start: 2400, + optional: false, + pieceNames: ['name-0'], + }, + { + end: 7400, + id: 'inst_1_clip_def', + name: 'def', + playerId: undefined, + start: 2400, + optional: true, + pieceNames: ['name-1'], + }, + { + end: 6800, + id: 'inst_2_clip_ghi', + name: 'ghi', + playerId: 1, + start: 2800, + optional: false, + pieceNames: ['name-2'], + }, ]) expect(mockGetPieceSessionId).toHaveBeenCalledTimes(3) diff --git a/packages/job-worker/src/playout/abPlayback/__tests__/abPlaybackResolver.spec.ts b/packages/job-worker/src/playout/abPlayback/__tests__/abPlaybackResolver.spec.ts index cf961f0490..28a9aa79ce 100644 --- a/packages/job-worker/src/playout/abPlayback/__tests__/abPlaybackResolver.spec.ts +++ b/packages/job-worker/src/playout/abPlayback/__tests__/abPlaybackResolver.spec.ts @@ -1,5 +1,5 @@ import { ABResolverOptions } from '@sofie-automation/blueprints-integration' -import { AssignmentResult, resolveAbAssignmentsFromRequests, SessionRequest } from '../abPlaybackResolver' +import { AssignmentResult, resolveAbAssignmentsFromRequests, SessionRequest } from '../abPlaybackResolver.js' const resolverOptions: ABResolverOptions = { idealGapBefore: 1000, @@ -21,21 +21,27 @@ describe('resolveAbAssignmentsFromRequests', () => { // Note: these should all collide { id: 'a', + name: 'a', start: 1000, end: undefined, playerId: 1, + pieceNames: [], }, { id: 'b', + name: 'b', start: 1000, end: undefined, playerId: 1, + pieceNames: [], }, { id: 'c', + name: 'c', start: 1000, end: undefined, playerId: 1, + pieceNames: [], }, ] @@ -50,13 +56,17 @@ describe('resolveAbAssignmentsFromRequests', () => { const requests: SessionRequest[] = [ { id: 'a', + name: 'a', start: 1000, end: undefined, + pieceNames: [], }, { id: 'b', + name: 'b', start: 2000, end: undefined, + pieceNames: [], }, ] @@ -72,14 +82,18 @@ describe('resolveAbAssignmentsFromRequests', () => { const requests: SessionRequest[] = [ { id: 'a', + name: 'a', start: 1000, end: undefined, playerId: 2, + pieceNames: [], }, { id: 'b', + name: 'b', start: 2000, end: undefined, + pieceNames: [], }, ] @@ -95,25 +109,31 @@ describe('resolveAbAssignmentsFromRequests', () => { const requests: SessionRequest[] = [ { id: 'a', + name: 'a', start: 1000, end: undefined, + pieceNames: [], }, { id: 'b', + name: 'b', start: 2000, end: undefined, + pieceNames: [], }, { id: 'c', + name: 'c', start: 3000, end: undefined, + pieceNames: [], }, ] const res = resolveAbAssignmentsFromRequests(resolverOptions, TWO_SLOTS, requests, 10000) expect(res).toBeTruthy() expect(res.failedOptional).toEqual([]) - expect(res.failedRequired).toEqual(['c']) + expect(res.failedRequired).toEqual([{ id: 'c', name: 'c', pieceNames: [] }]) expectGotPlayer(res, 'a', 1) expectGotPlayer(res, 'b', 2) expectGotPlayer(res, 'c', undefined) @@ -123,27 +143,33 @@ describe('resolveAbAssignmentsFromRequests', () => { const requests: SessionRequest[] = [ { id: 'a', + name: 'a', start: 1000, end: undefined, playerId: 2, + pieceNames: [], }, { id: 'b', + name: 'b', start: 2000, end: undefined, + pieceNames: [], }, { id: 'c', + name: 'c', start: 3000, end: undefined, playerId: 1, + pieceNames: [], }, ] const res = resolveAbAssignmentsFromRequests(resolverOptions, TWO_SLOTS, requests, 10000) expect(res).toBeTruthy() expect(res.failedOptional).toEqual([]) - expect(res.failedRequired).toEqual(['b']) + expect(res.failedRequired).toEqual([{ id: 'b', name: 'b', pieceNames: [] }]) expectGotPlayer(res, 'a', 2) expectGotPlayer(res, 'b', undefined) expectGotPlayer(res, 'c', 1) @@ -153,25 +179,33 @@ describe('resolveAbAssignmentsFromRequests', () => { const requests: SessionRequest[] = [ { id: 'a', + name: 'a', start: 1000, end: 10000, playerId: 2, + pieceNames: [], }, { id: 'b', + name: 'b', start: 2000, end: 10500, playerId: 1, + pieceNames: [], }, { id: 'c', + name: 'c', start: 10900, end: undefined, + pieceNames: [], }, { id: 'd', + name: 'd', start: 10950, end: undefined, + pieceNames: [], }, ] @@ -189,25 +223,33 @@ describe('resolveAbAssignmentsFromRequests', () => { const requests: SessionRequest[] = [ { id: 'a', + name: 'a', start: 1000, end: 9000, playerId: 2, + pieceNames: [], }, { id: 'b', + name: 'b', start: 2000, end: 8500, playerId: 1, + pieceNames: [], }, { id: 'c', + name: 'c', start: 10900, end: undefined, + pieceNames: [], }, { id: 'd', + name: 'd', start: 10950, end: undefined, + pieceNames: [], }, ] @@ -225,31 +267,41 @@ describe('resolveAbAssignmentsFromRequests', () => { const requests: SessionRequest[] = [ { id: 'a', + name: 'a', start: 1000, end: 15000, playerId: 3, + pieceNames: [], }, { id: 'b', + name: 'b', start: 2000, end: 16000, playerId: 1, + pieceNames: [], }, { id: 'c', + name: 'c', start: 20000, end: 40000, + pieceNames: [], }, { id: 'd', + name: 'd', start: 30000, end: undefined, playerId: 1, + pieceNames: [], }, { id: 'e', + name: 'e', start: 35000, end: undefined, + pieceNames: [], }, ] @@ -269,29 +321,37 @@ describe('resolveAbAssignmentsFromRequests', () => { // current part { id: 'a', + name: 'a', start: 1000, end: undefined, playerId: 2, + pieceNames: [], }, // adlib { id: 'b', + name: 'b', start: 10000, end: undefined, + pieceNames: [], }, // lookaheads { id: 'c', + name: 'c', start: Number.POSITIVE_INFINITY, end: undefined, playerId: 1, lookaheadRank: 1, + pieceNames: [], }, { id: 'd', + name: 'd', start: Number.POSITIVE_INFINITY, end: undefined, lookaheadRank: 2, + pieceNames: [], }, ] @@ -310,30 +370,38 @@ describe('resolveAbAssignmentsFromRequests', () => { // current part { id: 'a', + name: 'a', start: 1000, end: 10500, playerId: 2, + pieceNames: [], }, // adlib { id: 'b', + name: 'b', start: 10000, end: undefined, + pieceNames: [], }, // lookaheads (in order of future use) { id: 'c', + name: 'c', start: Number.POSITIVE_INFINITY, end: undefined, playerId: 1, lookaheadRank: 1, + pieceNames: [], }, { id: 'd', + name: 'd', start: Number.POSITIVE_INFINITY, end: undefined, playerId: 2, lookaheadRank: 2, + pieceNames: [], }, ] @@ -351,36 +419,46 @@ describe('resolveAbAssignmentsFromRequests', () => { // current part { id: 'a', + name: 'a', start: 1000, end: 9500, playerId: 2, + pieceNames: [], }, // adlib { id: 'b', + name: 'b', start: 10000, end: undefined, + pieceNames: [], }, // adlib { id: 'e', + name: 'e', start: 10000, end: undefined, + pieceNames: [], }, // lookaheads (in order of future use) { id: 'c', + name: 'c', start: Number.POSITIVE_INFINITY, end: undefined, playerId: 1, lookaheadRank: 1, + pieceNames: [], }, { id: 'd', + name: 'd', start: Number.POSITIVE_INFINITY, end: undefined, playerId: 2, lookaheadRank: 2, + pieceNames: [], }, ] @@ -399,30 +477,38 @@ describe('resolveAbAssignmentsFromRequests', () => { // current part { id: 'a', + name: 'a', start: 1000, end: 10500, playerId: 2, + pieceNames: [], }, // adlib { id: 'b', + name: 'b', start: 10000, end: 15000, + pieceNames: [], }, // lookaheads (in order of future use) { id: 'c', + name: 'c', start: Number.POSITIVE_INFINITY, end: undefined, playerId: 1, lookaheadRank: 1, + pieceNames: [], }, { id: 'd', + name: 'd', start: Number.POSITIVE_INFINITY, end: undefined, playerId: 2, lookaheadRank: 2, + pieceNames: [], }, ] @@ -441,36 +527,46 @@ describe('resolveAbAssignmentsFromRequests', () => { // current part { id: 'a', + name: 'a', start: 1000, end: 10500, playerId: 2, + pieceNames: [], }, // adlib { id: 'b', + name: 'b', start: 10000, end: 20500, + pieceNames: [], }, // next part { id: 'a', + name: 'a', start: 20000, end: undefined, playerId: 1, + pieceNames: [], }, // lookaheads (in order of future use) { id: 'c', + name: 'c', start: Number.POSITIVE_INFINITY, end: undefined, playerId: 2, lookaheadRank: 1, + pieceNames: [], }, { id: 'd', + name: 'd', start: Number.POSITIVE_INFINITY, end: undefined, lookaheadRank: 2, + pieceNames: [], }, ] @@ -489,36 +585,46 @@ describe('resolveAbAssignmentsFromRequests', () => { // current part { id: 'a', + name: 'a', start: 1000, end: 10500, playerId: 2, + pieceNames: [], }, // adlib { id: 'b', + name: 'b', start: 10000, end: 20500, + pieceNames: [], }, // next part { id: 'e', + name: 'e', start: 20000, end: undefined, playerId: 1, + pieceNames: [], }, // lookaheads (in order of future use) { id: 'c', + name: 'c', start: Number.POSITIVE_INFINITY, end: undefined, playerId: 2, lookaheadRank: 1, + pieceNames: [], }, { id: 'd', + name: 'd', start: Number.POSITIVE_INFINITY, end: undefined, lookaheadRank: 2, + pieceNames: [], }, ] @@ -538,43 +644,53 @@ describe('resolveAbAssignmentsFromRequests', () => { // current part { id: 'a', + name: 'a', start: 1000, end: undefined, playerId: 2, + pieceNames: [], }, // bak { id: 'b', + name: 'b', start: 5000, optional: true, playerId: 1, end: undefined, + pieceNames: [], }, // adlib { id: 'c', + name: 'c', start: 10000, end: undefined, + pieceNames: [], }, // lookaheads { id: 'd', + name: 'd', start: Number.POSITIVE_INFINITY, end: undefined, lookaheadRank: 1, + pieceNames: [], }, { id: 'e', + name: 'e', start: Number.POSITIVE_INFINITY, end: undefined, lookaheadRank: 2, + pieceNames: [], }, ] const res = resolveAbAssignmentsFromRequests(resolverOptions, TWO_SLOTS, requests, 10000) expect(res).toBeTruthy() expect(res.failedOptional).toEqual([]) - expect(res.failedRequired).toEqual(['c']) + expect(res.failedRequired).toEqual([{ id: 'c', name: 'c', pieceNames: [] }]) expectGotPlayer(res, 'a', 2) expectGotPlayer(res, 'b', 1) expectGotPlayer(res, 'c', undefined) @@ -585,36 +701,46 @@ describe('resolveAbAssignmentsFromRequests', () => { // current clip { id: 'a', + name: 'a', start: 1000, end: undefined, playerId: 2, + pieceNames: [], }, // previous clip { id: 'b', + name: 'b', start: 0, playerId: 1, end: 5000, + pieceNames: [], }, // lookaheads { id: 'd', + name: 'd', start: Number.POSITIVE_INFINITY, end: undefined, lookaheadRank: 1, + pieceNames: [], }, { id: 'e', + name: 'e', start: Number.POSITIVE_INFINITY, playerId: 3, // From before end: undefined, lookaheadRank: 2, + pieceNames: [], }, { id: 'f', + name: 'f', start: Number.POSITIVE_INFINITY, end: undefined, lookaheadRank: 3, + pieceNames: [], }, ] @@ -635,38 +761,48 @@ describe('resolveAbAssignmentsFromRequests', () => { // current clip { id: 'a', + name: 'a', start: 1000, end: undefined, playerId: 2, + pieceNames: [], }, // previous clip { id: 'b', + name: 'b', start: 0, playerId: 1, end: 5000, + pieceNames: [], }, // lookaheads { id: 'd', + name: 'd', start: Number.POSITIVE_INFINITY, end: undefined, lookaheadRank: 1, playerId: 1, + pieceNames: [], }, { id: 'e', + name: 'e', start: Number.POSITIVE_INFINITY, playerId: 3, // From before end: undefined, lookaheadRank: 2, + pieceNames: [], }, { id: 'f', + name: 'f', start: Number.POSITIVE_INFINITY, end: undefined, lookaheadRank: 3, playerId: 2, + pieceNames: [], }, ] @@ -686,31 +822,39 @@ describe('resolveAbAssignmentsFromRequests', () => { // current clip { id: 'a', + name: 'a', start: 1000, end: undefined, playerId: 3, + pieceNames: [], }, // previous clip { id: 'b', + name: 'b', start: 0, playerId: 1, end: 5000, + pieceNames: [], }, // lookaheads { id: 'd', + name: 'd', start: Number.POSITIVE_INFINITY, end: undefined, lookaheadRank: 1, playerId: 1, + pieceNames: [], }, { id: 'e', + name: 'e', start: Number.POSITIVE_INFINITY, playerId: 2, end: undefined, lookaheadRank: 2, + pieceNames: [], }, ] @@ -729,36 +873,46 @@ describe('resolveAbAssignmentsFromRequests', () => { // current clip { id: 'a', + name: 'a', start: 1000, end: 11000, playerId: 1, + pieceNames: [], }, { id: 'b', + name: 'b', start: 13000, // soon end: undefined, playerId: 1, + pieceNames: [], }, { id: 'c', + name: 'c', start: 1000, end: undefined, playerId: 2, + pieceNames: [], }, // lookaheads { id: 'd', + name: 'd', start: Number.POSITIVE_INFINITY, end: undefined, lookaheadRank: 1, playerId: 1, + pieceNames: [], }, { id: 'e', + name: 'e', start: Number.POSITIVE_INFINITY, playerId: 2, end: undefined, lookaheadRank: 2, + pieceNames: [], }, ] diff --git a/packages/job-worker/src/playout/abPlayback/__tests__/abSessionHelper.spec.ts b/packages/job-worker/src/playout/abPlayback/__tests__/abSessionHelper.spec.ts index 87936ee58b..8cc718ff50 100644 --- a/packages/job-worker/src/playout/abPlayback/__tests__/abSessionHelper.spec.ts +++ b/packages/job-worker/src/playout/abPlayback/__tests__/abSessionHelper.spec.ts @@ -5,10 +5,10 @@ import { ABSessionInfo } from '@sofie-automation/corelib/dist/dataModel/RundownP import { OnGenerateTimelineObjExt } from '@sofie-automation/corelib/dist/dataModel/Timeline' import { clone, getRandomId, omit } from '@sofie-automation/corelib/dist/lib' import { protectString, unprotectString } from '@sofie-automation/corelib/dist/protectedString' -import { MockJobContext, setupDefaultJobEnvironment } from '../../../__mocks__/context' -import _ = require('underscore') -import { setupDefaultRundownPlaylist, setupMockShowStyleCompound } from '../../../__mocks__/presetCollections' -import { AbSessionHelper } from '../abSessionHelper' +import { MockJobContext, setupDefaultJobEnvironment } from '../../../__mocks__/context.js' +import _ from 'underscore' +import { setupDefaultRundownPlaylist, setupMockShowStyleCompound } from '../../../__mocks__/presetCollections.js' +import { AbSessionHelper } from '../abSessionHelper.js' import { PieceInstance } from '@sofie-automation/corelib/dist/dataModel/PieceInstance' import { TimelineObjectAbSessionInfo } from '@sofie-automation/shared-lib/dist/core/model/Timeline' diff --git a/packages/job-worker/src/playout/abPlayback/__tests__/applyAssignments.spec.ts b/packages/job-worker/src/playout/abPlayback/__tests__/applyAssignments.spec.ts index af6a9a4e0b..0e416cb255 100644 --- a/packages/job-worker/src/playout/abPlayback/__tests__/applyAssignments.spec.ts +++ b/packages/job-worker/src/playout/abPlayback/__tests__/applyAssignments.spec.ts @@ -3,9 +3,9 @@ import { ABSessionAssignments } from '@sofie-automation/corelib/dist/dataModel/R import { OnGenerateTimelineObjExt } from '@sofie-automation/corelib/dist/dataModel/Timeline' import { literal } from '@sofie-automation/corelib/dist/lib' import { protectString } from '@sofie-automation/corelib/dist/protectedString' -import { CommonContext } from '../../../blueprints/context' -import { AbSessionHelper } from '../abSessionHelper' -import { applyAbPlayerObjectAssignments } from '../applyAssignments' +import { CommonContext } from '../../../blueprints/context/index.js' +import { AbSessionHelper } from '../abSessionHelper.js' +import { applyAbPlayerObjectAssignments } from '../applyAssignments.js' const POOL_NAME = 'clip' @@ -42,11 +42,13 @@ describe('applyMediaPlayersAssignments', () => { const previousAssignments: ABSessionAssignments = { abc: { sessionId: 'abc', + sessionName: 'abc', playerId: 5, lookahead: false, }, def: { sessionId: 'def', + sessionName: 'def', playerId: 3, lookahead: true, }, @@ -68,6 +70,7 @@ describe('applyMediaPlayersAssignments', () => { const previousAssignments: ABSessionAssignments = { piece0_clip_def: { sessionId: 'piece0_clip_def', + sessionName: 'def', playerId: 3, lookahead: false, }, diff --git a/packages/job-worker/src/playout/abPlayback/__tests__/routeSetDisabling.spec.ts b/packages/job-worker/src/playout/abPlayback/__tests__/routeSetDisabling.spec.ts index 88228e04ec..0ba6861738 100644 --- a/packages/job-worker/src/playout/abPlayback/__tests__/routeSetDisabling.spec.ts +++ b/packages/job-worker/src/playout/abPlayback/__tests__/routeSetDisabling.spec.ts @@ -1,5 +1,5 @@ import { StudioRouteBehavior, StudioRouteSet } from '@sofie-automation/corelib/dist/dataModel/Studio' -import { abPoolFilterDisabled, findPlayersInRouteSets } from '../routeSetDisabling' +import { abPoolFilterDisabled, findPlayersInRouteSets } from '../routeSetDisabling.js' import { ABPlayerDefinition } from '@sofie-automation/blueprints-integration' import { clone } from '@sofie-automation/corelib/dist/lib' diff --git a/packages/job-worker/src/playout/abPlayback/abPlaybackResolver.ts b/packages/job-worker/src/playout/abPlayback/abPlaybackResolver.ts index 217f9bab51..e968b55e42 100644 --- a/packages/job-worker/src/playout/abPlayback/abPlaybackResolver.ts +++ b/packages/job-worker/src/playout/abPlayback/abPlaybackResolver.ts @@ -1,21 +1,29 @@ import type { AbPlayerId, ABResolverOptions } from '@sofie-automation/blueprints-integration' import { clone } from '@sofie-automation/corelib/dist/lib' -import * as _ from 'underscore' +import _ from 'underscore' export interface SessionRequest { readonly id: string + readonly name: string readonly start: number readonly end: number | undefined readonly optional?: boolean readonly lookaheadRank?: number playerId?: AbPlayerId + pieceNames: string[] +} + +export interface FailedSession { + id: string + name: string + pieceNames: string[] } export interface AssignmentResult { /** Any non-optional sessions which were not assigned a player */ - failedRequired: string[] + failedRequired: FailedSession[] /** Any optional sessions which were not assigned a player */ - failedOptional: string[] + failedOptional: FailedSession[] /** All of the requests with their player assignments set */ requests: Readonly } @@ -312,9 +320,9 @@ export function resolveAbAssignmentsFromRequests( if (req.lookaheadRank !== undefined) { // ignore } else if (req.optional) { - res.failedOptional.push(req.id) + res.failedOptional.push({ id: req.id, name: req.name, pieceNames: req.pieceNames }) } else { - res.failedRequired.push(req.id) + res.failedRequired.push({ id: req.id, name: req.name, pieceNames: req.pieceNames }) } } } diff --git a/packages/job-worker/src/playout/abPlayback/abPlaybackSessions.ts b/packages/job-worker/src/playout/abPlayback/abPlaybackSessions.ts index 1a9fd75e50..6c99b94f85 100644 --- a/packages/job-worker/src/playout/abPlayback/abPlaybackSessions.ts +++ b/packages/job-worker/src/playout/abPlayback/abPlaybackSessions.ts @@ -2,9 +2,9 @@ import { OnGenerateTimelineObj, TSR } from '@sofie-automation/blueprints-integra import { ResolvedPieceInstance } from '@sofie-automation/corelib/dist/dataModel/PieceInstance' import { ABSessionAssignments } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { OnGenerateTimelineObjExt } from '@sofie-automation/corelib/dist/dataModel/Timeline' -import * as _ from 'underscore' -import { SessionRequest } from './abPlaybackResolver' -import { AbSessionHelper } from './abSessionHelper' +import _ from 'underscore' +import { SessionRequest } from './abPlaybackResolver.js' +import { AbSessionHelper } from './abSessionHelper.js' import { ReadonlyDeep } from 'type-fest' /** @@ -44,21 +44,25 @@ export function calculateSessionTimeRanges( // This session is already known, so extend the session to cover all the pieces sessionRequests[sessionId] = { id: sessionId, + name: session.sessionName, start: Math.min(val.start, start), end: val.end === undefined || end === undefined ? undefined : Math.max(val.end, end), optional: val.optional && (session.optional ?? false), lookaheadRank: undefined, playerId: previousAssignmentMap?.[sessionId]?.playerId, // Persist previous assignments + pieceNames: [...(val.pieceNames || []), p.instance.piece.name], } } else { // New session sessionRequests[sessionId] = { id: sessionId, + name: session.sessionName, start, end, optional: session.optional ?? false, lookaheadRank: undefined, playerId: previousAssignmentMap?.[sessionId]?.playerId, // Persist previous assignments + pieceNames: [p.instance.piece.name], } } } @@ -67,7 +71,10 @@ export function calculateSessionTimeRanges( const result = _.compact(Object.values(sessionRequests)) // Include lookaheads, as they dont have pieces - const groupedLookaheadMap = new Map>>() + const groupedLookaheadMap = new Map< + string, + { name: string; objs: Array> } + >() for (const obj of timelineObjects) { if ( !!obj.isLookahead && @@ -80,16 +87,20 @@ export function calculateSessionTimeRanges( for (const session of obj.abSessions) { if (session.poolName === poolName) { const sessionId = abSessionHelper.getTimelineObjectAbSessionId(obj, session) - if (sessionId) { - const existing = groupedLookaheadMap.get(sessionId) - groupedLookaheadMap.set(sessionId, existing ? [...existing, obj] : [obj]) + if (!sessionId) continue + + const existing = groupedLookaheadMap.get(sessionId) + if (existing) { + existing.objs.push(obj) + } else { + groupedLookaheadMap.set(sessionId, { name: session.sessionName, objs: [obj] }) } } } } } - const groupedLookahead = Array.from(groupedLookaheadMap.entries()).map(([id, objs]) => ({ objs, id })) + const groupedLookahead = Array.from(groupedLookaheadMap.entries()).map(([id, info]) => ({ id, ...info })) const sortedLookaheadGroups = _.sortBy(groupedLookahead, (grp) => { // Find the highest priority of the objects const r = _.max(_.pluck(grp.objs, 'priority')) || -900 @@ -100,10 +111,12 @@ export function calculateSessionTimeRanges( if (!sessionRequests[grp.id]) { result.push({ id: grp.id, + name: grp.name, start: Number.MAX_SAFE_INTEGER, // Distant future end: undefined, lookaheadRank: i + 1, // This is so that we can easily work out which to use first playerId: previousAssignmentMap?.[grp.id]?.playerId, + pieceNames: [], }) } }) diff --git a/packages/job-worker/src/playout/abPlayback/applyAssignments.ts b/packages/job-worker/src/playout/abPlayback/applyAssignments.ts index 62cae611fc..bb3096488b 100644 --- a/packages/job-worker/src/playout/abPlayback/applyAssignments.ts +++ b/packages/job-worker/src/playout/abPlayback/applyAssignments.ts @@ -8,10 +8,10 @@ import { } from '@sofie-automation/blueprints-integration' import { ABSessionAssignment, ABSessionAssignments } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { OnGenerateTimelineObjExt } from '@sofie-automation/corelib/dist/dataModel/Timeline' -import { logger } from '../../logging' -import * as _ from 'underscore' -import { SessionRequest } from './abPlaybackResolver' -import { AbSessionHelper } from './abSessionHelper' +import { logger } from '../../logging.js' +import _ from 'underscore' +import { SessionRequest } from './abPlaybackResolver.js' +import { AbSessionHelper } from './abSessionHelper.js' import { ReadonlyDeep } from 'type-fest' /** @@ -35,24 +35,28 @@ export function applyAbPlayerObjectAssignments( poolName: string ): ABSessionAssignments { const newAssignments: ABSessionAssignments = {} - const persistAssignment = (sessionId: string, playerId: AbPlayerId, lookahead: boolean): void => { + const persistAssignment = (session: ABSessionAssignment): void => { // Track the assignment, so that the next onTimelineGenerate can try to reuse the same session - if (newAssignments[sessionId]) { + if (newAssignments[session.sessionId]) { // TODO - warn? } - newAssignments[sessionId] = { sessionId, playerId, lookahead } + newAssignments[session.sessionId] = session } // collect objects by their sessionId - const groupedObjectsMap = new Map>() + const groupedObjectsMap = new Map }>() for (const obj of timelineObjs) { if (obj.abSessions && obj.pieceInstanceId) { for (const session of obj.abSessions) { if (session.poolName === poolName) { const sessionId = abSessionHelper.getTimelineObjectAbSessionId(obj, session) - if (sessionId) { - const existing = groupedObjectsMap.get(sessionId) - groupedObjectsMap.set(sessionId, existing ? [...existing, obj] : [obj]) + if (!sessionId) continue + + const existing = groupedObjectsMap.get(sessionId) + if (existing) { + existing.objs.push(obj) + } else { + groupedObjectsMap.set(sessionId, { name: session.sessionName, objs: [obj] }) } } } @@ -63,7 +67,7 @@ export function applyAbPlayerObjectAssignments( const unexpectedSessions: string[] = [] // Apply the known assignments - for (const [sessionId, objs] of groupedObjectsMap.entries()) { + for (const [sessionId, info] of groupedObjectsMap.entries()) { if (sessionId === 'undefined') continue const matchingAssignment = resolvedAssignments.find((req) => req.id === sessionId) @@ -76,24 +80,34 @@ export function applyAbPlayerObjectAssignments( abConfiguration, poolName, matchingAssignment.playerId, - objs + info.objs ) ) - persistAssignment(sessionId, matchingAssignment.playerId, !!matchingAssignment.lookaheadRank) + persistAssignment({ + sessionId, + sessionName: matchingAssignment.name, + playerId: matchingAssignment.playerId, + lookahead: !!matchingAssignment.lookaheadRank, + }) } else { // A warning will already have been raised about this having no player } } else { // This is a group that shouldn't exist, so are likely a bug. There isnt a lot we can do beyond warn about the issue - unexpectedSessions.push(`${sessionId}(${objs.map((obj) => obj.id).join(',')})`) + unexpectedSessions.push(`${sessionId}(${info.objs.map((obj) => obj.id).join(',')})`) // If there was a previous assignment, hopefully that is better than nothing const prev = previousAssignmentMap?.[sessionId] if (prev) { failedObjects.push( - ...updateObjectsToAbPlayer(blueprintContext, abConfiguration, poolName, prev.playerId, objs) + ...updateObjectsToAbPlayer(blueprintContext, abConfiguration, poolName, prev.playerId, info.objs) ) - persistAssignment(sessionId, prev.playerId, false) + persistAssignment({ + sessionId, + sessionName: '?', + playerId: prev.playerId, + lookahead: false, + }) } } } @@ -110,7 +124,7 @@ export function applyAbPlayerObjectAssignments( for (const assignment of Object.values(newAssignments)) { if (!assignment) continue logger.silly( - `ABPlayback: Assigned session "${poolName}"-"${assignment.sessionId}" to player "${assignment.playerId}" (lookahead: ${assignment.lookahead})` + `ABPlayback: Assigned session "${poolName}"-"${assignment.sessionId}" (${assignment.sessionName}) to player "${assignment.playerId}" (lookahead: ${assignment.lookahead})` ) } @@ -131,8 +145,7 @@ function updateObjectsToAbPlayer( const updatedLayer = applylayerMoveRule(abConfiguration.timelineObjectLayerChangeRules, poolName, playerId, obj) - const updatedCustom = - abConfiguration.customApplyToObject && abConfiguration.customApplyToObject(context, poolName, playerId, obj) + const updatedCustom = abConfiguration.customApplyToObject?.(context, poolName, playerId, obj) if (!updatedKeyframes && !updatedLayer && !updatedCustom) { failedObjects.push(obj) diff --git a/packages/job-worker/src/playout/abPlayback/index.ts b/packages/job-worker/src/playout/abPlayback/index.ts index f3b0c80c8e..a4598d260f 100644 --- a/packages/job-worker/src/playout/abPlayback/index.ts +++ b/packages/job-worker/src/playout/abPlayback/index.ts @@ -6,20 +6,21 @@ import { } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { OnGenerateTimelineObjExt } from '@sofie-automation/corelib/dist/dataModel/Timeline' import { endTrace, sendTrace, startTrace } from '@sofie-automation/corelib/dist/influxdb' -import { WrappedShowStyleBlueprint } from '../../blueprints/cache' +import { WrappedShowStyleBlueprint } from '../../blueprints/cache.js' import { ReadonlyDeep } from 'type-fest' -import { JobContext, ProcessedShowStyleCompound } from '../../jobs' -import { getCurrentTime } from '../../lib' -import { resolveAbAssignmentsFromRequests, SessionRequest } from './abPlaybackResolver' -import { calculateSessionTimeRanges } from './abPlaybackSessions' -import { applyAbPlayerObjectAssignments } from './applyAssignments' -import { AbSessionHelper } from './abSessionHelper' -import { ShowStyleContext } from '../../blueprints/context' -import { logger } from '../../logging' +import { JobContext, ProcessedShowStyleCompound } from '../../jobs/index.js' +import { getCurrentTime } from '../../lib/index.js' +import { resolveAbAssignmentsFromRequests, SessionRequest } from './abPlaybackResolver.js' +import { calculateSessionTimeRanges } from './abPlaybackSessions.js' +import { applyAbPlayerObjectAssignments } from './applyAssignments.js' +import { AbSessionHelper } from './abSessionHelper.js' +import { ShowStyleContext } from '../../blueprints/context/index.js' +import { logger } from '../../logging.js' import { ABPlayerDefinition, NoteSeverity } from '@sofie-automation/blueprints-integration' -import { abPoolFilterDisabled, findPlayersInRouteSets } from './routeSetDisabling' -import type { INotification } from '../../notifications/NotificationsModel' +import { abPoolFilterDisabled, findPlayersInRouteSets } from './routeSetDisabling.js' +import type { INotification } from '../../notifications/NotificationsModel.js' import { generateTranslation } from '@sofie-automation/corelib/dist/lib' +import _ from 'underscore' export interface ABPlaybackResult { assignments: Record @@ -68,7 +69,7 @@ export function applyAbPlaybackForTimeline( for (const assignment of Object.values(assignments)) { if (assignment) { logger.silly( - `ABPlayback: Previous assignment "${pool}"-"${assignment.sessionId}" to player "${assignment.playerId}"` + `ABPlayback: Previous assignment "${pool}"-"${assignment.sessionId}" (${assignment.sessionName}) to player "${assignment.playerId}"` ) } } @@ -109,34 +110,43 @@ export function applyAbPlaybackForTimeline( for (const assignment of Object.values(assignments.requests)) { logger.silly( - `ABPlayback resolved session "${poolName}"-"${assignment.id}" to player "${ + `ABPlayback resolved session "${poolName}"-"${assignment.id}" (${assignment.name}) to player "${ assignment.playerId }" (${JSON.stringify(assignment)})` ) } - if (assignments.failedRequired.length > 0) { + for (const failedSession of assignments.failedRequired) { + const uniqueNames = _.uniq(failedSession.pieceNames).join(', ') logger.warn( - `ABPlayback failed to assign sessions for "${poolName}": ${JSON.stringify(assignments.failedRequired)}` + `ABPlayback failed to assign session for "${poolName}"-"${failedSession.id}" (${failedSession.name}): ${uniqueNames}` ) + + // Ignore lookahead + if (failedSession.pieceNames.length === 0) continue + notifications.push({ id: `failedRequired-${poolName}`, severity: NoteSeverity.ERROR, - message: generateTranslation('Failed to assign players for {{count}} sessions', { - count: assignments.failedRequired.length, + message: generateTranslation('Failed to assign AB player for {{pieceNames}}', { + pieceNames: uniqueNames, }), }) } - if (assignments.failedOptional.length > 0) { + + for (const failedSession of assignments.failedOptional) { + const uniqueNames = _.uniq(failedSession.pieceNames).join(', ') logger.info( - `ABPlayback failed to assign optional sessions for "${poolName}": ${JSON.stringify( - assignments.failedOptional - )}` + `ABPlayback failed to assign optional session for "${poolName}"-"${failedSession.id}" (${failedSession.name}): ${uniqueNames}` ) + + // Ignore lookahead + if (failedSession.pieceNames.length === 0) continue + notifications.push({ - id: `failedOptional-${poolName}`, + id: `failedRequired-${poolName}`, severity: NoteSeverity.WARNING, - message: generateTranslation('Failed to assign players for {{count}} non-critical sessions', { - count: assignments.failedOptional.length, + message: generateTranslation('Failed to assign non-critical AB player for {{pieceNames}}', { + pieceNames: uniqueNames, }), }) } diff --git a/packages/job-worker/src/playout/abPlayback/routeSetDisabling.ts b/packages/job-worker/src/playout/abPlayback/routeSetDisabling.ts index 9f71f1d0ac..7ed73199f7 100644 --- a/packages/job-worker/src/playout/abPlayback/routeSetDisabling.ts +++ b/packages/job-worker/src/playout/abPlayback/routeSetDisabling.ts @@ -1,6 +1,6 @@ import type { ABPlayerDefinition } from '@sofie-automation/blueprints-integration' import type { StudioRouteSet } from '@sofie-automation/corelib/dist/dataModel/Studio' -import { logger } from '../../logging' +import { logger } from '../../logging.js' import { ReadonlyDeep } from 'type-fest' /** diff --git a/packages/job-worker/src/playout/activePlaylistActions.ts b/packages/job-worker/src/playout/activePlaylistActions.ts index a1594b3ec9..c4c2dff622 100644 --- a/packages/job-worker/src/playout/activePlaylistActions.ts +++ b/packages/job-worker/src/playout/activePlaylistActions.ts @@ -2,17 +2,17 @@ import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' import { SegmentOrphanedReason } from '@sofie-automation/corelib/dist/dataModel/Segment' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' import { ReadonlyDeep } from 'type-fest' -import { RundownActivationContext } from '../blueprints/context/RundownActivationContext' -import { JobContext } from '../jobs' -import { getCurrentTime } from '../lib' -import { logger } from '../logging' -import { getActiveRundownPlaylistsInStudioFromDb } from '../studio/lib' -import { cleanTimelineDatastore } from './datastore' -import { resetRundownPlaylist } from './lib' -import { PlayoutModel } from './model/PlayoutModel' -import { selectNextPart } from './selectNextPart' -import { setNextPart } from './setNext' -import { updateStudioTimeline, updateTimeline } from './timeline/generate' +import { RundownActivationContext } from '../blueprints/context/RundownActivationContext.js' +import { JobContext } from '../jobs/index.js' +import { getCurrentTime } from '../lib/index.js' +import { logger } from '../logging.js' +import { getActiveRundownPlaylistsInStudioFromDb } from '../studio/lib.js' +import { cleanTimelineDatastore } from './datastore.js' +import { resetRundownPlaylist } from './lib.js' +import { PlayoutModel } from './model/PlayoutModel.js' +import { selectNextPart } from './selectNextPart.js' +import { setNextPart } from './setNext.js' +import { updateStudioTimeline, updateTimeline } from './timeline/generate.js' export async function activateRundownPlaylist( context: JobContext, diff --git a/packages/job-worker/src/playout/activePlaylistJobs.ts b/packages/job-worker/src/playout/activePlaylistJobs.ts index aba24296a2..a6b202d980 100644 --- a/packages/job-worker/src/playout/activePlaylistJobs.ts +++ b/packages/job-worker/src/playout/activePlaylistJobs.ts @@ -6,16 +6,16 @@ import { PrepareRundownForBroadcastProps, ResetRundownPlaylistProps, } from '@sofie-automation/corelib/dist/worker/studio' -import { JobContext } from '../jobs' -import { runJobWithPlayoutModel } from './lock' -import { resetRundownPlaylist } from './lib' -import { updateTimeline } from './timeline/generate' -import { getActiveRundownPlaylistsInStudioFromDb } from '../studio/lib' +import { JobContext } from '../jobs/index.js' +import { runJobWithPlayoutModel } from './lock.js' +import { resetRundownPlaylist } from './lib.js' +import { updateTimeline } from './timeline/generate.js' +import { getActiveRundownPlaylistsInStudioFromDb } from '../studio/lib.js' import { activateRundownPlaylist, deactivateRundownPlaylist, deactivateRundownPlaylistInner, -} from './activePlaylistActions' +} from './activePlaylistActions.js' import { ReadonlyDeep } from 'type-fest' async function checkNoOtherPlaylistsActive( diff --git a/packages/job-worker/src/playout/adlibAction.ts b/packages/job-worker/src/playout/adlibAction.ts index f2fa07118b..36eaa59a10 100644 --- a/packages/job-worker/src/playout/adlibAction.ts +++ b/packages/job-worker/src/playout/adlibAction.ts @@ -4,36 +4,37 @@ import { UserError, UserErrorMessage } from '@sofie-automation/corelib/dist/erro import { getRandomId } from '@sofie-automation/corelib/dist/lib' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' import { ExecuteActionProps, ExecuteActionResult } from '@sofie-automation/corelib/dist/worker/studio' -import { WrappedShowStyleBlueprint } from '../blueprints/cache' -import { DatastoreActionExecutionContext, ActionExecutionContext } from '../blueprints/context' -import { WatchedPackagesHelper } from '../blueprints/context/watchedPackages' -import { JobContext, ProcessedShowStyleCompound } from '../jobs' -import { getCurrentTime } from '../lib' +import { WrappedShowStyleBlueprint } from '../blueprints/cache.js' +import { DatastoreActionExecutionContext, ActionExecutionContext } from '../blueprints/context/index.js' +import { WatchedPackagesHelper } from '../blueprints/context/watchedPackages.js' +import { JobContext, ProcessedShowStyleCompound } from '../jobs/index.js' +import { getCurrentTime } from '../lib/index.js' import { ReadonlyDeep } from 'type-fest' -import { PlayoutModel, PlayoutModelPreInit } from './model/PlayoutModel' -import { runJobWithPlaylistLock } from './lock' -import { updateTimeline } from './timeline/generate' -import { performTakeToNextedPart } from './take' +import { PlayoutModel, PlayoutModelPreInit } from './model/PlayoutModel.js' +import { runJobWithPlaylistLock } from './lock.js' +import { updateTimeline } from './timeline/generate.js' +import { performTakeToNextedPart } from './take.js' import { ActionUserData } from '@sofie-automation/blueprints-integration' import { DBRundownPlaylist, SelectedPartInstance } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' -import { logger } from '../logging' +import { logger } from '../logging.js' import { AdLibActionId, BlueprintId, BucketAdLibActionId, RundownBaselineAdLibActionId, } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { PlayoutRundownModel } from './model/PlayoutRundownModel' -import { createPlayoutModelfromInitModel, loadPlayoutModelPreInit } from './model/implementation/LoadPlayoutModel' +import { PlayoutRundownModel } from './model/PlayoutRundownModel.js' +import { createPlayoutModelfromInitModel, loadPlayoutModelPreInit } from './model/implementation/LoadPlayoutModel.js' import { ActionPartChange, PartAndPieceInstanceActionService, applyActionSideEffects, -} from '../blueprints/context/services/PartAndPieceInstanceActionService' -import { convertNoteToNotification } from '../notifications/util' +} from '../blueprints/context/services/PartAndPieceInstanceActionService.js' +import { convertNoteToNotification } from '../notifications/util.js' import type { INoteBase } from '@sofie-automation/corelib/dist/dataModel/Notes' -import { NotificationsModelHelper } from '../notifications/NotificationsModelHelper' -import type { INotificationsModel } from '../notifications/NotificationsModel' +import { NotificationsModelHelper } from '../notifications/NotificationsModelHelper.js' +import type { INotificationsModel } from '../notifications/NotificationsModel.js' +import { PersistentPlayoutStateStore } from '../blueprints/context/services/PersistantStateStore.js' /** * Execute an AdLib Action @@ -230,8 +231,11 @@ export async function executeActionInner( ) try { + const blueprintPersistentState = new PersistentPlayoutStateStore(playoutModel.playlist.previousPersistentState) + await blueprint.blueprint.executeAction( actionContext, + blueprintPersistentState, actionParameters.actionId, actionParameters.userData, actionParameters.triggerMode, @@ -239,6 +243,10 @@ export async function executeActionInner( actionParameters.publicData, actionParameters.actionOptions ?? {} ) + + if (blueprintPersistentState.hasChanges) { + playoutModel.setBlueprintPersistentState(blueprintPersistentState.getAll()) + } } catch (err) { logger.error(`Error in showStyleBlueprint.executeAction: ${stringifyError(err)}`) throw UserError.fromUnknown(err) @@ -339,10 +347,10 @@ function storeNotificationsForCategory( type: 'partInstance', rundownId: partInstanceInfo.rundownId, partInstanceId: partInstanceInfo.partInstanceId, - } + } : { type: 'playlist', - }, + }, }) } } diff --git a/packages/job-worker/src/playout/adlibJobs.ts b/packages/job-worker/src/playout/adlibJobs.ts index 1625239dd4..836ea26c31 100644 --- a/packages/job-worker/src/playout/adlibJobs.ts +++ b/packages/job-worker/src/playout/adlibJobs.ts @@ -3,8 +3,8 @@ import { BucketAdLib } from '@sofie-automation/corelib/dist/dataModel/BucketAdLi import { PieceInstancePiece } from '@sofie-automation/corelib/dist/dataModel/PieceInstance' import { RundownHoldState } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { assertNever, clone } from '@sofie-automation/corelib/dist/lib' -import { logger } from '../logging' -import { JobContext, ProcessedShowStyleCompound } from '../jobs' +import { logger } from '../logging.js' +import { JobContext, ProcessedShowStyleCompound } from '../jobs/index.js' import { AdlibPieceStartProps, DisableNextPieceProps, @@ -12,24 +12,24 @@ import { StopPiecesOnSourceLayersProps, TakePieceAsAdlibNowProps, } from '@sofie-automation/corelib/dist/worker/studio' -import { PlayoutModel } from './model/PlayoutModel' -import { PlayoutPartInstanceModel } from './model/PlayoutPartInstanceModel' -import { runJobWithPlayoutModel } from './lock' -import { updateTimeline } from './timeline/generate' -import { getCurrentTime } from '../lib' -import { comparePieceStart, convertAdLibToGenericPiece, convertPieceToAdLibPiece } from './pieces' -import { getResolvedPiecesForCurrentPartInstance } from './resolvedPieces' -import { syncPlayheadInfinitesForNextPartInstance } from './infinites' +import { PlayoutModel } from './model/PlayoutModel.js' +import { PlayoutPartInstanceModel } from './model/PlayoutPartInstanceModel.js' +import { runJobWithPlayoutModel } from './lock.js' +import { updateTimeline } from './timeline/generate.js' +import { getCurrentTime } from '../lib/index.js' +import { comparePieceStart, convertAdLibToGenericPiece, convertPieceToAdLibPiece } from './pieces.js' +import { getResolvedPiecesForCurrentPartInstance } from './resolvedPieces.js' +import { syncPlayheadInfinitesForNextPartInstance } from './infinites.js' import { UserError, UserErrorMessage } from '@sofie-automation/corelib/dist/error' import { PieceId, PieceInstanceId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { Piece } from '@sofie-automation/corelib/dist/dataModel/Piece' import { IBlueprintDirectPlayType, IBlueprintPieceType } from '@sofie-automation/blueprints-integration' import { ReadonlyDeep } from 'type-fest' -import { WatchedPackagesHelper } from '../blueprints/context/watchedPackages' -import { innerFindLastPieceOnLayer, innerStartOrQueueAdLibPiece, innerStopPieces } from './adlibUtils' -import _ = require('underscore') -import { executeActionInner } from './adlibAction' -import { PlayoutPieceInstanceModel } from './model/PlayoutPieceInstanceModel' +import { WatchedPackagesHelper } from '../blueprints/context/watchedPackages.js' +import { innerFindLastPieceOnLayer, innerStartOrQueueAdLibPiece, innerStopPieces } from './adlibUtils.js' +import _ from 'underscore' +import { executeActionInner } from './adlibAction.js' +import { PlayoutPieceInstanceModel } from './model/PlayoutPieceInstanceModel.js' /** * Play an existing Piece in the Rundown as an AdLib @@ -72,7 +72,7 @@ export async function handleTakePieceAsAdlibNow(context: JobContext, data: TakeP : ((await context.directCollections.Pieces.findOne({ _id: data.pieceInstanceIdOrPieceIdToCopy as PieceId, startRundownId: { $in: rundownIds }, - })) as Piece) + })) as Piece) if (!pieceToCopy) { throw UserError.from( new Error(`PieceInstance or Piece "${data.pieceInstanceIdOrPieceIdToCopy}" not found!`), diff --git a/packages/job-worker/src/playout/adlibTesting.ts b/packages/job-worker/src/playout/adlibTesting.ts index 7ff135389d..a20b62525a 100644 --- a/packages/job-worker/src/playout/adlibTesting.ts +++ b/packages/job-worker/src/playout/adlibTesting.ts @@ -2,12 +2,12 @@ import { SegmentOrphanedReason } from '@sofie-automation/corelib/dist/dataModel/ import { UserError, UserErrorMessage } from '@sofie-automation/corelib/dist/error' import { getRandomId } from '@sofie-automation/corelib/dist/lib' import { ActivateAdlibTestingProps } from '@sofie-automation/corelib/dist/worker/studio' -import { getCurrentTime } from '../lib' -import { JobContext } from '../jobs' -import { runJobWithPlayoutModel } from './lock' -import { performTakeToNextedPart } from './take' -import { PlayoutModel } from './model/PlayoutModel' -import { PlayoutPartInstanceModel } from './model/PlayoutPartInstanceModel' +import { getCurrentTime } from '../lib/index.js' +import { JobContext } from '../jobs/index.js' +import { runJobWithPlayoutModel } from './lock.js' +import { performTakeToNextedPart } from './take.js' +import { PlayoutModel } from './model/PlayoutModel.js' +import { PlayoutPartInstanceModel } from './model/PlayoutPartInstanceModel.js' export async function handleActivateAdlibTesting(context: JobContext, data: ActivateAdlibTestingProps): Promise { if (!context.studio.settings.allowAdlibTestingSegment) diff --git a/packages/job-worker/src/playout/adlibUtils.ts b/packages/job-worker/src/playout/adlibUtils.ts index 460de2b6fa..428d60fa75 100644 --- a/packages/job-worker/src/playout/adlibUtils.ts +++ b/packages/job-worker/src/playout/adlibUtils.ts @@ -1,30 +1,30 @@ import { AdLibPiece } from '@sofie-automation/corelib/dist/dataModel/AdLibPiece' import { BucketAdLib } from '@sofie-automation/corelib/dist/dataModel/BucketAdLibPiece' -import { PartInstanceId, PieceId, PieceInstanceId } from '@sofie-automation/corelib/dist/dataModel/Ids' +import { BucketAdLibId, PartInstanceId, PieceId, PieceInstanceId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { Piece } from '@sofie-automation/corelib/dist/dataModel/Piece' import { PieceInstance, PieceInstancePiece } from '@sofie-automation/corelib/dist/dataModel/PieceInstance' import { assertNever, getRandomId, getRank } from '@sofie-automation/corelib/dist/lib' import { MongoQuery } from '@sofie-automation/corelib/dist/mongo' -import { getCurrentTime } from '../lib' -import { JobContext } from '../jobs' -import { PlayoutModel } from './model/PlayoutModel' -import { PlayoutPartInstanceModel } from './model/PlayoutPartInstanceModel' +import { getCurrentTime } from '../lib/index.js' +import { JobContext } from '../jobs/index.js' +import { PlayoutModel } from './model/PlayoutModel.js' +import { PlayoutPartInstanceModel } from './model/PlayoutPartInstanceModel.js' import { fetchPiecesThatMayBeActiveForPart, getPieceInstancesForPart, syncPlayheadInfinitesForNextPartInstance, -} from './infinites' -import { convertAdLibToGenericPiece } from './pieces' -import { getResolvedPiecesForCurrentPartInstance } from './resolvedPieces' -import { updateTimeline } from './timeline/generate' +} from './infinites.js' +import { convertAdLibToGenericPiece } from './pieces.js' +import { getResolvedPiecesForCurrentPartInstance } from './resolvedPieces.js' +import { updateTimeline } from './timeline/generate.js' import { PieceLifespan } from '@sofie-automation/blueprints-integration' import { SourceLayers } from '@sofie-automation/corelib/dist/dataModel/ShowStyleBase' -import { updatePartInstanceRanksAfterAdlib } from '../updatePartInstanceRanksAndOrphanedState' -import { setNextPart } from './setNext' -import { calculateNowOffsetLatency } from './timeline/multi-gateway' -import { logger } from '../logging' +import { updatePartInstanceRanksAfterAdlib } from '../updatePartInstanceRanksAndOrphanedState.js' +import { setNextPart } from './setNext.js' +import { calculateNowOffsetLatency } from './timeline/multi-gateway.js' +import { logger } from '../logging.js' import { ReadonlyDeep } from 'type-fest' -import { PlayoutRundownModel } from './model/PlayoutRundownModel' +import { PlayoutRundownModel } from './model/PlayoutRundownModel.js' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' import { protectString } from '@sofie-automation/corelib/dist/protectedString' import { QuickLoopMarkerType } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' @@ -193,7 +193,7 @@ export async function insertQueuedPartWithPieces( currentPartInstance: PlayoutPartInstanceModel, newPart: Omit, initialPieces: Omit[], - fromAdlibId: PieceId | undefined + fromAdlibId: PieceId | BucketAdLibId | undefined ): Promise { const span = context.startSpan('insertQueuedPartWithPieces') @@ -313,10 +313,10 @@ export function innerStopPieces( const newDuration: Required['userDuration'] = playoutModel.isMultiGatewayMode ? { endRelativeToNow: offsetRelativeToNow, - } + } : { endRelativeToPart: relativeStopAt, - } + } pieceInstanceModel.pieceInstance.setDuration(newDuration) diff --git a/packages/job-worker/src/playout/bucketAdlibJobs.ts b/packages/job-worker/src/playout/bucketAdlibJobs.ts index a6cbff8248..85da8778c2 100644 --- a/packages/job-worker/src/playout/bucketAdlibJobs.ts +++ b/packages/job-worker/src/playout/bucketAdlibJobs.ts @@ -1,12 +1,12 @@ import { ExecuteActionResult, ExecuteBucketAdLibOrActionProps } from '@sofie-automation/corelib/dist/worker/studio' -import { JobContext } from '../jobs' -import { runJobWithPlaylistLock } from './lock' +import { JobContext } from '../jobs/index.js' +import { runJobWithPlaylistLock } from './lock.js' import { UserError, UserErrorMessage } from '@sofie-automation/corelib/dist/error' import { BucketId, ShowStyleBaseId, ShowStyleVariantId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { innerStartOrQueueAdLibPiece } from './adlibUtils' -import { executeAdlibActionAndSaveModel } from './adlibAction' +import { innerStartOrQueueAdLibPiece } from './adlibUtils.js' +import { executeAdlibActionAndSaveModel } from './adlibAction.js' import { RundownHoldState } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' -import { createPlayoutModelfromInitModel, loadPlayoutModelPreInit } from './model/implementation/LoadPlayoutModel' +import { createPlayoutModelfromInitModel, loadPlayoutModelPreInit } from './model/implementation/LoadPlayoutModel.js' /** * Execute an AdLib Action diff --git a/packages/job-worker/src/playout/datastore.ts b/packages/job-worker/src/playout/datastore.ts index 4ac971ce33..0da9babe41 100644 --- a/packages/job-worker/src/playout/datastore.ts +++ b/packages/job-worker/src/playout/datastore.ts @@ -2,8 +2,8 @@ import { DatastorePersistenceMode, TSR } from '@sofie-automation/blueprints-inte import { StudioId, TimelineDatastoreEntryId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { deserializeTimelineBlob } from '@sofie-automation/corelib/dist/dataModel/Timeline' import { protectString } from '@sofie-automation/corelib/dist/protectedString' -import { JobContext } from '../jobs' -import { PlayoutModel } from './model/PlayoutModel' +import { JobContext } from '../jobs/index.js' +import { PlayoutModel } from './model/PlayoutModel.js' export function getDatastoreId(studioId: StudioId, key: string): TimelineDatastoreEntryId { return protectString(`${studioId}_${key}`) diff --git a/packages/job-worker/src/playout/debug.ts b/packages/job-worker/src/playout/debug.ts index b46cadcad5..2028b0b23c 100644 --- a/packages/job-worker/src/playout/debug.ts +++ b/packages/job-worker/src/playout/debug.ts @@ -2,14 +2,14 @@ import { DebugRegenerateNextPartInstanceProps, DebugSyncInfinitesForNextPartInstanceProps, } from '@sofie-automation/corelib/dist/worker/studio' -import { runJobWithStudioPlayoutModel } from '../studio/lock' -import { JobContext } from '../jobs' -import { logger } from '../logging' -import { syncPlayheadInfinitesForNextPartInstance } from './infinites' -import { setNextPart } from './setNext' -import { runJobWithPlayoutModel } from './lock' -import { updateTimeline } from './timeline/generate' -import { updateTimelineFromStudioPlayoutModel } from './lib' +import { runJobWithStudioPlayoutModel } from '../studio/lock.js' +import { JobContext } from '../jobs/index.js' +import { logger } from '../logging.js' +import { syncPlayheadInfinitesForNextPartInstance } from './infinites.js' +import { setNextPart } from './setNext.js' +import { runJobWithPlayoutModel } from './lock.js' +import { updateTimeline } from './timeline/generate.js' +import { updateTimelineFromStudioPlayoutModel } from './lib.js' /** * Ensure that the infinite pieces on the nexted-part are correct diff --git a/packages/job-worker/src/playout/holdJobs.ts b/packages/job-worker/src/playout/holdJobs.ts index 3c88aca6a6..cf4f6e651c 100644 --- a/packages/job-worker/src/playout/holdJobs.ts +++ b/packages/job-worker/src/playout/holdJobs.ts @@ -2,10 +2,10 @@ import { PartHoldMode } from '@sofie-automation/blueprints-integration' import { RundownHoldState } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { UserError, UserErrorMessage } from '@sofie-automation/corelib/dist/error' import { ActivateHoldProps, DeactivateHoldProps } from '@sofie-automation/corelib/dist/worker/studio' -import { JobContext } from '../jobs' -import { runJobWithPlayoutModel } from './lock' -import { updateTimeline } from './timeline/generate' -import { logger } from '../logging' +import { JobContext } from '../jobs/index.js' +import { runJobWithPlayoutModel } from './lock.js' +import { updateTimeline } from './timeline/generate.js' +import { logger } from '../logging.js' /** * Activate Hold diff --git a/packages/job-worker/src/playout/infinites.ts b/packages/job-worker/src/playout/infinites.ts index daec9a439b..4523e8cc57 100644 --- a/packages/job-worker/src/playout/infinites.ts +++ b/packages/job-worker/src/playout/infinites.ts @@ -10,20 +10,20 @@ import { buildPastInfinitePiecesForThisPartQuery, } from '@sofie-automation/corelib/dist/playout/infinites' import { processAndPrunePieceInstanceTimings } from '@sofie-automation/corelib/dist/playout/processAndPrune' -import { JobContext } from '../jobs' +import { JobContext } from '../jobs/index.js' import { ReadonlyDeep } from 'type-fest' -import { PlayoutModel } from './model/PlayoutModel' -import { PlayoutPartInstanceModel } from './model/PlayoutPartInstanceModel' -import { PlayoutSegmentModel } from './model/PlayoutSegmentModel' -import { getCurrentTime } from '../lib' +import { PlayoutModel } from './model/PlayoutModel.js' +import { PlayoutPartInstanceModel } from './model/PlayoutPartInstanceModel.js' +import { PlayoutSegmentModel } from './model/PlayoutSegmentModel.js' +import { getCurrentTime } from '../lib/index.js' import { flatten } from '@sofie-automation/corelib/dist/lib' -import _ = require('underscore') -import { IngestModelReadonly } from '../ingest/model/IngestModel' +import _ from 'underscore' +import { IngestModelReadonly } from '../ingest/model/IngestModel.js' import { SegmentOrphanedReason } from '@sofie-automation/corelib/dist/dataModel/Segment' import { sortRundownIDsInPlaylist } from '@sofie-automation/corelib/dist/playout/playlist' import { mongoWhere } from '@sofie-automation/corelib/dist/mongo' -import { PlayoutRundownModel } from './model/PlayoutRundownModel' -import { logger } from '../logging' +import { PlayoutRundownModel } from './model/PlayoutRundownModel.js' +import { logger } from '../logging.js' /** When we crop a piece, set the piece as "it has definitely ended" this far into the future. */ export const DEFINITELY_ENDED_FUTURE_DURATION = 1 * 1000 @@ -278,7 +278,8 @@ export async function syncPlayheadInfinitesForNextPartInstance( nextSegment?.segment, toPartInstance.partInstance._id, nextPartIsAfterCurrentPart, - false + false, + context.studio.settings.allowTestingAdlibsToPersist ?? false ) toPartInstance.replaceInfinitesFromPreviousPlayhead(infinites) @@ -378,7 +379,8 @@ export function getPieceInstancesForPart( playoutModel.getAllOrderedParts().map((p) => p._id), newInstanceId, nextPartIsAfterCurrentPart, - false + false, + context.studio.settings.allowTestingAdlibsToPersist ?? false ) if (span) span.end() return res diff --git a/packages/job-worker/src/playout/lib.ts b/packages/job-worker/src/playout/lib.ts index 54b0fd1b79..5158357678 100644 --- a/packages/job-worker/src/playout/lib.ts +++ b/packages/job-worker/src/playout/lib.ts @@ -1,18 +1,18 @@ import { TimelineObjGeneric } from '@sofie-automation/corelib/dist/dataModel/Timeline' import { applyToArray, clone } from '@sofie-automation/corelib/dist/lib' import { TSR } from '@sofie-automation/blueprints-integration' -import { JobContext } from '../jobs' +import { JobContext } from '../jobs/index.js' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' import { PartInstanceId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { PlayoutModel } from './model/PlayoutModel' -import { logger } from '../logging' -import { MongoQuery } from '../db' +import { PlayoutModel } from './model/PlayoutModel.js' +import { logger } from '../logging.js' +import { MongoQuery } from '../db/index.js' import { mongoWhere } from '@sofie-automation/corelib/dist/mongo' -import { setNextPart } from './setNext' -import { selectNextPart } from './selectNextPart' -import { StudioPlayoutModel } from '../studio/model/StudioPlayoutModel' -import { runJobWithPlayoutModel } from './lock' -import { updateTimeline, updateStudioTimeline } from './timeline/generate' +import { setNextPart } from './setNext.js' +import { selectNextPart } from './selectNextPart.js' +import { StudioPlayoutModel } from '../studio/model/StudioPlayoutModel.js' +import { runJobWithPlayoutModel } from './lock.js' +import { updateTimeline, updateStudioTimeline } from './timeline/generate.js' /** * Reset the rundownPlaylist (all of the rundowns within the playlist): @@ -104,7 +104,7 @@ export function resetPartInstancesWithPieceInstances( reset: true, }, } - ) + ) : undefined, allToReset.length ? context.directCollections.PieceInstances.update( @@ -118,14 +118,14 @@ export function resetPartInstancesWithPieceInstances( reset: true, }, } - ) + ) : undefined, allToReset.length > 0 ? context.directCollections.Notifications.remove({ 'relatedTo.studioId': context.studioId, 'relatedTo.rundownId': { $in: rundownIds }, 'relatedTo.partInstanceId': { $in: allToReset }, - }) + }) : undefined, ]) }) diff --git a/packages/job-worker/src/playout/lock.ts b/packages/job-worker/src/playout/lock.ts index c8be6844cf..0dad525617 100644 --- a/packages/job-worker/src/playout/lock.ts +++ b/packages/job-worker/src/playout/lock.ts @@ -1,12 +1,12 @@ import { RundownPlaylistId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { RundownPlayoutPropsBase } from '@sofie-automation/corelib/dist/worker/studio' -import { logger } from '../logging' +import { logger } from '../logging.js' import { ReadonlyDeep } from 'type-fest' -import { JobContext } from '../jobs' -import { PlaylistLock } from '../jobs/lock' -import { PlayoutModel, PlayoutModelPreInit } from './model/PlayoutModel' -import { createPlayoutModelfromInitModel, loadPlayoutModelPreInit } from './model/implementation/LoadPlayoutModel' +import { JobContext } from '../jobs/index.js' +import { PlaylistLock } from '../jobs/lock.js' +import { PlayoutModel, PlayoutModelPreInit } from './model/PlayoutModel.js' +import { createPlayoutModelfromInitModel, loadPlayoutModelPreInit } from './model/implementation/LoadPlayoutModel.js' /** * Run a typical playout job diff --git a/packages/job-worker/src/playout/lookahead/__tests__/findForLayer.test.ts b/packages/job-worker/src/playout/lookahead/__tests__/findForLayer.test.ts index f6b5393652..643d95b66e 100644 --- a/packages/job-worker/src/playout/lookahead/__tests__/findForLayer.test.ts +++ b/packages/job-worker/src/playout/lookahead/__tests__/findForLayer.test.ts @@ -1,12 +1,12 @@ -import { findLookaheadForLayer } from '../findForLayer' -import { PartAndPieces, PartInstanceAndPieceInstances } from '../util' +import { findLookaheadForLayer } from '../findForLayer.js' +import { PartAndPieces, PartInstanceAndPieceInstances } from '../util.js' import { PieceInstance } from '@sofie-automation/corelib/dist/dataModel/PieceInstance' import { getRandomString } from '@sofie-automation/corelib/dist/lib' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' -import { setupDefaultJobEnvironment } from '../../../__mocks__/context' +import { setupDefaultJobEnvironment } from '../../../__mocks__/context.js' jest.mock('../findObjects') -import { findLookaheadObjectsForPart } from '../findObjects' +import { findLookaheadObjectsForPart } from '../findObjects.js' import { ReadonlyDeep } from 'type-fest' type TfindLookaheadObjectsForPart = jest.MockedFunction const findLookaheadObjectsForPartMock = findLookaheadObjectsForPart as TfindLookaheadObjectsForPart diff --git a/packages/job-worker/src/playout/lookahead/__tests__/findObjects.test.ts b/packages/job-worker/src/playout/lookahead/__tests__/findObjects.test.ts index 818752e6f8..884ba4ff0f 100644 --- a/packages/job-worker/src/playout/lookahead/__tests__/findObjects.test.ts +++ b/packages/job-worker/src/playout/lookahead/__tests__/findObjects.test.ts @@ -1,19 +1,19 @@ -import { findLookaheadObjectsForPart } from '../findObjects' +import { findLookaheadObjectsForPart } from '../findObjects.js' import { IBlueprintPieceType, OnGenerateTimelineObj, PieceLifespan, TSR, } from '@sofie-automation/blueprints-integration' -import { sortPieceInstancesByStart } from '../../pieces' +import { sortPieceInstancesByStart } from '../../pieces.js' import { RundownId, PartInstanceId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { PieceInstance } from '@sofie-automation/corelib/dist/dataModel/PieceInstance' import { TimelineObjRundown } from '@sofie-automation/corelib/dist/dataModel/Timeline' import { literal } from '@sofie-automation/corelib/dist/lib' import { protectString } from '@sofie-automation/corelib/dist/protectedString' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' -import { setupDefaultJobEnvironment } from '../../../__mocks__/context' -import _ = require('underscore') +import { setupDefaultJobEnvironment } from '../../../__mocks__/context.js' +import _ from 'underscore' import { EmptyPieceTimelineObjectsBlob, serializePieceTimelineObjectsBlob, diff --git a/packages/job-worker/src/playout/lookahead/__tests__/lookahead.test.ts b/packages/job-worker/src/playout/lookahead/__tests__/lookahead.test.ts index 1a925310bb..5aeb024a98 100644 --- a/packages/job-worker/src/playout/lookahead/__tests__/lookahead.test.ts +++ b/packages/job-worker/src/playout/lookahead/__tests__/lookahead.test.ts @@ -4,24 +4,24 @@ import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' import { DBStudio, MappingsExt } from '@sofie-automation/corelib/dist/dataModel/Studio' import { clone, getRandomId } from '@sofie-automation/corelib/dist/lib' import { protectString } from '@sofie-automation/corelib/dist/protectedString' -import { getCurrentTime } from '../../../lib' -import { SelectedPartInstancesTimelineInfo } from '../../timeline/generate' -import { getLookeaheadObjects } from '..' +import { getCurrentTime } from '../../../lib/index.js' +import { SelectedPartInstancesTimelineInfo } from '../../timeline/generate.js' +import { getLookeaheadObjects } from '../index.js' import { LookaheadMode, PlaylistTimingType, TSR } from '@sofie-automation/blueprints-integration' -import { setupDefaultJobEnvironment, MockJobContext } from '../../../__mocks__/context' -import { runJobWithPlayoutModel } from '../../../playout/lock' -import { defaultRundownPlaylist } from '../../../__mocks__/defaultCollectionObjects' +import { setupDefaultJobEnvironment, MockJobContext } from '../../../__mocks__/context.js' +import { runJobWithPlayoutModel } from '../../../playout/lock.js' +import { defaultRundownPlaylist } from '../../../__mocks__/defaultCollectionObjects.js' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' jest.mock('../findForLayer') type TfindLookaheadForLayer = jest.MockedFunction -import { findLookaheadForLayer } from '../findForLayer' +import { findLookaheadForLayer } from '../findForLayer.js' const findLookaheadForLayerMock = findLookaheadForLayer as TfindLookaheadForLayer jest.mock('../util') type TgetOrderedPartsAfterPlayhead = jest.MockedFunction -import { getOrderedPartsAfterPlayhead, PartAndPieces, PartInstanceAndPieceInstances } from '../util' -import { LookaheadTimelineObject } from '../findObjects' +import { getOrderedPartsAfterPlayhead, PartAndPieces, PartInstanceAndPieceInstances } from '../util.js' +import { LookaheadTimelineObject } from '../findObjects.js' import { wrapDefaultObject } from '@sofie-automation/corelib/dist/settings/objectWithOverrides' const getOrderedPartsAfterPlayheadMock = getOrderedPartsAfterPlayhead as TgetOrderedPartsAfterPlayhead @@ -276,6 +276,7 @@ describe('Lookahead', () => { partStarted: getCurrentTime() + 546, pieceInstances: ['1', '2'] as any, calculatedTimings: { inTransitionStart: null } as any, + regenerateTimelineAt: undefined, } const expectedPrevious = { @@ -299,6 +300,7 @@ describe('Lookahead', () => { partStarted: getCurrentTime() + 865, pieceInstances: ['3', '4'] as any, calculatedTimings: { inTransitionStart: null } as any, + regenerateTimelineAt: undefined, } const expectedCurrent = { part: partInstancesInfo.current.partInstance, @@ -319,6 +321,7 @@ describe('Lookahead', () => { partStarted: getCurrentTime() + 142, pieceInstances: ['5'] as any, calculatedTimings: { inTransitionStart: null } as any, + regenerateTimelineAt: undefined, } const expectedNext = { part: partInstancesInfo.next.partInstance, @@ -341,6 +344,7 @@ describe('Lookahead', () => { await expectLookaheadForLayerMock(playlistId, [expectedCurrent, expectedNext], expectedPrevious, fakeParts) }) + // eslint-disable-next-line jest/no-commented-out-tests // test('Pieces', () => { // const fakeParts = partIds.map((p) => ({ _id: p })) as Part[] // getOrderedPartsAfterPlayheadMock.mockReturnValue(fakeParts) diff --git a/packages/job-worker/src/playout/lookahead/__tests__/util.test.ts b/packages/job-worker/src/playout/lookahead/__tests__/util.test.ts index 969506ce1a..d678a8d9cb 100644 --- a/packages/job-worker/src/playout/lookahead/__tests__/util.test.ts +++ b/packages/job-worker/src/playout/lookahead/__tests__/util.test.ts @@ -2,14 +2,14 @@ import { RundownPlaylistId, SegmentId, PartId, RundownId } from '@sofie-automati import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' import { MappingsExt } from '@sofie-automation/corelib/dist/dataModel/Studio' import { protectString } from '@sofie-automation/corelib/dist/protectedString' -import { getCurrentTime } from '../../../lib' +import { getCurrentTime } from '../../../lib/index.js' import { LookaheadMode, PlaylistTimingType, TSR } from '@sofie-automation/blueprints-integration' -import { getOrderedPartsAfterPlayhead } from '../util' -import { MockJobContext, setupDefaultJobEnvironment } from '../../../__mocks__/context' -import { runJobWithPlayoutModel } from '../../../playout/lock' -import { defaultRundownPlaylist } from '../../../__mocks__/defaultCollectionObjects' -import _ = require('underscore') -import { wrapPartToTemporaryInstance } from '../../../__mocks__/partinstance' +import { getOrderedPartsAfterPlayhead } from '../util.js' +import { MockJobContext, setupDefaultJobEnvironment } from '../../../__mocks__/context.js' +import { runJobWithPlayoutModel } from '../../../playout/lock.js' +import { defaultRundownPlaylist } from '../../../__mocks__/defaultCollectionObjects.js' +import _ from 'underscore' +import { wrapPartToTemporaryInstance } from '../../../__mocks__/partinstance.js' import { wrapDefaultObject } from '@sofie-automation/corelib/dist/settings/objectWithOverrides' import { QuickLoopMarkerType } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { ForceQuickLoopAutoNext } from '@sofie-automation/shared-lib/dist/core/model/StudioSettings' diff --git a/packages/job-worker/src/playout/lookahead/findForLayer.ts b/packages/job-worker/src/playout/lookahead/findForLayer.ts index 42fbf03958..e09297c077 100644 --- a/packages/job-worker/src/playout/lookahead/findForLayer.ts +++ b/packages/job-worker/src/playout/lookahead/findForLayer.ts @@ -1,10 +1,10 @@ import { PartInstanceId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { DBPart, isPartPlayable } from '@sofie-automation/corelib/dist/dataModel/Part' import { ReadonlyDeep } from 'type-fest' -import { JobContext } from '../../jobs' -import { sortPieceInstancesByStart } from '../pieces' -import { findLookaheadObjectsForPart, LookaheadTimelineObject } from './findObjects' -import { PartAndPieces, PartInstanceAndPieceInstances } from './util' +import { JobContext } from '../../jobs/index.js' +import { sortPieceInstancesByStart } from '../pieces.js' +import { findLookaheadObjectsForPart, LookaheadTimelineObject } from './findObjects.js' +import { PartAndPieces, PartInstanceAndPieceInstances } from './util.js' export interface LookaheadResult { timed: Array diff --git a/packages/job-worker/src/playout/lookahead/findObjects.ts b/packages/job-worker/src/playout/lookahead/findObjects.ts index 05a13c6288..8e228a5a01 100644 --- a/packages/job-worker/src/playout/lookahead/findObjects.ts +++ b/packages/job-worker/src/playout/lookahead/findObjects.ts @@ -9,8 +9,8 @@ import { TimelineObjType, } from '@sofie-automation/corelib/dist/dataModel/Timeline' import { protectString, unprotectString } from '@sofie-automation/corelib/dist/protectedString' -import { JobContext } from '../../jobs' -import { PartAndPieces, PieceInstanceWithObjectMap } from './util' +import { JobContext } from '../../jobs/index.js' +import { PartAndPieces, PieceInstanceWithObjectMap } from './util.js' import { deserializePieceTimelineObjectsBlob } from '@sofie-automation/corelib/dist/dataModel/Piece' import { ReadonlyDeep, SetRequired } from 'type-fest' diff --git a/packages/job-worker/src/playout/lookahead/index.ts b/packages/job-worker/src/playout/lookahead/index.ts index 12ac4935ec..83fe9ea839 100644 --- a/packages/job-worker/src/playout/lookahead/index.ts +++ b/packages/job-worker/src/playout/lookahead/index.ts @@ -1,27 +1,27 @@ -import { getOrderedPartsAfterPlayhead, PartAndPieces, PartInstanceAndPieceInstances } from './util' -import { findLookaheadForLayer, LookaheadResult } from './findForLayer' -import { PlayoutModel } from '../model/PlayoutModel' -import { sortPieceInstancesByStart } from '../pieces' +import { getOrderedPartsAfterPlayhead, PartAndPieces, PartInstanceAndPieceInstances } from './util.js' +import { findLookaheadForLayer, LookaheadResult } from './findForLayer.js' +import { PlayoutModel } from '../model/PlayoutModel.js' +import { sortPieceInstancesByStart } from '../pieces.js' import { MappingExt } from '@sofie-automation/corelib/dist/dataModel/Studio' import { TSR, LookaheadMode, OnGenerateTimelineObj } from '@sofie-automation/blueprints-integration' -import { SelectedPartInstancesTimelineInfo, SelectedPartInstanceTimelineInfo } from '../timeline/generate' +import { SelectedPartInstancesTimelineInfo, SelectedPartInstanceTimelineInfo } from '../timeline/generate.js' import { OnGenerateTimelineObjExt, TimelineObjRundown, updateLookaheadLayer, } from '@sofie-automation/corelib/dist/dataModel/Timeline' -import { JobContext } from '../../jobs' +import { JobContext } from '../../jobs/index.js' import { Piece } from '@sofie-automation/corelib/dist/dataModel/Piece' import { PieceInstance, wrapPieceToInstance } from '@sofie-automation/corelib/dist/dataModel/PieceInstance' import { PartId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { protectString } from '@sofie-automation/corelib/dist/protectedString' import { clone } from '@sofie-automation/corelib/dist/lib' import { Filter as FilterQuery } from 'mongodb' -import _ = require('underscore') +import _ from 'underscore' import { LOOKAHEAD_DEFAULT_SEARCH_DISTANCE } from '@sofie-automation/shared-lib/dist/core/constants' -import { prefixSingleObjectId } from '../lib' -import { LookaheadTimelineObject } from './findObjects' -import { hasPieceInstanceDefinitelyEnded } from '../timeline/lib' +import { prefixSingleObjectId } from '../lib.js' +import { LookaheadTimelineObject } from './findObjects.js' +import { hasPieceInstanceDefinitelyEnded } from '../timeline/lib.js' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' import { ReadonlyDeep } from 'type-fest' @@ -98,7 +98,7 @@ export async function getLookeaheadObjects( nowInPart: partInstancesInfo0.current.nowInPart, allPieces: getPrunedEndedPieceInstances(partInstancesInfo0.current), calculatedTimings: partInstancesInfo0.current.calculatedTimings, - }) + }) : undefined, partInstancesInfo0.next ? removeInfiniteContinuations({ @@ -107,7 +107,7 @@ export async function getLookeaheadObjects( nowInPart: partInstancesInfo0.next.nowInPart, allPieces: partInstancesInfo0.next.pieceInstances, calculatedTimings: partInstancesInfo0.next.calculatedTimings, - }) + }) : undefined, ]) diff --git a/packages/job-worker/src/playout/lookahead/util.ts b/packages/job-worker/src/playout/lookahead/util.ts index 1300ae6f69..72bb201dc6 100644 --- a/packages/job-worker/src/playout/lookahead/util.ts +++ b/packages/job-worker/src/playout/lookahead/util.ts @@ -5,9 +5,9 @@ import { Piece } from '@sofie-automation/corelib/dist/dataModel/Piece' import { PieceInstance, PieceInstancePiece } from '@sofie-automation/corelib/dist/dataModel/PieceInstance' import { PartCalculatedTimings } from '@sofie-automation/corelib/dist/playout/timings' import { ReadonlyDeep } from 'type-fest' -import { JobContext } from '../../jobs' -import { PlayoutModel } from '../model/PlayoutModel' -import { selectNextPart } from '../selectNextPart' +import { JobContext } from '../../jobs/index.js' +import { PlayoutModel } from '../model/PlayoutModel.js' +import { selectNextPart } from '../selectNextPart.js' export interface PartInstanceAndPieceInstances { part: ReadonlyDeep diff --git a/packages/job-worker/src/playout/model/PlayoutModel.ts b/packages/job-worker/src/playout/model/PlayoutModel.ts index 7ded24012f..e3c710ba17 100644 --- a/packages/job-worker/src/playout/model/PlayoutModel.ts +++ b/packages/job-worker/src/playout/model/PlayoutModel.ts @@ -1,4 +1,5 @@ import { + BucketAdLibId, PartId, PartInstanceId, PieceId, @@ -9,7 +10,7 @@ import { SegmentId, SegmentPlayoutId, } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { BaseModel } from '../../modelBase' +import { BaseModel } from '../../modelBase.js' import { ABSessionAssignments, ABSessionInfo, @@ -18,19 +19,19 @@ import { RundownHoldState, } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { ReadonlyDeep } from 'type-fest' -import { StudioPlayoutModelBase, StudioPlayoutModelBaseReadonly } from '../../studio/model/StudioPlayoutModel' +import { StudioPlayoutModelBase, StudioPlayoutModelBaseReadonly } from '../../studio/model/StudioPlayoutModel.js' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' import { PieceInstance, PieceInstancePiece } from '@sofie-automation/corelib/dist/dataModel/PieceInstance' -import { PlaylistLock } from '../../jobs/lock' -import { PlayoutRundownModel } from './PlayoutRundownModel' -import { PlayoutSegmentModel } from './PlayoutSegmentModel' -import { PlayoutPartInstanceModel } from './PlayoutPartInstanceModel' +import { PlaylistLock } from '../../jobs/lock.js' +import { PlayoutRundownModel } from './PlayoutRundownModel.js' +import { PlayoutSegmentModel } from './PlayoutSegmentModel.js' +import { PlayoutPartInstanceModel } from './PlayoutPartInstanceModel.js' import { PeripheralDevice } from '@sofie-automation/corelib/dist/dataModel/PeripheralDevice' import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' -import { PlayoutPieceInstanceModel } from './PlayoutPieceInstanceModel' +import { PlayoutPieceInstanceModel } from './PlayoutPieceInstanceModel.js' import { PieceInstanceWithTimings } from '@sofie-automation/corelib/dist/playout/processAndPrune' import { PartCalculatedTimings } from '@sofie-automation/corelib/dist/playout/timings' -import type { INotificationsModel } from '../../notifications/NotificationsModel' +import type { INotificationsModel } from '../../notifications/NotificationsModel.js' export type DeferredFunction = (playoutModel: PlayoutModel) => void | Promise export type DeferredAfterSaveFunction = (playoutModel: PlayoutModelReadonly) => void | Promise @@ -236,7 +237,7 @@ export interface PlayoutModel extends PlayoutModelReadonly, StudioPlayoutModelBa createAdlibbedPartInstance( part: Omit, pieces: Omit[], - fromAdlibId: PieceId | undefined, + fromAdlibId: PieceId | BucketAdLibId | undefined, infinitePieceInstances: PieceInstance[] ): PlayoutPartInstanceModel @@ -317,17 +318,21 @@ export interface PlayoutModel extends PlayoutModelReadonly, StudioPlayoutModelBa setHoldState(newState: RundownHoldState): void /** - * Store the persistent results of the AB playback resolving and onTimelineGenerate - * @param persistentState Blueprint owned state from onTimelineGenerate + * Store the persistent results of the AB playback resolving * @param assignedAbSessions The applied AB sessions * @param trackedAbSessions The known AB sessions */ - setOnTimelineGenerateResult( - persistentState: unknown | undefined, + setAbResolvingState( assignedAbSessions: Record, trackedAbSessions: ABSessionInfo[] ): void + /** + * Store the blueprint persistent state + * @param persistentState Blueprint owned state + */ + setBlueprintPersistentState(persistentState: unknown | undefined): void + /** * Set a PartInstance as the nexted PartInstance * @param partInstance PartInstance to be set as next, or none diff --git a/packages/job-worker/src/playout/model/PlayoutPartInstanceModel.ts b/packages/job-worker/src/playout/model/PlayoutPartInstanceModel.ts index 2ed3dded10..6cb43e43e1 100644 --- a/packages/job-worker/src/playout/model/PlayoutPartInstanceModel.ts +++ b/packages/job-worker/src/playout/model/PlayoutPartInstanceModel.ts @@ -1,10 +1,15 @@ -import { PieceId, PieceInstanceId, RundownPlaylistActivationId } from '@sofie-automation/corelib/dist/dataModel/Ids' +import { + BucketAdLibId, + PieceId, + PieceInstanceId, + RundownPlaylistActivationId, +} from '@sofie-automation/corelib/dist/dataModel/Ids' import { ReadonlyDeep } from 'type-fest' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' import { PieceInstance, PieceInstancePiece } from '@sofie-automation/corelib/dist/dataModel/PieceInstance' import { IBlueprintMutatablePart, PieceLifespan, Time } from '@sofie-automation/blueprints-integration' import { PartCalculatedTimings } from '@sofie-automation/corelib/dist/playout/timings' -import { PlayoutPieceInstanceModel } from './PlayoutPieceInstanceModel' +import { PlayoutPieceInstanceModel } from './PlayoutPieceInstanceModel.js' import { CoreUserEditingDefinition } from '@sofie-automation/corelib/dist/dataModel/UserEditingDefinitions' /** @@ -65,7 +70,7 @@ export interface PlayoutPartInstanceModel { */ insertAdlibbedPiece( piece: Omit, - fromAdlibId: PieceId | undefined + fromAdlibId: PieceId | BucketAdLibId | undefined ): PlayoutPieceInstanceModel /** diff --git a/packages/job-worker/src/playout/model/PlayoutRundownModel.ts b/packages/job-worker/src/playout/model/PlayoutRundownModel.ts index fc4822edc7..124908c084 100644 --- a/packages/job-worker/src/playout/model/PlayoutRundownModel.ts +++ b/packages/job-worker/src/playout/model/PlayoutRundownModel.ts @@ -3,7 +3,7 @@ import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' import { ReadonlyDeep } from 'type-fest' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' import { RundownBaselineObj } from '@sofie-automation/corelib/dist/dataModel/RundownBaselineObj' -import { PlayoutSegmentModel } from './PlayoutSegmentModel' +import { PlayoutSegmentModel } from './PlayoutSegmentModel.js' /** * Wrap a Rundown and its Segments in a readonly and simplified view for Playout operations diff --git a/packages/job-worker/src/playout/model/implementation/LoadPlayoutModel.ts b/packages/job-worker/src/playout/model/implementation/LoadPlayoutModel.ts index 0099896c70..c42de1e38a 100644 --- a/packages/job-worker/src/playout/model/implementation/LoadPlayoutModel.ts +++ b/packages/job-worker/src/playout/model/implementation/LoadPlayoutModel.ts @@ -1,28 +1,28 @@ import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' -import { DatabasePersistedModel } from '../../../modelBase' -import { IngestModelReadonly } from '../../../ingest/model/IngestModel' -import { PlaylistLock } from '../../../jobs/lock' +import { DatabasePersistedModel } from '../../../modelBase.js' +import { IngestModelReadonly } from '../../../ingest/model/IngestModel.js' +import { PlaylistLock } from '../../../jobs/lock.js' import { ReadonlyDeep } from 'type-fest' -import { JobContext } from '../../../jobs' -import { PlayoutModelImpl } from './PlayoutModelImpl' -import { PlayoutRundownModelImpl } from './PlayoutRundownModelImpl' +import { JobContext } from '../../../jobs/index.js' +import { PlayoutModelImpl } from './PlayoutModelImpl.js' +import { PlayoutRundownModelImpl } from './PlayoutRundownModelImpl.js' import { PartInstanceId, RundownId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' import { PieceInstance } from '@sofie-automation/corelib/dist/dataModel/PieceInstance' import { DBSegment, SegmentOrphanedReason } from '@sofie-automation/corelib/dist/dataModel/Segment' import { TimelineComplete } from '@sofie-automation/corelib/dist/dataModel/Timeline' import { MongoQuery } from '@sofie-automation/corelib/dist/mongo' -import _ = require('underscore') +import _ from 'underscore' import { clone, Complete, groupByToMap, groupByToMapFunc, literal } from '@sofie-automation/corelib/dist/lib' -import { PlayoutSegmentModelImpl } from './PlayoutSegmentModelImpl' +import { PlayoutSegmentModelImpl } from './PlayoutSegmentModelImpl.js' import { protectString, unprotectString } from '@sofie-automation/corelib/dist/protectedString' import { PeripheralDevice } from '@sofie-automation/corelib/dist/dataModel/PeripheralDevice' -import { PlayoutModel, PlayoutModelPreInit } from '../PlayoutModel' +import { PlayoutModel, PlayoutModelPreInit } from '../PlayoutModel.js' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' import { RundownBaselineObj } from '@sofie-automation/corelib/dist/dataModel/RundownBaselineObj' import { sortRundownsWithinPlaylist } from '@sofie-automation/corelib/dist/playout/playlist' -import { logger } from '../../../logging' +import { logger } from '../../../logging.js' /** * Load a PlayoutModelPreInit for the given RundownPlaylist diff --git a/packages/job-worker/src/playout/model/implementation/PlayoutModelImpl.ts b/packages/job-worker/src/playout/model/implementation/PlayoutModelImpl.ts index 9a0a8b1bb4..771bcfd752 100644 --- a/packages/job-worker/src/playout/model/implementation/PlayoutModelImpl.ts +++ b/packages/job-worker/src/playout/model/implementation/PlayoutModelImpl.ts @@ -19,7 +19,7 @@ import { SelectedPartInstance, } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { ReadonlyDeep } from 'type-fest' -import { JobContext } from '../../../jobs' +import { JobContext } from '../../../jobs/index.js' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' import { @@ -33,35 +33,35 @@ import { TimelineCompleteGenerationVersions, TimelineObjGeneric, } from '@sofie-automation/corelib/dist/dataModel/Timeline' -import _ = require('underscore') +import _ from 'underscore' import { unprotectString } from '@sofie-automation/corelib/dist/protectedString' -import { PlaylistLock } from '../../../jobs/lock' -import { logger } from '../../../logging' +import { PlaylistLock } from '../../../jobs/lock.js' +import { logger } from '../../../logging.js' import { clone, getRandomId, literal, normalizeArrayToMapFunc } from '@sofie-automation/corelib/dist/lib' import { sleep } from '@sofie-automation/shared-lib/dist/lib/lib' import { sortRundownIDsInPlaylist } from '@sofie-automation/corelib/dist/playout/playlist' -import { PlayoutRundownModel } from '../PlayoutRundownModel' -import { PlayoutRundownModelImpl } from './PlayoutRundownModelImpl' -import { PlayoutSegmentModel } from '../PlayoutSegmentModel' -import { PlayoutPartInstanceModelImpl } from './PlayoutPartInstanceModelImpl' -import { PlayoutPartInstanceModel } from '../PlayoutPartInstanceModel' -import { getCurrentTime } from '../../../lib' +import { PlayoutRundownModel } from '../PlayoutRundownModel.js' +import { PlayoutRundownModelImpl } from './PlayoutRundownModelImpl.js' +import { PlayoutSegmentModel } from '../PlayoutSegmentModel.js' +import { PlayoutPartInstanceModelImpl } from './PlayoutPartInstanceModelImpl.js' +import { PlayoutPartInstanceModel } from '../PlayoutPartInstanceModel.js' +import { getCurrentTime } from '../../../lib/index.js' import { protectString } from '@sofie-automation/shared-lib/dist/lib/protectedString' -import { queuePartInstanceTimingEvent } from '../../timings/events' -import { IS_PRODUCTION } from '../../../environment' -import { DeferredAfterSaveFunction, DeferredFunction, PlayoutModel, PlayoutModelReadonly } from '../PlayoutModel' -import { writePartInstancesAndPieceInstances, writeAdlibTestingSegments } from './SavePlayoutModel' -import { PlayoutPieceInstanceModel } from '../PlayoutPieceInstanceModel' -import { DatabasePersistedModel } from '../../../modelBase' +import { queuePartInstanceTimingEvent } from '../../timings/events.js' +import { IS_PRODUCTION } from '../../../environment.js' +import { DeferredAfterSaveFunction, DeferredFunction, PlayoutModel, PlayoutModelReadonly } from '../PlayoutModel.js' +import { writePartInstancesAndPieceInstances, writeAdlibTestingSegments } from './SavePlayoutModel.js' +import { PlayoutPieceInstanceModel } from '../PlayoutPieceInstanceModel.js' +import { DatabasePersistedModel } from '../../../modelBase.js' import { ExpectedPackageDBFromStudioBaselineObjects } from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages' import { ExpectedPlayoutItemStudio } from '@sofie-automation/corelib/dist/dataModel/ExpectedPlayoutItem' -import { StudioBaselineHelper } from '../../../studio/model/StudioBaselineHelper' +import { StudioBaselineHelper } from '../../../studio/model/StudioBaselineHelper.js' import { EventsJobs } from '@sofie-automation/corelib/dist/worker/events' -import { QuickLoopService } from '../services/QuickLoopService' +import { QuickLoopService } from '../services/QuickLoopService.js' import { calculatePartTimings, PartCalculatedTimings } from '@sofie-automation/corelib/dist/playout/timings' import { PieceInstanceWithTimings } from '@sofie-automation/corelib/dist/playout/processAndPrune' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' -import { NotificationsModelHelper } from '../../../notifications/NotificationsModelHelper' +import { NotificationsModelHelper } from '../../../notifications/NotificationsModelHelper.js' export class PlayoutModelReadonlyImpl implements PlayoutModelReadonly { public readonly playlistId: RundownPlaylistId @@ -570,20 +570,20 @@ export class PlayoutModelImpl extends PlayoutModelReadonlyImpl implements Playou ? this.context.directCollections.PartInstances.remove({ _id: { $in: removeFromDb }, rundownId: { $in: rundownIds }, - }) + }) : undefined, allToRemove.length > 0 ? this.context.directCollections.PieceInstances.remove({ partInstanceId: { $in: allToRemove }, rundownId: { $in: rundownIds }, - }) + }) : undefined, allToRemove.length > 0 ? this.context.directCollections.Notifications.remove({ 'relatedTo.studioId': this.context.studioId, 'relatedTo.rundownId': { $in: rundownIds }, 'relatedTo.partInstanceId': { $in: allToRemove }, - }) + }) : undefined, ]) }) @@ -727,18 +727,22 @@ export class PlayoutModelImpl extends PlayoutModelReadonlyImpl implements Playou this.#playlistHasChanged = true } - setOnTimelineGenerateResult( - persistentState: unknown | undefined, + setAbResolvingState( assignedAbSessions: Record, trackedAbSessions: ABSessionInfo[] ): void { - this.playlistImpl.previousPersistentState = persistentState this.playlistImpl.assignedAbSessions = assignedAbSessions this.playlistImpl.trackedAbSessions = trackedAbSessions this.#playlistHasChanged = true } + setBlueprintPersistentState(persistentState: unknown | undefined): void { + this.playlistImpl.previousPersistentState = persistentState + + this.#playlistHasChanged = true + } + setPartInstanceAsNext( partInstance: PlayoutPartInstanceModel | null, setManually: boolean, @@ -812,7 +816,8 @@ export class PlayoutModelImpl extends PlayoutModelReadonlyImpl implements Playou setTimeline( timelineObjs: TimelineObjGeneric[], - generationVersions: TimelineCompleteGenerationVersions + generationVersions: TimelineCompleteGenerationVersions, + regenerateTimelineToken: string | undefined ): ReadonlyDeep { this.timelineImpl = { _id: this.context.studioId, @@ -820,6 +825,7 @@ export class PlayoutModelImpl extends PlayoutModelReadonlyImpl implements Playou generated: getCurrentTime(), timelineBlob: serializeTimelineBlob(timelineObjs), generationVersions: generationVersions, + regenerateTimelineToken: regenerateTimelineToken, } this.#timelineHasChanged = true @@ -941,7 +947,7 @@ export class PlayoutModelImpl extends PlayoutModelReadonlyImpl implements Playou ? 'null' : `partInstanceHasChanges: ${ pi.partInstanceHasChanges - }, changedPieceInstanceIds: ${JSON.stringify(pi.changedPieceInstanceIds())}`) + }, changedPieceInstanceIds: ${JSON.stringify(pi.changedPieceInstanceIds())}`) ) )}` ) diff --git a/packages/job-worker/src/playout/model/implementation/PlayoutPartInstanceModelImpl.ts b/packages/job-worker/src/playout/model/implementation/PlayoutPartInstanceModelImpl.ts index 79454df589..6294c5c00c 100644 --- a/packages/job-worker/src/playout/model/implementation/PlayoutPartInstanceModelImpl.ts +++ b/packages/job-worker/src/playout/model/implementation/PlayoutPartInstanceModelImpl.ts @@ -8,8 +8,8 @@ import { PieceInstancePiece, } from '@sofie-automation/corelib/dist/dataModel/PieceInstance' import { clone, getRandomId } from '@sofie-automation/corelib/dist/lib' -import { getCurrentTime } from '../../../lib' -import { setupPieceInstanceInfiniteProperties } from '../../pieces' +import { getCurrentTime } from '../../../lib/index.js' +import { setupPieceInstanceInfiniteProperties } from '../../pieces.js' import { calculatePartExpectedDurationWithTransition, PartCalculatedTimings, @@ -19,15 +19,15 @@ import { PlayoutMutatablePart, PlayoutPartInstanceModel, PlayoutPartInstanceModelSnapshot, -} from '../PlayoutPartInstanceModel' +} from '../PlayoutPartInstanceModel.js' import { protectString } from '@sofie-automation/corelib/dist/protectedString' -import { PlayoutPieceInstanceModel } from '../PlayoutPieceInstanceModel' -import { PlayoutPieceInstanceModelImpl } from './PlayoutPieceInstanceModelImpl' +import { PlayoutPieceInstanceModel } from '../PlayoutPieceInstanceModel.js' +import { PlayoutPieceInstanceModelImpl } from './PlayoutPieceInstanceModelImpl.js' import { EmptyPieceTimelineObjectsBlob } from '@sofie-automation/corelib/dist/dataModel/Piece' -import _ = require('underscore') +import _ from 'underscore' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' -import { PlayoutMutatablePartSampleKeys } from '../../../blueprints/context/lib' -import { QuickLoopService } from '../services/QuickLoopService' +import { PlayoutMutatablePartSampleKeys } from '../../../blueprints/context/lib.js' +import { QuickLoopService } from '../services/QuickLoopService.js' /** * time in ms before an autotake when we don't accept takes/updates diff --git a/packages/job-worker/src/playout/model/implementation/PlayoutPieceInstanceModelImpl.ts b/packages/job-worker/src/playout/model/implementation/PlayoutPieceInstanceModelImpl.ts index c9390119ff..4f10a8ec79 100644 --- a/packages/job-worker/src/playout/model/implementation/PlayoutPieceInstanceModelImpl.ts +++ b/packages/job-worker/src/playout/model/implementation/PlayoutPieceInstanceModelImpl.ts @@ -3,8 +3,8 @@ import { ReadonlyDeep } from 'type-fest' import { PieceInstance, PieceInstancePiece } from '@sofie-automation/corelib/dist/dataModel/PieceInstance' import { clone, getRandomId } from '@sofie-automation/corelib/dist/lib' import { Time } from '@sofie-automation/blueprints-integration' -import { PlayoutPieceInstanceModel } from '../PlayoutPieceInstanceModel' -import _ = require('underscore') +import { PlayoutPieceInstanceModel } from '../PlayoutPieceInstanceModel.js' +import _ from 'underscore' export class PlayoutPieceInstanceModelImpl implements PlayoutPieceInstanceModel { /** diff --git a/packages/job-worker/src/playout/model/implementation/PlayoutRundownModelImpl.ts b/packages/job-worker/src/playout/model/implementation/PlayoutRundownModelImpl.ts index 5483307d1f..4f6b54aef6 100644 --- a/packages/job-worker/src/playout/model/implementation/PlayoutRundownModelImpl.ts +++ b/packages/job-worker/src/playout/model/implementation/PlayoutRundownModelImpl.ts @@ -3,12 +3,12 @@ import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' import { ReadonlyDeep } from 'type-fest' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' import { RundownBaselineObj } from '@sofie-automation/corelib/dist/dataModel/RundownBaselineObj' -import { PlayoutRundownModel } from '../PlayoutRundownModel' -import { PlayoutSegmentModel } from '../PlayoutSegmentModel' +import { PlayoutRundownModel } from '../PlayoutRundownModel.js' +import { PlayoutSegmentModel } from '../PlayoutSegmentModel.js' import { UserError, UserErrorMessage } from '@sofie-automation/corelib/dist/error' import { SegmentOrphanedReason } from '@sofie-automation/corelib/dist/dataModel/Segment' import { getRandomId } from '@sofie-automation/corelib/dist/lib' -import { PlayoutSegmentModelImpl } from './PlayoutSegmentModelImpl' +import { PlayoutSegmentModelImpl } from './PlayoutSegmentModelImpl.js' export class PlayoutRundownModelImpl implements PlayoutRundownModel { readonly rundown: ReadonlyDeep diff --git a/packages/job-worker/src/playout/model/implementation/PlayoutSegmentModelImpl.ts b/packages/job-worker/src/playout/model/implementation/PlayoutSegmentModelImpl.ts index 6a02559991..1356244003 100644 --- a/packages/job-worker/src/playout/model/implementation/PlayoutSegmentModelImpl.ts +++ b/packages/job-worker/src/playout/model/implementation/PlayoutSegmentModelImpl.ts @@ -2,7 +2,7 @@ import { PartId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { ReadonlyDeep } from 'type-fest' import { DBSegment, SegmentOrphanedReason } from '@sofie-automation/corelib/dist/dataModel/Segment' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' -import { PlayoutSegmentModel } from '../PlayoutSegmentModel' +import { PlayoutSegmentModel } from '../PlayoutSegmentModel.js' export class PlayoutSegmentModelImpl implements PlayoutSegmentModel { readonly #segment: DBSegment diff --git a/packages/job-worker/src/playout/model/implementation/SavePlayoutModel.ts b/packages/job-worker/src/playout/model/implementation/SavePlayoutModel.ts index 7fcf051046..e5e218c7b8 100644 --- a/packages/job-worker/src/playout/model/implementation/SavePlayoutModel.ts +++ b/packages/job-worker/src/playout/model/implementation/SavePlayoutModel.ts @@ -4,9 +4,9 @@ import { PieceInstance } from '@sofie-automation/corelib/dist/dataModel/PieceIns import { DBSegment, SegmentOrphanedReason } from '@sofie-automation/corelib/dist/dataModel/Segment' import { protectString } from '@sofie-automation/corelib/dist/protectedString' import { AnyBulkWriteOperation } from 'mongodb' -import { JobContext } from '../../../jobs' -import { PlayoutPartInstanceModelImpl } from './PlayoutPartInstanceModelImpl' -import { PlayoutRundownModelImpl } from './PlayoutRundownModelImpl' +import { JobContext } from '../../../jobs/index.js' +import { PlayoutPartInstanceModelImpl } from './PlayoutPartInstanceModelImpl.js' +import { PlayoutRundownModelImpl } from './PlayoutRundownModelImpl.js' /** * Save any changed AdlibTesting Segments diff --git a/packages/job-worker/src/playout/model/implementation/__tests__/LoadPlayoutModel.spec.ts b/packages/job-worker/src/playout/model/implementation/__tests__/LoadPlayoutModel.spec.ts index 2766d1017f..aefb364bc3 100644 --- a/packages/job-worker/src/playout/model/implementation/__tests__/LoadPlayoutModel.spec.ts +++ b/packages/job-worker/src/playout/model/implementation/__tests__/LoadPlayoutModel.spec.ts @@ -2,16 +2,16 @@ import { setupDefaultRundown, setupDefaultRundownPlaylist, setupMockShowStyleCompound, -} from '../../../../__mocks__/presetCollections' -import { MockJobContext, setupDefaultJobEnvironment } from '../../../../__mocks__/context' -import { ProcessedShowStyleCompound } from '../../../../jobs' +} from '../../../../__mocks__/presetCollections.js' +import { MockJobContext, setupDefaultJobEnvironment } from '../../../../__mocks__/context.js' +import { ProcessedShowStyleCompound } from '../../../../jobs/index.js' import { ReadonlyDeep } from 'type-fest' import { protectString } from '@sofie-automation/corelib/dist/protectedString' -import { createPlayoutModelFromIngestModel, loadPlayoutModelPreInit } from '../LoadPlayoutModel' -import { runWithPlaylistLock } from '../../../../playout/lock' -import { loadIngestModelFromRundown } from '../../../../ingest/model/implementation/LoadIngestModel' -import { runWithRundownLock } from '../../../../ingest/lock' -import { IngestModelReadonly } from '../../../../ingest/model/IngestModel' +import { createPlayoutModelFromIngestModel, loadPlayoutModelPreInit } from '../LoadPlayoutModel.js' +import { runWithPlaylistLock } from '../../../../playout/lock.js' +import { loadIngestModelFromRundown } from '../../../../ingest/model/implementation/LoadIngestModel.js' +import { runWithRundownLock } from '../../../../ingest/lock.js' +import { IngestModelReadonly } from '../../../../ingest/model/IngestModel.js' describe('LoadPlayoutModel', () => { let context: MockJobContext diff --git a/packages/job-worker/src/playout/model/implementation/__tests__/PlayoutPartInstanceModelImpl.spec.ts b/packages/job-worker/src/playout/model/implementation/__tests__/PlayoutPartInstanceModelImpl.spec.ts index 6913a33208..86804c567b 100644 --- a/packages/job-worker/src/playout/model/implementation/__tests__/PlayoutPartInstanceModelImpl.spec.ts +++ b/packages/job-worker/src/playout/model/implementation/__tests__/PlayoutPartInstanceModelImpl.spec.ts @@ -1,7 +1,7 @@ import { protectString } from '@sofie-automation/corelib/dist/protectedString' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' import { getRandomId, literal } from '@sofie-automation/corelib/dist/lib' -import { PlayoutPartInstanceModelImpl } from '../PlayoutPartInstanceModelImpl' +import { PlayoutPartInstanceModelImpl } from '../PlayoutPartInstanceModelImpl.js' import { PieceInstance, PieceInstancePiece } from '@sofie-automation/corelib/dist/dataModel/PieceInstance' import { IBlueprintPieceType, PieceLifespan } from '@sofie-automation/blueprints-integration' diff --git a/packages/job-worker/src/playout/model/implementation/__tests__/PlayoutRundownModelImpl.spec.ts b/packages/job-worker/src/playout/model/implementation/__tests__/PlayoutRundownModelImpl.spec.ts index 410e2ec179..6e24332f81 100644 --- a/packages/job-worker/src/playout/model/implementation/__tests__/PlayoutRundownModelImpl.spec.ts +++ b/packages/job-worker/src/playout/model/implementation/__tests__/PlayoutRundownModelImpl.spec.ts @@ -1,11 +1,11 @@ import { DBSegment, SegmentOrphanedReason } from '@sofie-automation/corelib/dist/dataModel/Segment' -import { PlayoutSegmentModelImpl } from '../PlayoutSegmentModelImpl' +import { PlayoutSegmentModelImpl } from '../PlayoutSegmentModelImpl.js' import { protectString } from '@sofie-automation/corelib/dist/protectedString' import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' -import { PlayoutRundownModelImpl } from '../PlayoutRundownModelImpl' +import { PlayoutRundownModelImpl } from '../PlayoutRundownModelImpl.js' import { SegmentId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { ReadonlyDeep } from 'type-fest' -import { restartRandomId } from '../../../../__mocks__/nanoid' +import { restartRandomId } from '../../../../__mocks__/nanoid.js' import { UserErrorMessage } from '@sofie-automation/corelib/dist/error' describe('PlayoutRundownModelImpl', () => { diff --git a/packages/job-worker/src/playout/model/implementation/__tests__/PlayoutSegmentModelImpl.spec.ts b/packages/job-worker/src/playout/model/implementation/__tests__/PlayoutSegmentModelImpl.spec.ts index 33e087c5ad..a8b185c9ea 100644 --- a/packages/job-worker/src/playout/model/implementation/__tests__/PlayoutSegmentModelImpl.spec.ts +++ b/packages/job-worker/src/playout/model/implementation/__tests__/PlayoutSegmentModelImpl.spec.ts @@ -1,5 +1,5 @@ import { DBSegment, SegmentOrphanedReason } from '@sofie-automation/corelib/dist/dataModel/Segment' -import { PlayoutSegmentModelImpl } from '../PlayoutSegmentModelImpl' +import { PlayoutSegmentModelImpl } from '../PlayoutSegmentModelImpl.js' import { protectString } from '@sofie-automation/corelib/dist/protectedString' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' diff --git a/packages/job-worker/src/playout/model/implementation/__tests__/SavePlayoutModel.spec.ts b/packages/job-worker/src/playout/model/implementation/__tests__/SavePlayoutModel.spec.ts index 92b2f7498c..cad93227d8 100644 --- a/packages/job-worker/src/playout/model/implementation/__tests__/SavePlayoutModel.spec.ts +++ b/packages/job-worker/src/playout/model/implementation/__tests__/SavePlayoutModel.spec.ts @@ -1,15 +1,15 @@ import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment' -import { PlayoutSegmentModelImpl } from '../PlayoutSegmentModelImpl' +import { PlayoutSegmentModelImpl } from '../PlayoutSegmentModelImpl.js' import { protectString } from '@sofie-automation/corelib/dist/protectedString' import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' -import { PlayoutRundownModelImpl } from '../PlayoutRundownModelImpl' -import { setupDefaultJobEnvironment } from '../../../../__mocks__/context' -import { writePartInstancesAndPieceInstances, writeAdlibTestingSegments } from '../SavePlayoutModel' -import { PlayoutPartInstanceModelImpl } from '../PlayoutPartInstanceModelImpl' +import { PlayoutRundownModelImpl } from '../PlayoutRundownModelImpl.js' +import { setupDefaultJobEnvironment } from '../../../../__mocks__/context.js' +import { writePartInstancesAndPieceInstances, writeAdlibTestingSegments } from '../SavePlayoutModel.js' +import { PlayoutPartInstanceModelImpl } from '../PlayoutPartInstanceModelImpl.js' import { PartInstanceId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { PieceInstance } from '@sofie-automation/corelib/dist/dataModel/PieceInstance' import { mock } from 'jest-mock-extended' -import { QuickLoopService } from '../../services/QuickLoopService' +import { QuickLoopService } from '../../services/QuickLoopService.js' describe('SavePlayoutModel', () => { function createRundownModel(segments?: DBSegment[]): PlayoutRundownModelImpl { diff --git a/packages/job-worker/src/playout/model/services/QuickLoopService.ts b/packages/job-worker/src/playout/model/services/QuickLoopService.ts index c0fcfc8a32..fbf650adb7 100644 --- a/packages/job-worker/src/playout/model/services/QuickLoopService.ts +++ b/packages/job-worker/src/playout/model/services/QuickLoopService.ts @@ -1,5 +1,5 @@ import { MarkerPosition, compareMarkerPositions } from '@sofie-automation/corelib/dist/playout/playlist' -import { PlayoutModelReadonly } from '../PlayoutModel' +import { PlayoutModelReadonly } from '../PlayoutModel.js' import { QuickLoopMarker, QuickLoopMarkerType, @@ -10,14 +10,17 @@ import { ReadonlyObjectDeep } from 'type-fest/source/readonly-deep' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' import { PartId, RundownId, SegmentId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment' -import { PlayoutPartInstanceModel } from '../PlayoutPartInstanceModel' -import { JobContext } from '../../../jobs' +import { PlayoutPartInstanceModel } from '../PlayoutPartInstanceModel.js' +import { JobContext } from '../../../jobs/index.js' import { clone } from '@sofie-automation/corelib/dist/lib' import { DEFAULT_FALLBACK_PART_DURATION } from '@sofie-automation/shared-lib/dist/core/constants' -import { getCurrentTime } from '../../../lib' +import { getCurrentTime } from '../../../lib/index.js' export class QuickLoopService { - constructor(private readonly context: JobContext, private readonly playoutModel: PlayoutModelReadonly) {} + constructor( + private readonly context: JobContext, + private readonly playoutModel: PlayoutModelReadonly + ) {} isPartWithinQuickLoop(partInstanceModel: PlayoutPartInstanceModel | null): boolean | null { const quickLoopProps = this.playoutModel.playlist.quickLoop @@ -34,7 +37,7 @@ export class QuickLoopService { const partPosition = this.findPartPosition(partInstanceModel, rundownIds) const isPartBetweenMarkers = partPosition ? compareMarkerPositions(startPosition, partPosition) >= 0 && - compareMarkerPositions(partPosition, endPosition) >= 0 + compareMarkerPositions(partPosition, endPosition) >= 0 : false return isPartBetweenMarkers diff --git a/packages/job-worker/src/playout/moveNextPart.ts b/packages/job-worker/src/playout/moveNextPart.ts index 995f9c495c..00489b4eb5 100644 --- a/packages/job-worker/src/playout/moveNextPart.ts +++ b/packages/job-worker/src/playout/moveNextPart.ts @@ -1,9 +1,9 @@ import { groupByToMap } from '@sofie-automation/corelib/dist/lib' import { DBPart, isPartPlayable } from '@sofie-automation/corelib/dist/dataModel/Part' -import { JobContext } from '../jobs' -import { PlayoutModelReadonly } from './model/PlayoutModel' +import { JobContext } from '../jobs/index.js' +import { PlayoutModelReadonly } from './model/PlayoutModel.js' import { sortPartsInSortedSegments } from '@sofie-automation/corelib/dist/playout/playlist' -import { logger } from '../logging' +import { logger } from '../logging.js' import { SegmentOrphanedReason } from '@sofie-automation/corelib/dist/dataModel/Segment' import { ReadonlyDeep } from 'type-fest' diff --git a/packages/job-worker/src/playout/pieces.ts b/packages/job-worker/src/playout/pieces.ts index a30af7f8c2..9d46f0bfda 100644 --- a/packages/job-worker/src/playout/pieces.ts +++ b/packages/job-worker/src/playout/pieces.ts @@ -3,9 +3,9 @@ import { PieceInstance, PieceInstancePiece } from '@sofie-automation/corelib/dis import { protectString } from '@sofie-automation/corelib/dist/protectedString' import { PieceLifespan, IBlueprintPieceType } from '@sofie-automation/blueprints-integration/dist' import { getRandomId, literal } from '@sofie-automation/corelib/dist/lib' -import { JobContext } from '../jobs' +import { JobContext } from '../jobs/index.js' import { AdLibPiece } from '@sofie-automation/corelib/dist/dataModel/AdLibPiece' -import _ = require('underscore') +import _ from 'underscore' import { Piece } from '@sofie-automation/corelib/dist/dataModel/Piece' import { BucketAdLib } from '@sofie-automation/corelib/dist/dataModel/BucketAdLibPiece' import { ReadonlyDeep } from 'type-fest' diff --git a/packages/job-worker/src/playout/quickLoopMarkers.ts b/packages/job-worker/src/playout/quickLoopMarkers.ts index 3803f59f93..6989c74571 100644 --- a/packages/job-worker/src/playout/quickLoopMarkers.ts +++ b/packages/job-worker/src/playout/quickLoopMarkers.ts @@ -1,15 +1,15 @@ import { UserError, UserErrorMessage } from '@sofie-automation/corelib/dist/error' import { ClearQuickLoopMarkersProps, SetQuickLoopMarkerProps } from '@sofie-automation/corelib/dist/worker/studio' -import { JobContext } from '../jobs' -import { runJobWithPlayoutModel } from './lock' -import { updateTimeline } from './timeline/generate' -import { selectNextPart } from './selectNextPart' -import { setNextPart } from './setNext' -import { resetPartInstancesWithPieceInstances } from './lib' +import { JobContext } from '../jobs/index.js' +import { runJobWithPlayoutModel } from './lock.js' +import { updateTimeline } from './timeline/generate.js' +import { selectNextPart } from './selectNextPart.js' +import { setNextPart } from './setNext.js' +import { resetPartInstancesWithPieceInstances } from './lib.js' import { QuickLoopMarker, QuickLoopMarkerType } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { SegmentId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { clone } from 'underscore' -import { PlayoutModel } from './model/PlayoutModel' +import { PlayoutModel } from './model/PlayoutModel.js' export async function handleSetQuickLoopMarker(context: JobContext, data: SetQuickLoopMarkerProps): Promise { return runJobWithPlayoutModel( diff --git a/packages/job-worker/src/playout/resolvedPieces.ts b/packages/job-worker/src/playout/resolvedPieces.ts index f13ce67c72..f28b928506 100644 --- a/packages/job-worker/src/playout/resolvedPieces.ts +++ b/packages/job-worker/src/playout/resolvedPieces.ts @@ -1,14 +1,14 @@ import { PieceInstanceInfiniteId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { ResolvedPieceInstance } from '@sofie-automation/corelib/dist/dataModel/PieceInstance' import { SourceLayers } from '@sofie-automation/corelib/dist/dataModel/ShowStyleBase' -import { JobContext } from '../jobs' -import { getCurrentTime } from '../lib' +import { JobContext } from '../jobs/index.js' +import { getCurrentTime } from '../lib/index.js' import { processAndPrunePieceInstanceTimings, resolvePrunedPieceInstance, } from '@sofie-automation/corelib/dist/playout/processAndPrune' -import { SelectedPartInstancesTimelineInfo } from './timeline/generate' -import { PlayoutPartInstanceModel } from './model/PlayoutPartInstanceModel' +import { SelectedPartInstancesTimelineInfo } from './timeline/generate.js' +import { PlayoutPartInstanceModel } from './model/PlayoutPartInstanceModel.js' /** * Resolve the PieceInstances for a PartInstance diff --git a/packages/job-worker/src/playout/selectNextPart.ts b/packages/job-worker/src/playout/selectNextPart.ts index 892c88aecf..da8184a5cc 100644 --- a/packages/job-worker/src/playout/selectNextPart.ts +++ b/packages/job-worker/src/playout/selectNextPart.ts @@ -1,11 +1,11 @@ import { DBPart, isPartPlayable } from '@sofie-automation/corelib/dist/dataModel/Part' -import { JobContext } from '../jobs' +import { JobContext } from '../jobs/index.js' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' import { DBRundownPlaylist, QuickLoopMarkerType } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { ForceQuickLoopAutoNext } from '@sofie-automation/shared-lib/dist/core/model/StudioSettings' import { SegmentId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { ReadonlyDeep } from 'type-fest' -import { PlayoutSegmentModel } from './model/PlayoutSegmentModel' +import { PlayoutSegmentModel } from './model/PlayoutSegmentModel.js' /** * This wraps a Part which has been selected to be next, to include some additional data about that choice diff --git a/packages/job-worker/src/playout/setNext.ts b/packages/job-worker/src/playout/setNext.ts index acb7d281a2..7134917332 100644 --- a/packages/job-worker/src/playout/setNext.ts +++ b/packages/job-worker/src/playout/setNext.ts @@ -1,36 +1,37 @@ import { assertNever, getRandomId, generateTranslation } from '@sofie-automation/corelib/dist/lib' import { SegmentOrphanedReason } from '@sofie-automation/corelib/dist/dataModel/Segment' import { DBPart, isPartPlayable } from '@sofie-automation/corelib/dist/dataModel/Part' -import { JobContext } from '../jobs' +import { JobContext } from '../jobs/index.js' import { PartId, PartInstanceId, RundownId, SegmentId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { PlayoutModel } from './model/PlayoutModel' -import { PlayoutPartInstanceModel } from './model/PlayoutPartInstanceModel' -import { PlayoutSegmentModel } from './model/PlayoutSegmentModel' +import { PlayoutModel } from './model/PlayoutModel.js' +import { PlayoutPartInstanceModel } from './model/PlayoutPartInstanceModel.js' +import { PlayoutSegmentModel } from './model/PlayoutSegmentModel.js' import { fetchPiecesThatMayBeActiveForPart, getPieceInstancesForPart, syncPlayheadInfinitesForNextPartInstance, -} from './infinites' +} from './infinites.js' import { PRESERVE_UNSYNCED_PLAYING_SEGMENT_CONTENTS } from '@sofie-automation/shared-lib/dist/core/constants' import { IngestJobs } from '@sofie-automation/corelib/dist/worker/ingest' -import _ = require('underscore') -import { resetPartInstancesWithPieceInstances } from './lib' +import _ from 'underscore' +import { resetPartInstancesWithPieceInstances } from './lib.js' import { RundownHoldState } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { UserError, UserErrorMessage } from '@sofie-automation/corelib/dist/error' -import { SelectNextPartResult } from './selectNextPart' +import { SelectNextPartResult } from './selectNextPart.js' import { ReadonlyDeep } from 'type-fest' import { QueueNextSegmentResult } from '@sofie-automation/corelib/dist/worker/studio' import { protectString } from '@sofie-automation/corelib/dist/protectedString' -import { OnSetAsNextContext } from '../blueprints/context' -import { logger } from '../logging' -import { WatchedPackagesHelper } from '../blueprints/context/watchedPackages' +import { OnSetAsNextContext } from '../blueprints/context/index.js' +import { logger } from '../logging.js' +import { WatchedPackagesHelper } from '../blueprints/context/watchedPackages.js' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' import { PartAndPieceInstanceActionService, applyActionSideEffects, -} from '../blueprints/context/services/PartAndPieceInstanceActionService' +} from '../blueprints/context/services/PartAndPieceInstanceActionService.js' import { NoteSeverity } from '@sofie-automation/blueprints-integration' -import { convertNoteToNotification } from '../notifications/util' +import { convertNoteToNotification } from '../notifications/util.js' +import { PersistentPlayoutStateStore } from '../blueprints/context/services/PersistantStateStore.js' /** * Set or clear the nexted part, from a given PartInstance, or SelectNextPartResult @@ -45,7 +46,7 @@ export async function setNextPart( playoutModel: PlayoutModel, rawNextPart: ReadonlyDeep> | PlayoutPartInstanceModel | null, setManually: boolean, - nextTimeOffset?: number | undefined + nextTimeOffset?: number ): Promise { const span = context.startSpan('setNextPart') @@ -80,7 +81,7 @@ export async function setNextPart( ? { part: moveNextToPart.selectedPart, consumesQueuedSegmentId: false, - } + } : null, true ) @@ -102,7 +103,7 @@ async function setNextPartAndCheckForPendingMoveNextPart( playoutModel: PlayoutModel, rawNextPart: ReadonlyDeep> | PlayoutPartInstanceModel | null, setManually: boolean, - nextTimeOffset?: number | undefined + nextTimeOffset?: number ): Promise<{ selectedPart: ReadonlyDeep | null } | undefined> { if (rawNextPart) { if (!playoutModel.playlist.activationId) @@ -176,7 +177,7 @@ async function setNextPartAndCheckForPendingMoveNextPart( playoutModel.setPartInstanceAsNext(newPartInstance, setManually, consumesQueuedSegmentId, nextTimeOffset) - return executeOnSetAsNextCallback(playoutModel, newPartInstance, context) + return executeOnSetAsNextCallback(playoutModel, newPartInstance, context, setManually) } else { // Set to null @@ -188,7 +189,8 @@ async function setNextPartAndCheckForPendingMoveNextPart( async function executeOnSetAsNextCallback( playoutModel: PlayoutModel, newPartInstance: PlayoutPartInstanceModel, - context: JobContext + context: JobContext, + setManually: boolean ) { const NOTIFICATION_CATEGORY = 'onSetAsNext' @@ -218,16 +220,23 @@ async function executeOnSetAsNextCallback( playoutModel, showStyle, watchedPackagesHelper, - new PartAndPieceInstanceActionService(context, playoutModel, showStyle, rundownOfNextPart) + new PartAndPieceInstanceActionService(context, playoutModel, showStyle, rundownOfNextPart), + setManually ) // Clear any existing notifications for this partInstance. This will clear any from the previous setAsNext playoutModel.clearAllNotifications(NOTIFICATION_CATEGORY) try { - await blueprint.blueprint.onSetAsNext(onSetAsNextContext) + const blueprintPersistentState = new PersistentPlayoutStateStore(playoutModel.playlist.previousPersistentState) + + await blueprint.blueprint.onSetAsNext(onSetAsNextContext, blueprintPersistentState) await applyOnSetAsNextSideEffects(context, playoutModel, onSetAsNextContext) + if (blueprintPersistentState.hasChanges) { + playoutModel.setBlueprintPersistentState(blueprintPersistentState.getAll()) + } + for (const note of onSetAsNextContext.notes) { // Update the notifications. Even though these are related to a partInstance, they will be cleared on the next take playoutModel.setNotification(NOTIFICATION_CATEGORY, { @@ -237,7 +246,7 @@ async function executeOnSetAsNextCallback( type: 'partInstance', rundownId, partInstanceId, - } + } : { type: 'playlist' }, }) } @@ -253,7 +262,7 @@ async function executeOnSetAsNextCallback( type: 'partInstance', rundownId, partInstanceId, - } + } : { type: 'playlist' }, }) } @@ -551,7 +560,7 @@ export async function setNextPartFromPart( playoutModel: PlayoutModel, nextPart: ReadonlyDeep, setManually: boolean, - nextTimeOffset?: number | undefined + nextTimeOffset?: number ): Promise { const playlist = playoutModel.playlist if (!playlist.activationId) throw UserError.create(UserErrorMessage.InactiveRundown) diff --git a/packages/job-worker/src/playout/setNextJobs.ts b/packages/job-worker/src/playout/setNextJobs.ts index 6a041f3c86..a9ffc2c1f8 100644 --- a/packages/job-worker/src/playout/setNextJobs.ts +++ b/packages/job-worker/src/playout/setNextJobs.ts @@ -9,12 +9,12 @@ import { QueueNextSegmentProps, QueueNextSegmentResult, } from '@sofie-automation/corelib/dist/worker/studio' -import { JobContext } from '../jobs' -import { runJobWithPlayoutModel } from './lock' -import { setNextPartFromPart, setNextSegment, queueNextSegment } from './setNext' -import { selectNewPartWithOffsets } from './moveNextPart' -import { updateTimeline } from './timeline/generate' -import { PlayoutSegmentModel } from './model/PlayoutSegmentModel' +import { JobContext } from '../jobs/index.js' +import { runJobWithPlayoutModel } from './lock.js' +import { setNextPartFromPart, setNextSegment, queueNextSegment } from './setNext.js' +import { selectNewPartWithOffsets } from './moveNextPart.js' +import { updateTimeline } from './timeline/generate.js' +import { PlayoutSegmentModel } from './model/PlayoutSegmentModel.js' import { ReadonlyDeep } from 'type-fest' /** diff --git a/packages/job-worker/src/playout/snapshot.ts b/packages/job-worker/src/playout/snapshot.ts index 29086ab5e4..97a5f8230e 100644 --- a/packages/job-worker/src/playout/snapshot.ts +++ b/packages/job-worker/src/playout/snapshot.ts @@ -18,15 +18,15 @@ import { RestorePlaylistSnapshotProps, RestorePlaylistSnapshotResult, } from '@sofie-automation/corelib/dist/worker/studio' -import { getCurrentTime, getSystemVersion } from '../lib' -import { JobContext } from '../jobs' -import { runWithPlaylistLock } from './lock' +import { getCurrentTime, getSystemVersion } from '../lib/index.js' +import { JobContext } from '../jobs/index.js' +import { runWithPlaylistLock } from './lock.js' import { CoreRundownPlaylistSnapshot } from '@sofie-automation/corelib/dist/snapshots' import { unprotectString, ProtectedString, protectString } from '@sofie-automation/corelib/dist/protectedString' -import { saveIntoDb } from '../db/changes' -import { getPartId, getSegmentId } from '../ingest/lib' +import { saveIntoDb } from '../db/changes.js' +import { getPartId, getSegmentId } from '../ingest/lib.js' import { assertNever, getRandomId, literal } from '@sofie-automation/corelib/dist/lib' -import { logger } from '../logging' +import { logger } from '../logging.js' import { JSONBlobParse, JSONBlobStringify } from '@sofie-automation/shared-lib/dist/lib/JSONBlob' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { RundownOrphanedReason } from '@sofie-automation/corelib/dist/dataModel/Rundown' @@ -97,7 +97,7 @@ export async function handleGeneratePlaylistSnapshot( { 'timings.plannedStoppedPlayback': { $gte: validTime }, reset: true }, { reset: { $ne: true } }, ], - } + } ) const pieces = await context.directCollections.Pieces.findFetch({ startRundownId: { $in: rundownIds } }) const pieceInstances = await context.directCollections.PieceInstances.findFetch( @@ -106,7 +106,7 @@ export async function handleGeneratePlaylistSnapshot( : { rundownId: { $in: rundownIds }, $or: [{ partInstanceId: { $in: partInstances.map((p) => p._id) } }, { reset: { $ne: true } }], - } + } ) const adLibPieces = await context.directCollections.AdLibPieces.findFetch({ rundownId: { $in: rundownIds } }) const baselineAdlibs = await context.directCollections.RundownBaselineAdLibPieces.findFetch({ @@ -117,9 +117,6 @@ export async function handleGeneratePlaylistSnapshot( rundownId: { $in: rundownIds }, }) - const expectedMediaItems = await context.directCollections.ExpectedMediaItems.findFetch({ - partId: { $in: parts.map((i) => i._id) }, - }) const expectedPlayoutItems = await context.directCollections.ExpectedPlayoutItems.findFetch({ rundownId: { $in: rundownIds }, }) @@ -134,7 +131,7 @@ export async function handleGeneratePlaylistSnapshot( playlist.activationId && props.withTimeline ? await context.directCollections.Timelines.findOne({ _id: playlist.studioId, - }) + }) : undefined logger.info(`Snapshot generation done`) @@ -155,7 +152,6 @@ export async function handleGeneratePlaylistSnapshot( adLibPieces, adLibActions, baselineAdLibActions, - expectedMediaItems, expectedPlayoutItems, expectedPackages, timeline, @@ -395,7 +391,7 @@ export async function handleRestorePlaylistSnapshot( segmentId?: SegmentId part?: unknown piece?: unknown - } + }, >(objs: undefined | T[], updateId: boolean): T[] { const updateIds = (obj: T, updateOwnId: boolean) => { if (obj.rundownId) { @@ -503,12 +499,6 @@ export async function handleRestorePlaylistSnapshot( { rundownId: { $in: rundownIds } }, updateItemIds(snapshot.adLibActions, false) ), - saveIntoDb( - context, - context.directCollections.ExpectedMediaItems, - { partId: { $in: Array.from(partIdMap.keys()) } }, - updateItemIds(snapshot.expectedMediaItems, true) - ), saveIntoDb( context, context.directCollections.ExpectedPlayoutItems, diff --git a/packages/job-worker/src/playout/take.ts b/packages/job-worker/src/playout/take.ts index bdb6fd73b4..67b8f51742 100644 --- a/packages/job-worker/src/playout/take.ts +++ b/packages/job-worker/src/playout/take.ts @@ -2,38 +2,39 @@ import { PeripheralDeviceType } from '@sofie-automation/corelib/dist/dataModel/P import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' import { RundownHoldState, SelectedPartInstance } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { UserError, UserErrorMessage } from '@sofie-automation/corelib/dist/error' -import { logger } from '../logging' -import { JobContext, ProcessedShowStyleCompound } from '../jobs' -import { PlayoutModel } from './model/PlayoutModel' -import { PlayoutPartInstanceModel } from './model/PlayoutPartInstanceModel' -import { resetPartInstancesWithPieceInstances } from './lib' -import { selectNextPart } from './selectNextPart' -import { setNextPart } from './setNext' -import { getCurrentTime } from '../lib' +import { logger } from '../logging.js' +import { JobContext, ProcessedShowStyleCompound } from '../jobs/index.js' +import { PlayoutModel } from './model/PlayoutModel.js' +import { PlayoutPartInstanceModel } from './model/PlayoutPartInstanceModel.js' +import { resetPartInstancesWithPieceInstances } from './lib.js' +import { selectNextPart } from './selectNextPart.js' +import { setNextPart } from './setNext.js' +import { getCurrentTime } from '../lib/index.js' import { NoteSeverity, PartEndState, VTContent } from '@sofie-automation/blueprints-integration' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' import { ReadonlyDeep } from 'type-fest' -import { getResolvedPiecesForCurrentPartInstance } from './resolvedPieces' +import { getResolvedPiecesForCurrentPartInstance } from './resolvedPieces.js' import { clone, generateTranslation, getRandomId } from '@sofie-automation/corelib/dist/lib' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' -import { updateTimeline } from './timeline/generate' -import { OnTakeContext, PartEventContext, RundownContext } from '../blueprints/context' -import { WrappedShowStyleBlueprint } from '../blueprints/cache' -import { innerStopPieces } from './adlibUtils' -import { reportPartInstanceHasStarted, reportPartInstanceHasStopped } from './timings/partPlayback' -import { convertPartInstanceToBlueprints, convertResolvedPieceInstanceToBlueprints } from '../blueprints/context/lib' +import { updateTimeline } from './timeline/generate.js' +import { OnTakeContext, PartEventContext, RundownContext } from '../blueprints/context/index.js' +import { WrappedShowStyleBlueprint } from '../blueprints/cache.js' +import { innerStopPieces } from './adlibUtils.js' +import { reportPartInstanceHasStarted, reportPartInstanceHasStopped } from './timings/partPlayback.js' +import { convertPartInstanceToBlueprints, convertResolvedPieceInstanceToBlueprints } from '../blueprints/context/lib.js' import { processAndPrunePieceInstanceTimings } from '@sofie-automation/corelib/dist/playout/processAndPrune' import { TakeNextPartProps } from '@sofie-automation/corelib/dist/worker/studio' -import { runJobWithPlayoutModel } from './lock' -import _ = require('underscore') +import { runJobWithPlayoutModel } from './lock.js' +import _ from 'underscore' import { ReadonlyObjectDeep } from 'type-fest/source/readonly-deep' -import { WatchedPackagesHelper } from '../blueprints/context/watchedPackages' +import { WatchedPackagesHelper } from '../blueprints/context/watchedPackages.js' import { PartAndPieceInstanceActionService, applyActionSideEffects, -} from '../blueprints/context/services/PartAndPieceInstanceActionService' -import { PlayoutRundownModel } from './model/PlayoutRundownModel' -import { convertNoteToNotification } from '../notifications/util' +} from '../blueprints/context/services/PartAndPieceInstanceActionService.js' +import { PlayoutRundownModel } from './model/PlayoutRundownModel.js' +import { convertNoteToNotification } from '../notifications/util.js' +import { PersistentPlayoutStateStore } from '../blueprints/context/services/PersistantStateStore.js' /** * Take the currently Next:ed Part (start playing it) @@ -71,7 +72,6 @@ export async function handleTakeNextPart(context: JobContext, data: TakeNextPart ) } } - if (lastTakeTime && now - lastTakeTime < context.studio.settings.minimumTakeSpan) { logger.debug( `Time since last take is shorter than ${context.studio.settings.minimumTakeSpan} for ${ @@ -316,10 +316,18 @@ async function executeOnTakeCallback( new PartAndPieceInstanceActionService(context, playoutModel, showStyle, currentRundown) ) try { - await blueprint.blueprint.onTake(onSetAsNextContext) + const blueprintPersistentState = new PersistentPlayoutStateStore( + playoutModel.playlist.previousPersistentState + ) + + await blueprint.blueprint.onTake(onSetAsNextContext, blueprintPersistentState) await applyOnTakeSideEffects(context, playoutModel, onSetAsNextContext) isTakeAborted = onSetAsNextContext.isTakeAborted + if (blueprintPersistentState.hasChanges) { + playoutModel.setBlueprintPersistentState(blueprintPersistentState.getAll()) + } + for (const note of onSetAsNextContext.notes) { // Update the notifications. Even though these are related to a partInstance, they will be cleared on the next take playoutModel.setNotification(NOTIFICATION_CATEGORY, { @@ -511,13 +519,19 @@ export function updatePartInstanceOnTake( context.getShowStyleBlueprintConfig(showStyle), takeRundown ) + const blueprintPersistentState = new PersistentPlayoutStateStore( + playoutModel.playlist.previousPersistentState + ) previousPartEndState = blueprint.blueprint.getEndStateForPart( context2, - playoutModel.playlist.previousPersistentState, + blueprintPersistentState, convertPartInstanceToBlueprints(currentPartInstance.partInstance), resolvedPieces.map(convertResolvedPieceInstanceToBlueprints), time ) + if (blueprintPersistentState.hasChanges) { + playoutModel.setBlueprintPersistentState(blueprintPersistentState.getAll()) + } if (span) span.end() logger.info(`Calculated end state in ${getCurrentTime() - time}ms`) } catch (err) { diff --git a/packages/job-worker/src/playout/timeline/__tests__/pieceGroup.test.ts b/packages/job-worker/src/playout/timeline/__tests__/pieceGroup.test.ts index 6d4364c37e..88946357bd 100644 --- a/packages/job-worker/src/playout/timeline/__tests__/pieceGroup.test.ts +++ b/packages/job-worker/src/playout/timeline/__tests__/pieceGroup.test.ts @@ -1,6 +1,6 @@ import { getRandomId, literal } from '@sofie-automation/corelib/dist/lib' import { Piece } from '@sofie-automation/corelib/dist/dataModel/Piece' -import { createPieceGroupAndCap, PieceTimelineMetadata } from '../pieceGroup' +import { createPieceGroupAndCap, PieceTimelineMetadata } from '../pieceGroup.js' import { OnGenerateTimelineObjExt, TimelineContentTypeOther, diff --git a/packages/job-worker/src/playout/timeline/__tests__/rundown.test.ts b/packages/job-worker/src/playout/timeline/__tests__/rundown.test.ts index 003ee434b7..18322e9567 100644 --- a/packages/job-worker/src/playout/timeline/__tests__/rundown.test.ts +++ b/packages/job-worker/src/playout/timeline/__tests__/rundown.test.ts @@ -1,9 +1,9 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ import { DBRundownPlaylist, SelectedPartInstance } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' -import { setupDefaultJobEnvironment } from '../../../__mocks__/context' -import { buildTimelineObjsForRundown, RundownTimelineResult, RundownTimelineTimingContext } from '../rundown' +import { setupDefaultJobEnvironment } from '../../../__mocks__/context.js' +import { buildTimelineObjsForRundown, RundownTimelineResult, RundownTimelineTimingContext } from '../rundown.js' import { protectString } from '@sofie-automation/corelib/dist/protectedString' -import { SelectedPartInstancesTimelineInfo, SelectedPartInstanceTimelineInfo } from '../generate' +import { SelectedPartInstancesTimelineInfo, SelectedPartInstanceTimelineInfo } from '../generate.js' import { PartCalculatedTimings } from '@sofie-automation/corelib/dist/playout/timings' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' @@ -57,9 +57,9 @@ function transformTimelineIntoSimplifiedForm(res: RundownTimelineResult) { ? { ...res.timingContext.nextPartGroup, children: res.timingContext.nextPartGroup.children.length as any, - } + } : undefined, - } satisfies RundownTimelineTimingContext) + } satisfies RundownTimelineTimingContext) : undefined, } } @@ -201,6 +201,7 @@ describe('buildTimelineObjsForRundown', () => { partInstance: createMockPartInstance('part0'), pieceInstances: [], calculatedTimings: DEFAULT_PART_TIMINGS, + regenerateTimelineAt: undefined, }, } @@ -221,6 +222,7 @@ describe('buildTimelineObjsForRundown', () => { partInstance: createMockPartInstance('part0'), pieceInstances: [createMockPieceInstance('piece0')], calculatedTimings: DEFAULT_PART_TIMINGS, + regenerateTimelineAt: undefined, }, } @@ -254,6 +256,7 @@ describe('buildTimelineObjsForRundown', () => { ), pieceInstances: [createMockPieceInstance('piece0')], calculatedTimings: DEFAULT_PART_TIMINGS, + regenerateTimelineAt: undefined, }, } @@ -279,6 +282,7 @@ describe('buildTimelineObjsForRundown', () => { partInstance: createMockPartInstance('part0'), pieceInstances: [createMockPieceInstance('piece0')], calculatedTimings: DEFAULT_PART_TIMINGS, + regenerateTimelineAt: undefined, }, next: { nowInPart: 0, @@ -286,6 +290,7 @@ describe('buildTimelineObjsForRundown', () => { partInstance: createMockPartInstance('part1'), pieceInstances: [createMockPieceInstance('piece1')], calculatedTimings: DEFAULT_PART_TIMINGS, + regenerateTimelineAt: undefined, }, } @@ -312,6 +317,7 @@ describe('buildTimelineObjsForRundown', () => { partInstance: createMockPartInstance('part0', { autoNext: true, expectedDuration: 5000 }), pieceInstances: [createMockPieceInstance('piece0')], calculatedTimings: DEFAULT_PART_TIMINGS, + regenerateTimelineAt: undefined, }, next: { nowInPart: 0, @@ -319,6 +325,7 @@ describe('buildTimelineObjsForRundown', () => { partInstance: createMockPartInstance('part1'), pieceInstances: [createMockPieceInstance('piece1')], calculatedTimings: DEFAULT_PART_TIMINGS, + regenerateTimelineAt: undefined, }, } @@ -353,6 +360,7 @@ describe('buildTimelineObjsForRundown', () => { ), pieceInstances: [createMockPieceInstance('piece9')], calculatedTimings: DEFAULT_PART_TIMINGS, + regenerateTimelineAt: undefined, }, current: { nowInPart: 1234, @@ -360,6 +368,7 @@ describe('buildTimelineObjsForRundown', () => { partInstance: createMockPartInstance('part0'), pieceInstances: [createMockPieceInstance('piece0')], calculatedTimings: DEFAULT_PART_TIMINGS, + regenerateTimelineAt: undefined, }, } @@ -395,6 +404,7 @@ describe('buildTimelineObjsForRundown', () => { ), pieceInstances: [createMockPieceInstance('piece9'), createMockPieceInstance('piece8')], calculatedTimings: DEFAULT_PART_TIMINGS, + regenerateTimelineAt: undefined, }, current: { nowInPart: 1234, @@ -409,6 +419,7 @@ describe('buildTimelineObjsForRundown', () => { fromPartPostroll: 400, fromPartKeepalive: 100, }, + regenerateTimelineAt: undefined, }, } @@ -448,6 +459,7 @@ describe('buildTimelineObjsForRundown', () => { }), ], calculatedTimings: DEFAULT_PART_TIMINGS, + regenerateTimelineAt: undefined, }, current: { nowInPart: 1234, @@ -462,6 +474,7 @@ describe('buildTimelineObjsForRundown', () => { fromPartPostroll: 400, fromPartKeepalive: 100, }, + regenerateTimelineAt: undefined, }, } @@ -488,6 +501,7 @@ describe('buildTimelineObjsForRundown', () => { partInstance: createMockPartInstance('part0', { autoNext: true, expectedDuration: 5000 }), pieceInstances: [createMockPieceInstance('piece0')], calculatedTimings: DEFAULT_PART_TIMINGS, + regenerateTimelineAt: undefined, }, next: { nowInPart: 0, @@ -502,6 +516,7 @@ describe('buildTimelineObjsForRundown', () => { fromPartPostroll: 400, fromPartKeepalive: 100, }, + regenerateTimelineAt: undefined, }, } @@ -543,6 +558,7 @@ describe('buildTimelineObjsForRundown', () => { }), ], calculatedTimings: DEFAULT_PART_TIMINGS, + regenerateTimelineAt: undefined, }, next: { nowInPart: 0, @@ -565,6 +581,7 @@ describe('buildTimelineObjsForRundown', () => { fromPartPostroll: 400, fromPartKeepalive: 100, }, + regenerateTimelineAt: undefined, }, } @@ -597,6 +614,7 @@ describe('buildTimelineObjsForRundown', () => { ), pieceInstances: [createMockPieceInstance('piece9')], calculatedTimings: DEFAULT_PART_TIMINGS, + regenerateTimelineAt: undefined, } it('infinite starting in current', () => { @@ -613,6 +631,7 @@ describe('buildTimelineObjsForRundown', () => { createMockInfinitePieceInstance('piece1', {}, { plannedStartedPlayback: undefined }), ], calculatedTimings: DEFAULT_PART_TIMINGS, + regenerateTimelineAt: undefined, }, } @@ -641,6 +660,7 @@ describe('buildTimelineObjsForRundown', () => { partInstance: createMockPartInstance('part0'), pieceInstances: [createMockPieceInstance('piece0')], calculatedTimings: DEFAULT_PART_TIMINGS, + regenerateTimelineAt: undefined, }, } @@ -669,6 +689,7 @@ describe('buildTimelineObjsForRundown', () => { partInstance: createMockPartInstance('part0'), pieceInstances: [createMockPieceInstance('piece0')], calculatedTimings: DEFAULT_PART_TIMINGS, + regenerateTimelineAt: undefined, }, } @@ -696,6 +717,7 @@ describe('buildTimelineObjsForRundown', () => { partInstance: createMockPartInstance('part0'), pieceInstances: [createMockPieceInstance('piece0'), continueInfinitePiece(infinitePiece)], calculatedTimings: DEFAULT_PART_TIMINGS, + regenerateTimelineAt: undefined, }, } @@ -727,6 +749,7 @@ describe('buildTimelineObjsForRundown', () => { ), pieceInstances: [createMockPieceInstance('piece0'), infinitePiece], calculatedTimings: DEFAULT_PART_TIMINGS, + regenerateTimelineAt: undefined, }, next: { nowInPart: 0, @@ -742,6 +765,7 @@ describe('buildTimelineObjsForRundown', () => { ), pieceInstances: [createMockPieceInstance('piece1'), continueInfinitePiece(infinitePiece)], calculatedTimings: DEFAULT_PART_TIMINGS, + regenerateTimelineAt: undefined, }, } @@ -771,6 +795,7 @@ describe('buildTimelineObjsForRundown', () => { ), pieceInstances: [createMockPieceInstance('piece0'), createMockInfinitePieceInstance('piece6')], calculatedTimings: DEFAULT_PART_TIMINGS, + regenerateTimelineAt: undefined, }, next: { nowInPart: 0, @@ -789,6 +814,7 @@ describe('buildTimelineObjsForRundown', () => { ...DEFAULT_PART_TIMINGS, fromPartKeepalive: 100, }, + regenerateTimelineAt: undefined, }, } @@ -821,6 +847,7 @@ describe('buildTimelineObjsForRundown', () => { createMockInfinitePieceInstance('piece6', { excludeDuringPartKeepalive: true }), ], calculatedTimings: DEFAULT_PART_TIMINGS, + regenerateTimelineAt: undefined, }, next: { nowInPart: 0, @@ -839,6 +866,7 @@ describe('buildTimelineObjsForRundown', () => { ...DEFAULT_PART_TIMINGS, fromPartKeepalive: 100, }, + regenerateTimelineAt: undefined, }, } diff --git a/packages/job-worker/src/playout/timeline/generate.ts b/packages/job-worker/src/playout/timeline/generate.ts index 8bc040653b..7661c773fe 100644 --- a/packages/job-worker/src/playout/timeline/generate.ts +++ b/packages/job-worker/src/playout/timeline/generate.ts @@ -1,13 +1,7 @@ -import { BlueprintId, TimelineHash } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { JobContext, JobStudio } from '../../jobs' +import { BlueprintId, RundownPlaylistId, TimelineHash } from '@sofie-automation/corelib/dist/dataModel/Ids' +import { JobContext, JobStudio } from '../../jobs/index.js' import { ReadonlyDeep } from 'type-fest' -import { - BlueprintResultBaseline, - BlueprintResultTimeline, - OnGenerateTimelineObj, - Time, - TSR, -} from '@sofie-automation/blueprints-integration' +import { BlueprintResultBaseline, OnGenerateTimelineObj, Time, TSR } from '@sofie-automation/blueprints-integration' import { deserializeTimelineBlob, OnGenerateTimelineObjExt, @@ -16,36 +10,39 @@ import { TimelineObjGeneric, TimelineObjRundown, TimelineObjType, + TimelineObjRegenerateTrigger, } from '@sofie-automation/corelib/dist/dataModel/Timeline' import { RundownBaselineObj } from '@sofie-automation/corelib/dist/dataModel/RundownBaselineObj' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' -import { applyToArray, clone, literal, normalizeArray, omit } from '@sofie-automation/corelib/dist/lib' -import { PlayoutModel } from '../model/PlayoutModel' -import { logger } from '../../logging' -import { getCurrentTime, getSystemVersion } from '../../lib' -import { getResolvedPiecesForPartInstancesOnTimeline } from '../resolvedPieces' +import { applyToArray, clone, getHash, literal, normalizeArray, omit } from '@sofie-automation/corelib/dist/lib' +import { PlayoutModel } from '../model/PlayoutModel.js' +import { logger } from '../../logging.js' +import { getCurrentTime, getSystemVersion } from '../../lib/index.js' +import { getResolvedPiecesForPartInstancesOnTimeline } from '../resolvedPieces.js' import { processAndPrunePieceInstanceTimings, PieceInstanceWithTimings, } from '@sofie-automation/corelib/dist/playout/processAndPrune' -import { StudioPlayoutModel, StudioPlayoutModelBase } from '../../studio/model/StudioPlayoutModel' -import { getLookeaheadObjects } from '../lookahead' -import { StudioBaselineContext, OnTimelineGenerateContext } from '../../blueprints/context' +import { StudioPlayoutModel, StudioPlayoutModelBase } from '../../studio/model/StudioPlayoutModel.js' +import { getLookeaheadObjects } from '../lookahead/index.js' +import { StudioBaselineContext, OnTimelineGenerateContext } from '../../blueprints/context/index.js' import { ExpectedPackageDBType } from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages' -import { WatchedPackagesHelper } from '../../blueprints/context/watchedPackages' -import { postProcessStudioBaselineObjects } from '../../blueprints/postProcess' -import { updateBaselineExpectedPackagesOnStudio } from '../../ingest/expectedPackages' +import { WatchedPackagesHelper } from '../../blueprints/context/watchedPackages.js' +import { postProcessStudioBaselineObjects } from '../../blueprints/postProcess.js' +import { updateBaselineExpectedPackagesOnStudio } from '../../ingest/expectedPackages.js' import { endTrace, sendTrace, startTrace } from '@sofie-automation/corelib/dist/influxdb' import { deserializePieceTimelineObjectsBlob } from '@sofie-automation/corelib/dist/dataModel/Piece' -import { convertResolvedPieceInstanceToBlueprints } from '../../blueprints/context/lib' -import { buildTimelineObjsForRundown, RundownTimelineTimingContext } from './rundown' +import { convertResolvedPieceInstanceToBlueprints } from '../../blueprints/context/lib.js' +import { buildTimelineObjsForRundown, RundownTimelineTimingContext } from './rundown.js' import { SourceLayers } from '@sofie-automation/corelib/dist/dataModel/ShowStyleBase' -import { deNowifyMultiGatewayTimeline } from './multi-gateway' +import { deNowifyMultiGatewayTimeline } from './multi-gateway.js' import { validateTimeline } from 'superfly-timeline' import { getPartTimingsOrDefaults, PartCalculatedTimings } from '@sofie-automation/corelib/dist/playout/timings' -import { applyAbPlaybackForTimeline } from '../abPlayback' +import { applyAbPlaybackForTimeline } from '../abPlayback/index.js' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' -import { PlayoutPartInstanceModel } from '../model/PlayoutPartInstanceModel' +import { PlayoutPartInstanceModel } from '../model/PlayoutPartInstanceModel.js' +import { PersistentPlayoutStateStore } from '../../blueprints/context/services/PersistantStateStore.js' +import { PlayoutChangedType } from '@sofie-automation/shared-lib/dist/peripheralDevice/peripheralDeviceAPI' function isModelForStudio(model: StudioPlayoutModelBase): model is StudioPlayoutModel { const tmp = model as StudioPlayoutModel @@ -126,7 +123,7 @@ export async function updateStudioTimeline( logAnyRemainingNowTimes(context, baselineObjects) } - const timelineHash = saveTimeline(context, playoutModel, baselineObjects, versions) + const timelineHash = saveTimeline(context, playoutModel, baselineObjects, versions, undefined) if (studioBaseline) { updateBaselineExpectedPackagesOnStudio(context, playoutModel, studioBaseline) @@ -144,7 +141,12 @@ export async function updateTimeline(context: JobContext, playoutModel: PlayoutM throw new Error(`RundownPlaylist ("${playoutModel.playlist._id}") is not active")`) } - const { versions, objs: timelineObjs, timingContext: timingInfo } = await getTimelineRundown(context, playoutModel) + const { + versions, + objs: timelineObjs, + timingContext: timingInfo, + regenerateTimelineToken, + } = await getTimelineRundown(context, playoutModel) flattenAndProcessTimelineObjects(context, timelineObjs) @@ -156,7 +158,7 @@ export async function updateTimeline(context: JobContext, playoutModel: PlayoutM logAnyRemainingNowTimes(context, timelineObjs) } - const timelineHash = saveTimeline(context, playoutModel, timelineObjs, versions) + const timelineHash = saveTimeline(context, playoutModel, timelineObjs, versions, regenerateTimelineToken) logger.verbose(`updateTimeline done, hash: "${timelineHash}"`) if (span) span.end() @@ -227,9 +229,10 @@ export function saveTimeline( context: JobContext, studioPlayoutModel: StudioPlayoutModelBase, timelineObjs: TimelineObjGeneric[], - generationVersions: TimelineCompleteGenerationVersions + generationVersions: TimelineCompleteGenerationVersions, + regenerateTimelineToken: string | undefined ): TimelineHash { - const newTimeline = studioPlayoutModel.setTimeline(timelineObjs, generationVersions) + const newTimeline = studioPlayoutModel.setTimeline(timelineObjs, generationVersions, regenerateTimelineToken) // Also do a fast-track for the timeline to be published faster: context.hackPublishTimelineToFastTrack(newTimeline) @@ -248,6 +251,7 @@ export interface SelectedPartInstanceTimelineInfo { partInstance: ReadonlyDeep pieceInstances: PieceInstanceWithTimings[] calculatedTimings: PartCalculatedTimings + regenerateTimelineAt: number | undefined } function getPartInstanceTimelineInfo( @@ -273,6 +277,7 @@ function getPartInstanceTimelineInfo( partStarted, // Approximate `calculatedTimings`, for the partInstances which already have it cached calculatedTimings: getPartTimingsOrDefaults(partInstanceWithOverrides, pieceInstances), + regenerateTimelineAt: undefined, // Future use } } @@ -286,6 +291,7 @@ async function getTimelineRundown( objs: Array versions: TimelineCompleteGenerationVersions timingContext: RundownTimelineTimingContext | undefined + regenerateTimelineToken: string | undefined }> { const span = context.startSpan('getTimelineRundown') try { @@ -341,6 +347,9 @@ async function getTimelineRundown( timelineObjs = timelineObjs.concat(rundownTimelineResult.timeline) timelineObjs = timelineObjs.concat(await pLookaheadObjs) + const regenerateTimelineObj = createRegenerateTimelineObj(playoutModel.playlistId, partInstancesInfo) + if (regenerateTimelineObj) timelineObjs.push(regenerateTimelineObj.obj) + const blueprint = await context.getShowStyleBlueprint(showStyle._id) timelineVersions = generateTimelineVersions( context.studio, @@ -388,14 +397,17 @@ async function getTimelineRundown( }) } - let tlGenRes: BlueprintResultTimeline | undefined if (blueprint.blueprint.onTimelineGenerate) { + const blueprintPersistentState = new PersistentPlayoutStateStore( + playoutModel.playlist.previousPersistentState + ) + const span = context.startSpan('blueprint.onTimelineGenerate') const influxTrace = startTrace('blueprints:onTimelineGenerate') - tlGenRes = await blueprint.blueprint.onTimelineGenerate( + const tlGenRes = await blueprint.blueprint.onTimelineGenerate( blueprintContext, timelineObjs, - clone(playoutModel.playlist.previousPersistentState), + blueprintPersistentState, clone(currentPartInstance?.partInstance?.previousPartEndState), resolvedPieces.map(convertResolvedPieceInstanceToBlueprints) ) @@ -408,10 +420,13 @@ async function getTimelineRundown( objectType: TimelineObjType.RUNDOWN, }) }) + + if (blueprintPersistentState.hasChanges) { + playoutModel.setBlueprintPersistentState(blueprintPersistentState.getAll()) + } } - playoutModel.setOnTimelineGenerateResult( - tlGenRes?.persistentState, + playoutModel.setAbResolvingState( newAbSessionsResult.assignments, blueprintContext.abSessionsHelper.knownSessions ) @@ -438,6 +453,7 @@ async function getTimelineRundown( }), versions: timelineVersions ?? generateTimelineVersions(context.studio, undefined, '-'), timingContext: rundownTimelineResult.timingContext, + regenerateTimelineToken: regenerateTimelineObj?.token, } } else { if (span) span.end() @@ -446,6 +462,7 @@ async function getTimelineRundown( objs: [], versions: generateTimelineVersions(context.studio, undefined, '-'), timingContext: undefined, + regenerateTimelineToken: undefined, } } } catch (e) { @@ -455,10 +472,49 @@ async function getTimelineRundown( objs: [], versions: generateTimelineVersions(context.studio, undefined, '-'), timingContext: undefined, + regenerateTimelineToken: undefined, } } } +function createRegenerateTimelineObj( + playlistId: RundownPlaylistId, + partInstancesInfo: SelectedPartInstancesTimelineInfo +) { + const regenerateTimelineAt = Math.min( + partInstancesInfo.current?.regenerateTimelineAt ?? Number.POSITIVE_INFINITY, + partInstancesInfo.next?.regenerateTimelineAt ?? Number.POSITIVE_INFINITY + ) + if (regenerateTimelineAt < Number.POSITIVE_INFINITY) { + // The timeline has requested a regeneration at a specific time + const token = getHash(`regenerate-${playlistId}-${getCurrentTime()}`) + const obj = literal({ + id: `regenerate_${token}`, + enable: { + start: regenerateTimelineAt, + }, + layer: '__timeline_regeneration_trigger__', // Some unique name, as callbacks need to be on a layer + priority: 1, + content: { + deviceType: TSR.DeviceType.ABSTRACT, + type: 'callback', + callBack: PlayoutChangedType.TRIGGER_REGENERATION, + callBackData: { + rundownPlaylistId: playlistId, + regenerationToken: token, + }, + }, + objectType: TimelineObjType.RUNDOWN, + metaData: undefined, + partInstanceId: null, + }) + + return { token, obj } + } else { + return null + } +} + /** * Process the timeline objects, to provide some basic validation. Also flattens the nested objects into a single array * Note: Input array is mutated in place diff --git a/packages/job-worker/src/playout/timeline/lib.ts b/packages/job-worker/src/playout/timeline/lib.ts index 1b9c6e85b7..bd9cfb3b84 100644 --- a/packages/job-worker/src/playout/timeline/lib.ts +++ b/packages/job-worker/src/playout/timeline/lib.ts @@ -1,7 +1,7 @@ import { IBlueprintPieceType } from '@sofie-automation/blueprints-integration' import { PieceInstanceWithTimings } from '@sofie-automation/corelib/dist/playout/processAndPrune' import { ReadonlyDeep } from 'type-fest' -import { DEFINITELY_ENDED_FUTURE_DURATION } from '../infinites' +import { DEFINITELY_ENDED_FUTURE_DURATION } from '../infinites.js' /** * Check if a PieceInstance has 'definitely ended'. diff --git a/packages/job-worker/src/playout/timeline/multi-gateway.ts b/packages/job-worker/src/playout/timeline/multi-gateway.ts index d606baa8a2..dbc29f9327 100644 --- a/packages/job-worker/src/playout/timeline/multi-gateway.ts +++ b/packages/job-worker/src/playout/timeline/multi-gateway.ts @@ -3,17 +3,17 @@ import { PieceInstanceInfiniteId } from '@sofie-automation/corelib/dist/dataMode import { PeripheralDeviceType } from '@sofie-automation/corelib/dist/dataModel/PeripheralDevice' import { TimelineObjRundown } from '@sofie-automation/corelib/dist/dataModel/Timeline' import { normalizeArray } from '@sofie-automation/corelib/dist/lib' -import { PieceTimelineMetadata } from './pieceGroup' -import { StudioPlayoutModelBase } from '../../studio/model/StudioPlayoutModel' -import { logger } from '../../logging' -import { JobContext } from '../../jobs' -import { getCurrentTime } from '../../lib' -import { PlayoutModel } from '../model/PlayoutModel' -import { RundownTimelineTimingContext, getInfinitePartGroupId } from './rundown' +import { PieceTimelineMetadata } from './pieceGroup.js' +import { StudioPlayoutModelBase } from '../../studio/model/StudioPlayoutModel.js' +import { logger } from '../../logging.js' +import { JobContext } from '../../jobs/index.js' +import { getCurrentTime } from '../../lib/index.js' +import { PlayoutModel } from '../model/PlayoutModel.js' +import { RundownTimelineTimingContext, getInfinitePartGroupId } from './rundown.js' import { getExpectedLatency } from '@sofie-automation/corelib/dist/studio/playout' import { getPieceControlObjectId } from '@sofie-automation/corelib/dist/playout/ids' -import { PlayoutPartInstanceModel } from '../model/PlayoutPartInstanceModel' -import { PlayoutPieceInstanceModel } from '../model/PlayoutPieceInstanceModel' +import { PlayoutPartInstanceModel } from '../model/PlayoutPartInstanceModel.js' +import { PlayoutPieceInstanceModel } from '../model/PlayoutPieceInstanceModel.js' /** * We want it to be possible to generate a timeline without it containing any `start: 'now'`. @@ -213,7 +213,7 @@ function deNowifyInfinites( obj.enable = { start: targetNowTime - parentStartTime } logger.silly( - `deNowifyInfinites: Setting "${obj.id}" enable.start = ${obj.enable.start}, ${targetNowTime} ${parentStartTime} parentObject: "${parentObject.id}"` + `deNowifyInfinites: Setting "${obj.id}" enable.start = ${JSON.stringify(obj.enable.start)}, ${targetNowTime} ${parentStartTime} parentObject: "${parentObject.id}"` ) } } diff --git a/packages/job-worker/src/playout/timeline/part.ts b/packages/job-worker/src/playout/timeline/part.ts index d2ca1d53fc..fc2d546100 100644 --- a/packages/job-worker/src/playout/timeline/part.ts +++ b/packages/job-worker/src/playout/timeline/part.ts @@ -12,12 +12,12 @@ import { import { assertNever, literal } from '@sofie-automation/corelib/dist/lib' import { getPartGroupId, getPartFirstObjectId } from '@sofie-automation/corelib/dist/playout/ids' import { PieceInstanceWithTimings } from '@sofie-automation/corelib/dist/playout/processAndPrune' -import { PieceTimelineMetadata } from './pieceGroup' -import { JobContext } from '../../jobs' +import { PieceTimelineMetadata } from './pieceGroup.js' +import { JobContext } from '../../jobs/index.js' import { ReadonlyDeep } from 'type-fest' -import { getPieceEnableInsidePart, transformPieceGroupAndObjects } from './piece' +import { getPieceEnableInsidePart, transformPieceGroupAndObjects } from './piece.js' import { PlayoutChangedType } from '@sofie-automation/shared-lib/dist/peripheralDevice/peripheralDeviceAPI' -import { SelectedPartInstanceTimelineInfo } from './generate' +import { SelectedPartInstanceTimelineInfo } from './generate.js' import { PartCalculatedTimings } from '@sofie-automation/corelib/dist/playout/timings' export function transformPartIntoTimeline( @@ -99,10 +99,7 @@ function getPieceEnableForPieceInstance( if (!outTransition) return undefined const pieceEnable: TSR.Timeline.TimelineEnable = { - start: `#${parentGroup.id}.end - ${outTransition.duration}`, - } - if (partTimings.toPartPostroll) { - pieceEnable.start += ' - ' + partTimings.toPartPostroll + start: `#${parentGroup.id}.end - ${outTransition.duration + partTimings.toPartPostroll}`, } return pieceEnable diff --git a/packages/job-worker/src/playout/timeline/piece.ts b/packages/job-worker/src/playout/timeline/piece.ts index b1589b2007..2d5bf40a02 100644 --- a/packages/job-worker/src/playout/timeline/piece.ts +++ b/packages/job-worker/src/playout/timeline/piece.ts @@ -9,12 +9,12 @@ import { } from '@sofie-automation/corelib/dist/dataModel/Timeline' import { assertNever, clone } from '@sofie-automation/corelib/dist/lib' import { PieceInstanceWithTimings } from '@sofie-automation/corelib/dist/playout/processAndPrune' -import { createPieceGroupAndCap } from './pieceGroup' +import { createPieceGroupAndCap } from './pieceGroup.js' import { PartCalculatedTimings } from '@sofie-automation/corelib/dist/playout/timings' import { unprotectString } from '@sofie-automation/corelib/dist/protectedString' import { ReadonlyDeep } from 'type-fest' -import { prefixAllObjectIds } from '../lib' -import { hasPieceInstanceDefinitelyEnded } from './lib' +import { prefixAllObjectIds } from '../lib.js' +import { hasPieceInstanceDefinitelyEnded } from './lib.js' export function transformPieceGroupAndObjects( playlistId: RundownPlaylistId, diff --git a/packages/job-worker/src/playout/timeline/rundown.ts b/packages/job-worker/src/playout/timeline/rundown.ts index 0fcb057a88..ba92dd2e21 100644 --- a/packages/job-worker/src/playout/timeline/rundown.ts +++ b/packages/job-worker/src/playout/timeline/rundown.ts @@ -18,15 +18,15 @@ import { getPartGroupId } from '@sofie-automation/corelib/dist/playout/ids' import { PieceInstanceWithTimings } from '@sofie-automation/corelib/dist/playout/processAndPrune' import { PartCalculatedTimings } from '@sofie-automation/corelib/dist/playout/timings' import { protectString, unprotectString } from '@sofie-automation/corelib/dist/protectedString' -import { JobContext } from '../../jobs' +import { JobContext } from '../../jobs/index.js' import { ReadonlyDeep } from 'type-fest' -import { SelectedPartInstancesTimelineInfo, SelectedPartInstanceTimelineInfo } from './generate' -import { createPartGroup, createPartGroupFirstObject, PartEnable, transformPartIntoTimeline } from './part' +import { SelectedPartInstancesTimelineInfo, SelectedPartInstanceTimelineInfo } from './generate.js' +import { createPartGroup, createPartGroupFirstObject, PartEnable, transformPartIntoTimeline } from './part.js' import { literal, normalizeArrayToMapFunc } from '@sofie-automation/corelib/dist/lib' -import { getCurrentTime } from '../../lib' -import _ = require('underscore') -import { getPieceEnableInsidePart, transformPieceGroupAndObjects } from './piece' -import { logger } from '../../logging' +import { getCurrentTime } from '../../lib/index.js' +import _ from 'underscore' +import { getPieceEnableInsidePart, transformPieceGroupAndObjects } from './piece.js' +import { logger } from '../../logging.js' /** * Some additional data used by the timeline generation process @@ -81,16 +81,18 @@ export function buildTimelineObjsForRundown( // Fetch the nextPart first, because that affects how the currentPart will be treated if (activePlaylist.nextPartInfo) { // We may be at the end of a show, where there is no next part - if (!partInstancesInfo.next) throw new Error(`PartInstance "${activePlaylist.nextPartInfo}" not found!`) + if (!partInstancesInfo.next) + throw new Error(`PartInstance "${activePlaylist.nextPartInfo?.partInstanceId}" not found!`) } if (activePlaylist.currentPartInfo) { // We may be before the beginning of a show, and there can be no currentPart and we are waiting for the user to Take - if (!partInstancesInfo.current) throw new Error(`PartInstance "${activePlaylist.currentPartInfo}" not found!`) + if (!partInstancesInfo.current) + throw new Error(`PartInstance "${activePlaylist.currentPartInfo?.partInstanceId}" not found!`) } if (activePlaylist.previousPartInfo) { // We may be at the beginning of a show, where there is no previous part if (!partInstancesInfo.previous) - logger.warn(`Previous PartInstance "${activePlaylist.previousPartInfo}" not found!`) + logger.warn(`Previous PartInstance "${activePlaylist.previousPartInfo?.partInstanceId}" not found!`) } if (!partInstancesInfo.next && !partInstancesInfo.current) { @@ -127,7 +129,7 @@ export function buildTimelineObjsForRundown( partInstancesInfo.previous ? normalizeArrayToMapFunc(partInstancesInfo.previous.pieceInstances, (inst) => inst.infinite ? inst.infinite.infiniteInstanceId : undefined - ) + ) : new Map() // The startTime of this start is used as the reference point for the calculated timings, so we can use 'now' and everything will lie after this point diff --git a/packages/job-worker/src/playout/timelineJobs.ts b/packages/job-worker/src/playout/timelineJobs.ts index 3083dd3ee8..ac1839394a 100644 --- a/packages/job-worker/src/playout/timelineJobs.ts +++ b/packages/job-worker/src/playout/timelineJobs.ts @@ -1,11 +1,11 @@ import { UpdateTimelineAfterIngestProps } from '@sofie-automation/corelib/dist/worker/studio' -import { JobContext } from '../jobs' -import { runJobWithPlaylistLock, runWithPlayoutModel } from './lock' -import { updateStudioTimeline, updateTimeline } from './timeline/generate' -import { getSystemVersion } from '../lib' -import { runJobWithStudioPlayoutModel } from '../studio/lock' +import { JobContext } from '../jobs/index.js' +import { runJobWithPlaylistLock, runWithPlayoutModel } from './lock.js' +import { updateStudioTimeline, updateTimeline } from './timeline/generate.js' +import { getSystemVersion } from '../lib/index.js' +import { runJobWithStudioPlayoutModel } from '../studio/lock.js' import { shouldUpdateStudioBaselineInner as libShouldUpdateStudioBaselineInner } from '@sofie-automation/corelib/dist/studio/baseline' -import { StudioPlayoutModel } from '../studio/model/StudioPlayoutModel' +import { StudioPlayoutModel } from '../studio/model/StudioPlayoutModel.js' /** * Update the timeline with a regenerated Studio Baseline diff --git a/packages/job-worker/src/playout/timings/events.ts b/packages/job-worker/src/playout/timings/events.ts index eeca604b2f..5767ad843c 100644 --- a/packages/job-worker/src/playout/timings/events.ts +++ b/packages/job-worker/src/playout/timings/events.ts @@ -1,6 +1,6 @@ -import { JobContext } from '../../jobs' +import { JobContext } from '../../jobs/index.js' import { PartInstanceId, RundownPlaylistId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { logger } from '../../logging' +import { logger } from '../../logging.js' import { EventsJobs } from '@sofie-automation/corelib/dist/worker/events' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' diff --git a/packages/job-worker/src/playout/timings/index.ts b/packages/job-worker/src/playout/timings/index.ts index 17bfb8e17b..96005bf911 100644 --- a/packages/job-worker/src/playout/timings/index.ts +++ b/packages/job-worker/src/playout/timings/index.ts @@ -1,14 +1,15 @@ import { OnPlayoutPlaybackChangedProps } from '@sofie-automation/corelib/dist/worker/studio' -import { logger } from '../../logging' -import { JobContext } from '../../jobs' -import { runJobWithPlayoutModel } from '../lock' +import { logger } from '../../logging.js' +import { JobContext } from '../../jobs/index.js' +import { runJobWithPlayoutModel } from '../lock.js' import { assertNever } from '@sofie-automation/corelib/dist/lib' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' import { PlayoutChangedType } from '@sofie-automation/shared-lib/dist/peripheralDevice/peripheralDeviceAPI' -import { onPiecePlaybackStarted, onPiecePlaybackStopped } from './piecePlayback' -import { onPartPlaybackStarted, onPartPlaybackStopped } from './partPlayback' +import { onPiecePlaybackStarted, onPiecePlaybackStopped } from './piecePlayback.js' +import { onPartPlaybackStarted, onPartPlaybackStopped } from './partPlayback.js' +import { updateTimeline } from '../timeline/generate.js' -export { handleTimelineTriggerTime } from './timelineTriggerTime' +export { handleTimelineTriggerTime } from './timelineTriggerTime.js' /** * Called by playout-gateway when playback timings of any Parts or Pieces on the timeline have changed @@ -18,6 +19,8 @@ export async function handleOnPlayoutPlaybackChanged( data: OnPlayoutPlaybackChangedProps ): Promise { return runJobWithPlayoutModel(context, data, null, async (playoutModel) => { + let triggerRegeneration = false + for (const change of data.changes) { try { if (change.type === PlayoutChangedType.PART_PLAYBACK_STARTED) { @@ -42,9 +45,25 @@ export async function handleOnPlayoutPlaybackChanged( pieceInstanceId: change.data.pieceInstanceId, stoppedPlayback: change.data.time, }) + } else if (change.type === PlayoutChangedType.TRIGGER_REGENERATION) { + if ( + playoutModel.timeline?.regenerateTimelineToken && + change.data.regenerationToken === playoutModel.timeline.regenerateTimelineToken + ) { + triggerRegeneration = true + } else { + logger.warn( + `Playout gateway requested a regeneration of the timeline, with an incorrect regenerationToken. Got ${change.data.regenerationToken}, expected ${playoutModel.timeline?.regenerateTimelineToken}` + ) + } } else { assertNever(change) } + + if (triggerRegeneration) { + logger.info('Playout gateway requested a regeneration of the timeline') + await updateTimeline(context, playoutModel) + } } catch (err) { logger.error(stringifyError(err)) } diff --git a/packages/job-worker/src/playout/timings/partPlayback.ts b/packages/job-worker/src/playout/timings/partPlayback.ts index fcdd407252..3449264cce 100644 --- a/packages/job-worker/src/playout/timings/partPlayback.ts +++ b/packages/job-worker/src/playout/timings/partPlayback.ts @@ -1,14 +1,14 @@ import { PartInstanceId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { logger } from '../../logging' -import { JobContext } from '../../jobs' -import { PlayoutModel } from '../model/PlayoutModel' -import { PlayoutPartInstanceModel } from '../model/PlayoutPartInstanceModel' -import { selectNextPart } from '../selectNextPart' -import { setNextPart } from '../setNext' -import { updateTimeline } from '../timeline/generate' -import { getCurrentTime } from '../../lib' -import { afterTake, clearQueuedSegmentId, resetPreviousSegmentIfLooping, updatePartInstanceOnTake } from '../take' -import { INCORRECT_PLAYING_PART_DEBOUNCE, RESET_IGNORE_ERRORS } from '../constants' +import { logger } from '../../logging.js' +import { JobContext } from '../../jobs/index.js' +import { PlayoutModel } from '../model/PlayoutModel.js' +import { PlayoutPartInstanceModel } from '../model/PlayoutPartInstanceModel.js' +import { selectNextPart } from '../selectNextPart.js' +import { setNextPart } from '../setNext.js' +import { updateTimeline } from '../timeline/generate.js' +import { getCurrentTime } from '../../lib/index.js' +import { afterTake, clearQueuedSegmentId, resetPreviousSegmentIfLooping, updatePartInstanceOnTake } from '../take.js' +import { INCORRECT_PLAYING_PART_DEBOUNCE, RESET_IGNORE_ERRORS } from '../constants.js' import { Time } from '@sofie-automation/blueprints-integration' /** diff --git a/packages/job-worker/src/playout/timings/piecePlayback.ts b/packages/job-worker/src/playout/timings/piecePlayback.ts index bd1d76b8a3..66e466403f 100644 --- a/packages/job-worker/src/playout/timings/piecePlayback.ts +++ b/packages/job-worker/src/playout/timings/piecePlayback.ts @@ -1,10 +1,10 @@ import { PartInstanceId, PieceInstanceId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { logger } from '../../logging' -import { JobContext } from '../../jobs' -import { PlayoutModel } from '../model/PlayoutModel' +import { logger } from '../../logging.js' +import { JobContext } from '../../jobs/index.js' +import { PlayoutModel } from '../model/PlayoutModel.js' import { Time } from '@sofie-automation/blueprints-integration' -import { PlayoutPartInstanceModel } from '../model/PlayoutPartInstanceModel' -import { PlayoutPieceInstanceModel } from '../model/PlayoutPieceInstanceModel' +import { PlayoutPartInstanceModel } from '../model/PlayoutPartInstanceModel.js' +import { PlayoutPieceInstanceModel } from '../model/PlayoutPieceInstanceModel.js' /** * Set the playback of a piece is confirmed to have started diff --git a/packages/job-worker/src/playout/timings/timelineTriggerTime.ts b/packages/job-worker/src/playout/timings/timelineTriggerTime.ts index 6a731aaf1e..831b651d9e 100644 --- a/packages/job-worker/src/playout/timings/timelineTriggerTime.ts +++ b/packages/job-worker/src/playout/timings/timelineTriggerTime.ts @@ -1,15 +1,15 @@ import { PartInstanceId, PieceInstanceId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { OnTimelineTriggerTimeProps } from '@sofie-automation/corelib/dist/worker/studio' -import { logger } from '../../logging' -import { JobContext } from '../../jobs' -import { runJobWithPlaylistLock } from '../lock' -import { saveTimeline } from '../timeline/generate' +import { logger } from '../../logging.js' +import { JobContext } from '../../jobs/index.js' +import { runJobWithPlaylistLock } from '../lock.js' +import { saveTimeline } from '../timeline/generate.js' import { applyToArray, normalizeArrayToMap } from '@sofie-automation/corelib/dist/lib' import { PieceInstance } from '@sofie-automation/corelib/dist/dataModel/PieceInstance' -import { runJobWithStudioPlayoutModel } from '../../studio/lock' -import { StudioPlayoutModel } from '../../studio/model/StudioPlayoutModel' -import { PieceTimelineMetadata } from '../timeline/pieceGroup' +import { runJobWithStudioPlayoutModel } from '../../studio/lock.js' +import { StudioPlayoutModel } from '../../studio/model/StudioPlayoutModel.js' +import { PieceTimelineMetadata } from '../timeline/pieceGroup.js' import { deserializeTimelineBlob } from '@sofie-automation/corelib/dist/dataModel/Timeline' import { ReadonlyDeep } from 'type-fest' import { AnyBulkWriteOperation } from 'mongodb' @@ -205,7 +205,14 @@ function timelineTriggerTimeInner( } } if (tlChanged) { - const timelineHash = saveTimeline(context, studioPlayoutModel, timelineObjs, timeline.generationVersions) + const timelineHash = saveTimeline( + context, + studioPlayoutModel, + timelineObjs, + // Preserve some current values: + timeline.generationVersions, + timeline.regenerateTimelineToken + ) logger.verbose(`timelineTriggerTime: Updated Timeline, hash: "${timelineHash}"`) } diff --git a/packages/job-worker/src/playout/upgrade.ts b/packages/job-worker/src/playout/upgrade.ts index 7f887b3ac5..ba75a4adab 100644 --- a/packages/job-worker/src/playout/upgrade.ts +++ b/packages/job-worker/src/playout/upgrade.ts @@ -25,11 +25,12 @@ import { BlueprintFixUpConfigForStudioResult, BlueprintValidateConfigForStudioResult, } from '@sofie-automation/corelib/dist/worker/studio' -import { compileCoreConfigValues } from '../blueprints/config' -import { CommonContext } from '../blueprints/context' -import { JobContext } from '../jobs' +import { compileCoreConfigValues } from '../blueprints/config.js' +import { CommonContext } from '../blueprints/context/index.js' +import { JobContext } from '../jobs/index.js' import { FixUpBlueprintConfigContext } from '@sofie-automation/corelib/dist/fixUpBlueprintConfig/context' import { DEFAULT_MINIMUM_TAKE_SPAN } from '@sofie-automation/shared-lib/dist/core/constants' +import { PERIPHERAL_SUBTYPE_PROCESS, PeripheralDevice } from '@sofie-automation/corelib/dist/dataModel/PeripheralDevice' /** * Run the Blueprint applyConfig for the studio @@ -58,37 +59,60 @@ export async function handleBlueprintUpgradeForStudio(context: JobContext, _data dev[0], literal>({ name: dev[1].name ?? '', - options: dev[1], + options: dev[1].options ?? {}, }), ]) ) + + const peripheralDevices = (await context.directCollections.PeripheralDevices.findFetch( + { subType: PERIPHERAL_SUBTYPE_PROCESS, 'studioAndConfigId.studioId': context.studioId }, + { projection: { _id: 1, studioAndConfigId: 1 } } + )) as Array> + const playoutDevices = Object.fromEntries( - Object.entries(result.playoutDevices ?? {}).map((dev) => [ - dev[0], - literal>({ - peripheralDeviceId: undefined, - options: dev[1], - }), - ]) + Object.entries<{ parentDeviceName?: string; options: TSR.DeviceOptionsAny }>(result.playoutDevices ?? {}).map( + (dev) => { + return [ + dev[0], + literal>({ + peripheralDeviceId: peripheralDevices.find( + (p) => p.studioAndConfigId?.configId === dev[1].parentDeviceName + )?._id, + options: dev[1].options, + }), + ] + } + ) ) + const ingestDevices = Object.fromEntries( - Object.entries(result.ingestDevices ?? {}).map((dev) => [ - dev[0], - literal>({ - peripheralDeviceId: undefined, - options: dev[1], - }), - ]) + Object.entries<{ parentDeviceName?: string; options: unknown }>(result.ingestDevices ?? {}).map((dev) => { + return [ + dev[0], + literal>({ + peripheralDeviceId: peripheralDevices.find( + (p) => p.studioAndConfigId?.configId === dev[1].parentDeviceName + )?._id, + options: dev[1].options, + }), + ] + }) ) + const inputDevices = Object.fromEntries( - Object.entries(result.inputDevices ?? {}).map((dev) => [ - dev[0], - literal>({ - peripheralDeviceId: undefined, - options: dev[1], - }), - ]) + Object.entries<{ parentDeviceName?: string; options: unknown }>(result.inputDevices ?? {}).map((dev) => { + return [ + dev[0], + literal>({ + peripheralDeviceId: peripheralDevices.find( + (p) => p.studioAndConfigId?.configId === dev[1].parentDeviceName + )?._id, + options: dev[1].options, + }), + ] + }) ) + const routeSets = Object.fromEntries( Object.entries>(result.routeSets ?? {}).map((dev) => [ dev[0], diff --git a/packages/job-worker/src/profiler.ts b/packages/job-worker/src/profiler.ts index e169051d2b..ffebc7dfe3 100644 --- a/packages/job-worker/src/profiler.ts +++ b/packages/job-worker/src/profiler.ts @@ -1,5 +1,5 @@ -import * as Agent from 'elastic-apm-node' -import { logger } from './logging' +import Agent from 'elastic-apm-node' +import { logger } from './logging.js' let active = false export function setupApmAgent(): void { diff --git a/packages/job-worker/src/rundownPlaylists.ts b/packages/job-worker/src/rundownPlaylists.ts index 31e8e90ffd..a1600b522c 100644 --- a/packages/job-worker/src/rundownPlaylists.ts +++ b/packages/job-worker/src/rundownPlaylists.ts @@ -24,25 +24,25 @@ import { IBlueprintRundown, NoteSeverity, } from '@sofie-automation/blueprints-integration' -import { JobContext, JobStudio } from './jobs' -import { logger } from './logging' -import { resetRundownPlaylist } from './playout/lib' -import { runJobWithPlaylistLock, runWithPlayoutModel } from './playout/lock' -import { updateTimeline } from './playout/timeline/generate' -import { WrappedStudioBlueprint } from './blueprints/cache' -import { StudioUserContext } from './blueprints/context' -import { getCurrentTime } from './lib' +import { JobContext, JobStudio } from './jobs/index.js' +import { logger } from './logging.js' +import { resetRundownPlaylist } from './playout/lib.js' +import { runJobWithPlaylistLock, runWithPlayoutModel } from './playout/lock.js' +import { updateTimeline } from './playout/timeline/generate.js' +import { WrappedStudioBlueprint } from './blueprints/cache.js' +import { StudioUserContext } from './blueprints/context/index.js' +import { getCurrentTime } from './lib/index.js' import { regeneratePlaylistAndRundownOrder, removeRundownFromPlaylistAndUpdatePlaylist, updatePlayoutAfterChangingRundownInPlaylist, -} from './ingest/commit' -import { allowedToMoveRundownOutOfPlaylist } from './rundown' +} from './ingest/commit.js' +import { allowedToMoveRundownOutOfPlaylist } from './rundown.js' import { PlaylistTiming } from '@sofie-automation/corelib/dist/playout/rundownTiming' import { UserError, UserErrorMessage } from '@sofie-automation/corelib/dist/error' -import { PlaylistLock, RundownLock } from './jobs/lock' -import { runWithRundownLock } from './ingest/lock' -import { convertRundownToBlueprints } from './blueprints/context/lib' +import { PlaylistLock, RundownLock } from './jobs/lock.js' +import { runWithRundownLock } from './ingest/lock.js' +import { convertRundownToBlueprints } from './blueprints/context/lib.js' import { sortRundownIDsInPlaylist } from '@sofie-automation/corelib/dist/playout/playlist' import { INoteBase } from '@sofie-automation/corelib/dist/dataModel/Notes' @@ -155,7 +155,6 @@ export async function removeRundownFromDb(context: JobContext, lock: RundownLock context.directCollections.Rundowns.remove({ _id: rundownId }), context.directCollections.AdLibActions.remove({ rundownId: rundownId }), context.directCollections.AdLibPieces.remove({ rundownId: rundownId }), - context.directCollections.ExpectedMediaItems.remove({ rundownId: rundownId }), context.directCollections.ExpectedPlayoutItems.remove({ rundownId: rundownId }), context.directCollections.ExpectedPackages.remove({ rundownId: rundownId }), context.directCollections.SofieIngestDataCache.remove({ rundownId: rundownId }), diff --git a/packages/job-worker/src/showStyles.ts b/packages/job-worker/src/showStyles.ts index d86a37a349..166500cc9a 100644 --- a/packages/job-worker/src/showStyles.ts +++ b/packages/job-worker/src/showStyles.ts @@ -1,8 +1,8 @@ import { IBlueprintConfig } from '@sofie-automation/blueprints-integration' import { deepFreeze } from '@sofie-automation/corelib/dist/lib' -import * as deepmerge from 'deepmerge' +import deepmerge from 'deepmerge' import { ReadonlyDeep } from 'type-fest' -import { ProcessedShowStyleBase, ProcessedShowStyleVariant, ProcessedShowStyleCompound } from './jobs' +import { ProcessedShowStyleBase, ProcessedShowStyleVariant, ProcessedShowStyleCompound } from './jobs/index.js' export function createShowStyleCompound( showStyleBase: ReadonlyDeep, diff --git a/packages/job-worker/src/studio/cleanup.ts b/packages/job-worker/src/studio/cleanup.ts index c433b07f5c..069a8b8b32 100644 --- a/packages/job-worker/src/studio/cleanup.ts +++ b/packages/job-worker/src/studio/cleanup.ts @@ -1,8 +1,8 @@ -import { runJobWithPlaylistLock } from '../playout/lock' -import { JobContext } from '../jobs' -import { runJobWithStudioPlayoutModel } from './lock' +import { runJobWithPlaylistLock } from '../playout/lock.js' +import { JobContext } from '../jobs/index.js' +import { runJobWithStudioPlayoutModel } from './lock.js' import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' -import { removePlaylistFromDb } from '../rundownPlaylists' +import { removePlaylistFromDb } from '../rundownPlaylists.js' /** * Cleanup any RundownPlaylists that contain no Rundowns diff --git a/packages/job-worker/src/studio/lib.ts b/packages/job-worker/src/studio/lib.ts index 2c02447e5b..aaa91ffc3b 100644 --- a/packages/job-worker/src/studio/lib.ts +++ b/packages/job-worker/src/studio/lib.ts @@ -1,7 +1,7 @@ import { RundownPlaylistId, StudioId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { protectString } from '@sofie-automation/corelib/dist/protectedString' -import { JobContext } from '../jobs' +import { JobContext } from '../jobs/index.js' export async function getActiveRundownPlaylistsInStudioFromDb( context: JobContext, diff --git a/packages/job-worker/src/studio/lock.ts b/packages/job-worker/src/studio/lock.ts index b0aa672ca7..25a5262f8b 100644 --- a/packages/job-worker/src/studio/lock.ts +++ b/packages/job-worker/src/studio/lock.ts @@ -1,6 +1,6 @@ -import { JobContext } from '../jobs' -import { StudioPlayoutModel } from './model/StudioPlayoutModel' -import { loadStudioPlayoutModel } from './model/StudioPlayoutModelImpl' +import { JobContext } from '../jobs/index.js' +import { StudioPlayoutModel } from './model/StudioPlayoutModel.js' +import { loadStudioPlayoutModel } from './model/StudioPlayoutModelImpl.js' /** * Run a typical studio job diff --git a/packages/job-worker/src/studio/model/StudioBaselineHelper.ts b/packages/job-worker/src/studio/model/StudioBaselineHelper.ts index 5b41352248..99336b67c6 100644 --- a/packages/job-worker/src/studio/model/StudioBaselineHelper.ts +++ b/packages/job-worker/src/studio/model/StudioBaselineHelper.ts @@ -1,11 +1,11 @@ -import { JobContext } from '../../jobs' +import { JobContext } from '../../jobs/index.js' import { ExpectedPackageDB, ExpectedPackageDBFromStudioBaselineObjects, ExpectedPackageDBType, } from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages' import { ExpectedPlayoutItemStudio } from '@sofie-automation/corelib/dist/dataModel/ExpectedPlayoutItem' -import { saveIntoDb } from '../../db/changes' +import { saveIntoDb } from '../../db/changes.js' export class StudioBaselineHelper { readonly #context: JobContext @@ -36,7 +36,7 @@ export class StudioBaselineHelper { this.#context.directCollections.ExpectedPlayoutItems, { studioId: this.#context.studioId, baseline: 'studio' }, this.#pendingExpectedPlayoutItems - ) + ) : undefined, this.#pendingExpectedPackages ? saveIntoDb( @@ -47,7 +47,7 @@ export class StudioBaselineHelper { fromPieceType: ExpectedPackageDBType.STUDIO_BASELINE_OBJECTS, }, this.#pendingExpectedPackages - ) + ) : undefined, ]) diff --git a/packages/job-worker/src/studio/model/StudioPlayoutModel.ts b/packages/job-worker/src/studio/model/StudioPlayoutModel.ts index 3a7cdb60c0..f481983c69 100644 --- a/packages/job-worker/src/studio/model/StudioPlayoutModel.ts +++ b/packages/job-worker/src/studio/model/StudioPlayoutModel.ts @@ -6,7 +6,7 @@ import { TimelineCompleteGenerationVersions, TimelineObjGeneric, } from '@sofie-automation/corelib/dist/dataModel/Timeline' -import { BaseModel } from '../../modelBase' +import { BaseModel } from '../../modelBase.js' import { ReadonlyDeep } from 'type-fest' import { ExpectedPackageDBFromStudioBaselineObjects } from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages' import { ExpectedPlayoutItemStudio } from '@sofie-automation/corelib/dist/dataModel/ExpectedPlayoutItem' @@ -47,7 +47,8 @@ export interface StudioPlayoutModelBase extends StudioPlayoutModelBaseReadonly { */ setTimeline( timelineObjs: TimelineObjGeneric[], - generationVersions: TimelineCompleteGenerationVersions + generationVersions: TimelineCompleteGenerationVersions, + regenerateTimelineToken: string | undefined ): ReadonlyDeep } diff --git a/packages/job-worker/src/studio/model/StudioPlayoutModelImpl.ts b/packages/job-worker/src/studio/model/StudioPlayoutModelImpl.ts index f00630f5a1..670886cff0 100644 --- a/packages/job-worker/src/studio/model/StudioPlayoutModelImpl.ts +++ b/packages/job-worker/src/studio/model/StudioPlayoutModelImpl.ts @@ -7,17 +7,17 @@ import { TimelineCompleteGenerationVersions, TimelineObjGeneric, } from '@sofie-automation/corelib/dist/dataModel/Timeline' -import { JobContext } from '../../jobs' +import { JobContext } from '../../jobs/index.js' import { ReadonlyDeep } from 'type-fest' import { getRandomId } from '@sofie-automation/corelib/dist/lib' -import { getCurrentTime } from '../../lib' -import { IS_PRODUCTION } from '../../environment' -import { logger } from '../../logging' -import { StudioPlayoutModel } from './StudioPlayoutModel' -import { DatabasePersistedModel } from '../../modelBase' +import { getCurrentTime } from '../../lib/index.js' +import { IS_PRODUCTION } from '../../environment.js' +import { logger } from '../../logging.js' +import { StudioPlayoutModel } from './StudioPlayoutModel.js' +import { DatabasePersistedModel } from '../../modelBase.js' import { ExpectedPackageDBFromStudioBaselineObjects } from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages' import { ExpectedPlayoutItemStudio } from '@sofie-automation/corelib/dist/dataModel/ExpectedPlayoutItem' -import { StudioBaselineHelper } from './StudioBaselineHelper' +import { StudioBaselineHelper } from './StudioBaselineHelper.js' /** * This is a model used for studio operations. @@ -87,7 +87,8 @@ export class StudioPlayoutModelImpl implements StudioPlayoutModel { setTimeline( timelineObjs: TimelineObjGeneric[], - generationVersions: TimelineCompleteGenerationVersions + generationVersions: TimelineCompleteGenerationVersions, + regenerateTimelineToken: string | undefined ): ReadonlyDeep { this.#timeline = { _id: this.context.studioId, @@ -95,6 +96,7 @@ export class StudioPlayoutModelImpl implements StudioPlayoutModel { generated: getCurrentTime(), timelineBlob: serializeTimelineBlob(timelineObjs), generationVersions: generationVersions, + regenerateTimelineToken: regenerateTimelineToken, } this.#timelineHasChanged = true diff --git a/packages/job-worker/src/studio/routeSet.ts b/packages/job-worker/src/studio/routeSet.ts index eba9504062..d71665cf5a 100644 --- a/packages/job-worker/src/studio/routeSet.ts +++ b/packages/job-worker/src/studio/routeSet.ts @@ -1,7 +1,7 @@ import { SwitchRouteSetProps } from '@sofie-automation/corelib/dist/worker/studio' -import { JobContext } from '../jobs' -import { runJobWithStudioPlayoutModel } from './lock' -import { updateTimelineFromStudioPlayoutModel } from '../playout/lib' +import { JobContext } from '../jobs/index.js' +import { runJobWithStudioPlayoutModel } from './lock.js' +import { updateTimelineFromStudioPlayoutModel } from '../playout/lib.js' export async function handleSwitchRouteSet(context: JobContext, data: SwitchRouteSetProps): Promise { await runJobWithStudioPlayoutModel(context, async (studioPlayoutModel) => { diff --git a/packages/job-worker/src/updatePartInstanceRanksAndOrphanedState.ts b/packages/job-worker/src/updatePartInstanceRanksAndOrphanedState.ts index 06de2ebd98..b0e07cbf50 100644 --- a/packages/job-worker/src/updatePartInstanceRanksAndOrphanedState.ts +++ b/packages/job-worker/src/updatePartInstanceRanksAndOrphanedState.ts @@ -3,14 +3,14 @@ import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartIns import { groupByToMap, normalizeArrayToMap } from '@sofie-automation/corelib/dist/lib' import { AnyBulkWriteOperation } from 'mongodb' import { ReadonlyDeep } from 'type-fest' -import { BeforeIngestOperationPartMap, BeforePartMapItem } from './ingest/commit' -import { JobContext } from './jobs' -import { logger } from './logging' -import _ = require('underscore') +import { BeforeIngestOperationPartMap, BeforePartMapItem } from './ingest/commit.js' +import { JobContext } from './jobs/index.js' +import { logger } from './logging.js' +import _ from 'underscore' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' -import { PlayoutModel } from './playout/model/PlayoutModel' -import { IngestModelReadonly } from './ingest/model/IngestModel' -import { PlayoutPartInstanceModel } from './playout/model/PlayoutPartInstanceModel' +import { PlayoutModel } from './playout/model/PlayoutModel.js' +import { IngestModelReadonly } from './ingest/model/IngestModel.js' +import { PlayoutPartInstanceModel } from './playout/model/PlayoutPartInstanceModel.js' type MinimalPartInstance = Pick & { part: Pick @@ -227,7 +227,7 @@ async function updateNormalPartInstanceRanksAndFindOrphans( $set: { 'part._rank': part._rank, }, - } + } : ''), $unset: { orphaned: 1, diff --git a/packages/job-worker/src/workers/caches.ts b/packages/job-worker/src/workers/caches.ts index 80d7eec6f1..cc50a65b42 100644 --- a/packages/job-worker/src/workers/caches.ts +++ b/packages/job-worker/src/workers/caches.ts @@ -1,7 +1,7 @@ import { DBStudio } from '@sofie-automation/corelib/dist/dataModel/Studio' -import { parseBlueprintDocument, WrappedShowStyleBlueprint, WrappedStudioBlueprint } from '../blueprints/cache' +import { parseBlueprintDocument, WrappedShowStyleBlueprint, WrappedStudioBlueprint } from '../blueprints/cache.js' import { ReadonlyDeep } from 'type-fest' -import { IDirectCollections } from '../db' +import { IDirectCollections } from '../db/index.js' import { BlueprintId, ShowStyleBaseId, @@ -9,15 +9,15 @@ import { StudioId, } from '@sofie-automation/corelib/dist/dataModel/Ids' import { BlueprintManifestType } from '@sofie-automation/blueprints-integration' -import { ProcessedShowStyleConfig, ProcessedStudioConfig } from '../blueprints/config' -import { DefaultStudioBlueprint } from '../blueprints/defaults/studio' +import { ProcessedShowStyleConfig, ProcessedStudioConfig } from '../blueprints/config.js' +import { DefaultStudioBlueprint } from '../blueprints/defaults/studio.js' import { protectString } from '@sofie-automation/corelib/dist/protectedString' import { clone, deepFreeze } from '@sofie-automation/corelib/dist/lib' -import { logger } from '../logging' -import deepmerge = require('deepmerge') -import { JobStudio, ProcessedShowStyleBase, ProcessedShowStyleVariant, StudioCacheContext } from '../jobs' -import { StudioCacheContextImpl } from './context/StudioCacheContextImpl' -import { convertStudioToJobStudio } from '../jobs/studio' +import { logger } from '../logging.js' +import deepmerge from 'deepmerge' +import { JobStudio, ProcessedShowStyleBase, ProcessedShowStyleVariant, StudioCacheContext } from '../jobs/index.js' +import { StudioCacheContextImpl } from './context/StudioCacheContextImpl.js' +import { convertStudioToJobStudio } from '../jobs/studio.js' /** * A Wrapper to maintain a cache and provide a context using the cache when appropriate diff --git a/packages/job-worker/src/workers/context/JobContextImpl.ts b/packages/job-worker/src/workers/context/JobContextImpl.ts index 8cd15572dc..08d6a7dc82 100644 --- a/packages/job-worker/src/workers/context/JobContextImpl.ts +++ b/packages/job-worker/src/workers/context/JobContextImpl.ts @@ -1,24 +1,24 @@ -import { IDirectCollections } from '../../db' -import { JobContext, JobStudio } from '../../jobs' -import { WorkerDataCache } from '../caches' +import { IDirectCollections } from '../../db/index.js' +import { JobContext, JobStudio } from '../../jobs/index.js' +import { WorkerDataCache } from '../caches.js' import { RundownId, RundownPlaylistId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { getIngestQueueName, IngestJobFunc } from '@sofie-automation/corelib/dist/worker/ingest' -import { ApmSpan, ApmTransaction } from '../../profiler' +import { ApmSpan, ApmTransaction } from '../../profiler.js' import { getRandomString } from '@sofie-automation/corelib/dist/lib' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' import { getStudioQueueName, StudioJobFunc } from '@sofie-automation/corelib/dist/worker/studio' -import { LockBase, PlaylistLock, RundownLock } from '../../jobs/lock' -import { logger } from '../../logging' -import { BaseModel } from '../../modelBase' -import { LocksManager } from '../locks' +import { LockBase, PlaylistLock, RundownLock } from '../../jobs/lock.js' +import { logger } from '../../logging.js' +import { BaseModel } from '../../modelBase.js' +import { LocksManager } from '../locks.js' import { unprotectString } from '@sofie-automation/corelib/dist/protectedString' import { EventsJobFunc, getEventsQueueName } from '@sofie-automation/corelib/dist/worker/events' -import { FastTrackTimelineFunc } from '../../main' +import { FastTrackTimelineFunc } from '../../main.js' import { TimelineComplete } from '@sofie-automation/corelib/dist/dataModel/Timeline' -import type { QueueJobFunc } from './util' -import { StudioCacheContextImpl } from './StudioCacheContextImpl' -import { PlaylistLockImpl, RundownLockImpl } from './Locks' -import { StudioRouteSetUpdater } from './StudioRouteSetUpdater' +import type { QueueJobFunc } from './util.js' +import { StudioCacheContextImpl } from './StudioCacheContextImpl.js' +import { PlaylistLockImpl, RundownLockImpl } from './Locks.js' +import { StudioRouteSetUpdater } from './StudioRouteSetUpdater.js' import type { DBStudio } from '@sofie-automation/corelib/dist/dataModel/Studio' import type { ReadonlyDeep } from 'type-fest' diff --git a/packages/job-worker/src/workers/context/Locks.ts b/packages/job-worker/src/workers/context/Locks.ts index 55cc72f36d..57db53bd19 100644 --- a/packages/job-worker/src/workers/context/Locks.ts +++ b/packages/job-worker/src/workers/context/Locks.ts @@ -1,11 +1,14 @@ import type { RundownId, RundownPlaylistId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { PlaylistLock, RundownLock } from '../../jobs/lock' -import { logger } from '../../logging' +import { PlaylistLock, RundownLock } from '../../jobs/lock.js' +import { logger } from '../../logging.js' export class PlaylistLockImpl extends PlaylistLock { #isLocked = true - public constructor(playlistId: RundownPlaylistId, private readonly doRelease: () => Promise) { + public constructor( + playlistId: RundownPlaylistId, + private readonly doRelease: () => Promise + ) { super(playlistId) } @@ -37,7 +40,10 @@ export class PlaylistLockImpl extends PlaylistLock { export class RundownLockImpl extends RundownLock { #isLocked = true - public constructor(rundownId: RundownId, private readonly doRelease: () => Promise) { + public constructor( + rundownId: RundownId, + private readonly doRelease: () => Promise + ) { super(rundownId) } diff --git a/packages/job-worker/src/workers/context/StudioCacheContextImpl.ts b/packages/job-worker/src/workers/context/StudioCacheContextImpl.ts index 183a89d01b..e012ed509b 100644 --- a/packages/job-worker/src/workers/context/StudioCacheContextImpl.ts +++ b/packages/job-worker/src/workers/context/StudioCacheContextImpl.ts @@ -1,29 +1,29 @@ -import { IDirectCollections } from '../../db' +import { IDirectCollections } from '../../db/index.js' import { ProcessedShowStyleBase, ProcessedShowStyleVariant, ProcessedShowStyleCompound, StudioCacheContext, JobStudio, -} from '../../jobs' +} from '../../jobs/index.js' import { ReadonlyDeep } from 'type-fest' -import { WorkerDataCache } from '../caches' +import { WorkerDataCache } from '../caches.js' import { DBStudio } from '@sofie-automation/corelib/dist/dataModel/Studio' import { ShowStyleBaseId, ShowStyleVariantId, StudioId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { parseBlueprintDocument, WrappedShowStyleBlueprint, WrappedStudioBlueprint } from '../../blueprints/cache' +import { parseBlueprintDocument, WrappedShowStyleBlueprint, WrappedStudioBlueprint } from '../../blueprints/cache.js' import { ReadonlyObjectDeep } from 'type-fest/source/readonly-deep' import { DBShowStyleBase } from '@sofie-automation/corelib/dist/dataModel/ShowStyleBase' import { clone, deepFreeze } from '@sofie-automation/corelib/dist/lib' -import { createShowStyleCompound } from '../../showStyles' +import { createShowStyleCompound } from '../../showStyles.js' import { BlueprintManifestType } from '@sofie-automation/blueprints-integration' import { preprocessShowStyleConfig, preprocessStudioConfig, ProcessedShowStyleConfig, ProcessedStudioConfig, -} from '../../blueprints/config' +} from '../../blueprints/config.js' -import { processShowStyleBase, processShowStyleVariant } from '../../jobs/showStyle' +import { processShowStyleBase, processShowStyleVariant } from '../../jobs/showStyle.js' export class StudioCacheContextImpl implements StudioCacheContext { constructor( diff --git a/packages/job-worker/src/workers/context/StudioRouteSetUpdater.ts b/packages/job-worker/src/workers/context/StudioRouteSetUpdater.ts index 9de2f486f4..98338284cf 100644 --- a/packages/job-worker/src/workers/context/StudioRouteSetUpdater.ts +++ b/packages/job-worker/src/workers/context/StudioRouteSetUpdater.ts @@ -6,11 +6,11 @@ import { OverrideOpHelperImpl, WrappedOverridableItemNormal, } from '@sofie-automation/corelib/dist/overrideOpHelper' -import { logger } from '../../logging' +import { logger } from '../../logging.js' import type { ReadonlyDeep } from 'type-fest' -import type { WorkerDataCache } from '../caches' -import type { IDirectCollections } from '../../db' -import { JobStudio } from '../../jobs' +import type { WorkerDataCache } from '../caches.js' +import type { IDirectCollections } from '../../db/index.js' +import { JobStudio } from '../../jobs/index.js' import { applyAndValidateOverrides } from '@sofie-automation/corelib/dist/settings/objectWithOverrides' export class StudioRouteSetUpdater { diff --git a/packages/job-worker/src/workers/context/__tests__/StudioRouteSetUpdater.spec.ts b/packages/job-worker/src/workers/context/__tests__/StudioRouteSetUpdater.spec.ts index e6ef0fe40d..838f598641 100644 --- a/packages/job-worker/src/workers/context/__tests__/StudioRouteSetUpdater.spec.ts +++ b/packages/job-worker/src/workers/context/__tests__/StudioRouteSetUpdater.spec.ts @@ -1,7 +1,7 @@ import { StudioRouteBehavior, StudioRouteSet } from '@sofie-automation/blueprints-integration' -import { setupDefaultJobEnvironment } from '../../../__mocks__/context' -import { StudioRouteSetUpdater } from '../StudioRouteSetUpdater' -import type { WorkerDataCache } from '../../caches' +import { setupDefaultJobEnvironment } from '../../../__mocks__/context.js' +import { StudioRouteSetUpdater } from '../StudioRouteSetUpdater.js' +import type { WorkerDataCache } from '../../caches.js' import { wrapDefaultObject } from '@sofie-automation/corelib/dist/settings/objectWithOverrides' function setupTest(routeSets: Record) { diff --git a/packages/job-worker/src/workers/events/child.ts b/packages/job-worker/src/workers/events/child.ts index d6c0a59da1..4d5c5d79da 100644 --- a/packages/job-worker/src/workers/events/child.ts +++ b/packages/job-worker/src/workers/events/child.ts @@ -1,25 +1,25 @@ -import { eventJobHandlers } from './jobs' +import { eventJobHandlers } from './jobs.js' import { StudioId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { MongoClient } from 'mongodb' -import { createMongoConnection, getMongoCollections, IDirectCollections } from '../../db' +import { createMongoConnection, getMongoCollections, IDirectCollections } from '../../db/index.js' import { unprotectString } from '@sofie-automation/corelib/dist/protectedString' -import { setupApmAgent, startTransaction } from '../../profiler' +import { setupApmAgent, startTransaction } from '../../profiler.js' import { InvalidateWorkerDataCache, invalidateWorkerDataCache, loadWorkerDataCache, WorkerDataCache, WorkerDataCacheWrapperImpl, -} from '../caches' -import { JobContextImpl } from '../context/JobContextImpl' -import { QueueJobFunc } from '../context/util' -import { AnyLockEvent, LocksManager } from '../locks' -import { FastTrackTimelineFunc, LogLineWithSourceFunc } from '../../main' -import { interceptLogging, logger } from '../../logging' -import { setupInfluxDb } from '../../influx' +} from '../caches.js' +import { JobContextImpl } from '../context/JobContextImpl.js' +import { QueueJobFunc } from '../context/util.js' +import { AnyLockEvent, LocksManager } from '../locks.js' +import { FastTrackTimelineFunc, LogLineWithSourceFunc } from '../../main.js' +import { interceptLogging, logger } from '../../logging.js' +import { setupInfluxDb } from '../../influx.js' import { getEventsQueueName } from '@sofie-automation/corelib/dist/worker/events' -import { ExternalMessageQueueRunner } from '../../events/ExternalMessageQueue' -import { WorkerJobResult } from '../parent-base' +import { ExternalMessageQueueRunner } from '../../events/ExternalMessageQueue.js' +import { WorkerJobResult } from '../parent-base.js' import { endTrace, sendTrace, startTrace } from '@sofie-automation/corelib/dist/influxdb' import { getPrometheusMetricsString, setupPrometheusMetrics } from '@sofie-automation/corelib/dist/prometheus' import { UserError } from '@sofie-automation/corelib/dist/error' diff --git a/packages/job-worker/src/workers/events/jobs.ts b/packages/job-worker/src/workers/events/jobs.ts index 680b6f1c2c..1cd2abed7d 100644 --- a/packages/job-worker/src/workers/events/jobs.ts +++ b/packages/job-worker/src/workers/events/jobs.ts @@ -1,10 +1,10 @@ -import { JobContext } from '../../jobs' +import { JobContext } from '../../jobs/index.js' import { EventsJobFunc, EventsJobs } from '@sofie-automation/corelib/dist/worker/events' import { handleNotifyCurrentlyPlayingPart, handlePartInstanceTimings, handleRundownDataHasChanged, -} from '../../events/handle' +} from '../../events/handle.js' type ExecutableFunction = ( context: JobContext, diff --git a/packages/job-worker/src/workers/events/parent.ts b/packages/job-worker/src/workers/events/parent.ts index 7b7ec8ec6b..d423080df5 100644 --- a/packages/job-worker/src/workers/events/parent.ts +++ b/packages/job-worker/src/workers/events/parent.ts @@ -1,10 +1,10 @@ -import { EventsWorkerChild } from './child' -import { InvalidateWorkerDataCache } from '../caches' -import { WorkerJobResult, WorkerParentBase, WorkerParentBaseOptions, WorkerParentOptions } from '../parent-base' -import { AnyLockEvent } from '../locks' +import { EventsWorkerChild } from './child.js' +import { InvalidateWorkerDataCache } from '../caches.js' +import { WorkerJobResult, WorkerParentBase, WorkerParentBaseOptions, WorkerParentOptions } from '../parent-base.js' +import { AnyLockEvent } from '../locks.js' import { getEventsQueueName } from '@sofie-automation/corelib/dist/worker/events' import { Promisify, threadedClass, ThreadedClassManager } from 'threadedclass' -import { FastTrackTimelineFunc, LogLineWithSourceFunc } from '../../main' +import { FastTrackTimelineFunc, LogLineWithSourceFunc } from '../../main.js' const FREEZE_LIMIT = 1000 // how long to wait for a response to a Ping const RESTART_TIMEOUT = 10000 // how long to wait for a restart to complete before throwing an error diff --git a/packages/job-worker/src/workers/ingest/child.ts b/packages/job-worker/src/workers/ingest/child.ts index 41ebc90eaf..853b3796ac 100644 --- a/packages/job-worker/src/workers/ingest/child.ts +++ b/packages/job-worker/src/workers/ingest/child.ts @@ -1,18 +1,23 @@ -import { ingestJobHandlers } from './jobs' +import { ingestJobHandlers } from './jobs.js' import { StudioId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { MongoClient } from 'mongodb' -import { createMongoConnection, getMongoCollections, IDirectCollections } from '../../db' +import { createMongoConnection, getMongoCollections, IDirectCollections } from '../../db/index.js' import { unprotectString } from '@sofie-automation/corelib/dist/protectedString' -import { setupApmAgent, startTransaction } from '../../profiler' -import { InvalidateWorkerDataCache, invalidateWorkerDataCache, loadWorkerDataCache, WorkerDataCache } from '../caches' -import { JobContextImpl } from '../context/JobContextImpl' -import { QueueJobFunc } from '../context/util' -import { AnyLockEvent, LocksManager } from '../locks' -import { FastTrackTimelineFunc, LogLineWithSourceFunc } from '../../main' -import { interceptLogging, logger } from '../../logging' -import { setupInfluxDb } from '../../influx' +import { setupApmAgent, startTransaction } from '../../profiler.js' +import { + InvalidateWorkerDataCache, + invalidateWorkerDataCache, + loadWorkerDataCache, + WorkerDataCache, +} from '../caches.js' +import { JobContextImpl } from '../context/JobContextImpl.js' +import { QueueJobFunc } from '../context/util.js' +import { AnyLockEvent, LocksManager } from '../locks.js' +import { FastTrackTimelineFunc, LogLineWithSourceFunc } from '../../main.js' +import { interceptLogging, logger } from '../../logging.js' +import { setupInfluxDb } from '../../influx.js' import { getIngestQueueName } from '@sofie-automation/corelib/dist/worker/ingest' -import { WorkerJobResult } from '../parent-base' +import { WorkerJobResult } from '../parent-base.js' import { endTrace, sendTrace, startTrace } from '@sofie-automation/corelib/dist/influxdb' import { getPrometheusMetricsString, setupPrometheusMetrics } from '@sofie-automation/corelib/dist/prometheus' import { UserError } from '@sofie-automation/corelib/dist/error' diff --git a/packages/job-worker/src/workers/ingest/jobs.ts b/packages/job-worker/src/workers/ingest/jobs.ts index 2d2ef71a17..b8cdbb0779 100644 --- a/packages/job-worker/src/workers/ingest/jobs.ts +++ b/packages/job-worker/src/workers/ingest/jobs.ts @@ -1,4 +1,4 @@ -import { JobContext } from '../../jobs' +import { JobContext } from '../../jobs/index.js' import { IngestJobs, IngestJobFunc } from '@sofie-automation/corelib/dist/worker/ingest' import { handleMosDeleteStory, @@ -6,13 +6,13 @@ import { handleMosInsertStories, handleMosMoveStories, handleMosSwapStories, -} from '../../ingest/mosDevice/mosStoryJobs' +} from '../../ingest/mosDevice/mosStoryJobs.js' import { handleMosRundownData, handleMosRundownMetadata, handleMosRundownReadyToAir, handleMosRundownStatus, -} from '../../ingest/mosDevice/mosRundownJobs' +} from '../../ingest/mosDevice/mosRundownJobs.js' import { handleRegenerateRundown, handleRemovedRundown, @@ -20,16 +20,16 @@ import { handleUpdatedRundownMetaData, handleUserRemoveRundown, handleUserUnsyncRundown, -} from '../../ingest/ingestRundownJobs' -import { handleRemovedPart, handleUpdatedPart } from '../../ingest/ingestPartJobs' +} from '../../ingest/ingestRundownJobs.js' +import { handleRemovedPart, handleUpdatedPart } from '../../ingest/ingestPartJobs.js' import { handleRegenerateSegment, handleRemovedSegment, handleRemoveOrphanedSegemnts, handleUpdatedSegment, handleUpdatedSegmentRanks, -} from '../../ingest/ingestSegmentJobs' -import { handleExpectedPackagesRegenerate, handleUpdatedPackageInfoForRundown } from '../../ingest/packageInfo' +} from '../../ingest/ingestSegmentJobs.js' +import { handleExpectedPackagesRegenerate, handleUpdatedPackageInfoForRundown } from '../../ingest/packageInfo.js' import { handleBucketActionModify, handleBucketActionRegenerateExpectedPackages, @@ -37,16 +37,16 @@ import { handleBucketPieceModify, handleBucketRemoveAdlibAction, handleBucketRemoveAdlibPiece, -} from '../../ingest/bucket/bucketAdlibs' -import { handleBucketItemImport, handleBucketItemRegenerate } from '../../ingest/bucket/import' -import { handleUserExecuteChangeOperation } from '../../ingest/userOperation' +} from '../../ingest/bucket/bucketAdlibs.js' +import { handleBucketItemImport, handleBucketItemRegenerate } from '../../ingest/bucket/import.js' +import { handleUserExecuteChangeOperation } from '../../ingest/userOperation.js' import { wrapCustomIngestJob, wrapGenericIngestJob, wrapGenericIngestJobWithPrecheck, wrapMosIngestJob, -} from '../../ingest/jobWrappers' -import { handleCreateAdlibTestingRundownForShowStyleVariant } from '../../ingest/createAdlibTestingRundown' +} from '../../ingest/jobWrappers.js' +import { handleCreateAdlibTestingRundownForShowStyleVariant } from '../../ingest/createAdlibTestingRundown.js' type ExecutableFunction = ( context: JobContext, diff --git a/packages/job-worker/src/workers/ingest/parent.ts b/packages/job-worker/src/workers/ingest/parent.ts index 78af19b4d9..88daef1eff 100644 --- a/packages/job-worker/src/workers/ingest/parent.ts +++ b/packages/job-worker/src/workers/ingest/parent.ts @@ -1,10 +1,10 @@ -import { IngestWorkerChild } from './child' -import { InvalidateWorkerDataCache } from '../caches' -import { WorkerJobResult, WorkerParentBase, WorkerParentBaseOptions } from '../parent-base' -import { AnyLockEvent } from '../locks' +import { IngestWorkerChild } from './child.js' +import { InvalidateWorkerDataCache } from '../caches.js' +import { WorkerJobResult, WorkerParentBase, WorkerParentBaseOptions } from '../parent-base.js' +import { AnyLockEvent } from '../locks.js' import { getIngestQueueName } from '@sofie-automation/corelib/dist/worker/ingest' import { Promisify, threadedClass, ThreadedClassManager } from 'threadedclass' -import { FastTrackTimelineFunc, LogLineWithSourceFunc } from '../../main' +import { FastTrackTimelineFunc, LogLineWithSourceFunc } from '../../main.js' const FREEZE_LIMIT = 10000 // how long to wait for a response to a Ping const RESTART_TIMEOUT = 10000 // how long to wait for a restart to complete before throwing an error diff --git a/packages/job-worker/src/workers/locks.ts b/packages/job-worker/src/workers/locks.ts index e97da411c5..1922e43b98 100644 --- a/packages/job-worker/src/workers/locks.ts +++ b/packages/job-worker/src/workers/locks.ts @@ -1,5 +1,5 @@ import { createManualPromise, ManualPromise } from '@sofie-automation/corelib/dist/lib' -import { logger } from '../logging' +import { logger } from '../logging.js' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' export type AnyLockEvent = LockEvent | UnLockEvent diff --git a/packages/job-worker/src/workers/parent-base.ts b/packages/job-worker/src/workers/parent-base.ts index bb7f2890de..c97d65d739 100644 --- a/packages/job-worker/src/workers/parent-base.ts +++ b/packages/job-worker/src/workers/parent-base.ts @@ -8,18 +8,18 @@ import { } from '@sofie-automation/corelib/dist/lib' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' import { protectString, unprotectString } from '@sofie-automation/corelib/dist/protectedString' -import { startTransaction } from '../profiler' +import { startTransaction } from '../profiler.js' import { MongoClient } from 'mongodb' -import { createInvalidateWorkerDataCache, InvalidateWorkerDataCache } from './caches' -import { logger } from '../logging' -import { LocksManager } from '../locks' +import { createInvalidateWorkerDataCache, InvalidateWorkerDataCache } from './caches.js' +import { logger } from '../logging.js' +import { LocksManager } from '../locks.js' import { FORCE_CLEAR_CACHES_JOB } from '@sofie-automation/corelib/dist/worker/shared' -import { JobManager, JobStream } from '../manager' +import { JobManager, JobStream } from '../manager.js' import { Promisify, ThreadedClassManager } from 'threadedclass' import { StatusCode } from '@sofie-automation/blueprints-integration' import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' import { WorkerThreadStatus } from '@sofie-automation/corelib/dist/dataModel/WorkerThreads' -import { UserError } from '@sofie-automation/corelib/dist/error' +import { UserError, UserErrorMessage } from '@sofie-automation/corelib/dist/error' import { sleep } from '@sofie-automation/shared-lib/dist/lib/lib' export enum ThreadStatus { @@ -306,9 +306,7 @@ export abstract class WorkerParentBase { job.id, startTime, endTime, - result.error - ? UserError.tryFromJSON(result.error) ?? new Error(result.error) - : null, + result.error, result.result ) @@ -324,7 +322,13 @@ export abstract class WorkerParentBase { logger.error(`Job errored ${job.id} "${job.name}": ${stringifyError(e)}`) this.#watchdogJobStarted = undefined - await this.#jobManager.jobFinished(job.id, startTime, Date.now(), error, null) + await this.#jobManager.jobFinished( + job.id, + startTime, + Date.now(), + UserError.toJSON(UserError.from(error, UserErrorMessage.InternalError)), + null + ) } // Ensure all locks have been freed after the job diff --git a/packages/job-worker/src/workers/studio/child.ts b/packages/job-worker/src/workers/studio/child.ts index cd468780ee..57974fbb73 100644 --- a/packages/job-worker/src/workers/studio/child.ts +++ b/packages/job-worker/src/workers/studio/child.ts @@ -1,22 +1,26 @@ -import { studioJobHandlers } from './jobs' +import { studioJobHandlers } from './jobs.js' import { StudioId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { MongoClient } from 'mongodb' -import { createMongoConnection, getMongoCollections, IDirectCollections } from '../../db' +import { createMongoConnection, getMongoCollections, IDirectCollections } from '../../db/index.js' import { unprotectString } from '@sofie-automation/corelib/dist/protectedString' -import { setupApmAgent, startTransaction } from '../../profiler' -import { InvalidateWorkerDataCache, invalidateWorkerDataCache, loadWorkerDataCache, WorkerDataCache } from '../caches' -import { JobContextImpl } from '../context/JobContextImpl' -import { QueueJobFunc } from '../context/util' -import { AnyLockEvent, LocksManager } from '../locks' -import { FastTrackTimelineFunc, LogLineWithSourceFunc } from '../../main' -import { interceptLogging, logger } from '../../logging' -import { setupInfluxDb } from '../../influx' +import { setupApmAgent, startTransaction } from '../../profiler.js' +import { + InvalidateWorkerDataCache, + invalidateWorkerDataCache, + loadWorkerDataCache, + WorkerDataCache, +} from '../caches.js' +import { JobContextImpl } from '../context/JobContextImpl.js' +import { QueueJobFunc } from '../context/util.js' +import { AnyLockEvent, LocksManager } from '../locks.js' +import { FastTrackTimelineFunc, LogLineWithSourceFunc } from '../../main.js' +import { interceptLogging, logger } from '../../logging.js' +import { setupInfluxDb } from '../../influx.js' import { getStudioQueueName } from '@sofie-automation/corelib/dist/worker/studio' -import { WorkerJobResult } from '../parent-base' +import { WorkerJobResult } from '../parent-base.js' import { endTrace, sendTrace, startTrace } from '@sofie-automation/corelib/dist/influxdb' import { getPrometheusMetricsString, setupPrometheusMetrics } from '@sofie-automation/corelib/dist/prometheus' import { UserError } from '@sofie-automation/corelib/dist/error' -import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' interface StaticData { readonly mongoClient: MongoClient @@ -126,7 +130,6 @@ export class StudioWorkerChild { } } catch (e) { const userError = UserError.fromUnknown(e) - console.log('border', userError.toErrorString(), stringifyError(e)) logger.error(`Studio job "${jobName}" errored: ${userError.toErrorString()}`) diff --git a/packages/job-worker/src/workers/studio/jobs.ts b/packages/job-worker/src/workers/studio/jobs.ts index 4cc371d5df..4e08fd7edb 100644 --- a/packages/job-worker/src/workers/studio/jobs.ts +++ b/packages/job-worker/src/workers/studio/jobs.ts @@ -1,53 +1,53 @@ -import { JobContext } from '../../jobs' +import { JobContext } from '../../jobs/index.js' import { handleAdLibPieceStart, handleStartStickyPieceOnSourceLayer, handleTakePieceAsAdlibNow, handleStopPiecesOnSourceLayers, handleDisableNextPiece, -} from '../../playout/adlibJobs' +} from '../../playout/adlibJobs.js' import { StudioJobs, StudioJobFunc } from '@sofie-automation/corelib/dist/worker/studio' -import { handleUpdateTimelineAfterIngest, handleUpdateStudioBaseline } from '../../playout/timelineJobs' +import { handleUpdateTimelineAfterIngest, handleUpdateStudioBaseline } from '../../playout/timelineJobs.js' import { handleMoveNextPart, handleSetNextPart, handleSetNextSegment, handleQueueNextSegment, -} from '../../playout/setNextJobs' +} from '../../playout/setNextJobs.js' import { handleActivateRundownPlaylist, handleDeactivateRundownPlaylist, handlePrepareRundownPlaylistForBroadcast, handleResetRundownPlaylist, -} from '../../playout/activePlaylistJobs' +} from '../../playout/activePlaylistJobs.js' import { handleDebugSyncPlayheadInfinitesForNextPartInstance, handleDebugRegenerateNextPartInstance, handleDebugCrash, handleDebugUpdateTimeline, -} from '../../playout/debug' -import { handleActivateHold, handleDeactivateHold } from '../../playout/holdJobs' -import { handleRemoveEmptyPlaylists } from '../../studio/cleanup' +} from '../../playout/debug.js' +import { handleActivateHold, handleDeactivateHold } from '../../playout/holdJobs.js' +import { handleRemoveEmptyPlaylists } from '../../studio/cleanup.js' import { handleRegenerateRundownPlaylist, handleRemoveRundownPlaylist, handleMoveRundownIntoPlaylist, handleRestoreRundownsInPlaylistToDefaultOrder, -} from '../../rundownPlaylists' -import { handleGeneratePlaylistSnapshot, handleRestorePlaylistSnapshot } from '../../playout/snapshot' +} from '../../rundownPlaylists.js' +import { handleGeneratePlaylistSnapshot, handleRestorePlaylistSnapshot } from '../../playout/snapshot.js' import { handleBlueprintFixUpConfigForStudio, handleBlueprintIgnoreFixUpConfigForStudio, handleBlueprintUpgradeForStudio, handleBlueprintValidateConfigForStudio, -} from '../../playout/upgrade' -import { handleTimelineTriggerTime, handleOnPlayoutPlaybackChanged } from '../../playout/timings' -import { handleExecuteAdlibAction } from '../../playout/adlibAction' -import { handleTakeNextPart } from '../../playout/take' -import { handleClearQuickLoopMarkers, handleSetQuickLoopMarker } from '../../playout/quickLoopMarkers' -import { handleActivateAdlibTesting } from '../../playout/adlibTesting' -import { handleExecuteBucketAdLibOrAction } from '../../playout/bucketAdlibJobs' -import { handleSwitchRouteSet } from '../../studio/routeSet' +} from '../../playout/upgrade.js' +import { handleTimelineTriggerTime, handleOnPlayoutPlaybackChanged } from '../../playout/timings/index.js' +import { handleExecuteAdlibAction } from '../../playout/adlibAction.js' +import { handleTakeNextPart } from '../../playout/take.js' +import { handleClearQuickLoopMarkers, handleSetQuickLoopMarker } from '../../playout/quickLoopMarkers.js' +import { handleActivateAdlibTesting } from '../../playout/adlibTesting.js' +import { handleExecuteBucketAdLibOrAction } from '../../playout/bucketAdlibJobs.js' +import { handleSwitchRouteSet } from '../../studio/routeSet.js' type ExecutableFunction = ( context: JobContext, diff --git a/packages/job-worker/src/workers/studio/parent.ts b/packages/job-worker/src/workers/studio/parent.ts index 84c90f9123..288c6cc411 100644 --- a/packages/job-worker/src/workers/studio/parent.ts +++ b/packages/job-worker/src/workers/studio/parent.ts @@ -1,10 +1,10 @@ import { getStudioQueueName } from '@sofie-automation/corelib/dist/worker/studio' -import type { StudioWorkerChild } from './child' -import { InvalidateWorkerDataCache } from '../caches' -import { WorkerParentBase, WorkerParentOptions, WorkerParentBaseOptions, WorkerJobResult } from '../parent-base' -import { AnyLockEvent } from '../locks' +import type { StudioWorkerChild } from './child.js' +import { InvalidateWorkerDataCache } from '../caches.js' +import { WorkerParentBase, WorkerParentOptions, WorkerParentBaseOptions, WorkerJobResult } from '../parent-base.js' +import { AnyLockEvent } from '../locks.js' import { Promisify, threadedClass, ThreadedClassManager } from 'threadedclass' -import { FastTrackTimelineFunc, LogLineWithSourceFunc } from '../../main' +import { FastTrackTimelineFunc, LogLineWithSourceFunc } from '../../main.js' const FREEZE_LIMIT = 2500 // how long to wait for a response to a Ping const RESTART_TIMEOUT = 10000 // how long to wait for a restart to complete before throwing an error diff --git a/packages/job-worker/src/workers/worker-set.ts b/packages/job-worker/src/workers/worker-set.ts index b585a18d06..9fea07421c 100644 --- a/packages/job-worker/src/workers/worker-set.ts +++ b/packages/job-worker/src/workers/worker-set.ts @@ -1,20 +1,20 @@ import { StudioId, WorkerId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { ChangeStream, ChangeStreamDocument, Document, MongoClient } from 'mongodb' -import { LocksManager } from '../locks' -import { IngestWorkerParent } from './ingest/parent' -import { StudioWorkerParent } from './studio/parent' -import { EventsWorkerParent } from './events/parent' -import { JobManager } from '../manager' -import { FastTrackTimelineFunc, LogLineWithSourceFunc } from '../main' -import { WorkerParentBase, WorkerParentOptions } from './parent-base' -import { logger } from '../logging' +import { LocksManager } from '../locks.js' +import { IngestWorkerParent } from './ingest/parent.js' +import { StudioWorkerParent } from './studio/parent.js' +import { EventsWorkerParent } from './events/parent.js' +import { JobManager } from '../manager.js' +import { FastTrackTimelineFunc, LogLineWithSourceFunc } from '../main.js' +import { WorkerParentBase, WorkerParentOptions } from './parent-base.js' +import { logger } from '../logging.js' import { Blueprint } from '@sofie-automation/corelib/dist/dataModel/Blueprint' import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' import { DBShowStyleBase } from '@sofie-automation/corelib/dist/dataModel/ShowStyleBase' import { DBShowStyleVariant } from '@sofie-automation/corelib/dist/dataModel/ShowStyleVariant' import { DBStudio } from '@sofie-automation/corelib/dist/dataModel/Studio' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' -import { InvalidateWorkerDataCache } from './caches' +import { InvalidateWorkerDataCache } from './caches.js' export class StudioWorkerSet { readonly #threads: WorkerParentBase[] diff --git a/packages/job-worker/tsconfig.build.json b/packages/job-worker/tsconfig.build.json index cb679acc16..0fe6995660 100755 --- a/packages/job-worker/tsconfig.build.json +++ b/packages/job-worker/tsconfig.build.json @@ -11,6 +11,7 @@ }, "resolveJsonModule": true, "types": ["node"], - "skipLibCheck": true + "skipLibCheck": true, + "esModuleInterop": true } } diff --git a/packages/lerna.json b/packages/lerna.json index 37c38d9a13..26ccbc1db5 100644 --- a/packages/lerna.json +++ b/packages/lerna.json @@ -1,5 +1,5 @@ { - "version": "1.52.0", - "npmClient": "yarn", - "$schema": "node_modules/lerna/schemas/lerna-schema.json" -} \ No newline at end of file + "version": "1.53.0-in-development", + "npmClient": "yarn", + "$schema": "node_modules/lerna/schemas/lerna-schema.json" +} diff --git a/packages/blueprints-integration/.eslintrc.json b/packages/live-status-gateway-api/.eslintrc.json similarity index 100% rename from packages/blueprints-integration/.eslintrc.json rename to packages/live-status-gateway-api/.eslintrc.json diff --git a/packages/live-status-gateway-api/.gitignore b/packages/live-status-gateway-api/.gitignore new file mode 100644 index 0000000000..6c0c44cc7c --- /dev/null +++ b/packages/live-status-gateway-api/.gitignore @@ -0,0 +1,16 @@ +node_modules +dist +test +src/**.js + +/coverage +/docs +.nyc_output +*.log + +wallaby.conf.js + +.DS_Store + +server +docs diff --git a/packages/live-status-gateway-api/.prettierignore b/packages/live-status-gateway-api/.prettierignore new file mode 100644 index 0000000000..6029bc02d8 --- /dev/null +++ b/packages/live-status-gateway-api/.prettierignore @@ -0,0 +1,4 @@ +package.json +src/copy +src/generated/* +CHANGELOG.md \ No newline at end of file diff --git a/packages/live-status-gateway-api/LICENSE b/packages/live-status-gateway-api/LICENSE new file mode 100644 index 0000000000..78f0f2dbb8 --- /dev/null +++ b/packages/live-status-gateway-api/LICENSE @@ -0,0 +1,21 @@ +MIT License (MIT) + +Copyright (c) 2018 Norsk rikskringkasting AS (NRK) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/live-status-gateway-api/README.md b/packages/live-status-gateway-api/README.md new file mode 100644 index 0000000000..9254f98abd --- /dev/null +++ b/packages/live-status-gateway-api/README.md @@ -0,0 +1,13 @@ +# Sofie: The Modern TV News Studio Automation System (Live Status Gateway API) + +[![npm](https://img.shields.io/npm/v/@sofie-automation/live-status-gateway-api)](https://www.npmjs.com/package/@sofie-automation/live-status-gateway-api) + +This library is used as part of [**Sofie Server Core**](https://github.com/nrkno/sofie-core). + +This is a part of the [**Sofie** TV News Studio Automation System](https://github.com/nrkno/Sofie-TV-automation/). + +## Purpose + +This library is a collection of typings used by the `live-status-gateway` and consumers of the api it provides. + +The package also contains the asyncapi schema, to allow for other consumers of the library to do their own generating if desired. diff --git a/packages/live-status-gateway/api/asyncapi.yaml b/packages/live-status-gateway-api/api/asyncapi.yaml similarity index 91% rename from packages/live-status-gateway/api/asyncapi.yaml rename to packages/live-status-gateway-api/api/asyncapi.yaml index 4c1095011c..ebd709e580 100644 --- a/packages/live-status-gateway/api/asyncapi.yaml +++ b/packages/live-status-gateway-api/api/asyncapi.yaml @@ -48,6 +48,8 @@ channels: - $ref: '#/components/messages/activePieces' - $ref: '#/components/messages/segments' - $ref: '#/components/messages/adLibs' + - $ref: '#/components/messages/packages' + - $ref: '#/components/messages/buckets' components: messages: ping: @@ -124,3 +126,14 @@ components: description: AdLibs in active Playlist payload: $ref: './schemas/adLibs.yaml#/$defs/adLibs' + packages: + name: packages + messageId: packages + description: Status of Packages expected by Pieces + payload: + $ref: './schemas/packages.yaml#/$defs/packages' + buckets: + name: buckets + description: Buckets in Studio + payload: + $ref: './schemas/buckets.yaml#/$defs/buckets' diff --git a/packages/live-status-gateway/api/schemas/activePieces.yaml b/packages/live-status-gateway-api/api/schemas/activePieces.yaml similarity index 96% rename from packages/live-status-gateway/api/schemas/activePieces.yaml rename to packages/live-status-gateway-api/api/schemas/activePieces.yaml index 01d777f443..d2996b70bc 100644 --- a/packages/live-status-gateway/api/schemas/activePieces.yaml +++ b/packages/live-status-gateway-api/api/schemas/activePieces.yaml @@ -3,6 +3,7 @@ description: Active Pieces schema for websocket subscriptions $defs: activePieces: type: object + title: ActivePiecesEvent properties: event: type: string diff --git a/packages/live-status-gateway/api/schemas/activePlaylist.yaml b/packages/live-status-gateway-api/api/schemas/activePlaylist.yaml similarity index 72% rename from packages/live-status-gateway/api/schemas/activePlaylist.yaml rename to packages/live-status-gateway-api/api/schemas/activePlaylist.yaml index 2624e4e684..308b90e757 100644 --- a/packages/live-status-gateway/api/schemas/activePlaylist.yaml +++ b/packages/live-status-gateway-api/api/schemas/activePlaylist.yaml @@ -3,18 +3,26 @@ description: Active Playlist schema for websocket subscriptions $defs: activePlaylist: type: object + title: ActivePlaylistEvent properties: event: type: string const: activePlaylist id: description: Unique id of the active playlist - type: string + oneOf: + - type: string + - type: 'null' + externalId: + description: Id normally sourced from the ingest system + oneOf: + - type: string + - type: 'null' name: description: User-presentable name for the active playlist type: string rundownIds: - description: The set of rundownIds in the active playlist + description: The set of rundownIds in the active playlist, in order type: array items: type: string @@ -32,10 +40,12 @@ $defs: timing: description: Timing information about the active playlist type: object + title: ActivePlaylistTiming properties: timingMode: description: 'Timing mode for the playlist.' type: string + title: ActivePlaylistTimingMode enum: - none - forward-time @@ -57,6 +67,7 @@ $defs: quickLoop: description: Information about the current quickLoop, if any type: object + title: ActivePlaylistQuickLoop properties: locked: description: Whether the user is allowed to make alterations to the Start/End markers @@ -71,11 +82,12 @@ $defs: description: The end of the loop $ref: '#/$defs/quickLoopMarker' required: [locked, running] - required: [event, id, name, rundownIds, currentPart, currentSegment, nextPart, timing] + required: [event, id, externalId, name, rundownIds, currentPart, currentSegment, nextPart, timing] additionalProperties: false examples: - event: activePlaylist id: 'OKAgZmZ0Buc99lE_2uPPSKVbMrQ_' + externalId: '1ZIYVYL1aEkNEJbeGsmRXr5s8wtkyxfPRjNSTxZfcoEI' name: 'Playlist 0' rundownIds: ['y9HauyWkcxQS3XaAOsW40BRLLsI_'] currentPart: @@ -92,6 +104,7 @@ $defs: expectedDurationMs: 180000 partBase: type: object + title: PartStatus properties: id: description: Unique id of the part @@ -124,6 +137,34 @@ $defs: - $ref: '#/$defs/piece/examples/0' publicData: partType: 'intro' + currentSegmentPart: + type: object + title: CurrentSegmentPart + properties: + id: + description: Unique id of the part + type: string + name: + description: User-presentable name of the part + type: string + autoNext: + description: If this part will progress to the next automatically + type: boolean + default: false + timing: + type: object + title: CurrentSegmentPartTiming + properties: + expectedDurationMs: + description: Expected duration of the part + type: number + required: [id, name, timing] + additionalProperties: false + examples: + - id: 'H5CBGYjThrMSmaYvRaa5FVKJIzk_' + name: 'Intro' + timing: + expectedDurationMs: 15000 part: oneOf: - $ref: '#/$defs/partBase' @@ -137,13 +178,15 @@ $defs: - $ref: '#/$defs/piece/examples/0' currentPart: oneOf: - - allOf: + - title: CurrentPartStatus + allOf: - $ref: '#/$defs/partBase' - type: object properties: timing: description: Timing information about the current part type: object + title: CurrentPartTiming properties: startTime: description: Unix timestamp of when the part started (milliseconds) @@ -171,33 +214,42 @@ $defs: publicData: partType: 'intro' currentSegment: - type: object - properties: - id: - description: Unique id of the segment - type: string - timing: - description: Timing information about the current segment - type: object + oneOf: + - type: object + title: CurrentSegment properties: - expectedDurationMs: - description: Expected duration of the segment - type: number - budgetDurationMs: - description: Budget duration of the segment - type: number - projectedEndTime: - description: Unix timestamp of when the segment is projected to end (milliseconds). The time this segment started, offset by its budget duration, if the segment has a defined budget duration. Otherwise, the time the current part started, offset by the difference between expected durations of all parts in this segment and the as-played durations of the parts that already stopped. - type: number - countdownType: - description: 'Countdown type within the segment. Default: `part_expected_duration`' + id: + description: Unique id of the segment type: string - enum: - - part_expected_duration - - segment_budget_duration - required: [expectedDurationMs, projectedEndTime] - required: [id, timing] - additionalProperties: false + timing: + description: Timing information about the current segment + type: object + title: CurrentSegmentTiming + properties: + expectedDurationMs: + description: Expected duration of the segment + type: number + budgetDurationMs: + description: Budget duration of the segment + type: number + projectedEndTime: + description: Unix timestamp of when the segment is projected to end (milliseconds). The time this segment started, offset by its budget duration, if the segment has a defined budget duration. Otherwise, the time the current part started, offset by the difference between expected durations of all parts in this segment and the as-played durations of the parts that already stopped. + type: number + countdownType: + description: 'Countdown type within the segment. Default: `part_expected_duration`' + type: string + title: SegmentCountdownType + enum: + - part_expected_duration + - segment_budget_duration + required: [expectedDurationMs, projectedEndTime] + parts: + type: array + items: + $ref: '#/$defs/currentSegmentPart' + required: [id, timing, parts] + additionalProperties: false + - type: 'null' examples: - id: 'H5CBGYjThrMSmaYvRaa5FVKJIzk_' timing: @@ -205,8 +257,11 @@ $defs: budgetDurationMs: 20000 projectedEndTime: 1600000075000 countdownType: segment_budget_duration + parts: + - $ref: '#/$defs/currentSegmentPart/examples/0' piece: type: object + title: PieceStatus properties: id: description: Unique id of the Piece @@ -239,9 +294,11 @@ $defs: switcherSource: 1 quickLoopMarker: type: object + title: QuickLoopMarker properties: markerType: description: The type of entity the marker is locked to + title: QuickLoopMarkerType type: string enum: - playlist diff --git a/packages/live-status-gateway/api/schemas/adLibs.yaml b/packages/live-status-gateway-api/api/schemas/adLibs.yaml similarity index 95% rename from packages/live-status-gateway/api/schemas/adLibs.yaml rename to packages/live-status-gateway-api/api/schemas/adLibs.yaml index 97b90dcf47..6c6d096664 100644 --- a/packages/live-status-gateway/api/schemas/adLibs.yaml +++ b/packages/live-status-gateway-api/api/schemas/adLibs.yaml @@ -3,6 +3,7 @@ description: AdLibs schema for websocket subscriptions $defs: adLibs: type: object + title: AdLibsEvent properties: event: type: string @@ -32,14 +33,17 @@ $defs: globalAdLibs: $ref: '#/$defs/adLibBase/examples' adLib: + title: AdLibStatus allOf: - $ref: '#/$defs/adLibBase' - type: object properties: segmentId: description: Unique id of the segment this adLib belongs to + type: string partId: description: Unique id of the part this adLib belongs to + type: string required: [segmentId, partId] examples: - id: 'C6K_yIMuGFUk8X_L9A9_jRT6aq4_' @@ -54,10 +58,12 @@ $defs: publicData: fileName: MV000123.mxf globalAdLib: - $ref: '#/$defs/adLibBase' - additionalProperties: false + title: GlobalAdLibStatus + allOf: + - $ref: '#/$defs/adLibBase' adLibBase: type: object + title: AdLibBaseStatus properties: id: description: Unique id of the AdLib @@ -76,6 +82,7 @@ $defs: type: array items: type: object + title: AdLibActionType properties: name: description: The string to be passed to the ExecuteAdlib function diff --git a/packages/live-status-gateway-api/api/schemas/buckets.yaml b/packages/live-status-gateway-api/api/schemas/buckets.yaml new file mode 100644 index 0000000000..3b61fd87e3 --- /dev/null +++ b/packages/live-status-gateway-api/api/schemas/buckets.yaml @@ -0,0 +1,64 @@ +title: Buckets +description: Buckets schema for websocket subscriptions +$defs: + buckets: + type: object + title: BucketsEvent + properties: + event: + type: string + const: buckets + buckets: + description: Buckets available in the Studio + type: array + items: + $ref: '#/$defs/bucket' + required: [event, buckets] + additionalProperties: false + examples: + - event: buckets + buckets: + $ref: '#/$defs/bucket/examples' + bucket: + type: object + title: BucketStatus + properties: + id: + description: Unique id of the bucket + type: string + name: + description: The user defined bucket name + type: string + adLibs: + description: The AdLibs in this bucket + type: array + items: + $ref: '#/$defs/bucketAdlib' + required: [id, name, adLibs] + additionalProperties: false + examples: + - id: 'C6K_yIMuGFUk8X_L9A9_jRT6aq4_' + name: My Bucket + adLibs: + $ref: '#/$defs/bucketAdlib/examples' + bucketAdlib: + title: BucketAdLibStatus + allOf: + - $ref: './adLibs.yaml#/$defs/adLibBase' + - type: object + properties: + externalId: + type: string + description: Id of the adlib recognizable by the external source. Unique within a bucket. + required: [externalId] + examples: + - externalId: 'C6K_yIMuGFUk8X_L9A9_jRT6aq4_' + id: 'C6K_yIMuGFUk8X_L9A9_jRT6aq4_' + name: Music video clip + sourceLayer: Video Clip + actionType: + - name: pvw + label: Preview + tags: ['music_video'] + publicData: + fileName: MV000123.mxf diff --git a/packages/live-status-gateway-api/api/schemas/packages.yaml b/packages/live-status-gateway-api/api/schemas/packages.yaml new file mode 100644 index 0000000000..d95c5a7edb --- /dev/null +++ b/packages/live-status-gateway-api/api/schemas/packages.yaml @@ -0,0 +1,82 @@ +title: Packages +description: Packages schema for websocket subscriptions. Packages are assets that need to be prepared by Sofie Package Manager or third-party systems to make AdLibs and Pieces playable. +$defs: + packages: + type: object + title: PackagesEvent + properties: + event: + type: string + const: packages + rundownPlaylistId: + description: Unique id of the rundown playlist, or null if no playlist is active + oneOf: + - type: string + - type: 'null' + packages: + description: The Package statuses for this playlist + type: array + items: + $ref: '#/$defs/package' + required: [event, rundownPlaylistId, packages] + additionalProperties: false + examples: + - event: packages + rundownPlaylistId: 'OKAgZmZ0Buc99lE_2uPPSKVbMrQ_' + packages: + $ref: '#/$defs/package/examples' + package: + type: object + title: PackageInfoStatus + properties: + packageName: + description: Name of the package + type: string + status: + type: string + title: PackageStatus + enum: + - unknown + - ok + - source_broken + - source_has_issues + - source_missing + - source_not_ready + - source_not_set + - source_unknown_state + description: | + Status: + * `unknown` - status not determined (yet) + * `ok` - no faults, can be played + * `source_broken` - the source is present, but should not be played due to a technical malfunction (file is broken, camera robotics failed, REMOTE input is just bars, etc.) + * `source_has_issues` - technically it can be played, but some issues with it were detected + * `source_missing` - the source (file, live input) is missing and cannot be played + * `source_not_ready` - can't be played for a non-technical reason (e.g. a placeholder clip with no content) + * `source_not_set` - missing a file path + * `source_unknown_state` - reported, but unrecognized state + rundownId: + description: Id of the Rundown that a Piece (or AdLib) expecting this package belongs to + type: string + partId: + description: Id of the Part that a Piece (or AdLib) expecting this package belongs to. It could be an Id of a Part from the Active Playlist topic, or a Part not exposed otherwise by the LSG. + type: string + segmentId: + description: Id of the Segment that a Piece (or AdLib) expecting this package belongs to + type: string + pieceOrAdLibId: + description: Id of the Piece or AdLib that expects this package. It could be an Id of a Piece from the Active Pieces and Active Playlist topics, or an Id of an AdLib from the AdLibs topic. It could also be an Id of a Piece not exposed otherwise by the LSG, but still relevant, e.g. to summarize the status of packages within a specific Part/Segment. + type: string + thumbnailUrl: + description: URL where the thumbnail can be accessed + type: string + previewUrl: + description: URL where the preview can be accessed + type: string + required: [status, rundownId, pieceOrAdLibId] + additionalProperties: false + examples: + - packageName: 'MV000123.mxf' + status: ok + rundownId: 'y9HauyWkcxQS3XaAOsW40BRLLsI_' + pieceOrAdLibId: 'C6K_yIMuGFUk8X_L9A9_jRT6aq4_' + thumbnailUrl: 'https://package-manager.local/package/MV000123.mov_thumbnail.jpg' diff --git a/packages/live-status-gateway/api/schemas/root.yaml b/packages/live-status-gateway-api/api/schemas/root.yaml similarity index 86% rename from packages/live-status-gateway/api/schemas/root.yaml rename to packages/live-status-gateway-api/api/schemas/root.yaml index 488a5d3054..0fcd3540e3 100644 --- a/packages/live-status-gateway/api/schemas/root.yaml +++ b/packages/live-status-gateway-api/api/schemas/root.yaml @@ -6,6 +6,7 @@ $defs: description: Client originated ID reflected in response message. ping: type: object + title: PingEvent properties: event: type: string @@ -19,6 +20,7 @@ $defs: reqid: 27 pong: type: object + title: PongEvent properties: event: type: string @@ -32,6 +34,7 @@ $defs: reqid: 27 heartbeat: type: object + title: HeartbeatEvent properties: event: type: string @@ -42,6 +45,7 @@ $defs: - event: heartbeat subscribe: type: object + title: SubscribeEvent properties: event: type: string @@ -50,6 +54,7 @@ $defs: $ref: '#/$defs/reqid' subscription: type: object + title: SubscribeSubscription properties: name: $ref: '#/$defs/name' @@ -64,6 +69,7 @@ $defs: name: studio unsubscribe: type: object + title: UnsubscribeEvent properties: event: type: string @@ -72,6 +78,7 @@ $defs: $ref: '#/$defs/reqid' subscription: type: object + title: UnsubscribeSubscription properties: name: $ref: '#/$defs/name' @@ -86,6 +93,7 @@ $defs: name: studio subscriptionStatus: type: object + title: SubscriptionStatus oneOf: - $ref: '#/$defs/subscriptionStatusError' - $ref: '#/$defs/subscriptionStatusSuccess' @@ -93,6 +101,7 @@ $defs: examples: - $ref: '#/$defs/subscriptionStatusCommon/examples/0' subscriptionStatusError: + title: SubscriptionStatusError allOf: - properties: errorMessage: @@ -104,7 +113,9 @@ $defs: - errorMessage: 'Subscribe to studio topic failed' $ref: '#/$defs/subscriptionStatusCommon/examples/0' subscriptionStatusSuccess: - $ref: '#/$defs/subscriptionStatusCommon' + title: SubscriptionStatusSuccess + allOf: + - $ref: '#/$defs/subscriptionStatusCommon' subscriptionStatusCommon: type: object properties: @@ -115,6 +126,7 @@ $defs: $ref: '#/$defs/reqid' subscription: type: object + title: SubscriptionDetails properties: name: $ref: '#/$defs/name' @@ -132,12 +144,19 @@ $defs: status: subscribed name: type: string + title: SubscriptionName description: The name of the topic related to this status. enum: - studio - activePlaylist + - activePieces + - segments + - adLibs + - buckets + - packages status: type: string + title: SubscriptionStatus description: The current status of the subscription enum: - subscribed diff --git a/packages/live-status-gateway/api/schemas/segments.yaml b/packages/live-status-gateway-api/api/schemas/segments.yaml similarity index 95% rename from packages/live-status-gateway/api/schemas/segments.yaml rename to packages/live-status-gateway-api/api/schemas/segments.yaml index ca87639614..34eb033fd1 100644 --- a/packages/live-status-gateway/api/schemas/segments.yaml +++ b/packages/live-status-gateway-api/api/schemas/segments.yaml @@ -3,6 +3,7 @@ description: Segments schema for websocket subscriptions $defs: segments: type: object + title: SegmentsEvent properties: event: type: string @@ -26,6 +27,7 @@ $defs: $ref: '#/$defs/segment/examples' segment: type: object + title: Segment properties: id: description: Unique id of the segment @@ -41,6 +43,7 @@ $defs: type: string timing: type: object + title: SegmentTiming properties: expectedDurationMs: description: Expected duration of the segment (milliseconds) @@ -51,6 +54,7 @@ $defs: countdownType: description: 'Countdown type within the segment. Default: `part_expected_duration`' type: string + title: SegmentCountdownType enum: - part_expected_duration - segment_budget_duration diff --git a/packages/live-status-gateway/api/schemas/studio.yaml b/packages/live-status-gateway-api/api/schemas/studio.yaml similarity index 78% rename from packages/live-status-gateway/api/schemas/studio.yaml rename to packages/live-status-gateway-api/api/schemas/studio.yaml index d971a8a13d..d7582c14d6 100644 --- a/packages/live-status-gateway/api/schemas/studio.yaml +++ b/packages/live-status-gateway-api/api/schemas/studio.yaml @@ -3,13 +3,16 @@ description: Studio schema for websocket subscriptions $defs: studio: type: object + title: StudioEvent properties: event: type: string const: studio id: description: Unique id of the studio - type: string + oneOf: + - type: string + - type: 'null' name: description: User-presentable name for the studio installation type: string @@ -28,23 +31,29 @@ $defs: $ref: '#/$defs/playlist/examples' playlist: type: object + title: PlaylistStatus properties: id: description: Unique id of the playlist type: string + externalId: + description: Id normally sourced from the ingest system + type: string name: description: The user defined playlist name type: string activationStatus: description: Whether this playlist is currently active or in rehearsal type: string + title: PlaylistActivationStatus enum: - deactivated - rehearsal - activated - required: [id, name, activationStatus] + required: [id, externalId, name, activationStatus] additionalProperties: false examples: - id: 'OKAgZmZ0Buc99lE_2uPPSKVbMrQ_' + externalId: '1ZIYVYL1aEkNEJbeGsmRXr5s8wtkyxfPRjNSTxZfcoEI' name: 'Playlist 0' activationStatus: rehearsal diff --git a/packages/live-status-gateway-api/eslint.config.mjs b/packages/live-status-gateway-api/eslint.config.mjs new file mode 100644 index 0000000000..b9e5a88fd8 --- /dev/null +++ b/packages/live-status-gateway-api/eslint.config.mjs @@ -0,0 +1,3 @@ +import { generateEslintConfig } from '@sofie-automation/code-standard-preset/eslint/main.mjs' + +export default generateEslintConfig({}) diff --git a/packages/live-status-gateway-api/jest.config.js b/packages/live-status-gateway-api/jest.config.js new file mode 100644 index 0000000000..2fe89196ee --- /dev/null +++ b/packages/live-status-gateway-api/jest.config.js @@ -0,0 +1,27 @@ +module.exports = { + globals: {}, + moduleFileExtensions: ['js', 'ts'], + transform: { + '^.+\\.(ts|tsx)$': [ + 'ts-jest', + { + tsconfig: 'tsconfig.json', + }, + ], + }, + testMatch: ['**/__tests__/**/*.(spec|test).(ts|js)'], + testPathIgnorePatterns: ['integrationTests'], + testEnvironment: 'node', + // coverageThreshold: { + // global: { + // branches: 80, + // functions: 100, + // lines: 95, + // statements: 90, + // }, + // }, + coverageDirectory: './coverage/', + coverageProvider: 'v8', + collectCoverage: true, + preset: 'ts-jest', +} diff --git a/packages/live-status-gateway-api/package.json b/packages/live-status-gateway-api/package.json new file mode 100644 index 0000000000..9619f7c4f7 --- /dev/null +++ b/packages/live-status-gateway-api/package.json @@ -0,0 +1,64 @@ +{ + "name": "@sofie-automation/live-status-gateway-api", + "version": "1.53.0-in-development", + "description": "Library for types & values shared by core, workers and gateways", + "main": "dist/index.js", + "typings": "dist/index.d.ts", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/nrkno/sofie-core.git", + "directory": "packages/live-status-gateway-api" + }, + "bugs": { + "url": "https://github.com/nrkno/sofie-core/issues" + }, + "homepage": "https://github.com/nrkno/sofie-core/blob/master/packages/live-status-gateway-api#readme", + "scripts": { + "build": "yarn generate-schema-types && run -T rimraf dist && run build:main", + "build:main": "run -T tsc -p tsconfig.build.json", + "lint:raw": "run -T eslint", + "lint": "run lint:raw .", + "unit": "run -T jest", + "test": "run lint && run unit", + "watch": "run -T jest --watch", + "cov": "run -T jest --coverage; open-cli coverage/lcov-report/index.html", + "cov-open": "open-cli coverage/lcov-report/index.html", + "validate:dependencies": "yarn npm audit --environment production && run license-validate", + "validate:dev-dependencies": "yarn npm audit --environment development", + "license-validate": "run -T sofie-licensecheck", + "gendocs": "run -T rimraf docs && ag ./api/asyncapi.yaml @asyncapi/html-template -o docs -p singleFile=true -p outFilename=liveStatus.html", + "genserver": "run -T rimraf server && ag ./api/asyncapi.yaml @asyncapi/nodejs-ws-template -o server -p server=development", + "generate-schema-types": "node scripts/generate-schema-types.mjs" + }, + "engines": { + "node": ">=14.19" + }, + "files": [ + "/dist", + "/api", + "/CHANGELOG.md", + "/README.md", + "/LICENSE" + ], + "dependencies": { + "tslib": "^2.6.2" + }, + "devDependencies": { + "@asyncapi/generator": "^2.6.0", + "@asyncapi/html-template": "^3.2.0", + "@asyncapi/modelina": "^4.0.4", + "@asyncapi/nodejs-ws-template": "^0.10.0", + "@asyncapi/parser": "^3.4.0" + }, + "prettier": "@sofie-automation/code-standard-preset/.prettierrc.json", + "lint-staged": { + "*.{js,css,json,md,scss}": [ + "yarn run -T prettier" + ], + "*.{ts,tsx}": [ + "yarn lint:raw" + ] + }, + "packageManager": "yarn@4.6.0" +} diff --git a/packages/live-status-gateway-api/scripts/generate-schema-types.mjs b/packages/live-status-gateway-api/scripts/generate-schema-types.mjs new file mode 100644 index 0000000000..5eeb54c60a --- /dev/null +++ b/packages/live-status-gateway-api/scripts/generate-schema-types.mjs @@ -0,0 +1,112 @@ +import { TypeScriptGenerator } from '@asyncapi/modelina' +import { fromFile, Parser } from '@asyncapi/parser' +import fs from 'fs/promises' +import cp from 'child_process' +import * as path from 'path' + +const BANNER = + '/* eslint-disable */\n/**\n * This file was automatically generated using and @asyncapi/parser @asyncapi/modelina.\n * DO NOT MODIFY IT BY HAND. Instead, modify the source AsyncAPI schema files,\n * and run "yarn generate-schema-types" to regenerate this file.\n */\n' + +const renderDescription = ({ renderer, content, item }) => { + const desc = item.originalInput.description?.trim() + + if (desc) { + const doc = renderer.renderComments(`${desc || ''}`.trim()) + return `${doc}\n${content}` + } + return content +} +/** + * Preset which adds descriptions + * Modified from the original, to omit examples + * + * @type {import('@asyncapi/modelina').TypeScriptPreset} + */ +const CUSTOM_TS_DESCRIPTION_PRESET = { + class: { + self({ renderer, model, content }) { + return renderDescription({ renderer, content, item: model }) + }, + getter({ renderer, property, content }) { + return renderDescription({ renderer, content, item: property.property }) + }, + }, + interface: { + self({ renderer, model, content }) { + return renderDescription({ renderer, content, item: model }) + }, + property({ renderer, property, content }) { + return renderDescription({ renderer, content, item: property.property }) + }, + }, + type: { + self({ renderer, model, content }) { + return renderDescription({ renderer, content, item: model }) + }, + }, + enum: { + self({ renderer, model, content }) { + return renderDescription({ renderer, content, item: model }) + }, + }, +} + +const generator = new TypeScriptGenerator({ + modelType: 'interface', + enumType: 'enum', + mapType: 'record', + moduleSystem: 'ESM', + presets: [CUSTOM_TS_DESCRIPTION_PRESET], + rawPropertyNames: true, +}) + +const parser = new Parser() +const asyncApiDoc = await fromFile(parser, 'api/asyncapi.yaml').parse() +if (!asyncApiDoc.document) { + console.error('No document was produced from the asyncapi parser') + console.error(JSON.stringify(asyncApiDoc.diagnostics)) + + // eslint-disable-next-line n/no-process-exit + process.exit(5) +} + +const models = await generator.generate(asyncApiDoc.document) +const allModelNames = [] +const allmodelContent = [] +for (const model of models) { + allModelNames.push(model.modelName) + allmodelContent.push(model.result) + + if (model.modelName.includes('Anonymous')) + throw new Error(`Anonymous model found: ${model.modelName}\n\n${JSON.stringify(model.result, null, 2)}`) +} + +const allModelsString = + BANNER + '\n\n' + allmodelContent.join('\n\n') + '\n\n' + 'export {' + allModelNames.join(', ') + '};' + +const fileName = path.resolve('src/generated/schema.ts') +await fs.writeFile(fileName, allModelsString) + +// Prettier format the output file: +await runCmd(`npx prettier --write "${fileName}"`, { + // Run from repo root, so that prettier picks up the config + cwd: path.resolve('../..'), +}) + +console.log(`Schema types written to ${fileName}`) + +async function runCmd(cmd, options) { + await new Promise((resolve, reject) => { + const child = cp.exec(cmd, options || {}, (err, stdout, stderr) => { + if (err) { + console.error('stderr', stderr) + reject(err) + } else { + resolve(stdout) + } + }) + + child.stdout.pipe(process.stdout) + child.stderr.pipe(process.stderr) + }) +} diff --git a/packages/live-status-gateway/src/__tests__/temp.spec.ts b/packages/live-status-gateway-api/src/__tests__/temp.spec.ts similarity index 100% rename from packages/live-status-gateway/src/__tests__/temp.spec.ts rename to packages/live-status-gateway-api/src/__tests__/temp.spec.ts diff --git a/packages/live-status-gateway-api/src/generated/schema.ts b/packages/live-status-gateway-api/src/generated/schema.ts new file mode 100644 index 0000000000..9b55309c09 --- /dev/null +++ b/packages/live-status-gateway-api/src/generated/schema.ts @@ -0,0 +1,770 @@ +/* eslint-disable */ +/** + * This file was automatically generated using and @asyncapi/parser @asyncapi/modelina. + * DO NOT MODIFY IT BY HAND. Instead, modify the source AsyncAPI schema files, + * and run "yarn generate-schema-types" to regenerate this file. + */ + +type Slash = + | PongEvent + | HeartbeatEvent + | SubscriptionStatusError + | SubscriptionStatusSuccess + | StudioEvent + | ActivePlaylistEvent + | ActivePiecesEvent + | SegmentsEvent + | AdLibsEvent + | PackagesEvent + | BucketsEvent + +interface PongEvent { + event: 'pong' + /** + * Client originated ID reflected in response message. + */ + reqid: number +} + +interface HeartbeatEvent { + event: 'heartbeat' +} + +interface SubscriptionStatusError { + errorMessage: string + event: 'subscriptionStatus' + /** + * Client originated ID reflected in response message. + */ + reqid: number + subscription: SubscriptionDetails +} + +interface SubscriptionDetails { + /** + * The name of the topic related to this status. + */ + name: SubscriptionName + /** + * The current status of the subscription + */ + status: SubscriptionStatus +} + +/** + * The name of the topic related to this status. + */ +enum SubscriptionName { + STUDIO = 'studio', + ACTIVE_PLAYLIST = 'activePlaylist', + ACTIVE_PIECES = 'activePieces', + SEGMENTS = 'segments', + AD_LIBS = 'adLibs', + BUCKETS = 'buckets', + RESERVED_PACKAGES = 'packages', +} + +/** + * The current status of the subscription + */ +enum SubscriptionStatus { + SUBSCRIBED = 'subscribed', + UNSUBSCRIBED = 'unsubscribed', +} + +interface SubscriptionStatusSuccess { + event: 'subscriptionStatus' + /** + * Client originated ID reflected in response message. + */ + reqid: number + subscription: SubscriptionDetails +} + +interface StudioEvent { + event: 'studio' + /** + * Unique id of the studio + */ + id: string | null + /** + * User-presentable name for the studio installation + */ + name: string + /** + * The playlists that are currently loaded in the studio + */ + playlists: PlaylistStatus[] +} + +interface PlaylistStatus { + /** + * Unique id of the playlist + */ + id: string + /** + * Id normally sourced from the ingest system + */ + externalId: string + /** + * The user defined playlist name + */ + name: string + /** + * Whether this playlist is currently active or in rehearsal + */ + activationStatus: PlaylistActivationStatus +} + +/** + * Whether this playlist is currently active or in rehearsal + */ +enum PlaylistActivationStatus { + DEACTIVATED = 'deactivated', + REHEARSAL = 'rehearsal', + ACTIVATED = 'activated', +} + +interface ActivePlaylistEvent { + event: 'activePlaylist' + /** + * Unique id of the active playlist + */ + id: string | null + /** + * Id normally sourced from the ingest system + */ + externalId: string | null + /** + * User-presentable name for the active playlist + */ + name: string + /** + * The set of rundownIds in the active playlist, in order + */ + rundownIds: string[] + currentPart: CurrentPartStatus | null + currentSegment: CurrentSegment | null + nextPart: PartStatus | null + /** + * Optional arbitrary data + */ + publicData?: any + /** + * Timing information about the active playlist + */ + timing: ActivePlaylistTiming + /** + * Information about the current quickLoop, if any + */ + quickLoop?: ActivePlaylistQuickLoop +} + +interface CurrentPartStatus { + /** + * Unique id of the part + */ + id: string + /** + * User name of the part + */ + name: string + /** + * Unique id of the segment this part belongs to + */ + segmentId: string + /** + * If this part will progress to the next automatically + */ + autoNext?: boolean + /** + * All pieces in this part + */ + pieces: PieceStatus[] + /** + * Optional arbitrary data + */ + publicData?: any + /** + * Timing information about the current part + */ + timing: CurrentPartTiming + additionalProperties?: Record +} + +interface PieceStatus { + /** + * Unique id of the Piece + */ + id: string + /** + * User-facing name of the Piece + */ + name: string + /** + * The source layer name for this Piece + */ + sourceLayer: string + /** + * The output layer name for this Piece + */ + outputLayer: string + /** + * Tags attached to this Piece + */ + tags?: string[] + /** + * Optional arbitrary data + */ + publicData?: any +} + +/** + * Timing information about the current part + */ +interface CurrentPartTiming { + /** + * Unix timestamp of when the part started (milliseconds) + */ + startTime: number + /** + * Expected duration of the part (milliseconds) + */ + expectedDurationMs: number + /** + * Unix timestamp of when the part is projected to end (milliseconds). A sum of `startTime` and `expectedDurationMs`. + */ + projectedEndTime: number + additionalProperties?: Record +} + +interface CurrentSegment { + /** + * Unique id of the segment + */ + id: string + /** + * Timing information about the current segment + */ + timing: CurrentSegmentTiming + parts: CurrentSegmentPart[] +} + +/** + * Timing information about the current segment + */ +interface CurrentSegmentTiming { + /** + * Expected duration of the segment + */ + expectedDurationMs: number + /** + * Budget duration of the segment + */ + budgetDurationMs?: number + /** + * Unix timestamp of when the segment is projected to end (milliseconds). The time this segment started, offset by its budget duration, if the segment has a defined budget duration. Otherwise, the time the current part started, offset by the difference between expected durations of all parts in this segment and the as-played durations of the parts that already stopped. + */ + projectedEndTime: number + /** + * Countdown type within the segment. Default: `part_expected_duration` + */ + countdownType?: SegmentCountdownType + additionalProperties?: Record +} + +/** + * Countdown type within the segment. Default: `part_expected_duration` + */ +enum SegmentCountdownType { + PART_EXPECTED_DURATION = 'part_expected_duration', + SEGMENT_BUDGET_DURATION = 'segment_budget_duration', +} + +interface CurrentSegmentPart { + /** + * Unique id of the part + */ + id: string + /** + * User-presentable name of the part + */ + name: string + /** + * If this part will progress to the next automatically + */ + autoNext?: boolean + timing: CurrentSegmentPartTiming +} + +interface CurrentSegmentPartTiming { + /** + * Expected duration of the part + */ + expectedDurationMs?: number + additionalProperties?: Record +} + +interface PartStatus { + /** + * Unique id of the part + */ + id: string + /** + * User name of the part + */ + name: string + /** + * Unique id of the segment this part belongs to + */ + segmentId: string + /** + * If this part will progress to the next automatically + */ + autoNext?: boolean + /** + * All pieces in this part + */ + pieces: PieceStatus[] + /** + * Optional arbitrary data + */ + publicData?: any + additionalProperties?: Record +} + +/** + * Timing information about the active playlist + */ +interface ActivePlaylistTiming { + /** + * Timing mode for the playlist. + */ + timingMode: ActivePlaylistTimingMode + /** + * Unix timestamp of when the playlist started (milliseconds) + */ + startedPlayback?: number + /** + * Unix timestamp of when the playlist is expected to start (milliseconds). Required when the timingMode is set to forward-time. + */ + expectedStart?: number + /** + * Duration of the playlist in ms + */ + expectedDurationMs?: number + /** + * Unix timestamp of when the playlist is expected to end (milliseconds) Required when the timingMode is set to back-time. + */ + expectedEnd?: number +} + +/** + * Timing mode for the playlist. + */ +enum ActivePlaylistTimingMode { + NONE = 'none', + FORWARD_MINUS_TIME = 'forward-time', + BACK_MINUS_TIME = 'back-time', +} + +/** + * Information about the current quickLoop, if any + */ +interface ActivePlaylistQuickLoop { + /** + * Whether the user is allowed to make alterations to the Start/End markers + */ + locked: boolean + /** + * Whether the loop has two valid markers and is currently running + */ + running: boolean + start?: QuickLoopMarker + end?: QuickLoopMarker + additionalProperties?: Record +} + +interface QuickLoopMarker { + /** + * The type of entity the marker is locked to + */ + markerType: QuickLoopMarkerType + /** + * The rundown that this marker references. This will be set for rundown, segment and part markers + */ + rundownId?: string + /** + * The segment that this marker references. This will be set for segment and part markers + */ + segmentId?: string + /** + * The part that this marker references. This will be set for only part markers + */ + partId?: string + additionalProperties?: Record +} + +/** + * The type of entity the marker is locked to + */ +enum QuickLoopMarkerType { + PLAYLIST = 'playlist', + RUNDOWN = 'rundown', + SEGMENT = 'segment', + PART = 'part', +} + +interface ActivePiecesEvent { + event: 'activePieces' + /** + * Unique id of the rundown playlist, or null if no playlist is active + */ + rundownPlaylistId: string | null + /** + * Pieces that are currently active (on air) + */ + activePieces: PieceStatus[] +} + +interface SegmentsEvent { + event: 'segments' + /** + * Unique id of the rundown playlist, or null if no playlist is active + */ + rundownPlaylistId: string | null + /** + * The segments that are in the currently active rundown playlist, in order + */ + segments: Segment[] +} + +interface Segment { + /** + * Unique id of the segment + */ + id: string + /** + * User-facing identifier that can be used to identify the contents of a segment in the Rundown source system + */ + identifier?: string + /** + * Unique id of the rundown this segment belongs to + */ + rundownId: string + /** + * Name of the segment + */ + name: string + timing: SegmentTiming + /** + * Optional arbitrary data + */ + publicData?: any +} + +interface SegmentTiming { + /** + * Expected duration of the segment (milliseconds) + */ + expectedDurationMs: number + /** + * Budget duration of the segment (milliseconds) + */ + budgetDurationMs?: number + /** + * Countdown type within the segment. Default: `part_expected_duration` + */ + countdownType?: SegmentCountdownType + additionalProperties?: Record +} + +interface AdLibsEvent { + event: 'adLibs' + /** + * Unique id of the rundown playlist, or null if no playlist is active + */ + rundownPlaylistId: string | null + /** + * The available AdLibs for this playlist + */ + adLibs: AdLibStatus[] + /** + * The available Global AdLibs for this playlist + */ + globalAdLibs: GlobalAdLibStatus[] +} + +interface AdLibStatus { + /** + * Unique id of the AdLib + */ + id: string + /** + * The user defined AdLib name + */ + name: string + /** + * The source layer name for this AdLib + */ + sourceLayer: string + /** + * The output layer name for this AdLib + */ + outputLayer?: string + /** + * The available action type names that can be used to modify the execution of the AdLib + */ + actionType: AdLibActionType[] + /** + * Tags attached to this AdLib + */ + tags?: string[] + /** + * Optional arbitrary data + */ + publicData?: any + /** + * JSON schema definition of the adLib properties that can be modified using the adLibOptions property in executeAdLib + */ + optionsSchema?: string + /** + * Unique id of the segment this adLib belongs to + */ + segmentId: string + /** + * Unique id of the part this adLib belongs to + */ + partId: string + additionalProperties?: Record +} + +interface AdLibActionType { + /** + * The string to be passed to the ExecuteAdlib function + */ + name: string + /** + * The label for the AdLib type + */ + label: string +} + +interface GlobalAdLibStatus { + /** + * Unique id of the AdLib + */ + id: string + /** + * The user defined AdLib name + */ + name: string + /** + * The source layer name for this AdLib + */ + sourceLayer: string + /** + * The output layer name for this AdLib + */ + outputLayer?: string + /** + * The available action type names that can be used to modify the execution of the AdLib + */ + actionType: AdLibActionType[] + /** + * Tags attached to this AdLib + */ + tags?: string[] + /** + * Optional arbitrary data + */ + publicData?: any + /** + * JSON schema definition of the adLib properties that can be modified using the adLibOptions property in executeAdLib + */ + optionsSchema?: string + additionalProperties?: Record +} + +interface PackagesEvent { + event: 'packages' + /** + * Unique id of the rundown playlist, or null if no playlist is active + */ + rundownPlaylistId: string | null + /** + * The Package statuses for this playlist + */ + packages: PackageInfoStatus[] +} + +interface PackageInfoStatus { + /** + * Name of the package + */ + packageName?: string + /** + * Status: + * * `unknown` - status not determined (yet) + * * `ok` - no faults, can be played + * * `source_broken` - the source is present, but should not be played due to a technical malfunction (file is broken, camera robotics failed, REMOTE input is just bars, etc.) + * * `source_has_issues` - technically it can be played, but some issues with it were detected + * * `source_missing` - the source (file, live input) is missing and cannot be played + * * `source_not_ready` - can't be played for a non-technical reason (e.g. a placeholder clip with no content) + * * `source_not_set` - missing a file path + * * `source_unknown_state` - reported, but unrecognized state + */ + status: PackageStatus + /** + * Id of the Rundown that a Piece (or AdLib) expecting this package belongs to + */ + rundownId: string + /** + * Id of the Part that a Piece (or AdLib) expecting this package belongs to. It could be an Id of a Part from the Active Playlist topic, or a Part not exposed otherwise by the LSG. + */ + partId?: string + /** + * Id of the Segment that a Piece (or AdLib) expecting this package belongs to + */ + segmentId?: string + /** + * Id of the Piece or AdLib that expects this package. It could be an Id of a Piece from the Active Pieces and Active Playlist topics, or an Id of an AdLib from the AdLibs topic. It could also be an Id of a Piece not exposed otherwise by the LSG, but still relevant, e.g. to summarize the status of packages within a specific Part/Segment. + */ + pieceOrAdLibId: string + /** + * URL where the thumbnail can be accessed + */ + thumbnailUrl?: string + /** + * URL where the preview can be accessed + */ + previewUrl?: string +} + +/** + * Status: + * * `unknown` - status not determined (yet) + * * `ok` - no faults, can be played + * * `source_broken` - the source is present, but should not be played due to a technical malfunction (file is broken, camera robotics failed, REMOTE input is just bars, etc.) + * * `source_has_issues` - technically it can be played, but some issues with it were detected + * * `source_missing` - the source (file, live input) is missing and cannot be played + * * `source_not_ready` - can't be played for a non-technical reason (e.g. a placeholder clip with no content) + * * `source_not_set` - missing a file path + * * `source_unknown_state` - reported, but unrecognized state + */ +enum PackageStatus { + UNKNOWN = 'unknown', + OK = 'ok', + SOURCE_BROKEN = 'source_broken', + SOURCE_HAS_ISSUES = 'source_has_issues', + SOURCE_MISSING = 'source_missing', + SOURCE_NOT_READY = 'source_not_ready', + SOURCE_NOT_SET = 'source_not_set', + SOURCE_UNKNOWN_STATE = 'source_unknown_state', +} + +interface BucketsEvent { + event: 'buckets' + /** + * Buckets available in the Studio + */ + buckets: BucketStatus[] +} + +interface BucketStatus { + /** + * Unique id of the bucket + */ + id: string + /** + * The user defined bucket name + */ + name: string + /** + * The AdLibs in this bucket + */ + adLibs: BucketAdLibStatus[] +} + +interface BucketAdLibStatus { + /** + * Unique id of the AdLib + */ + id: string + /** + * The user defined AdLib name + */ + name: string + /** + * The source layer name for this AdLib + */ + sourceLayer: string + /** + * The output layer name for this AdLib + */ + outputLayer?: string + /** + * The available action type names that can be used to modify the execution of the AdLib + */ + actionType: AdLibActionType[] + /** + * Tags attached to this AdLib + */ + tags?: string[] + /** + * Optional arbitrary data + */ + publicData?: any + /** + * JSON schema definition of the adLib properties that can be modified using the adLibOptions property in executeAdLib + */ + optionsSchema?: string + /** + * Id of the adlib recognizable by the external source. Unique within a bucket. + */ + externalId: string + additionalProperties?: Record +} + +export { + Slash, + PongEvent, + HeartbeatEvent, + SubscriptionStatusError, + SubscriptionDetails, + SubscriptionName, + SubscriptionStatus, + SubscriptionStatusSuccess, + StudioEvent, + PlaylistStatus, + PlaylistActivationStatus, + ActivePlaylistEvent, + CurrentPartStatus, + PieceStatus, + CurrentPartTiming, + CurrentSegment, + CurrentSegmentTiming, + SegmentCountdownType, + CurrentSegmentPart, + CurrentSegmentPartTiming, + PartStatus, + ActivePlaylistTiming, + ActivePlaylistTimingMode, + ActivePlaylistQuickLoop, + QuickLoopMarker, + QuickLoopMarkerType, + ActivePiecesEvent, + SegmentsEvent, + Segment, + SegmentTiming, + AdLibsEvent, + AdLibStatus, + AdLibActionType, + GlobalAdLibStatus, + PackagesEvent, + PackageInfoStatus, + PackageStatus, + BucketsEvent, + BucketStatus, + BucketAdLibStatus, +} diff --git a/packages/live-status-gateway-api/src/index.ts b/packages/live-status-gateway-api/src/index.ts new file mode 100644 index 0000000000..ec4cde3c33 --- /dev/null +++ b/packages/live-status-gateway-api/src/index.ts @@ -0,0 +1,4 @@ +// Re-export the generated types +export * from './generated/schema.js' + +export { Slash as AllMessages } from './generated/schema.js' diff --git a/packages/live-status-gateway-api/tsconfig.build.json b/packages/live-status-gateway-api/tsconfig.build.json new file mode 100644 index 0000000000..957dfc4586 --- /dev/null +++ b/packages/live-status-gateway-api/tsconfig.build.json @@ -0,0 +1,16 @@ +{ + "extends": "@sofie-automation/code-standard-preset/ts/tsconfig.lib", + "include": ["src/**/*.ts"], + "exclude": ["node_modules/**", "src/**/*spec.ts", "src/**/__tests__/*", "src/**/__mocks__/*"], + "compilerOptions": { + "target": "es2019", + "outDir": "./dist", + "baseUrl": "./", + "paths": { + "*": ["./node_modules/*"], + "@sofie-automation/live-status-gateway-api": ["./src/index.ts"] + }, + "resolveJsonModule": true, + "types": ["node"] + } +} diff --git a/packages/live-status-gateway-api/tsconfig.json b/packages/live-status-gateway-api/tsconfig.json new file mode 100644 index 0000000000..39cf9672dc --- /dev/null +++ b/packages/live-status-gateway-api/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.build.json", + "exclude": ["node_modules/**"], + "compilerOptions": { + "types": ["jest", "node"] + } +} diff --git a/packages/live-status-gateway/.eslintrc.json b/packages/live-status-gateway/.eslintrc.json deleted file mode 100644 index 1b89104e9a..0000000000 --- a/packages/live-status-gateway/.eslintrc.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "extends": ["../node_modules/@sofie-automation/code-standard-preset/eslint/main", "plugin:yml/recommended"], - "overrides": [ - { - "files": ["*.yaml"], - "rules": { - "yml/quotes": ["error", { "prefer": "single" }], - "yml/spaced-comment": ["error"], - "spaced-comment": ["off"] - } - } - ], - "rules": { - "prettier/prettier": ["error", { "endOfLine": "auto" }], - "node/no-unpublished-import": ["error", { - "allowModules": ["jest-mock-extended", "type-fest"] - }] - }, - "parserOptions": { - "sourceType": "module", - "project": ["./tsconfig.eslint.json"] - } -} diff --git a/packages/live-status-gateway/Dockerfile b/packages/live-status-gateway/Dockerfile index 655c1a37a2..2f986ddb58 100644 --- a/packages/live-status-gateway/Dockerfile +++ b/packages/live-status-gateway/Dockerfile @@ -5,6 +5,7 @@ WORKDIR /opt COPY package.json lerna.json yarn.lock tsconfig.json ./ COPY live-status-gateway live-status-gateway +COPY live-status-gateway-api live-status-gateway-api COPY blueprints-integration blueprints-integration COPY server-core-integration server-core-integration COPY shared-lib shared-lib @@ -21,6 +22,7 @@ RUN apk add --no-cache tzdata COPY --from=0 /opt/package.json /opt/package.json COPY --from=0 /opt/node_modules /opt/node_modules COPY --from=0 /opt/live-status-gateway /opt/live-status-gateway +COPY --from=0 /opt/live-status-gateway-api /opt/live-status-gateway-api COPY --from=0 /opt/blueprints-integration /opt/blueprints-integration COPY --from=0 /opt/server-core-integration /opt/server-core-integration COPY --from=0 /opt/shared-lib /opt/shared-lib @@ -29,4 +31,4 @@ COPY --from=0 /opt/corelib /opt/corelib WORKDIR /opt/live-status-gateway RUN chown -R 1000:1000 /opt/live-status-gateway USER 1000 -CMD ["node", "dist/index.js"] +ENTRYPOINT ["node", "dist/index.js"] diff --git a/packages/live-status-gateway/Dockerfile.circle b/packages/live-status-gateway/Dockerfile.circle index 86fa3e2b55..556e87b1a0 100644 --- a/packages/live-status-gateway/Dockerfile.circle +++ b/packages/live-status-gateway/Dockerfile.circle @@ -4,6 +4,7 @@ RUN apk add --no-cache tzdata COPY package.json /opt/ COPY node_modules /opt/node_modules COPY live-status-gateway /opt/live-status-gateway +COPY live-status-gateway-api /opt/live-status-gateway-api COPY blueprints-integration /opt/blueprints-integration COPY server-core-integration /opt/server-core-integration COPY shared-lib /opt/shared-lib @@ -12,4 +13,4 @@ COPY corelib /opt/corelib WORKDIR /opt/live-status-gateway RUN chown -R 1000:1000 /opt/live-status-gateway USER 1000 -CMD ["node", "dist/index.js"] +ENTRYPOINT ["node", "dist/index.js"] diff --git a/packages/live-status-gateway/README.md b/packages/live-status-gateway/README.md index 2d93c8ffe6..a3ca191b10 100644 --- a/packages/live-status-gateway/README.md +++ b/packages/live-status-gateway/README.md @@ -1,8 +1,11 @@ # Sofie Live Status Gateway The Sofie Live Status Gateway is intended to be used to provide a **Stable API** that can **stream live updates** to external applications. + ## For Developers + ### Starting the gateway + `yarn start -id [SOME_ID_VALUE]` e.g. `yarn start -id live_status_gateway0`, \ or \ `yarn dev` which will set the id to `localDevLsg`. @@ -14,40 +17,40 @@ Minimal example: ```js const ws = new WebSocket(`ws://mysofie:8080`) ws.addEventListener('message', (message) => { - const data = JSON.parse(message.data); - switch (data.event) { - case 'pong': - handlePong(data); - break; - case 'heartbeat': - handleHeartbeat(data); - break; - case 'subscriptionStatus': - handleSubscriptionStatus(data); - break; - case 'studio': - handleStudio(data); - break; - case 'activePlaylist': - handleActivePlaylist(data); - break; - } -}); + const data = JSON.parse(message.data) + switch (data.event) { + case 'pong': + handlePong(data) + break + case 'heartbeat': + handleHeartbeat(data) + break + case 'subscriptionStatus': + handleSubscriptionStatus(data) + break + case 'studio': + handleStudio(data) + break + case 'activePlaylist': + handleActivePlaylist(data) + break + } +}) ws.addEventListener('open', () => { - console.log('socket open'); + console.log('socket open') // subscribe to activePlaylist - ws.send('{"event": "subscribe", "subscription": {"name": "activePlaylist" }, "reqid": 1}'); -}); + ws.send('{"event": "subscribe", "subscription": {"name": "activePlaylist" }, "reqid": 1}') +}) ws.addEventListener('close', () => { - console.log('socket close'); -}); + console.log('socket close') +}) ws.addEventListener('error', (error) => { - console.log('socket error', error); -}); + console.log('socket error', error) +}) ``` ### Timing accuracy diff --git a/packages/live-status-gateway/eslint.config.mjs b/packages/live-status-gateway/eslint.config.mjs new file mode 100644 index 0000000000..379a687a6b --- /dev/null +++ b/packages/live-status-gateway/eslint.config.mjs @@ -0,0 +1,15 @@ +import { generateEslintConfig } from '@sofie-automation/code-standard-preset/eslint/main.mjs' +import pluginYaml from 'eslint-plugin-yml' + +const extendedRules = await generateEslintConfig({}) +extendedRules.push(...pluginYaml.configs['flat/recommended'], { + files: ['**/*.yaml'], + + rules: { + 'yml/quotes': ['error', { prefer: 'single' }], + 'yml/spaced-comment': ['error'], + 'spaced-comment': ['off'], + }, +}) + +export default extendedRules diff --git a/packages/live-status-gateway/jest.config.js b/packages/live-status-gateway/jest.config.js index f6c455957e..1b0e384f84 100644 --- a/packages/live-status-gateway/jest.config.js +++ b/packages/live-status-gateway/jest.config.js @@ -9,6 +9,9 @@ module.exports = { }, ], }, + moduleNameMapper: { + '(.+)\\.js$': '$1', + }, testMatch: ['**/__tests__/**/*.(spec|test).(ts|js)'], testPathIgnorePatterns: ['integrationTests'], testEnvironment: 'node', diff --git a/packages/live-status-gateway/package.json b/packages/live-status-gateway/package.json index 83b404ceb8..a69692bf0a 100644 --- a/packages/live-status-gateway/package.json +++ b/packages/live-status-gateway/package.json @@ -1,6 +1,6 @@ { "name": "live-status-gateway", - "version": "1.52.0", + "version": "1.53.0-in-development", "private": true, "description": "Provides state from Sofie over sockets", "license": "MIT", @@ -19,7 +19,7 @@ "buildstart": "run build && run dev", "buildinspect": "run build && run inspect", "build:main": "run -T tsc -p tsconfig.build.json", - "lint:raw": "run -T eslint --ext .ts --ext .js --ignore-pattern dist --ignore-pattern server", + "lint:raw": "run -T eslint --ignore-pattern server", "lint": "run lint:raw .", "unit": "run -T jest", "test": "run lint && run unit", @@ -27,8 +27,6 @@ "cov": "run -T jest; run -T open-cli coverage/lcov-report/index.html", "cov-open": "open-cli coverage/lcov-report/index.html", "ci": "run test", - "gendocs": "run -T rimraf docs && ag ./api/asyncapi.yaml @asyncapi/html-template -o docs -p singleFile=true -p outFilename=liveStatus.html", - "genserver": "run -T rimraf server && ag ./api/asyncapi.yaml @asyncapi/nodejs-ws-template -o server -p server=development", "inspect": "node --experimental-fetch --inspect dist/index.js", "start": "node --experimental-fetch dist/index.js", "dev": "run start -id localDevLsg", @@ -37,7 +35,7 @@ "license-validate": "run -T sofie-licensecheck" }, "engines": { - "node": ">=22.11" + "node": ">=22.13.1" }, "keywords": [ "broadcast", @@ -53,10 +51,11 @@ "production" ], "dependencies": { - "@sofie-automation/blueprints-integration": "1.52.0", - "@sofie-automation/corelib": "1.52.0", - "@sofie-automation/server-core-integration": "1.52.0", - "@sofie-automation/shared-lib": "1.52.0", + "@sofie-automation/blueprints-integration": "1.53.0-in-development", + "@sofie-automation/corelib": "1.53.0-in-development", + "@sofie-automation/live-status-gateway-api": "1.53.0-in-development", + "@sofie-automation/server-core-integration": "1.53.0-in-development", + "@sofie-automation/shared-lib": "1.53.0-in-development", "debug": "^4.4.0", "fast-clone": "^1.5.13", "influx": "^5.9.7", @@ -66,9 +65,6 @@ "ws": "^8.18.0" }, "devDependencies": { - "@asyncapi/generator": "^2.6.0", - "@asyncapi/html-template": "^3.1.0", - "@asyncapi/nodejs-ws-template": "^0.10.0", "type-fest": "^4.33.0" }, "lint-staged": { diff --git a/packages/live-status-gateway/sample-client/index.html b/packages/live-status-gateway/sample-client/index.html index 1c30839f81..bcf2f8a303 100644 --- a/packages/live-status-gateway/sample-client/index.html +++ b/packages/live-status-gateway/sample-client/index.html @@ -1,4 +1,4 @@ - + Live Status Gateway client diff --git a/packages/live-status-gateway/sample-client/script.js b/packages/live-status-gateway/sample-client/script.js index 7f7a2eea50..a31abd9471 100644 --- a/packages/live-status-gateway/sample-client/script.js +++ b/packages/live-status-gateway/sample-client/script.js @@ -1,3 +1,5 @@ +/* eslint-disable no-undef */ + const ws = new WebSocket(`ws://localhost:8080`) ws.addEventListener('message', (message) => { const data = JSON.parse(message.data) diff --git a/packages/live-status-gateway/src/$schemas/options.json b/packages/live-status-gateway/src/$schemas/options.json index 0efe9d5065..d14928a882 100644 --- a/packages/live-status-gateway/src/$schemas/options.json +++ b/packages/live-status-gateway/src/$schemas/options.json @@ -10,7 +10,7 @@ "description": "Activate Debug Logging", "default": false } - }, + }, "required": [], "additionalProperties": false } diff --git a/packages/live-status-gateway/src/collectionBase.ts b/packages/live-status-gateway/src/collectionBase.ts new file mode 100644 index 0000000000..79651731a7 --- /dev/null +++ b/packages/live-status-gateway/src/collectionBase.ts @@ -0,0 +1,128 @@ +import { CorelibPubSubCollections, CorelibPubSubTypes } from '@sofie-automation/corelib/dist/pubsub' +import { + StudioId, + CoreConnection, + ProtectedString, + Collection as CoreCollection, + CollectionDocCheck, +} from '@sofie-automation/server-core-integration' +import throttleToNextTick from '@sofie-automation/shared-lib/dist/lib/throttleToNextTick' +import _ from 'underscore' +import { Logger } from 'winston' +import { CoreHandler } from './coreHandler.js' +import { arePropertiesShallowEqual } from './helpers/equality.js' +import { CollectionHandlers } from './liveStatusServer.js' + +export type ObserverCallback = (data: Pick | undefined) => void + +export const DEFAULT_THROTTLE_PERIOD_MS = 20 + +export abstract class CollectionBase { + protected _name: string + protected _collectionName: TCollection + protected _logger: Logger + protected _coreHandler: CoreHandler + protected _studioId!: StudioId + protected _observers: Map< + ObserverCallback, + { keysToPick: readonly (keyof T)[] | undefined; lastData: T | undefined } + > = new Map() + protected _collectionData: T | undefined + + protected get _core(): CoreConnection { + return this._coreHandler.core + } + protected throttledChanged: () => void + + constructor( + collection: TCollection, + logger: Logger, + coreHandler: CoreHandler, + throttlePeriodMs = DEFAULT_THROTTLE_PERIOD_MS + ) { + this._name = this.constructor.name + this._collectionName = collection + this._logger = logger + this._coreHandler = coreHandler + + this.throttledChanged = throttleToNextTick( + throttlePeriodMs > 0 + ? _.throttle(() => this.changed(), throttlePeriodMs, { leading: true, trailing: true }) + : () => this.changed() + ) + + this._logger.info(`Starting ${this._name} handler`) + } + + init(_handlers: CollectionHandlers): void { + if (!this._coreHandler.studioId) throw new Error('StudioId is not defined') + this._studioId = this._coreHandler.studioId + } + + close(): void { + this._logger.info(`Closing ${this._name} handler`) + } + + subscribe(callback: ObserverCallback, keysToPick?: readonly K[]): void { + //this._logger.info(`${name}' added observer for '${this._name}'`) + if (this._collectionData) callback(this._collectionData) + this._observers.set(callback, { keysToPick, lastData: this.shallowClone(this._collectionData) }) + } + + /** + * Called after a batch of updates to documents in the collection + */ + protected changed(): void { + // override me + } + + notify(data: T | undefined): void { + for (const [observer, o] of this._observers) { + if ( + !o.lastData || + !o.keysToPick || + !data || + !arePropertiesShallowEqual(o.lastData, data, undefined, o.keysToPick) + ) { + observer(data) + o.lastData = this.shallowClone(data) + } + } + } + + protected shallowClone(data: T | undefined): T | undefined { + if (data === undefined) return undefined + if (Array.isArray(data)) return [...data] as T + if (typeof data === 'object') return { ...data } + return data + } + + protected logDocumentChange(documentId: string | ProtectedString, changeType: string): void { + this._logger.silly(`${this._name} ${changeType} ${documentId}`) + } + + protected logUpdateReceived(collectionName: string, updateCount: number | undefined): void + protected logUpdateReceived(collectionName: string, extraInfo?: string): void + protected logUpdateReceived( + collectionName: string, + extraInfoOrUpdateCount: string | number | undefined | null = null + ): void { + let message = `${this._name} received ${collectionName} update` + if (typeof extraInfoOrUpdateCount === 'string') { + message += `, ${extraInfoOrUpdateCount}` + } else if (extraInfoOrUpdateCount !== null) { + message += `(${extraInfoOrUpdateCount})` + } + this._logger.debug(message) + } + + protected logNotifyingUpdate(updateCount: number | undefined): void { + this._logger.debug(`${this._name} notifying update with ${updateCount} ${this._collectionName}`) + } + + protected getCollectionOrFail(): CoreCollection> { + const collection = this._core.getCollection(this._collectionName) + if (!collection) throw new Error(`collection '${this._collectionName}' not found!`) + return collection + } +} diff --git a/packages/live-status-gateway/src/collections/adLibActionsHandler.ts b/packages/live-status-gateway/src/collections/adLibActionsHandler.ts index 256d1fb571..185910c334 100644 --- a/packages/live-status-gateway/src/collections/adLibActionsHandler.ts +++ b/packages/live-status-gateway/src/collections/adLibActionsHandler.ts @@ -1,79 +1,11 @@ import { Logger } from 'winston' -import { CoreHandler } from '../coreHandler' -import { CollectionBase, Collection, CollectionObserver } from '../wsHandler' -import { AdLibAction } from '@sofie-automation/corelib/dist/dataModel/AdlibAction' -import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' +import { CoreHandler } from '../coreHandler.js' import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub' -import { AdLibActionId, RundownId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { SelectedPartInstances } from './partInstancesHandler' - -export class AdLibActionsHandler - extends CollectionBase - implements Collection, CollectionObserver -{ - public observerName: string - private _curRundownId: RundownId | undefined - private _curPartInstance: DBPartInstance | undefined +import { RundownContentHandlerBase } from './rundownContentHandlerBase.js' +export class AdLibActionsHandler extends RundownContentHandlerBase { constructor(logger: Logger, coreHandler: CoreHandler) { - super(AdLibActionsHandler.name, CollectionName.AdLibActions, CorelibPubSub.adLibActions, logger, coreHandler) - this.observerName = this._name - } - - async changed(id: AdLibActionId, changeType: string): Promise { - this.logDocumentChange(id, changeType) - if (!this._collectionName) return - const col = this._core.getCollection(this._collectionName) - if (!col) throw new Error(`collection '${this._collectionName}' not found!`) - this._collectionData = col.find({ rundownId: this._curRundownId }) - await this.notify(this._collectionData) - } - - async update(source: string, data: SelectedPartInstances | undefined): Promise { - this.logUpdateReceived('partInstances', source) - const prevRundownId = this._curRundownId - this._curPartInstance = data ? data.current ?? data.next : undefined - this._curRundownId = this._curPartInstance ? this._curPartInstance.rundownId : undefined - - await new Promise(process.nextTick.bind(this)) - if (!this._collectionName) return - if (!this._publicationName) return - if (prevRundownId !== this._curRundownId) { - if (this._subscriptionId) this._coreHandler.unsubscribe(this._subscriptionId) - if (this._dbObserver) this._dbObserver.stop() - if (this._curRundownId && this._curPartInstance) { - this._subscriptionId = await this._coreHandler.setupSubscription(this._publicationName, [ - this._curRundownId, - ]) - this._dbObserver = this._coreHandler.setupObserver(this._collectionName) - this._dbObserver.added = (id) => { - void this.changed(id, 'added').catch(this._logger.error) - } - this._dbObserver.changed = (id) => { - void this.changed(id, 'changed').catch(this._logger.error) - } - this._dbObserver.removed = (id) => { - void this.changed(id, 'removed').catch(this._logger.error) - } - - const collection = this._core.getCollection(this._collectionName) - if (!collection) throw new Error(`collection '${this._collectionName}' not found!`) - this._collectionData = collection.find({ - rundownId: this._curRundownId, - }) - await this.notify(this._collectionData) - } - } - } - - // override notify to implement empty array handling - async notify(data: AdLibAction[] | undefined): Promise { - this.logNotifyingUpdate(data?.length) - if (data !== undefined) { - for (const observer of this._observers) { - await observer.update(this._name, data) - } - } + super(CollectionName.AdLibActions, CorelibPubSub.adLibActions, logger, coreHandler) } } diff --git a/packages/live-status-gateway/src/collections/adLibsHandler.ts b/packages/live-status-gateway/src/collections/adLibsHandler.ts index e34fbcb11f..c597d17d14 100644 --- a/packages/live-status-gateway/src/collections/adLibsHandler.ts +++ b/packages/live-status-gateway/src/collections/adLibsHandler.ts @@ -1,80 +1,11 @@ import { Logger } from 'winston' -import { CoreHandler } from '../coreHandler' -import { CollectionBase, Collection, CollectionObserver } from '../wsHandler' -import { AdLibPiece } from '@sofie-automation/corelib/dist/dataModel/AdLibPiece' -import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' +import { CoreHandler } from '../coreHandler.js' import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub' -import { PieceId, RundownId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { SelectedPartInstances } from './partInstancesHandler' - -export class AdLibsHandler - extends CollectionBase - implements Collection, CollectionObserver -{ - public observerName: string - // private _core: CoreConnection - private _currentRundownId: RundownId | undefined - private _currentPartInstance: DBPartInstance | undefined +import { RundownContentHandlerBase } from './rundownContentHandlerBase.js' +export class AdLibsHandler extends RundownContentHandlerBase { constructor(logger: Logger, coreHandler: CoreHandler) { - super(AdLibsHandler.name, CollectionName.AdLibPieces, CorelibPubSub.adLibPieces, logger, coreHandler) - this.observerName = this._name - } - - async changed(id: PieceId, changeType: string): Promise { - this.logDocumentChange(id, changeType) - if (!this._collectionName) return - const col = this._core.getCollection(this._collectionName) - if (!col) throw new Error(`collection '${this._collectionName}' not found!`) - this._collectionData = col.find({ rundownId: this._currentRundownId }) - await this.notify(this._collectionData) - } - - async update(source: string, data: SelectedPartInstances | undefined): Promise { - this.logUpdateReceived('partInstances', source) - const prevRundownId = this._currentRundownId - this._currentPartInstance = data ? data.current ?? data.next : undefined - this._currentRundownId = this._currentPartInstance?.rundownId - - await new Promise(process.nextTick.bind(this)) - if (!this._collectionName) return - if (!this._publicationName) return - if (prevRundownId !== this._currentRundownId) { - if (this._subscriptionId) this._coreHandler.unsubscribe(this._subscriptionId) - if (this._dbObserver) this._dbObserver.stop() - if (this._currentRundownId && this._currentPartInstance) { - this._subscriptionId = await this._coreHandler.setupSubscription(this._publicationName, [ - this._currentRundownId, - ]) - this._dbObserver = this._coreHandler.setupObserver(this._collectionName) - this._dbObserver.added = (id) => { - void this.changed(id, 'added').catch(this._logger.error) - } - this._dbObserver.changed = (id) => { - void this.changed(id, 'changed').catch(this._logger.error) - } - this._dbObserver.removed = (id) => { - void this.changed(id, 'removed').catch(this._logger.error) - } - - const collection = this._core.getCollection(this._collectionName) - if (!collection) throw new Error(`collection '${this._collectionName}' not found!`) - this._collectionData = collection.find({ - rundownId: this._currentRundownId, - }) - await this.notify(this._collectionData) - } - } - } - - // override notify to implement empty array handling - async notify(data: AdLibPiece[] | undefined): Promise { - this.logNotifyingUpdate(data?.length) - if (data !== undefined) { - for (const observer of this._observers) { - await observer.update(this._name, data) - } - } + super(CollectionName.AdLibPieces, CorelibPubSub.adLibPieces, logger, coreHandler) } } diff --git a/packages/live-status-gateway/src/collections/bucketAdLibActionsHandler.ts b/packages/live-status-gateway/src/collections/bucketAdLibActionsHandler.ts new file mode 100644 index 0000000000..53ab087a1b --- /dev/null +++ b/packages/live-status-gateway/src/collections/bucketAdLibActionsHandler.ts @@ -0,0 +1,28 @@ +import { Logger } from 'winston' +import { CoreHandler } from '../coreHandler.js' +import { PublicationCollection } from '../publicationCollection.js' +import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' +import { BucketAdLibAction } from '@sofie-automation/corelib/dist/dataModel/BucketAdLibAction' +import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub' +import { CollectionHandlers } from '../liveStatusServer.js' + +export class BucketAdLibActionsHandler extends PublicationCollection< + BucketAdLibAction[], + CorelibPubSub.bucketAdLibActions, + CollectionName.BucketAdLibActions +> { + constructor(logger: Logger, coreHandler: CoreHandler) { + super(CollectionName.BucketAdLibActions, CorelibPubSub.bucketAdLibActions, logger, coreHandler) + } + + changed(): void { + const collection = this.getCollectionOrFail() + this._collectionData = collection.find(undefined) + this.notify(this._collectionData) + } + + init(handlers: CollectionHandlers): void { + super.init(handlers) + this.setupSubscription(this._studioId, null, []) // This only matches adLibs avilable to all variants + } +} diff --git a/packages/live-status-gateway/src/collections/bucketAdLibsHandler.ts b/packages/live-status-gateway/src/collections/bucketAdLibsHandler.ts new file mode 100644 index 0000000000..dc47fa64eb --- /dev/null +++ b/packages/live-status-gateway/src/collections/bucketAdLibsHandler.ts @@ -0,0 +1,28 @@ +import { Logger } from 'winston' +import { CoreHandler } from '../coreHandler.js' +import { PublicationCollection } from '../publicationCollection.js' +import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' +import { BucketAdLib } from '@sofie-automation/corelib/dist/dataModel/BucketAdLibPiece' +import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub' +import { CollectionHandlers } from '../liveStatusServer.js' + +export class BucketAdLibsHandler extends PublicationCollection< + BucketAdLib[], + CorelibPubSub.bucketAdLibPieces, + CollectionName.BucketAdLibPieces +> { + constructor(logger: Logger, coreHandler: CoreHandler) { + super(CollectionName.BucketAdLibPieces, CorelibPubSub.bucketAdLibPieces, logger, coreHandler) + } + + changed(): void { + const collection = this.getCollectionOrFail() + this._collectionData = collection.find(undefined) + this.notify(this._collectionData) + } + + init(handlers: CollectionHandlers): void { + super.init(handlers) + this.setupSubscription(this._studioId, null, []) // This only matches adLibs avilable to all variants + } +} diff --git a/packages/live-status-gateway/src/collections/bucketsHandler.ts b/packages/live-status-gateway/src/collections/bucketsHandler.ts new file mode 100644 index 0000000000..3daaf012c0 --- /dev/null +++ b/packages/live-status-gateway/src/collections/bucketsHandler.ts @@ -0,0 +1,24 @@ +import { Logger } from 'winston' +import { CoreHandler } from '../coreHandler.js' +import { PublicationCollection } from '../publicationCollection.js' +import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' +import { Bucket } from '@sofie-automation/corelib/dist/dataModel/Bucket' +import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub' +import { CollectionHandlers } from '../liveStatusServer.js' + +export class BucketsHandler extends PublicationCollection { + constructor(logger: Logger, coreHandler: CoreHandler) { + super(CollectionName.Buckets, CorelibPubSub.buckets, logger, coreHandler) + } + + changed(): void { + const collection = this.getCollectionOrFail() + this._collectionData = collection.find(undefined) + this.notify(this._collectionData) + } + + init(handlers: CollectionHandlers): void { + super.init(handlers) + this.setupSubscription(this._studioId, null) + } +} diff --git a/packages/live-status-gateway/src/collections/globalAdLibActionsHandler.ts b/packages/live-status-gateway/src/collections/globalAdLibActionsHandler.ts index 4ec34285b6..5debc26f99 100644 --- a/packages/live-status-gateway/src/collections/globalAdLibActionsHandler.ts +++ b/packages/live-status-gateway/src/collections/globalAdLibActionsHandler.ts @@ -1,85 +1,16 @@ import { Logger } from 'winston' -import { CoreHandler } from '../coreHandler' -import { CollectionBase, Collection, CollectionObserver } from '../wsHandler' -import { RundownBaselineAdLibAction } from '@sofie-automation/corelib/dist/dataModel/RundownBaselineAdLibAction' +import { CoreHandler } from '../coreHandler.js' import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub' -import { RundownBaselineAdLibActionId, RundownId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { SelectedPartInstances } from './partInstancesHandler' - -export class GlobalAdLibActionsHandler - extends CollectionBase< - RundownBaselineAdLibAction[], - CorelibPubSub.rundownBaselineAdLibActions, - CollectionName.RundownBaselineAdLibActions - > - implements Collection, CollectionObserver -{ - public observerName: string - private _currentRundownId: RundownId | undefined +import { RundownContentHandlerBase } from './rundownContentHandlerBase.js' +export class GlobalAdLibActionsHandler extends RundownContentHandlerBase { constructor(logger: Logger, coreHandler: CoreHandler) { super( - GlobalAdLibActionsHandler.name, CollectionName.RundownBaselineAdLibActions, CorelibPubSub.rundownBaselineAdLibActions, logger, coreHandler ) - this.observerName = this._name - } - - async changed(id: RundownBaselineAdLibActionId, changeType: string): Promise { - this.logDocumentChange(id, changeType) - if (!this._collectionName) return - const col = this._core.getCollection(this._collectionName) - if (!col) throw new Error(`collection '${this._collectionName}' not found!`) - this._collectionData = col.find({ rundownId: this._currentRundownId }) - await this.notify(this._collectionData) - } - - async update(source: string, data: SelectedPartInstances | undefined): Promise { - this.logUpdateReceived('partInstances', source) - const prevRundownId = this._currentRundownId - const partInstance = data ? data.current ?? data.next : undefined - this._currentRundownId = partInstance?.rundownId - - await new Promise(process.nextTick.bind(this)) - if (!this._collectionName) return - if (!this._publicationName) return - if (prevRundownId !== this._currentRundownId) { - if (this._subscriptionId) this._coreHandler.unsubscribe(this._subscriptionId) - if (this._dbObserver) this._dbObserver.stop() - if (this._currentRundownId) { - this._subscriptionId = await this._coreHandler.setupSubscription(this._publicationName, [ - this._currentRundownId, - ]) - this._dbObserver = this._coreHandler.setupObserver(this._collectionName) - this._dbObserver.added = (id) => { - void this.changed(id, 'added').catch(this._logger.error) - } - this._dbObserver.changed = (id) => { - void this.changed(id, 'changed').catch(this._logger.error) - } - this._dbObserver.removed = (id) => { - void this.changed(id, 'removed').catch(this._logger.error) - } - - const collection = this._core.getCollection(this._collectionName) - if (!collection) throw new Error(`collection '${this._collectionName}' not found!`) - this._collectionData = collection.find({ rundownId: this._currentRundownId }) - await this.notify(this._collectionData) - } - } - } - - // override notify to implement empty array handling - async notify(data: RundownBaselineAdLibAction[] | undefined): Promise { - this.logNotifyingUpdate(data?.length) - if (data !== undefined) { - for (const observer of this._observers) { - await observer.update(this._name, data) - } - } } } diff --git a/packages/live-status-gateway/src/collections/globalAdLibsHandler.ts b/packages/live-status-gateway/src/collections/globalAdLibsHandler.ts index 2f8f8fb662..6de3ff1516 100644 --- a/packages/live-status-gateway/src/collections/globalAdLibsHandler.ts +++ b/packages/live-status-gateway/src/collections/globalAdLibsHandler.ts @@ -1,85 +1,11 @@ import { Logger } from 'winston' -import { CoreHandler } from '../coreHandler' -import { CollectionBase, Collection, CollectionObserver } from '../wsHandler' -import { RundownBaselineAdLibItem } from '@sofie-automation/corelib/dist/dataModel/RundownBaselineAdLibPiece' +import { CoreHandler } from '../coreHandler.js' import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub' -import { PieceId, RundownId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { SelectedPartInstances } from './partInstancesHandler' - -export class GlobalAdLibsHandler - extends CollectionBase< - RundownBaselineAdLibItem[], - CorelibPubSub.rundownBaselineAdLibPieces, - CollectionName.RundownBaselineAdLibPieces - > - implements Collection, CollectionObserver -{ - public observerName: string - private _currentRundownId: RundownId | undefined +import { RundownContentHandlerBase } from './rundownContentHandlerBase.js' +export class GlobalAdLibsHandler extends RundownContentHandlerBase { constructor(logger: Logger, coreHandler: CoreHandler) { - super( - GlobalAdLibsHandler.name, - CollectionName.RundownBaselineAdLibPieces, - CorelibPubSub.rundownBaselineAdLibPieces, - logger, - coreHandler - ) - this.observerName = this._name - } - - async changed(id: PieceId, changeType: string): Promise { - this.logDocumentChange(id, changeType) - if (!this._collectionName) return - const collection = this._core.getCollection(this._collectionName) - if (!collection) throw new Error(`collection '${this._collectionName}' not found!`) - this._collectionData = collection.find({ rundownId: this._currentRundownId }) - await this.notify(this._collectionData) - } - - async update(source: string, data: SelectedPartInstances | undefined): Promise { - this.logUpdateReceived('globalAdLibs', source) - const prevRundownId = this._currentRundownId - const partInstance = data ? data.current ?? data.next : undefined - this._currentRundownId = partInstance?.rundownId - - await new Promise(process.nextTick.bind(this)) - if (!this._collectionName) return - if (!this._publicationName) return - if (prevRundownId !== this._currentRundownId) { - if (this._subscriptionId) this._coreHandler.unsubscribe(this._subscriptionId) - if (this._dbObserver) this._dbObserver.stop() - if (this._currentRundownId) { - this._subscriptionId = await this._coreHandler.setupSubscription(this._publicationName, [ - this._currentRundownId, - ]) - this._dbObserver = this._coreHandler.setupObserver(this._collectionName) - this._dbObserver.added = (id) => { - void this.changed(id, 'added').catch(this._logger.error) - } - this._dbObserver.changed = (id) => { - void this.changed(id, 'changed').catch(this._logger.error) - } - this._dbObserver.removed = (id) => { - void this.changed(id, 'removed').catch(this._logger.error) - } - - const collection = this._core.getCollection(this._collectionName) - if (!collection) throw new Error(`collection '${this._collectionName}' not found!`) - this._collectionData = collection.find({ rundownId: this._currentRundownId }) - await this.notify(this._collectionData) - } - } - } - - // override notify to implement empty array handling - async notify(data: RundownBaselineAdLibItem[] | undefined): Promise { - this.logNotifyingUpdate(data?.length) - if (data !== undefined) { - for (const observer of this._observers) { - await observer.update(this._name, data) - } - } + super(CollectionName.RundownBaselineAdLibPieces, CorelibPubSub.rundownBaselineAdLibPieces, logger, coreHandler) } } diff --git a/packages/live-status-gateway/src/collections/partHandler.ts b/packages/live-status-gateway/src/collections/partHandler.ts index c2df5416da..0ad8970562 100644 --- a/packages/live-status-gateway/src/collections/partHandler.ts +++ b/packages/live-status-gateway/src/collections/partHandler.ts @@ -1,102 +1,73 @@ import { Logger } from 'winston' -import { CoreHandler } from '../coreHandler' -import { CollectionBase, Collection, CollectionObserver } from '../wsHandler' +import { CoreHandler } from '../coreHandler.js' +import { PublicationCollection } from '../publicationCollection.js' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' -import { PartInstancesHandler, SelectedPartInstances } from './partInstancesHandler' -import { PlaylistHandler } from './playlistHandler' -import { PartsHandler } from './partsHandler' +import { SelectedPartInstances } from './partInstancesHandler.js' +import { PartsHandler } from './partsHandler.js' import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub' -import { PartId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import areElementsShallowEqual from '@sofie-automation/shared-lib/dist/lib/isShallowEqual' +import { CollectionHandlers } from '../liveStatusServer.js' +import { PickKeys } from '@sofie-automation/shared-lib/dist/lib/types' -export class PartHandler - extends CollectionBase - implements Collection, CollectionObserver, CollectionObserver -{ - public observerName: string - private _activePlaylist: DBRundownPlaylist | undefined +const PLAYLIST_KEYS = ['_id', 'rundownIdsInOrder'] as const +type Playlist = PickKeys + +const PART_INSTANCES_KEYS = ['current'] as const +type PartInstances = PickKeys + +export class PartHandler extends PublicationCollection { + private _activePlaylist: Playlist | undefined private _currentPartInstance: DBPartInstance | undefined - constructor(logger: Logger, coreHandler: CoreHandler, private _partsHandler: PartsHandler) { - super(PartHandler.name, CollectionName.Parts, CorelibPubSub.parts, logger, coreHandler) - this.observerName = this._name + constructor( + logger: Logger, + coreHandler: CoreHandler, + private _partsHandler: PartsHandler + ) { + super(CollectionName.Parts, CorelibPubSub.parts, logger, coreHandler) + } + + init(handlers: CollectionHandlers): void { + super.init(handlers) + + handlers.playlistHandler.subscribe(this.onPlaylistUpdate, PLAYLIST_KEYS) + handlers.partInstancesHandler.subscribe(this.onPartInstanceUpdate, PART_INSTANCES_KEYS) } - async changed(id: PartId, changeType: string): Promise { - this.logDocumentChange(id, changeType) - if (!this._collectionName) return - const collection = this._core.getCollection(this._collectionName) - if (!collection) throw new Error(`collection '${this._collectionName}' not found!`) + protected changed(): void { + const collection = this.getCollectionOrFail() const allParts = collection.find(undefined) - await this._partsHandler.setParts(allParts) + this._partsHandler.setParts(allParts) if (this._collectionData) { this._collectionData = collection.findOne(this._collectionData._id) - await this.notify(this._collectionData) + this.notify(this._collectionData) } } - async update(source: string, data: DBRundownPlaylist | SelectedPartInstances | undefined): Promise { - const prevRundownIds = this._activePlaylist?.rundownIdsInOrder ?? [] - const prevCurPartInstance = this._currentPartInstance + private onPlaylistUpdate = (rundownPlaylist: Playlist | undefined): void => { + this.logUpdateReceived('playlist', `rundownPlaylistId ${rundownPlaylist?._id}`) + this._activePlaylist = rundownPlaylist - const rundownPlaylist = data ? (data as DBRundownPlaylist) : undefined - const partInstances = data as SelectedPartInstances - switch (source) { - case PlaylistHandler.name: - this.logUpdateReceived('playlist', source, `rundownPlaylistId ${rundownPlaylist?._id}`) - this._activePlaylist = rundownPlaylist - break - case PartInstancesHandler.name: - this.logUpdateReceived('partInstances', source) - this._currentPartInstance = partInstances.current - break - default: - throw new Error(`${this._name} received unsupported update from ${source}}`) + this.stopSubscription() + if (this._activePlaylist) { + const rundownIds = this._activePlaylist.rundownIdsInOrder + this.setupSubscription(rundownIds, null) } + } - await new Promise(process.nextTick.bind(this)) - if (!this._collectionName) return - if (!this._publicationName) return - const rundownsChanged = !areElementsShallowEqual(this._activePlaylist?.rundownIdsInOrder ?? [], prevRundownIds) - if (rundownsChanged) { - if (this._subscriptionId) this._coreHandler.unsubscribe(this._subscriptionId) - if (this._dbObserver) this._dbObserver.stop() - if (this._activePlaylist) { - const rundownIds = this._activePlaylist.rundownIdsInOrder - this._subscriptionId = await this._coreHandler.setupSubscription( - this._publicationName, - rundownIds, - null - ) - this._dbObserver = this._coreHandler.setupObserver(this._collectionName) - this._dbObserver.added = (id) => { - void this.changed(id, 'added').catch(this._logger.error) - } - this._dbObserver.changed = (id) => { - void this.changed(id, 'changed').catch(this._logger.error) - } - this._dbObserver.removed = (id) => { - void this.changed(id, 'removed').catch(this._logger.error) - } - } - } - const collection = this._core.getCollection(this._collectionName) - if (rundownsChanged) { - const allParts = collection.find(undefined) - await this._partsHandler.setParts(allParts) - } - if (prevCurPartInstance !== this._currentPartInstance) { - this._logger.debug( - `${this._name} found updated partInstances with current part ${this._activePlaylist?.currentPartInfo?.partInstanceId}` - ) - if (!collection) throw new Error(`collection '${this._collectionName}' not found!`) - if (this._currentPartInstance) { - this._collectionData = collection.findOne(this._currentPartInstance.part._id) - await this.notify(this._collectionData) - } + private onPartInstanceUpdate = (partInstances: PartInstances | SelectedPartInstances | undefined): void => { + if (!partInstances) return + + this.logUpdateReceived('partInstances') + this._currentPartInstance = partInstances.current + + const collection = this.getCollectionOrFail() + + if (this._currentPartInstance) { + this._collectionData = collection.findOne(this._currentPartInstance.part._id) + this.notify(this._collectionData) } } } diff --git a/packages/live-status-gateway/src/collections/partInstancesHandler.ts b/packages/live-status-gateway/src/collections/partInstancesHandler.ts index acca11e154..0089bc13c2 100644 --- a/packages/live-status-gateway/src/collections/partInstancesHandler.ts +++ b/packages/live-status-gateway/src/collections/partInstancesHandler.ts @@ -1,14 +1,16 @@ import { Logger } from 'winston' -import { CoreHandler } from '../coreHandler' -import { CollectionBase, Collection, CollectionObserver } from '../wsHandler' +import { CoreHandler } from '../coreHandler.js' +import { PublicationCollection } from '../publicationCollection.js' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' import areElementsShallowEqual from '@sofie-automation/shared-lib/dist/lib/isShallowEqual' -import _ = require('underscore') +import _ from 'underscore' import throttleToNextTick from '@sofie-automation/shared-lib/dist/lib/throttleToNextTick' import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub' -import { PartInstanceId, RundownId, RundownPlaylistActivationId } from '@sofie-automation/corelib/dist/dataModel/Ids' +import { RundownId, RundownPlaylistActivationId } from '@sofie-automation/corelib/dist/dataModel/Ids' +import { CollectionHandlers } from '../liveStatusServer.js' +import { PickKeys } from '@sofie-automation/shared-lib/dist/lib/types' export interface SelectedPartInstances { previous: DBPartInstance | undefined @@ -18,24 +20,32 @@ export interface SelectedPartInstances { inCurrentSegment: DBPartInstance[] } -export class PartInstancesHandler - extends CollectionBase - implements Collection, CollectionObserver -{ - public observerName: string - private _currentPlaylist: DBRundownPlaylist | undefined +const PLAYLIST_KEYS = [ + '_id', + 'activationId', + 'previousPartInfo', + 'currentPartInfo', + 'nextPartInfo', + 'rundownIdsInOrder', +] as const +type Playlist = PickKeys + +export class PartInstancesHandler extends PublicationCollection< + SelectedPartInstances, + CorelibPubSub.partInstances, + CollectionName.PartInstances +> { + private _currentPlaylist: Playlist | undefined private _rundownIds: RundownId[] = [] private _activationId: RundownPlaylistActivationId | undefined - private _subscriptionPending = false private _throttledUpdateAndNotify = throttleToNextTick(() => { this.updateCollectionData() - this.notify(this._collectionData).catch(this._logger.error) + this.notify(this._collectionData) }) constructor(logger: Logger, coreHandler: CoreHandler) { - super(PartInstancesHandler.name, CollectionName.PartInstances, CorelibPubSub.partInstances, logger, coreHandler) - this.observerName = this._name + super(CollectionName.PartInstances, CorelibPubSub.partInstances, logger, coreHandler) this._collectionData = { previous: undefined, current: undefined, @@ -45,17 +55,19 @@ export class PartInstancesHandler } } - async changed(id: PartInstanceId, changeType: string): Promise { - this.logDocumentChange(id, changeType) - if (!this._collectionName || this._subscriptionPending) return + init(handlers: CollectionHandlers): void { + super.init(handlers) + handlers.playlistHandler.subscribe(this.onPlaylistUpdate, PLAYLIST_KEYS) + } + + protected changed(): void { this._throttledUpdateAndNotify() } private updateCollectionData(): boolean { - if (!this._collectionName || !this._collectionData) return false - const collection = this._core.getCollection(this._collectionName) - if (!collection) throw new Error(`collection '${this._collectionName}' not found!`) + if (!this._collectionData) return false + const collection = this.getCollectionOrFail() const previousPartInstance = this._currentPlaylist?.previousPartInfo?.partInstanceId ? collection.findOne(this._currentPlaylist.previousPartInfo.partInstanceId) : undefined @@ -99,25 +111,25 @@ export class PartInstancesHandler } private clearCollectionData() { - if (!this._collectionName || !this._collectionData) return - this._collectionData.previous = undefined - this._collectionData.current = undefined - this._collectionData.next = undefined - this._collectionData.firstInSegmentPlayout = undefined - this._collectionData.inCurrentSegment = [] + if (!this._collectionData) return + this._collectionData = { + previous: undefined, + current: undefined, + next: undefined, + firstInSegmentPlayout: undefined, + inCurrentSegment: [], + } } - async update(source: string, data: DBRundownPlaylist | undefined): Promise { - const prevRundownIds = this._rundownIds.map((rid) => rid) + private onPlaylistUpdate = (data: Playlist | undefined): void => { + const prevRundownIds = [...this._rundownIds] const prevActivationId = this._activationId this.logUpdateReceived( 'playlist', - source, `rundownPlaylistId ${data?._id}, active ${data?.activationId ? true : false}` ) this._currentPlaylist = data - if (!this._collectionName) return this._rundownIds = this._currentPlaylist ? this._currentPlaylist.rundownIdsInOrder : [] this._activationId = this._currentPlaylist?.activationId @@ -125,49 +137,27 @@ export class PartInstancesHandler const sameSubscription = areElementsShallowEqual(this._rundownIds, prevRundownIds) && prevActivationId === this._activationId if (!sameSubscription) { - await new Promise(process.nextTick.bind(this)) - if (!this._collectionName) return - if (!this._publicationName) return - if (!this._currentPlaylist) return - if (this._subscriptionId) this._coreHandler.unsubscribe(this._subscriptionId) - this._subscriptionPending = true - this._subscriptionId = await this._coreHandler.setupSubscription( - this._publicationName, - this._rundownIds, - this._activationId - ) - this._subscriptionPending = false - this._dbObserver = this._coreHandler.setupObserver(this._collectionName) - this._dbObserver.added = (id) => { - void this.changed(id, 'added').catch(this._logger.error) - } - this._dbObserver.changed = (id) => { - void this.changed(id, 'changed').catch(this._logger.error) - } - this._dbObserver.removed = (id) => { - void this.changed(id, 'removed').catch(this._logger.error) - } - - await this.updateAndNotify() + this.stopSubscription() + this.setupSubscription(this._rundownIds, this._activationId) } else if (this._subscriptionId) { - await this.updateAndNotify() + this.updateAndNotify() } else { - await this.clearAndNotify() + this.clearAndNotify() } } else { - await this.clearAndNotify() + this.clearAndNotify() } } - private async clearAndNotify() { + private clearAndNotify() { this.clearCollectionData() - await this.notify(this._collectionData) + this.notify(this._collectionData) } - private async updateAndNotify() { + private updateAndNotify() { const hasAnythingChanged = this.updateCollectionData() if (hasAnythingChanged) { - await this.notify(this._collectionData) + this.notify(this._collectionData) } } } diff --git a/packages/live-status-gateway/src/collections/partsHandler.ts b/packages/live-status-gateway/src/collections/partsHandler.ts index aece1f9c6d..9b132f1a72 100644 --- a/packages/live-status-gateway/src/collections/partsHandler.ts +++ b/packages/live-status-gateway/src/collections/partsHandler.ts @@ -1,38 +1,23 @@ import { Logger } from 'winston' -import { CoreHandler } from '../coreHandler' -import { CollectionBase, Collection } from '../wsHandler' +import { CoreHandler } from '../coreHandler.js' +import { CollectionBase } from '../collectionBase.js' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' -import _ = require('underscore') -import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub' +import _ from 'underscore' import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' const THROTTLE_PERIOD_MS = 200 -export class PartsHandler - extends CollectionBase - implements Collection -{ - public observerName: string - private throttledNotify: (data: DBPart[]) => Promise +export class PartsHandler extends CollectionBase { + private throttledNotify: (data: DBPart[]) => void constructor(logger: Logger, coreHandler: CoreHandler) { - super(PartsHandler.name, CollectionName.Parts, CorelibPubSub.parts, logger, coreHandler) - this.observerName = this._name + super(CollectionName.Parts, logger, coreHandler) this.throttledNotify = _.throttle(this.notify.bind(this), THROTTLE_PERIOD_MS, { leading: true, trailing: true }) } - async setParts(parts: DBPart[]): Promise { + setParts(parts: DBPart[]): void { this.logUpdateReceived('parts', parts.length) this._collectionData = parts - await this.throttledNotify(this._collectionData) - } - - async notify(data: DBPart[] | undefined): Promise { - this.logNotifyingUpdate(this._collectionData?.length) - if (data !== undefined) { - for (const observer of this._observers) { - await observer.update(this._name, data) - } - } + this.throttledNotify(this._collectionData) } } diff --git a/packages/live-status-gateway/src/collections/pieceContentStatusesHandler.ts b/packages/live-status-gateway/src/collections/pieceContentStatusesHandler.ts new file mode 100644 index 0000000000..5fc0969ef6 --- /dev/null +++ b/packages/live-status-gateway/src/collections/pieceContentStatusesHandler.ts @@ -0,0 +1,74 @@ +import { CustomCollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' +import { RundownPlaylistId } from '@sofie-automation/corelib/dist/dataModel/Ids' +import { UIPieceContentStatus } from '@sofie-automation/corelib/dist/dataModel/PieceContentStatus' +import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' +import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub' +import throttleToNextTick from '@sofie-automation/shared-lib/dist/lib/throttleToNextTick' +import { PickKeys } from '@sofie-automation/shared-lib/dist/lib/types' +import { Logger } from 'winston' +import { CoreHandler } from '../coreHandler.js' +import { CollectionHandlers } from '../liveStatusServer.js' +import { PublicationCollection } from '../publicationCollection.js' + +const PLAYLIST_KEYS = ['_id'] as const +type Playlist = PickKeys + +export class PieceContentStatusesHandler extends PublicationCollection< + UIPieceContentStatus[], + CorelibPubSub.uiPieceContentStatuses, + CustomCollectionName.UIPieceContentStatuses +> { + private _currentPlaylistId: RundownPlaylistId | undefined + + private _throttledUpdateAndNotify = throttleToNextTick(() => { + this.updateAndNotify() + }) + + constructor(logger: Logger, coreHandler: CoreHandler) { + super(CustomCollectionName.UIPieceContentStatuses, CorelibPubSub.uiPieceContentStatuses, logger, coreHandler) + } + + init(handlers: CollectionHandlers): void { + super.init(handlers) + + handlers.playlistHandler.subscribe(this.onPlaylistUpdated, PLAYLIST_KEYS) + } + + protected changed(): void { + this._throttledUpdateAndNotify() + } + + private updateCollectionData() { + const collection = this.getCollectionOrFail() + this._collectionData = collection.find({}) + } + + private clearCollectionData() { + this._collectionData = [] + } + + onPlaylistUpdated = (playlist: Playlist | undefined): void => { + this.logUpdateReceived('playlist', `rundownPlaylistId ${playlist?._id}`) + const prevPlaylistId = this._currentPlaylistId + this._currentPlaylistId = playlist?._id + + if (this._currentPlaylistId) { + if (prevPlaylistId !== this._currentPlaylistId) { + this.stopSubscription() + this.setupSubscription(this._currentPlaylistId) + } + } else { + this.clearAndNotify() + } + } + + private clearAndNotify() { + this.clearCollectionData() + this.notify(this._collectionData) + } + + private updateAndNotify() { + this.updateCollectionData() + this.notify(this._collectionData) + } +} diff --git a/packages/live-status-gateway/src/collections/pieceInstancesHandler.ts b/packages/live-status-gateway/src/collections/pieceInstancesHandler.ts index 74bff309e2..8861d109d9 100644 --- a/packages/live-status-gateway/src/collections/pieceInstancesHandler.ts +++ b/packages/live-status-gateway/src/collections/pieceInstancesHandler.ts @@ -1,25 +1,42 @@ import { Logger } from 'winston' -import { CoreHandler } from '../coreHandler' -import { CollectionBase, Collection, CollectionObserver } from '../wsHandler' +import { CoreHandler } from '../coreHandler.js' +import { PublicationCollection } from '../publicationCollection.js' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { PieceInstance } from '@sofie-automation/corelib/dist/dataModel/PieceInstance' -import { unprotectString } from '@sofie-automation/corelib/dist/protectedString' import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' import areElementsShallowEqual from '@sofie-automation/shared-lib/dist/lib/isShallowEqual' -import throttleToNextTick from '@sofie-automation/shared-lib/dist/lib/throttleToNextTick' -import _ = require('underscore') +import _ from 'underscore' import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub' -import { PartInstanceId, PieceInstanceId } from '@sofie-automation/corelib/dist/dataModel/Ids' +import { PartInstanceId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { + PieceInstanceWithTimings, processAndPrunePieceInstanceTimings, resolvePrunedPieceInstance, } from '@sofie-automation/corelib/dist/playout/processAndPrune' -import { ShowStyleBaseExt, ShowStyleBaseHandler } from './showStyleBaseHandler' -import { PlaylistHandler } from './playlistHandler' +import { ShowStyleBaseExt } from './showStyleBaseHandler.js' import { SourceLayers } from '@sofie-automation/corelib/dist/dataModel/ShowStyleBase' -import { PartInstancesHandler, SelectedPartInstances } from './partInstancesHandler' +import { SelectedPartInstances } from './partInstancesHandler.js' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' +import { arePropertiesDeepEqual } from '../helpers/equality.js' +import { CollectionHandlers } from '../liveStatusServer.js' import { ReadonlyDeep } from 'type-fest' +import { PickKeys } from '@sofie-automation/shared-lib/dist/lib/types' + +const PLAYLIST_KEYS = [ + '_id', + 'activationId', + 'currentPartInfo', + 'nextPartInfo', + 'previousPartInfo', + 'rundownIdsInOrder', +] as const +type Playlist = PickKeys + +const PART_INSTANCES_KEYS = ['previous', 'current'] as const +type PartInstances = PickKeys + +const SHOW_STYLE_BASE_KEYS = ['sourceLayers'] as const +type ShowStyle = PickKeys export type PieceInstanceMin = Omit, 'reportedStartedPlayback' | 'reportedStoppedPlayback'> @@ -34,31 +51,18 @@ export interface SelectedPieceInstances { nextPartInstance: PieceInstanceMin[] } -export class PieceInstancesHandler - extends CollectionBase - implements Collection, CollectionObserver -{ - public observerName: string - private _currentPlaylist: DBRundownPlaylist | undefined +export class PieceInstancesHandler extends PublicationCollection< + SelectedPieceInstances, + CorelibPubSub.pieceInstances, + CollectionName.PieceInstances +> { + private _currentPlaylist: Playlist | undefined private _partInstanceIds: PartInstanceId[] = [] - private _activationId: string | undefined - private _subscriptionPending = false private _sourceLayers: SourceLayers = {} - private _partInstances: SelectedPartInstances | undefined - - private _throttledUpdateAndNotify = throttleToNextTick(() => { - this.updateAndNotify().catch(this._logger.error) - }) + private _partInstances: PartInstances | undefined constructor(logger: Logger, coreHandler: CoreHandler) { - super( - PieceInstancesHandler.name, - CollectionName.PieceInstances, - CorelibPubSub.pieceInstances, - logger, - coreHandler - ) - this.observerName = this._name + super(CollectionName.PieceInstances, CorelibPubSub.pieceInstances, logger, coreHandler) this._collectionData = { active: [], currentPartInstance: [], @@ -66,17 +70,23 @@ export class PieceInstancesHandler } } - async changed(id: PieceInstanceId, changeType: string): Promise { - this.logDocumentChange(id, changeType) - if (!this._collectionName || this._subscriptionPending) return - this._throttledUpdateAndNotify() + init(handlers: CollectionHandlers): void { + super.init(handlers) + + handlers.playlistHandler.subscribe(this.onPlaylistUpdate, PLAYLIST_KEYS) + handlers.partInstancesHandler.subscribe(this.onPartInstancesUpdate, PART_INSTANCES_KEYS) + handlers.showStyleBaseHandler.subscribe(this.onShowStyleBaseUpdate, SHOW_STYLE_BASE_KEYS) + } + + protected changed(): void { + this.updateAndNotify() } private processAndPrunePieceInstanceTimings( partInstance: DBPartInstance | undefined, pieceInstances: PieceInstance[], filterActive: boolean - ): ReadonlyDeep[] { + ): PieceInstanceWithTimings[] { // Approximate when 'now' is in the PartInstance, so that any adlibbed Pieces will be timed roughly correctly const partStarted = partInstance?.timings?.plannedStartedPlayback const nowInPart = partStarted === undefined ? 0 : Date.now() - partStarted @@ -104,30 +114,29 @@ export class PieceInstancesHandler } private updateCollectionData(): boolean { - if (!this._collectionName || !this._collectionData) return false - const collection = this._core.getCollection(this._collectionName) - if (!collection) throw new Error(`collection '${this._collectionName}' not found!`) + if (!this._collectionData) return false + const collection = this.getCollectionOrFail() const inPreviousPartInstance = this._currentPlaylist?.previousPartInfo?.partInstanceId ? this.processAndPrunePieceInstanceTimings( this._partInstances?.previous, collection.find({ partInstanceId: this._currentPlaylist.previousPartInfo.partInstanceId }), true - ) + ) : [] const inCurrentPartInstance = this._currentPlaylist?.currentPartInfo?.partInstanceId ? this.processAndPrunePieceInstanceTimings( this._partInstances?.current, collection.find({ partInstanceId: this._currentPlaylist.currentPartInfo.partInstanceId }), true - ) + ) : [] const inNextPartInstance = this._currentPlaylist?.nextPartInfo?.partInstanceId ? this.processAndPrunePieceInstanceTimings( undefined, collection.find({ partInstanceId: this._currentPlaylist.nextPartInfo.partInstanceId }), false - ) + ) : [] const active = [...inCurrentPartInstance] @@ -145,20 +154,35 @@ export class PieceInstancesHandler hasAnythingChanged = true } if ( - !_.isEqual(this._collectionData.currentPartInstance, inCurrentPartInstance) && - (this._collectionData.currentPartInstance.length !== inCurrentPartInstance.length || - this._collectionData.currentPartInstance.some((pieceInstance, index) => { - return !arePropertiesDeepEqual>( - inCurrentPartInstance[index], - pieceInstance, - ['reportedStartedPlayback', 'reportedStoppedPlayback'] - ) - })) + this._collectionData.currentPartInstance.length !== inCurrentPartInstance.length || + this._collectionData.currentPartInstance.some((pieceInstance, index) => { + return !arePropertiesDeepEqual(inCurrentPartInstance[index], pieceInstance, [ + 'plannedStartedPlayback', + 'plannedStoppedPlayback', + 'reportedStartedPlayback', + 'reportedStoppedPlayback', + 'resolvedEndCap', + 'priority', + ]) + }) ) { + this._logger.debug('xcur', { prev: this._collectionData.currentPartInstance, cur: inCurrentPartInstance }) this._collectionData.currentPartInstance = inCurrentPartInstance hasAnythingChanged = true } - if (!_.isEqual(this._collectionData.nextPartInstance, inNextPartInstance)) { + if ( + this._collectionData.nextPartInstance.length !== inNextPartInstance.length || + this._collectionData.nextPartInstance.some((pieceInstance, index) => { + return !arePropertiesDeepEqual(inNextPartInstance[index], pieceInstance, [ + 'plannedStartedPlayback', + 'plannedStoppedPlayback', + 'reportedStartedPlayback', + 'reportedStoppedPlayback', + 'resolvedEndCap', + 'priority', + ]) + }) + ) { this._collectionData.nextPartInstance = inNextPartInstance hasAnythingChanged = true } @@ -166,122 +190,70 @@ export class PieceInstancesHandler } private clearCollectionData() { - if (!this._collectionName || !this._collectionData) return + if (!this._collectionData) return this._collectionData.active = [] this._collectionData.currentPartInstance = [] this._collectionData.nextPartInstance = [] } - async update( - source: string, - data: DBRundownPlaylist | ShowStyleBaseExt | SelectedPartInstances | undefined - ): Promise { - switch (source) { - case PlaylistHandler.name: - return this.updateRundownPlaylist(source, data as DBRundownPlaylist | undefined) - case ShowStyleBaseHandler.name: { - this.logUpdateReceived('showStyleBase', source) - const showStyleBaseExt = data as ShowStyleBaseExt | undefined - this._sourceLayers = showStyleBaseExt?.sourceLayers ?? {} - this._throttledUpdateAndNotify() - break - } - case PartInstancesHandler.name: { - this.logUpdateReceived('partInstances', source) - this._partInstances = data as SelectedPartInstances - this._throttledUpdateAndNotify() - break - } - default: - throw new Error(`${this._name} received unsupported update from ${source}}`) - } + private onShowStyleBaseUpdate = (showStyleBase: ShowStyle | undefined): void => { + this.logUpdateReceived('showStyleBase') + this._sourceLayers = showStyleBase?.sourceLayers ?? {} + this.updateAndNotify() } - private async updateRundownPlaylist(source: string, data: DBRundownPlaylist | undefined): Promise { + private onPartInstancesUpdate = (partInstances: PartInstances | undefined): void => { + this.logUpdateReceived('partInstances') + this._partInstances = partInstances + this.updateAndNotify() + } + + private onPlaylistUpdate = (playlist: Playlist | undefined): void => { + this.logUpdateReceived('playlist', `rundownPlaylistId ${playlist?._id}, active ${!!playlist?.activationId}`) + const prevPartInstanceIds = this._partInstanceIds - const prevActivationId = this._activationId + const prevPlaylist = this._currentPlaylist - this.logUpdateReceived('playlist', source, `rundownPlaylistId ${data?._id}, active ${!!data?.activationId}`) - this._currentPlaylist = data - if (!this._collectionName) return + this._currentPlaylist = playlist this._partInstanceIds = this._currentPlaylist - ? _.compact([ - this._currentPlaylist.previousPartInfo?.partInstanceId, - this._currentPlaylist.nextPartInfo?.partInstanceId, - this._currentPlaylist.currentPartInfo?.partInstanceId, - ]) + ? _.compact( + [ + this._currentPlaylist.previousPartInfo?.partInstanceId, + this._currentPlaylist.nextPartInfo?.partInstanceId, + this._currentPlaylist.currentPartInfo?.partInstanceId, + ].sort() + ) : [] - this._activationId = unprotectString(this._currentPlaylist?.activationId) - if (this._currentPlaylist && this._partInstanceIds.length && this._activationId) { + if (this._currentPlaylist && this._partInstanceIds.length && this._currentPlaylist?.activationId) { const sameSubscription = areElementsShallowEqual(this._partInstanceIds, prevPartInstanceIds) && - prevActivationId === this._activationId + areElementsShallowEqual( + prevPlaylist?.rundownIdsInOrder ?? [], + this._currentPlaylist.rundownIdsInOrder + ) && + prevPlaylist?.activationId === this._currentPlaylist?.activationId if (!sameSubscription) { - await new Promise(process.nextTick.bind(this)) - if (!this._collectionName) return - if (!this._publicationName) return - if (!this._currentPlaylist) return - if (this._subscriptionId) this._coreHandler.unsubscribe(this._subscriptionId) - this._subscriptionPending = true - this._subscriptionId = await this._coreHandler.setupSubscription( - this._publicationName, - this._currentPlaylist.rundownIdsInOrder, - this._partInstanceIds, - {} - ) - this._subscriptionPending = false - this._dbObserver = this._coreHandler.setupObserver(this._collectionName) - this._dbObserver.added = (id) => { - void this.changed(id, 'added').catch(this._logger.error) - } - this._dbObserver.changed = (id) => { - void this.changed(id, 'changed').catch(this._logger.error) - } - this._dbObserver.removed = (id) => { - void this.changed(id, 'removed').catch(this._logger.error) - } - - await this.updateAndNotify() + this.setupSubscription(this._currentPlaylist.rundownIdsInOrder, this._partInstanceIds, {}) } else if (this._subscriptionId) { - await this.updateAndNotify() + this.updateAndNotify() } else { - await this.clearAndNotify() + this.clearAndNotify() } } else { - this.clearCollectionData() - await this.notify(this._collectionData) + this.clearAndNotify() } } - private async clearAndNotify() { + private clearAndNotify() { this.clearCollectionData() - await this.notify(this._collectionData) + this.notify(this._collectionData) } - private async updateAndNotify() { + private updateAndNotify() { const hasAnythingChanged = this.updateCollectionData() if (hasAnythingChanged) { - await this.notify(this._collectionData) + this.notify(this._collectionData) } } } - -function arePropertiesDeepEqual>(a: T, b: T, omitProperties: Array): boolean { - if (typeof a !== 'object' || a == null || typeof b !== 'object' || b == null) { - return false - } - - const keysA = Object.keys(a).filter((key) => !omitProperties.includes(key)) - const keysB = Object.keys(b).filter((key) => !omitProperties.includes(key)) - - if (keysA.length !== keysB.length) return false - - for (const key of keysA) { - if (!keysB.includes(key) || !_.isEqual(a[key], b[key])) { - return false - } - } - - return true -} diff --git a/packages/live-status-gateway/src/collections/playlistHandler.ts b/packages/live-status-gateway/src/collections/playlistHandler.ts index 3c81b0818c..b691caf27f 100644 --- a/packages/live-status-gateway/src/collections/playlistHandler.ts +++ b/packages/live-status-gateway/src/collections/playlistHandler.ts @@ -1,89 +1,60 @@ import { Logger } from 'winston' -import { CoreHandler } from '../coreHandler' -import { CollectionBase, Collection } from '../wsHandler' +import { CoreHandler } from '../coreHandler.js' +import { PublicationCollection } from '../publicationCollection.js' +import { CollectionBase } from '../collectionBase.js' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub' -import { RundownPlaylistId } from '@sofie-automation/corelib/dist/dataModel/Ids' - -export class PlaylistsHandler - extends CollectionBase - implements Collection -{ - public observerName: string +import { CollectionHandlers } from '../liveStatusServer.js' +export class PlaylistsHandler extends CollectionBase { constructor(logger: Logger, coreHandler: CoreHandler) { - super(PlaylistsHandler.name, CollectionName.RundownPlaylists, undefined, logger, coreHandler) - this.observerName = this._name + super(CollectionName.RundownPlaylists, logger, coreHandler) } - async setPlaylists(playlists: DBRundownPlaylist[]): Promise { + setPlaylists(playlists: DBRundownPlaylist[]): void { this.logUpdateReceived('playlists', playlists.length) this._collectionData = playlists - await this.notify(this._collectionData) - } - - // override notify to implement empty array handling - async notify(data: DBRundownPlaylist[] | undefined): Promise { - this.logNotifyingUpdate(this._collectionData?.length) - if (data !== undefined) { - for (const observer of this._observers) { - await observer.update(this._name, data) - } - } + this.notify(this._collectionData) } } -export class PlaylistHandler - extends CollectionBase - implements Collection -{ - public observerName: string +export class PlaylistHandler extends PublicationCollection< + DBRundownPlaylist, + CorelibPubSub.rundownPlaylists, + CollectionName.RundownPlaylists +> { private _playlistsHandler: PlaylistsHandler constructor(logger: Logger, coreHandler: CoreHandler) { - super( - PlaylistHandler.name, - CollectionName.RundownPlaylists, - CorelibPubSub.rundownPlaylists, - logger, - coreHandler - ) - this.observerName = this._name + super(CollectionName.RundownPlaylists, CorelibPubSub.rundownPlaylists, logger, coreHandler) this._playlistsHandler = new PlaylistsHandler(this._logger, this._coreHandler) } - async init(): Promise { - await super.init() - if (!this._studioId) return - if (!this._collectionName) return - if (!this._publicationName) return - this._subscriptionId = await this._coreHandler.setupSubscription(this._publicationName, null, [this._studioId]) - this._dbObserver = this._coreHandler.setupObserver(this._collectionName) - if (this._collectionName) { - const col = this._core.getCollection(this._collectionName) - if (!col) throw new Error(`collection '${this._collectionName}' not found!`) - const playlists = col.find(undefined) - this._collectionData = playlists.find((p) => p.activationId) - await this._playlistsHandler.setPlaylists(playlists) - this._dbObserver.added = (id) => { - void this.changed(id, 'added').catch(this._logger.error) - } - this._dbObserver.changed = (id) => { - void this.changed(id, 'changed').catch(this._logger.error) - } - } + init(handlers: CollectionHandlers): void { + super.init(handlers) + this.setupSubscription(null, [this._studioId]) } - async changed(id: RundownPlaylistId, changeType: string): Promise { - this.logDocumentChange(id, changeType) - if (!this._collectionName) return - const collection = this._core.getCollection(this._collectionName) - if (!collection) throw new Error(`collection '${this._collectionName}' not found!`) + protected changed(): void { + this.updateAndNotify() + } + + private updateAndNotify(): void { + const collection = this.getCollectionOrFail() const playlists = collection.find(undefined) - await this._playlistsHandler.setPlaylists(playlists) - this._collectionData = playlists.find((p) => p.activationId) - await this.notify(this._collectionData) + this._playlistsHandler.setPlaylists(playlists) + + this.updateAndNotifyActivePlaylist(playlists) + } + + private updateAndNotifyActivePlaylist(playlists: DBRundownPlaylist[]) { + const prevActivePlaylist = this._collectionData + const activePlaylist = playlists.find((p) => p.activationId) + this._collectionData = activePlaylist + if (prevActivePlaylist !== activePlaylist) { + this.notify(this._collectionData) + } } get playlistsHandler(): PlaylistsHandler { diff --git a/packages/live-status-gateway/src/collections/rundownContentHandlerBase.ts b/packages/live-status-gateway/src/collections/rundownContentHandlerBase.ts new file mode 100644 index 0000000000..c354ecae1f --- /dev/null +++ b/packages/live-status-gateway/src/collections/rundownContentHandlerBase.ts @@ -0,0 +1,75 @@ +import { Logger } from 'winston' +import { CoreHandler } from '../coreHandler.js' +import { PublicationCollection } from '../publicationCollection.js' +import { CorelibPubSubCollections, CorelibPubSubTypes } from '@sofie-automation/corelib/dist/pubsub' +import { RundownId } from '@sofie-automation/corelib/dist/dataModel/Ids' +import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' +import { CollectionHandlers } from '../liveStatusServer.js' +import { PickKeys } from '@sofie-automation/shared-lib/dist/lib/types' +import { CollectionDocCheck } from '@sofie-automation/server-core-integration' +import { ParametersOfFunctionOrNever } from '@sofie-automation/server-core-integration/dist/lib/subscriptions' + +const PLAYLIST_KEYS = ['currentPartInfo', 'nextPartInfo'] as const +type Playlist = PickKeys + +type MatchingKeys = { + [K in keyof T]: T[K] extends (...args: Args) => any ? K : never +}[keyof T] + +type RundownMatchingKeys = MatchingKeys + +/** + * For items whose `rundownId` should equal `rundownId` of the current Part (or next Part, if the firts Take was not performed) + */ +export abstract class RundownContentHandlerBase extends PublicationCollection< + CollectionDocCheck]>[], + TPubSub, + ReturnType +> { + private _currentRundownId: RundownId | undefined + + constructor( + collection: ReturnType, + publication: TPubSub, + logger: Logger, + coreHandler: CoreHandler + ) { + super(collection, publication, logger, coreHandler) + } + + init(handlers: CollectionHandlers): void { + super.init(handlers) + + handlers.playlistHandler.subscribe(this.onPlaylistUpdate, PLAYLIST_KEYS) + } + + protected changed(): void { + this.updateAndNotify() + } + + private onPlaylistUpdate = (data: Playlist | undefined): void => { + this.logUpdateReceived('playlist') + const prevRundownId = this._currentRundownId + + const rundownPlaylist = data + + this._currentRundownId = rundownPlaylist?.currentPartInfo?.rundownId ?? rundownPlaylist?.nextPartInfo?.rundownId + + if (prevRundownId !== this._currentRundownId) { + this.stopSubscription() + if (this._currentRundownId) { + const args = [[this._currentRundownId]] as unknown as ParametersOfFunctionOrNever< + CorelibPubSubTypes[TPubSub] + > // TODO: get rid of this type conversion + this.setupSubscription(...args) + } + // no need to trigger updateAndNotify() because the subscription will take care of this + } + } + + private updateAndNotify(): void { + const col = this.getCollectionOrFail() + this._collectionData = col.find({ rundownId: this._currentRundownId }) + this.notify(this._collectionData) + } +} diff --git a/packages/live-status-gateway/src/collections/rundownHandler.ts b/packages/live-status-gateway/src/collections/rundownHandler.ts index c59f077874..74f7decdc3 100644 --- a/packages/live-status-gateway/src/collections/rundownHandler.ts +++ b/packages/live-status-gateway/src/collections/rundownHandler.ts @@ -1,89 +1,75 @@ import { Logger } from 'winston' -import { CoreHandler } from '../coreHandler' -import { CollectionBase, Collection, CollectionObserver } from '../wsHandler' +import { CoreHandler } from '../coreHandler.js' +import { PublicationCollection } from '../publicationCollection.js' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' -import { unprotectString } from '@sofie-automation/shared-lib/dist/lib/protectedString' -import { PartInstancesHandler, SelectedPartInstances } from './partInstancesHandler' import { RundownId, RundownPlaylistId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' -import { PlaylistHandler } from './playlistHandler' -import { RundownsHandler } from './rundownsHandler' +import { RundownsHandler } from './rundownsHandler.js' import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub' +import { unprotectString } from '@sofie-automation/server-core-integration' +import { CollectionHandlers } from '../liveStatusServer.js' +import { PickKeys } from '@sofie-automation/shared-lib/dist/lib/types' -export class RundownHandler - extends CollectionBase - implements Collection, CollectionObserver, CollectionObserver -{ - public observerName: string +const PLAYLIST_KEYS = ['_id', 'currentPartInfo', 'nextPartInfo'] as const +type Playlist = PickKeys + +export class RundownHandler extends PublicationCollection< + DBRundown, + CorelibPubSub.rundownsInPlaylists, + CollectionName.Rundowns +> { private _currentPlaylistId: RundownPlaylistId | undefined private _currentRundownId: RundownId | undefined - constructor(logger: Logger, coreHandler: CoreHandler, private _rundownsHandler?: RundownsHandler) { - super(RundownHandler.name, CollectionName.Rundowns, CorelibPubSub.rundownsInPlaylists, logger, coreHandler) - this.observerName = this._name + constructor( + logger: Logger, + coreHandler: CoreHandler, + private _rundownsHandler?: RundownsHandler + ) { + super(CollectionName.Rundowns, CorelibPubSub.rundownsInPlaylists, logger, coreHandler) } - async changed(id: RundownId, changeType: string): Promise { - this.logDocumentChange(id, changeType) - if (id !== this._currentRundownId) - throw new Error(`${this._name} received change with unexpected id ${id} !== ${this._currentRundownId}`) - if (!this._collectionName) return - const collection = this._core.getCollection(this._collectionName) - if (!collection) throw new Error(`collection '${this._collectionName}' not found!`) - await this._rundownsHandler?.setRundowns(collection.find(undefined)) - if (this._collectionData) this._collectionData = collection.findOne(this._collectionData._id) - await this.notify(this._collectionData) + init(handlers: CollectionHandlers): void { + super.init(handlers) + + handlers.playlistHandler.subscribe(this.onPlaylistUpdate, PLAYLIST_KEYS) } - async update(source: string, data: DBRundownPlaylist | SelectedPartInstances | undefined): Promise { + protected changed(): void { + this.updateAndNotify() + } + + private updateAndNotify(): void { + const collection = this.getCollectionOrFail() + this._rundownsHandler?.setRundowns(collection.find(undefined)) + if (this._currentRundownId) { + this._collectionData = collection.findOne(this._currentRundownId) + } else { + this._collectionData = undefined + } + this.notify(this._collectionData) + } + + private onPlaylistUpdate = (data: Playlist | undefined): void => { const prevPlaylistId = this._currentPlaylistId const prevCurRundownId = this._currentRundownId - const rundownPlaylist = data ? (data as DBRundownPlaylist) : undefined - const partInstances = data as SelectedPartInstances - switch (source) { - case PlaylistHandler.name: - this.logUpdateReceived('playlist', source, unprotectString(rundownPlaylist?._id)) - this._currentPlaylistId = rundownPlaylist?._id - break - case PartInstancesHandler.name: - this.logUpdateReceived('partInstances', source) - this._currentRundownId = partInstances.current?.rundownId ?? partInstances.next?.rundownId - break - default: - throw new Error(`${this._name} received unsupported update from ${source}}`) - } + const rundownPlaylist = data + + this.logUpdateReceived('playlist', unprotectString(rundownPlaylist?._id)) + this._currentPlaylistId = rundownPlaylist?._id + this._currentRundownId = rundownPlaylist?.currentPartInfo?.rundownId ?? rundownPlaylist?.nextPartInfo?.rundownId - await new Promise(process.nextTick.bind(this)) - if (!this._collectionName) return - if (!this._publicationName) return if (prevPlaylistId !== this._currentPlaylistId) { - if (this._subscriptionId) this._coreHandler.unsubscribe(this._subscriptionId) - if (this._dbObserver) this._dbObserver.stop() + this.stopSubscription() if (this._currentPlaylistId) { - this._subscriptionId = await this._coreHandler.setupSubscription(this._publicationName, [ - this._currentPlaylistId, - ]) - this._dbObserver = this._coreHandler.setupObserver(this._collectionName) - this._dbObserver.added = (id) => { - void this.changed(id, 'added').catch(this._logger.error) - } - this._dbObserver.changed = (id) => { - void this.changed(id, 'changed').catch(this._logger.error) - } + this.setupSubscription([this._currentPlaylistId]) } + return } - if (prevCurRundownId !== this._currentPlaylistId) { - const currentPlaylistId = this._currentRundownId - if (currentPlaylistId) { - const collection = this._core.getCollection(this._collectionName) - if (!collection) throw new Error(`collection '${this._collectionName}' not found!`) - const rundown = collection.findOne(currentPlaylistId) - if (!rundown) throw new Error(`rundown '${currentPlaylistId}' not found!`) - this._collectionData = rundown - } else this._collectionData = undefined - await this.notify(this._collectionData) + if (prevCurRundownId !== this._currentRundownId) { + this.updateAndNotify() } } } diff --git a/packages/live-status-gateway/src/collections/rundownsHandler.ts b/packages/live-status-gateway/src/collections/rundownsHandler.ts index 0ffb07422c..3641f98396 100644 --- a/packages/live-status-gateway/src/collections/rundownsHandler.ts +++ b/packages/live-status-gateway/src/collections/rundownsHandler.ts @@ -1,33 +1,17 @@ import { Logger } from 'winston' -import { CoreHandler } from '../coreHandler' -import { CollectionBase, Collection } from '../wsHandler' +import { CoreHandler } from '../coreHandler.js' +import { CollectionBase } from '../collectionBase.js' import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' -export class RundownsHandler - extends CollectionBase - implements Collection -{ - public observerName: string - +export class RundownsHandler extends CollectionBase { constructor(logger: Logger, coreHandler: CoreHandler) { - super(RundownsHandler.name, CollectionName.Rundowns, undefined, logger, coreHandler) - this.observerName = this._name + super(CollectionName.Rundowns, logger, coreHandler) } - async setRundowns(rundowns: DBRundown[]): Promise { + setRundowns(rundowns: DBRundown[]): void { this.logUpdateReceived('rundowns', rundowns.length) this._collectionData = rundowns - await this.notify(this._collectionData) - } - - // override notify to implement empty array handling - async notify(data: DBRundown[] | undefined): Promise { - this.logNotifyingUpdate(this._collectionData?.length) - if (data !== undefined) { - for (const observer of this._observers) { - await observer.update(this._name, data) - } - } + this.notify(this._collectionData) } } diff --git a/packages/live-status-gateway/src/collections/segmentHandler.ts b/packages/live-status-gateway/src/collections/segmentHandler.ts index 830af41e0b..53f1b6c933 100644 --- a/packages/live-status-gateway/src/collections/segmentHandler.ts +++ b/packages/live-status-gateway/src/collections/segmentHandler.ts @@ -1,101 +1,86 @@ import { Logger } from 'winston' -import { CoreHandler } from '../coreHandler' -import { CollectionBase, Collection, CollectionObserver } from '../wsHandler' +import { CoreHandler } from '../coreHandler.js' +import { PublicationCollection } from '../publicationCollection.js' import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment' -import { PartInstancesHandler, SelectedPartInstances } from './partInstancesHandler' +import { SelectedPartInstances } from './partInstancesHandler.js' import { RundownId, SegmentId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' import areElementsShallowEqual from '@sofie-automation/shared-lib/dist/lib/isShallowEqual' -import { SegmentsHandler } from './segmentsHandler' +import { SegmentsHandler } from './segmentsHandler.js' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' -import { PlaylistHandler } from './playlistHandler' import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub' +import { CollectionHandlers } from '../liveStatusServer.js' +import { PickKeys } from '@sofie-automation/shared-lib/dist/lib/types' -export class SegmentHandler - extends CollectionBase - implements Collection, CollectionObserver, CollectionObserver -{ - public observerName: string +const PLAYLIST_KEYS = ['rundownIdsInOrder'] as const +type Playlist = PickKeys + +const PART_INSTANCES_KEYS = ['current'] as const +type PartInstances = PickKeys + +export class SegmentHandler extends PublicationCollection { private _currentSegmentId: SegmentId | undefined private _rundownIds: RundownId[] = [] - constructor(logger: Logger, coreHandler: CoreHandler, private _segmentsHandler: SegmentsHandler) { - super(SegmentHandler.name, CollectionName.Segments, CorelibPubSub.segments, logger, coreHandler) - this.observerName = this._name + constructor( + logger: Logger, + coreHandler: CoreHandler, + private _segmentsHandler: SegmentsHandler + ) { + super(CollectionName.Segments, CorelibPubSub.segments, logger, coreHandler) } - async changed(id: SegmentId, changeType: string): Promise { - this.logDocumentChange(id, changeType) - if (!this._collectionName) return - const collection = this._core.getCollection(this._collectionName) - if (!collection) throw new Error(`collection '${this._collectionName}' not found!`) - const allSegments = collection.find(undefined) - await this._segmentsHandler.setSegments(allSegments) - await this.updateAndNotify() + init(handlers: CollectionHandlers): void { + super.init(handlers) + + handlers.playlistHandler.subscribe(this.onPlaylistUpdate, PLAYLIST_KEYS) + handlers.partInstancesHandler.subscribe(this.onPartInstancesUpdate, PART_INSTANCES_KEYS) } - private async updateAndNotify() { - const collection = this._core.getCollection(this._collectionName) - const newData = this._currentSegmentId ? collection.findOne(this._currentSegmentId) : undefined - if (this._collectionData !== newData) { - this._collectionData = newData - await this.notify(this._collectionData) + protected changed(): void { + this.updateAndNotify() + } + + private updateAndNotify() { + const collection = this.getCollectionOrFail() + const allSegments = collection.find(undefined) + this._segmentsHandler.setSegments(allSegments) + if (this._currentSegmentId && collection.findOne(this._currentSegmentId) !== this._collectionData) { + this.updateAndNotifyCurrentSegment() } } - async update(source: string, data: SelectedPartInstances | DBRundownPlaylist | undefined): Promise { + private updateAndNotifyCurrentSegment() { + const collection = this.getCollectionOrFail() + this._collectionData = this._currentSegmentId ? collection.findOne(this._currentSegmentId) : undefined + this.notify(this._collectionData) + } + + private onPlaylistUpdate = (playlist: Playlist | undefined): void => { const previousRundownIds = this._rundownIds - switch (source) { - case PartInstancesHandler.name: { - this.logUpdateReceived('partInstances', source) - const partInstanceMap = data as SelectedPartInstances - this._currentSegmentId = data ? partInstanceMap.current?.segmentId : undefined - break - } - case PlaylistHandler.name: { - this.logUpdateReceived('playlist', source) - this._rundownIds = (data as DBRundownPlaylist | undefined)?.rundownIdsInOrder ?? [] - break - } - default: - throw new Error(`${this._name} received unsupported update from ${source}}`) - } - await new Promise(process.nextTick.bind(this)) - if (!this._collectionName) return - if (!this._publicationName) return + this.logUpdateReceived('playlist') + this._rundownIds = playlist?.rundownIdsInOrder ?? [] const rundownsChanged = !areElementsShallowEqual(this._rundownIds, previousRundownIds) if (rundownsChanged) { - if (this._subscriptionId) this._coreHandler.unsubscribe(this._subscriptionId) - if (this._dbObserver) this._dbObserver.stop() + this.stopSubscription() if (this._rundownIds.length) { - this._subscriptionId = await this._coreHandler.setupSubscription( - this._publicationName, - this._rundownIds, - { - omitHidden: true, - } - ) - this._dbObserver = this._coreHandler.setupObserver(this._collectionName) - this._dbObserver.added = (id) => { - void this.changed(id, 'added').catch(this._logger.error) - } - this._dbObserver.changed = (id) => { - void this.changed(id, 'changed').catch(this._logger.error) - } - this._dbObserver.removed = (id) => { - void this.changed(id, 'removed').catch(this._logger.error) - } + this.setupSubscription(this._rundownIds, { + omitHidden: true, + }) } } + } - const collection = this._core.getCollection(this._collectionName) - if (!collection) throw new Error(`collection '${this._collectionName}' not found!`) - if (rundownsChanged) { - const allSegments = collection.find(undefined) - await this._segmentsHandler.setSegments(allSegments) + private onPartInstancesUpdate = (data: PartInstances | undefined): void => { + this.logUpdateReceived('partInstances') + + const previousSegmentId = this._currentSegmentId + this._currentSegmentId = data?.current?.segmentId + + if (previousSegmentId !== this._currentSegmentId) { + this.updateAndNotifyCurrentSegment() } - await this.updateAndNotify() } } diff --git a/packages/live-status-gateway/src/collections/segmentsHandler.ts b/packages/live-status-gateway/src/collections/segmentsHandler.ts index 401def1ead..3fde4eef0f 100644 --- a/packages/live-status-gateway/src/collections/segmentsHandler.ts +++ b/packages/live-status-gateway/src/collections/segmentsHandler.ts @@ -1,38 +1,23 @@ import { Logger } from 'winston' -import { CoreHandler } from '../coreHandler' -import { CollectionBase, Collection } from '../wsHandler' +import { CoreHandler } from '../coreHandler.js' +import { CollectionBase } from '../collectionBase.js' import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment' -import * as _ from 'underscore' +import _ from 'underscore' import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' const THROTTLE_PERIOD_MS = 200 -export class SegmentsHandler - extends CollectionBase - implements Collection -{ - public observerName: string - private throttledNotify: (data: DBSegment[]) => Promise +export class SegmentsHandler extends CollectionBase { + private throttledNotify: (data: DBSegment[]) => void constructor(logger: Logger, coreHandler: CoreHandler) { - super(SegmentsHandler.name, CollectionName.Segments, undefined, logger, coreHandler) - this.observerName = this._name + super(CollectionName.Segments, logger, coreHandler) this.throttledNotify = _.throttle(this.notify.bind(this), THROTTLE_PERIOD_MS, { leading: true, trailing: true }) } - async setSegments(segments: DBSegment[]): Promise { + setSegments(segments: DBSegment[]): void { this.logUpdateReceived('segments', segments.length) this._collectionData = segments - await this.throttledNotify(this._collectionData) - } - - // override notify to implement empty array handling - async notify(data: DBSegment[] | undefined): Promise { - this.logNotifyingUpdate(this._collectionData?.length) - if (data !== undefined) { - for (const observer of this._observers) { - await observer.update(this._name, data) - } - } + this.throttledNotify(this._collectionData) } } diff --git a/packages/live-status-gateway/src/collections/showStyleBaseHandler.ts b/packages/live-status-gateway/src/collections/showStyleBaseHandler.ts index 2cdcdd6541..74dde9b609 100644 --- a/packages/live-status-gateway/src/collections/showStyleBaseHandler.ts +++ b/packages/live-status-gateway/src/collections/showStyleBaseHandler.ts @@ -1,6 +1,6 @@ import { Logger } from 'winston' -import { CoreHandler } from '../coreHandler' -import { CollectionBase, Collection, CollectionObserver } from '../wsHandler' +import { CoreHandler } from '../coreHandler.js' +import { PublicationCollection } from '../publicationCollection.js' import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' import { DBShowStyleBase, OutputLayers, SourceLayers } from '@sofie-automation/corelib/dist/dataModel/ShowStyleBase' import { ShowStyleBaseId } from '@sofie-automation/corelib/dist/dataModel/Ids' @@ -8,6 +8,7 @@ import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collect import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub' import { applyAndValidateOverrides } from '@sofie-automation/corelib/dist/settings/objectWithOverrides' import { IOutputLayer, ISourceLayer } from '@sofie-automation/blueprints-integration' +import { CollectionHandlers } from '../liveStatusServer.js' export interface ShowStyleBaseExt extends DBShowStyleBase { sourceLayerNamesById: ReadonlyMap @@ -15,67 +16,47 @@ export interface ShowStyleBaseExt extends DBShowStyleBase { sourceLayers: SourceLayers } -export class ShowStyleBaseHandler - extends CollectionBase - implements Collection, CollectionObserver -{ - public observerName: string +export class ShowStyleBaseHandler extends PublicationCollection< + ShowStyleBaseExt, + CorelibPubSub.showStyleBases, + CollectionName.ShowStyleBases +> { private _showStyleBaseId: ShowStyleBaseId | undefined private _sourceLayersMap: Map = new Map() private _outputLayersMap: Map = new Map() constructor(logger: Logger, coreHandler: CoreHandler) { - super( - ShowStyleBaseHandler.name, - CollectionName.ShowStyleBases, - CorelibPubSub.showStyleBases, - logger, - coreHandler - ) - this.observerName = this._name + super(CollectionName.ShowStyleBases, CorelibPubSub.showStyleBases, logger, coreHandler) } - async changed(id: ShowStyleBaseId, changeType: string): Promise { - this.logDocumentChange(id, changeType) - if (!this._collectionName) return + init(handlers: CollectionHandlers): void { + super.init(handlers) + + handlers.rundownHandler.subscribe(this.onRundownUpdate) + } + + protected changed(): void { if (this._showStyleBaseId) { this.updateCollectionData() - await this.notify(this._collectionData) + this.notify(this._collectionData) } } - async update(source: string, data: DBRundown | undefined): Promise { - this.logUpdateReceived('rundown', source, `rundownId ${data?._id}, showStyleBaseId ${data?.showStyleBaseId}`) + onRundownUpdate = (data: DBRundown | undefined): void => { + this.logUpdateReceived('rundown', `rundownId ${data?._id}, showStyleBaseId ${data?.showStyleBaseId}`) const prevShowStyleBaseId = this._showStyleBaseId this._showStyleBaseId = data?.showStyleBaseId - await new Promise(process.nextTick.bind(this)) - if (!this._collectionName) return - if (!this._publicationName) return if (prevShowStyleBaseId !== this._showStyleBaseId) { - if (this._subscriptionId) this._coreHandler.unsubscribe(this._subscriptionId) - if (this._dbObserver) this._dbObserver.stop() + this.stopSubscription() if (this._showStyleBaseId) { - this._subscriptionId = await this._coreHandler.setupSubscription(this._publicationName, [ - this._showStyleBaseId, - ]) - this._dbObserver = this._coreHandler.setupObserver(this._collectionName) - this._dbObserver.added = (id) => { - void this.changed(id, 'added').catch(this._logger.error) - } - this._dbObserver.changed = (id) => { - void this.changed(id, 'changed').catch(this._logger.error) - } - - this.updateCollectionData() - await this.notify(this._collectionData) + this.setupSubscription([this._showStyleBaseId]) } } } updateCollectionData(): void { - const collection = this._core.getCollection(this._collectionName) - if (!collection) throw new Error(`collection '${this._collectionName}' not found!`) + const collection = this.getCollectionOrFail() if (!this._showStyleBaseId) return const showStyleBase = collection.findOne(this._showStyleBaseId) if (!showStyleBase) { diff --git a/packages/live-status-gateway/src/collections/studioHandler.ts b/packages/live-status-gateway/src/collections/studioHandler.ts index fb7be9b795..030bc6f453 100644 --- a/packages/live-status-gateway/src/collections/studioHandler.ts +++ b/packages/live-status-gateway/src/collections/studioHandler.ts @@ -1,53 +1,26 @@ import { Logger } from 'winston' import { DBStudio } from '@sofie-automation/corelib/dist/dataModel/Studio' -import { CoreHandler } from '../coreHandler' -import { CollectionBase, Collection } from '../wsHandler' +import { CoreHandler } from '../coreHandler.js' +import { PublicationCollection } from '../publicationCollection.js' import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub' -import { StudioId } from '@sofie-automation/server-core-integration' - -export class StudioHandler - extends CollectionBase - implements Collection -{ - public observerName: string +import { CollectionHandlers } from '../liveStatusServer.js' +export class StudioHandler extends PublicationCollection { constructor(logger: Logger, coreHandler: CoreHandler) { - super(StudioHandler.name, CollectionName.Studios, CorelibPubSub.studios, logger, coreHandler) - this.observerName = this._name + super(CollectionName.Studios, CorelibPubSub.studios, logger, coreHandler) } - async init(): Promise { - await super.init() - if (!this._collectionName) return - if (!this._publicationName) return - if (!this._studioId) return - this._subscriptionId = await this._coreHandler.setupSubscription(this._publicationName, [this._studioId]) - this._dbObserver = this._coreHandler.setupObserver(this._collectionName) + init(handlers: CollectionHandlers): void { + super.init(handlers) - if (this._collectionName) { - const col = this._core.getCollection(this._collectionName) - if (!col) throw new Error(`collection '${this._collectionName}' not found!`) - const studio = col.findOne(this._studioId) - if (!studio) throw new Error(`studio '${this._studioId}' not found!`) - this._collectionData = studio - this._dbObserver.added = (id) => { - void this.changed(id, 'added').catch(this._logger.error) - } - this._dbObserver.changed = (id) => { - void this.changed(id, 'changed').catch(this._logger.error) - } - } + this.setupSubscription([this._studioId]) } - async changed(id: StudioId, changeType: string): Promise { - this.logDocumentChange(id, changeType) - if (!(id === this._studioId && this._collectionName)) return - const collection = this._core.getCollection(this._collectionName) - if (!collection) throw new Error(`collection '${this._collectionName}' not found!`) - const studio = collection.findOne(id) - if (!studio) throw new Error(`studio '${this._studioId}' not found on changed!`) + protected changed(): void { + const collection = this.getCollectionOrFail() + const studio = collection.findOne(this._studioId) this._collectionData = studio - await this.notify(this._collectionData) + this.notify(this._collectionData) } } diff --git a/packages/live-status-gateway/src/config.ts b/packages/live-status-gateway/src/config.ts index 7d23e03059..95366edebd 100644 --- a/packages/live-status-gateway/src/config.ts +++ b/packages/live-status-gateway/src/config.ts @@ -1,4 +1,4 @@ -import { Config } from './connector' +import { Config } from './connector.js' import { protectString } from '@sofie-automation/shared-lib/dist/lib/protectedString' // CLI arguments / Environment variables -------------- diff --git a/packages/live-status-gateway/src/connector.ts b/packages/live-status-gateway/src/connector.ts index f3c67117f4..d38c3b2585 100644 --- a/packages/live-status-gateway/src/connector.ts +++ b/packages/live-status-gateway/src/connector.ts @@ -1,8 +1,8 @@ -import { CoreHandler, CoreConfig } from './coreHandler' +import { CoreHandler, CoreConfig } from './coreHandler.js' import { Logger } from 'winston' -import { Process } from './process' +import { Process } from './process.js' import { PeripheralDeviceId } from '@sofie-automation/shared-lib/dist/core/model/Ids' -import { LiveStatusServer } from './liveStatusServer' +import { LiveStatusServer } from './liveStatusServer.js' export interface Config { process: ProcessConfig @@ -64,7 +64,7 @@ export class Connector { this._logger.info('Shutting down in 10 seconds!') setTimeout(() => { - // eslint-disable-next-line no-process-exit + // eslint-disable-next-line n/no-process-exit process.exit(0) }, 10 * 1000) return diff --git a/packages/live-status-gateway/src/coreHandler.ts b/packages/live-status-gateway/src/coreHandler.ts index cefd214ffd..7899409279 100644 --- a/packages/live-status-gateway/src/coreHandler.ts +++ b/packages/live-status-gateway/src/coreHandler.ts @@ -11,10 +11,10 @@ import { SubscriptionId, stringifyError, } from '@sofie-automation/server-core-integration' -import { DeviceConfig } from './connector' +import { DeviceConfig } from './connector.js' import { Logger } from 'winston' -import { Process } from './process' -import { LIVE_STATUS_DEVICE_CONFIG } from './configManifest' +import { Process } from './process.js' +import { LIVE_STATUS_DEVICE_CONFIG } from './configManifest.js' import { PeripheralDeviceCategory, PeripheralDeviceType, @@ -23,7 +23,7 @@ import { protectString } from '@sofie-automation/shared-lib/dist/lib/protectedSt import { PeripheralDeviceCommandId, StudioId } from '@sofie-automation/shared-lib/dist/core/model/Ids' import { StatusCode } from '@sofie-automation/shared-lib/dist/lib/status' import { PeripheralDeviceCommand } from '@sofie-automation/shared-lib/dist/core/model/PeripheralDeviceCommand' -import { LiveStatusGatewayConfig } from './generated/options' +import { LiveStatusGatewayConfig } from '@sofie-automation/shared-lib/dist/generated/LiveStatusGatewayOptionsTypes' import { CorelibPubSubTypes, CorelibPubSubCollections } from '@sofie-automation/corelib/dist/pubsub' import { ParametersOfFunctionOrNever } from '@sofie-automation/server-core-integration/dist/lib/subscriptions' @@ -251,7 +251,7 @@ export class CoreHandler { this.logger.error(e) }) } - // eslint-disable-next-line @typescript-eslint/ban-types + // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type const fcn: Function = fcnObject[cmd.functionName as keyof CoreHandler] as Function try { if (!fcn) throw Error(`Function "${cmd.functionName}" not found on device "${cmd.deviceId}"!`) @@ -281,11 +281,9 @@ export class CoreHandler { if (!cmds) throw Error('"peripheralDeviceCommands" collection not found!') const cmd = cmds.findOne(id) if (!cmd) throw Error('PeripheralCommand "' + id + '" not found!') - // console.log('addedChangedCommand', id) + if (cmd.deviceId === functionObject.core.deviceId) { this.executeFunction(cmd, functionObject) - } else { - // console.log('not mine', cmd.deviceId, this.core.deviceId) } } observer.added = (id) => { @@ -309,7 +307,7 @@ export class CoreHandler { if (actually === 1) { this.logger.info('KillProcess command received, shutting down in 1000ms!') setTimeout(() => { - // eslint-disable-next-line no-process-exit + // eslint-disable-next-line n/no-process-exit process.exit(0) }, 1000) return true diff --git a/packages/live-status-gateway/src/helpers/equality.ts b/packages/live-status-gateway/src/helpers/equality.ts new file mode 100644 index 0000000000..1bf144a080 --- /dev/null +++ b/packages/live-status-gateway/src/helpers/equality.ts @@ -0,0 +1,75 @@ +import _ from 'underscore' + +export function arePropertiesShallowEqual>( + a: T, + b: Partial, + omitProperties?: readonly (keyof T)[], + selectProperties?: readonly (keyof T)[] +): boolean { + if (typeof a !== 'object' || a == null || typeof b !== 'object' || b == null) { + return false + } + + const keysA = Object.keys(a).filter( + omitProperties + ? (key) => !omitProperties.includes(key) + : selectProperties + ? (key) => selectProperties.includes(key) + : () => true + ) + const keysB = Object.keys(b).filter( + omitProperties + ? (key) => !omitProperties.includes(key) + : selectProperties + ? (key) => selectProperties.includes(key) + : () => true + ) + + if (keysA.length !== keysB.length) return false + + for (const key of keysA) { + if (!keysB.includes(key) || a[key] !== b[key]) { + return false + } + } + + return true +} + +export function arePropertiesDeepEqual>( + a: T, + b: Partial, + omitProperties?: readonly (keyof T)[], + selectProperties?: readonly (keyof T)[] +): boolean { + if (typeof a !== 'object' || a == null || typeof b !== 'object' || b == null) { + return false + } + + const keysA = Object.keys(a).filter( + omitProperties + ? (key) => !omitProperties.includes(key) + : selectProperties + ? (key) => selectProperties.includes(key) + : () => true + ) + const keysB = Object.keys(b).filter( + omitProperties + ? (key) => !omitProperties.includes(key) + : selectProperties + ? (key) => selectProperties.includes(key) + : () => true + ) + + if (keysA.length !== keysB.length) { + return false + } + + for (const key of keysA) { + if (!keysB.includes(key) || !_.isEqual(a[key], b[key])) { + return false + } + } + + return true +} diff --git a/packages/live-status-gateway/src/index.ts b/packages/live-status-gateway/src/index.ts index b5fdb0d900..8031d754e0 100644 --- a/packages/live-status-gateway/src/index.ts +++ b/packages/live-status-gateway/src/index.ts @@ -1,5 +1,5 @@ -import { Connector } from './connector' -import { config, logPath, disableWatchdog, logLevel } from './config' +import { Connector } from './connector.js' +import { config, logPath, disableWatchdog, logLevel } from './config.js' import * as Winston from 'winston' import { stringifyError } from '@sofie-automation/server-core-integration' diff --git a/packages/live-status-gateway/src/liveStatusServer.ts b/packages/live-status-gateway/src/liveStatusServer.ts index 90bd64c471..1dc3318691 100644 --- a/packages/live-status-gateway/src/liveStatusServer.ts +++ b/packages/live-status-gateway/src/liveStatusServer.ts @@ -1,28 +1,57 @@ import { Logger } from 'winston' -import { CoreHandler } from './coreHandler' +import { CoreHandler } from './coreHandler.js' import { WebSocket, WebSocketServer } from 'ws' -import { StudioHandler } from './collections/studioHandler' -import { ShowStyleBaseHandler } from './collections/showStyleBaseHandler' -import { PlaylistHandler } from './collections/playlistHandler' -import { RundownHandler } from './collections/rundownHandler' -// import { RundownsHandler } from './collections/rundownsHandler' -import { SegmentHandler } from './collections/segmentHandler' -// import { PartHandler } from './collections/part' -import { PartInstancesHandler } from './collections/partInstancesHandler' -import { AdLibActionsHandler } from './collections/adLibActionsHandler' -import { GlobalAdLibActionsHandler } from './collections/globalAdLibActionsHandler' -import { RootChannel, StatusChannels } from './topics/root' -import { StudioTopic } from './topics/studioTopic' -import { ActivePlaylistTopic } from './topics/activePlaylistTopic' -import { AdLibsHandler } from './collections/adLibsHandler' -import { GlobalAdLibsHandler } from './collections/globalAdLibsHandler' -import { SegmentsTopic } from './topics/segmentsTopic' -import { SegmentsHandler } from './collections/segmentsHandler' -import { PartHandler } from './collections/partHandler' -import { PartsHandler } from './collections/partsHandler' -import { PieceInstancesHandler } from './collections/pieceInstancesHandler' -import { AdLibsTopic } from './topics/adLibsTopic' -import { ActivePiecesTopic } from './topics/activePiecesTopic' +import { StudioHandler } from './collections/studioHandler.js' +import { ShowStyleBaseHandler } from './collections/showStyleBaseHandler.js' +import { PlaylistHandler, PlaylistsHandler } from './collections/playlistHandler.js' +import { RundownHandler } from './collections/rundownHandler.js' +// import { RundownsHandler } from './collections/rundownsHandler.js' +import { SegmentHandler } from './collections/segmentHandler.js' +// import { PartHandler } from './collections/part.js' +import { PartInstancesHandler } from './collections/partInstancesHandler.js' +import { AdLibActionsHandler } from './collections/adLibActionsHandler.js' +import { GlobalAdLibActionsHandler } from './collections/globalAdLibActionsHandler.js' +import { RootChannel } from './topics/root.js' +import { StudioTopic } from './topics/studioTopic.js' +import { ActivePlaylistTopic } from './topics/activePlaylistTopic.js' +import { AdLibsHandler } from './collections/adLibsHandler.js' +import { GlobalAdLibsHandler } from './collections/globalAdLibsHandler.js' +import { SegmentsTopic } from './topics/segmentsTopic.js' +import { SegmentsHandler } from './collections/segmentsHandler.js' +import { PartHandler } from './collections/partHandler.js' +import { PartsHandler } from './collections/partsHandler.js' +import { PieceInstancesHandler } from './collections/pieceInstancesHandler.js' +import { AdLibsTopic } from './topics/adLibsTopic.js' +import { ActivePiecesTopic } from './topics/activePiecesTopic.js' +import { SubscriptionName } from '@sofie-automation/live-status-gateway-api' +import { PieceContentStatusesHandler } from './collections/pieceContentStatusesHandler.js' +import { PackagesTopic } from './topics/packagesTopic.js' +import { BucketsHandler } from './collections/bucketsHandler.js' +import { BucketAdLibsHandler } from './collections/bucketAdLibsHandler.js' +import { BucketAdLibActionsHandler } from './collections/bucketAdLibActionsHandler.js' +import { BucketsTopic } from './topics/bucketsTopic.js' + +export interface CollectionHandlers { + studioHandler: StudioHandler + showStyleBaseHandler: ShowStyleBaseHandler + playlistHandler: PlaylistHandler + playlistsHandler: PlaylistsHandler + rundownHandler: RundownHandler + segmentsHandler: SegmentsHandler + segmentHandler: SegmentHandler + partsHandler: PartsHandler + partHandler: PartHandler + partInstancesHandler: PartInstancesHandler + pieceInstancesHandler: PieceInstancesHandler + adLibActionsHandler: AdLibActionsHandler + adLibsHandler: AdLibsHandler + globalAdLibActionsHandler: GlobalAdLibActionsHandler + globalAdLibsHandler: GlobalAdLibsHandler + pieceContentStatusesHandler: PieceContentStatusesHandler + bucketsHandler: BucketsHandler + bucketAdLibsHandler: BucketAdLibsHandler + bucketAdLibActionsHandler: BucketAdLibActionsHandler +} export class LiveStatusServer { _logger: Logger @@ -39,94 +68,67 @@ export class LiveStatusServer { const rootChannel = new RootChannel(this._logger) - const studioTopic = new StudioTopic(this._logger) - const activePiecesTopic = new ActivePiecesTopic(this._logger) - const activePlaylistTopic = new ActivePlaylistTopic(this._logger) - const segmentsTopic = new SegmentsTopic(this._logger) - const adLibsTopic = new AdLibsTopic(this._logger) - - rootChannel.addTopic(StatusChannels.studio, studioTopic) - rootChannel.addTopic(StatusChannels.activePlaylist, activePlaylistTopic) - rootChannel.addTopic(StatusChannels.activePieces, activePiecesTopic) - rootChannel.addTopic(StatusChannels.segments, segmentsTopic) - rootChannel.addTopic(StatusChannels.adLibs, adLibsTopic) - const studioHandler = new StudioHandler(this._logger, this._coreHandler) - await studioHandler.init() const showStyleBaseHandler = new ShowStyleBaseHandler(this._logger, this._coreHandler) - await showStyleBaseHandler.init() const playlistHandler = new PlaylistHandler(this._logger, this._coreHandler) - await playlistHandler.init() - // const rundownsHandler = new RundownsHandler(this._logger, this._coreHandler) - // await rundownsHandler.init() + const playlistsHandler = playlistHandler.playlistsHandler const rundownHandler = new RundownHandler(this._logger, this._coreHandler) - await rundownHandler.init() const segmentsHandler = new SegmentsHandler(this._logger, this._coreHandler) - await segmentsHandler.init() const segmentHandler = new SegmentHandler(this._logger, this._coreHandler, segmentsHandler) - await segmentHandler.init() const partsHandler = new PartsHandler(this._logger, this._coreHandler) - await partsHandler.init() const partHandler = new PartHandler(this._logger, this._coreHandler, partsHandler) - await partHandler.init() const partInstancesHandler = new PartInstancesHandler(this._logger, this._coreHandler) - await partInstancesHandler.init() const pieceInstancesHandler = new PieceInstancesHandler(this._logger, this._coreHandler) - await pieceInstancesHandler.init() const adLibActionsHandler = new AdLibActionsHandler(this._logger, this._coreHandler) - await adLibActionsHandler.init() const adLibsHandler = new AdLibsHandler(this._logger, this._coreHandler) - await adLibsHandler.init() const globalAdLibActionsHandler = new GlobalAdLibActionsHandler(this._logger, this._coreHandler) - await globalAdLibActionsHandler.init() const globalAdLibsHandler = new GlobalAdLibsHandler(this._logger, this._coreHandler) - await globalAdLibsHandler.init() - - // add observers for collection subscription updates - await playlistHandler.subscribe(rundownHandler) - await playlistHandler.subscribe(segmentHandler) - await playlistHandler.subscribe(partHandler) - await playlistHandler.subscribe(partInstancesHandler) - await playlistHandler.subscribe(pieceInstancesHandler) - await rundownHandler.subscribe(showStyleBaseHandler) - await partInstancesHandler.subscribe(rundownHandler) - await partInstancesHandler.subscribe(segmentHandler) - // partInstancesHandler.subscribe(partHandler) - await partInstancesHandler.subscribe(adLibActionsHandler) - await partInstancesHandler.subscribe(globalAdLibActionsHandler) - await partInstancesHandler.subscribe(adLibsHandler) - await partInstancesHandler.subscribe(globalAdLibsHandler) - await showStyleBaseHandler.subscribe(pieceInstancesHandler) - await partInstancesHandler.subscribe(pieceInstancesHandler) - - // add observers for websocket topic updates - await studioHandler.subscribe(studioTopic) - await playlistHandler.playlistsHandler.subscribe(studioTopic) - - await playlistHandler.subscribe(activePlaylistTopic) - await showStyleBaseHandler.subscribe(activePlaylistTopic) - await partInstancesHandler.subscribe(activePlaylistTopic) - await partsHandler.subscribe(activePlaylistTopic) - await pieceInstancesHandler.subscribe(activePlaylistTopic) - await segmentHandler.subscribe(activePlaylistTopic) - await segmentsHandler.subscribe(activePlaylistTopic) - - await playlistHandler.subscribe(activePiecesTopic) - await showStyleBaseHandler.subscribe(activePiecesTopic) - await pieceInstancesHandler.subscribe(activePiecesTopic) - - await playlistHandler.subscribe(segmentsTopic) - await segmentsHandler.subscribe(segmentsTopic) - await partsHandler.subscribe(segmentsTopic) - - await showStyleBaseHandler.subscribe(adLibsTopic) - await partsHandler.subscribe(adLibsTopic) - await segmentsHandler.subscribe(adLibsTopic) - await playlistHandler.subscribe(adLibsTopic) - await adLibActionsHandler.subscribe(adLibsTopic) - await adLibsHandler.subscribe(adLibsTopic) - await globalAdLibActionsHandler.subscribe(adLibsTopic) - await globalAdLibsHandler.subscribe(adLibsTopic) + const pieceContentStatusesHandler = new PieceContentStatusesHandler(this._logger, this._coreHandler) + const bucketsHandler = new BucketsHandler(this._logger, this._coreHandler) + const bucketAdLibsHandler = new BucketAdLibsHandler(this._logger, this._coreHandler) + const bucketAdLibActionsHandler = new BucketAdLibActionsHandler(this._logger, this._coreHandler) + + const handlers: CollectionHandlers = { + studioHandler, + showStyleBaseHandler, + playlistHandler, + playlistsHandler, + rundownHandler, + segmentsHandler, + segmentHandler, + partsHandler, + partHandler, + partInstancesHandler, + pieceInstancesHandler, + adLibActionsHandler, + adLibsHandler, + globalAdLibActionsHandler, + globalAdLibsHandler, + pieceContentStatusesHandler, + bucketsHandler, + bucketAdLibsHandler, + bucketAdLibActionsHandler, + } + + for (const handlerName in handlers) { + handlers[handlerName as keyof CollectionHandlers].init(handlers) + } + + const studioTopic = new StudioTopic(this._logger, handlers) + const activePiecesTopic = new ActivePiecesTopic(this._logger, handlers) + const activePlaylistTopic = new ActivePlaylistTopic(this._logger, handlers) + const segmentsTopic = new SegmentsTopic(this._logger, handlers) + const adLibsTopic = new AdLibsTopic(this._logger, handlers) + const packageStatusTopic = new PackagesTopic(this._logger, handlers) + const bucketsTopic = new BucketsTopic(this._logger, handlers) + + rootChannel.addTopic(SubscriptionName.STUDIO, studioTopic) + rootChannel.addTopic(SubscriptionName.ACTIVE_PLAYLIST, activePlaylistTopic) + rootChannel.addTopic(SubscriptionName.ACTIVE_PIECES, activePiecesTopic) + rootChannel.addTopic(SubscriptionName.SEGMENTS, segmentsTopic) + rootChannel.addTopic(SubscriptionName.AD_LIBS, adLibsTopic) + rootChannel.addTopic(SubscriptionName.RESERVED_PACKAGES, packageStatusTopic) + rootChannel.addTopic(SubscriptionName.BUCKETS, bucketsTopic) const wss = new WebSocketServer({ port: 8080 }) wss.on('connection', (ws, request) => { diff --git a/packages/live-status-gateway/src/process.ts b/packages/live-status-gateway/src/process.ts index 04e6f95eb2..58eaef7cdd 100644 --- a/packages/live-status-gateway/src/process.ts +++ b/packages/live-status-gateway/src/process.ts @@ -1,6 +1,6 @@ import { Logger } from 'winston' import * as fs from 'fs' -import { ProcessConfig } from './connector' +import { ProcessConfig } from './connector.js' export class Process { logger: Logger diff --git a/packages/live-status-gateway/src/publicationCollection.ts b/packages/live-status-gateway/src/publicationCollection.ts new file mode 100644 index 0000000000..8300a7fd33 --- /dev/null +++ b/packages/live-status-gateway/src/publicationCollection.ts @@ -0,0 +1,106 @@ +import { CorelibPubSubTypes, CorelibPubSubCollections } from '@sofie-automation/corelib/dist/pubsub' +import { + SubscriptionId, + Observer, + CollectionDocCheck, + PeripheralDevicePubSubCollections, + ProtectedString, +} from '@sofie-automation/server-core-integration' +import { ParametersOfFunctionOrNever } from '@sofie-automation/server-core-integration/dist/lib/subscriptions' +import { Logger } from 'winston' +import { CollectionBase, DEFAULT_THROTTLE_PERIOD_MS } from './collectionBase.js' +import { CoreHandler } from './coreHandler.js' +import { ObserverCallback } from './collectionBase.js' + +export abstract class PublicationCollection< + T, + TPubSub extends keyof CorelibPubSubTypes, + TCollection extends keyof CorelibPubSubCollections, +> extends CollectionBase { + protected _publicationName: TPubSub + protected _subscriptionId: SubscriptionId | undefined + protected _subscriptionPending = false + protected _dbObserver: + | Observer> + | undefined + + constructor( + collection: TCollection, + publication: TPubSub, + logger: Logger, + coreHandler: CoreHandler, + throttlePeriodMs = DEFAULT_THROTTLE_PERIOD_MS + ) { + super(collection, logger, coreHandler, throttlePeriodMs) + this._publicationName = publication + } + + close(): void { + super.close() + if (this._subscriptionId) this._coreHandler.unsubscribe(this._subscriptionId) + this._dbObserver?.stop() + } + + subscribe(callback: ObserverCallback, keysToPick?: readonly K[]): void { + //this._logger.info(`${name}' added observer for '${this._name}'`) + if (this._collectionData) callback(this._collectionData) + this._observers.set(callback, { keysToPick, lastData: this.shallowClone(this._collectionData) }) + } + + /** + * Called after a batch of updates to documents in the collection + */ + protected changed(): void { + // override me + } + + private onDocumentEvent(id: ProtectedString | string, changeType: string): void { + this.logDocumentChange(id, changeType) + if (!this._subscriptionId) { + this._logger.silly(`${this._name} ${changeType} ${id} skipping (lack of subscription)`) + return + } + if (this._subscriptionPending) { + this._logger.silly(`${this._name} ${changeType} ${id} skipping (subscription pending)`) + return + } + this.throttledChanged() + } + + private setupObserver(): void { + this._dbObserver = this._coreHandler.setupObserver(this._collectionName) + this._dbObserver.added = (id) => { + this.onDocumentEvent(id, 'added') + } + this._dbObserver.changed = (id) => { + this.onDocumentEvent(id, 'changed') + } + this._dbObserver.removed = (id) => { + this.onDocumentEvent(id, 'removed') + } + } + + protected stopSubscription(): void { + if (this._subscriptionId) this._coreHandler.unsubscribe(this._subscriptionId) + this._subscriptionId = undefined + this._dbObserver?.stop() + this._dbObserver = undefined + } + + protected setupSubscription(...args: ParametersOfFunctionOrNever): void { + if (!this._publicationName) throw new Error(`Publication name not set for '${this._name}'`) + this.stopSubscription() + this._subscriptionPending = true + this._coreHandler + .setupSubscription(this._publicationName, ...args) + .then((subscriptionId) => { + this._subscriptionId = subscriptionId + this.setupObserver() + }) + .catch((e) => this._logger.error(e)) + .finally(() => { + this._subscriptionPending = false + this.changed() + }) + } +} diff --git a/packages/live-status-gateway/src/topics/__tests__/activePieces.spec.ts b/packages/live-status-gateway/src/topics/__tests__/activePieces.spec.ts index 7e7f469e13..12c5ccb7c3 100644 --- a/packages/live-status-gateway/src/topics/__tests__/activePieces.spec.ts +++ b/packages/live-status-gateway/src/topics/__tests__/activePieces.spec.ts @@ -1,16 +1,23 @@ -import { makeMockLogger, makeMockSubscriber, makeTestPlaylist, makeTestShowStyleBase } from './utils' -import { PlaylistHandler } from '../../collections/playlistHandler' -import { ShowStyleBaseExt, ShowStyleBaseHandler } from '../../collections/showStyleBaseHandler' +import { + makeMockHandlers, + makeMockLogger, + makeMockSubscriber, + makeTestPlaylist, + makeTestShowStyleBase, +} from './utils.js' +import { ShowStyleBaseExt } from '../../collections/showStyleBaseHandler.js' import { protectString } from '@sofie-automation/server-core-integration/dist' import { PartialDeep } from 'type-fest' import { literal } from '@sofie-automation/corelib/dist/lib' -import { PieceInstancesHandler, SelectedPieceInstances } from '../../collections/pieceInstancesHandler' +import { SelectedPieceInstances } from '../../collections/pieceInstancesHandler.js' import { PieceInstance } from '@sofie-automation/corelib/dist/dataModel/PieceInstance' -import { ActivePiecesStatus, ActivePiecesTopic } from '../activePiecesTopic' +import { ActivePiecesTopic } from '../activePiecesTopic.js' +import { ActivePiecesEvent } from '@sofie-automation/live-status-gateway-api' describe('ActivePiecesTopic', () => { it('provides active pieces', async () => { - const topic = new ActivePiecesTopic(makeMockLogger()) + const handlers = makeMockHandlers() + const topic = new ActivePiecesTopic(makeMockLogger(), handlers) const mockSubscriber = makeMockSubscriber() const currentPartInstanceId = 'CURRENT_PART_INSTANCE_ID' @@ -23,10 +30,10 @@ describe('ActivePiecesTopic', () => { partInstanceId: protectString(currentPartInstanceId), rundownId: playlist.rundownIdsInOrder[0], } - await topic.update(PlaylistHandler.name, playlist) + handlers.playlistHandler.notify(playlist) const testShowStyleBase = makeTestShowStyleBase() - await topic.update(ShowStyleBaseHandler.name, testShowStyleBase as ShowStyleBaseExt) + handlers.showStyleBaseHandler.notify(testShowStyleBase as ShowStyleBaseExt) const testPieceInstances: PartialDeep = { currentPartInstance: [], @@ -44,11 +51,11 @@ describe('ActivePiecesTopic', () => { }), ] as PieceInstance[], } - await topic.update(PieceInstancesHandler.name, testPieceInstances as SelectedPieceInstances) + handlers.pieceInstancesHandler.notify(testPieceInstances as SelectedPieceInstances) topic.addSubscriber(mockSubscriber) - const expectedStatus: PartialDeep = { + const expectedStatus: PartialDeep = { event: 'activePieces', activePieces: [ diff --git a/packages/live-status-gateway/src/topics/__tests__/activePlaylist.spec.ts b/packages/live-status-gateway/src/topics/__tests__/activePlaylist.spec.ts index b9b1af95b3..702ee867c6 100644 --- a/packages/live-status-gateway/src/topics/__tests__/activePlaylist.spec.ts +++ b/packages/live-status-gateway/src/topics/__tests__/activePlaylist.spec.ts @@ -1,18 +1,25 @@ -import { ActivePlaylistStatus, ActivePlaylistTopic } from '../activePlaylistTopic' -import { makeMockLogger, makeMockSubscriber, makeTestPlaylist, makeTestShowStyleBase } from './utils' -import { PlaylistHandler } from '../../collections/playlistHandler' -import { ShowStyleBaseExt, ShowStyleBaseHandler } from '../../collections/showStyleBaseHandler' -import { PartInstancesHandler, SelectedPartInstances } from '../../collections/partInstancesHandler' +import { ActivePlaylistTopic } from '../activePlaylistTopic.js' +import { + makeMockHandlers, + makeMockLogger, + makeMockSubscriber, + makeTestPlaylist, + makeTestShowStyleBase, +} from './utils.js' +import { ShowStyleBaseExt } from '../../collections/showStyleBaseHandler.js' +import { SelectedPartInstances } from '../../collections/partInstancesHandler.js' import { protectString, unprotectString, unprotectStringArray } from '@sofie-automation/server-core-integration/dist' import { PartialDeep } from 'type-fest' import { literal } from '@sofie-automation/corelib/dist/lib' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' -import { PartsHandler } from '../../collections/partsHandler' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' -import { SegmentHandler } from '../../collections/segmentHandler' import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment' import { CountdownType } from '@sofie-automation/blueprints-integration' -import { PlaylistTimingType } from '@sofie-automation/blueprints-integration' +import { + ActivePlaylistEvent, + ActivePlaylistTimingMode, + SegmentCountdownType, +} from '@sofie-automation/live-status-gateway-api' function makeEmptyTestPartInstances(): SelectedPartInstances { return { @@ -26,32 +33,34 @@ function makeEmptyTestPartInstances(): SelectedPartInstances { describe('ActivePlaylistTopic', () => { it('notifies subscribers', async () => { - const topic = new ActivePlaylistTopic(makeMockLogger()) + const handlers = makeMockHandlers() + const topic = new ActivePlaylistTopic(makeMockLogger(), handlers) const mockSubscriber = makeMockSubscriber() const playlist = makeTestPlaylist() playlist.activationId = protectString('somethingRandom') - await topic.update(PlaylistHandler.name, playlist) + handlers.playlistHandler.notify(playlist) const testShowStyleBase = makeTestShowStyleBase() - await topic.update(ShowStyleBaseHandler.name, testShowStyleBase as ShowStyleBaseExt) + handlers.showStyleBaseHandler.notify(testShowStyleBase as ShowStyleBaseExt) const testPartInstancesMap = makeEmptyTestPartInstances() - await topic.update(PartInstancesHandler.name, testPartInstancesMap) + handlers.partInstancesHandler.notify(testPartInstancesMap) topic.addSubscriber(mockSubscriber) - const expectedStatus: ActivePlaylistStatus = { + const expectedStatus: ActivePlaylistEvent = { event: 'activePlaylist', name: playlist.name, id: unprotectString(playlist._id), + externalId: 'NCS_PLAYLIST_1', currentPart: null, nextPart: null, currentSegment: null, rundownIds: unprotectStringArray(playlist.rundownIdsInOrder), publicData: undefined, timing: { - timingMode: PlaylistTimingType.None, + timingMode: ActivePlaylistTimingMode.NONE, }, quickLoop: undefined, } @@ -64,7 +73,8 @@ describe('ActivePlaylistTopic', () => { }) it('provides segment and part', async () => { - const topic = new ActivePlaylistTopic(makeMockLogger()) + const handlers = makeMockHandlers() + const topic = new ActivePlaylistTopic(makeMockLogger(), handlers) const mockSubscriber = makeMockSubscriber() const currentPartInstanceId = 'CURRENT_PART_INSTANCE_ID' @@ -77,12 +87,11 @@ describe('ActivePlaylistTopic', () => { partInstanceId: protectString(currentPartInstanceId), rundownId: playlist.rundownIdsInOrder[0], } - await topic.update(PlaylistHandler.name, playlist) + handlers.playlistHandler.notify(playlist) const testShowStyleBase = makeTestShowStyleBase() - await topic.update(ShowStyleBaseHandler.name, testShowStyleBase as ShowStyleBaseExt) - const segment1id = protectString('SEGMENT_1') + handlers.showStyleBaseHandler.notify(testShowStyleBase as ShowStyleBaseExt) const part1: Partial = { _id: protectString('PART_1'), title: 'Test Part', @@ -107,20 +116,21 @@ describe('ActivePlaylistTopic', () => { }), ] as DBPartInstance[], } - await topic.update(PartInstancesHandler.name, testPartInstances as SelectedPartInstances) + handlers.partInstancesHandler.notify(testPartInstances as SelectedPartInstances) - await topic.update(PartsHandler.name, [part1] as DBPart[]) + handlers.partsHandler.notify([part1] as DBPart[]) - await topic.update(SegmentHandler.name, { + handlers.segmentHandler.notify({ _id: segment1id, } as DBSegment) topic.addSubscriber(mockSubscriber) - const expectedStatus: ActivePlaylistStatus = { + const expectedStatus: ActivePlaylistEvent = { event: 'activePlaylist', name: playlist.name, id: unprotectString(playlist._id), + externalId: 'NCS_PLAYLIST_1', currentPart: { id: 'PART_1', name: 'Test Part', @@ -137,11 +147,21 @@ describe('ActivePlaylistTopic', () => { expectedDurationMs: 10000, projectedEndTime: 1600000070000, }, + parts: [ + { + id: 'PART_1', + name: 'Test Part', + timing: { + expectedDurationMs: 10000, + }, + autoNext: undefined, + }, + ], }, rundownIds: unprotectStringArray(playlist.rundownIdsInOrder), publicData: { a: 'b' }, timing: { - timingMode: PlaylistTimingType.None, + timingMode: ActivePlaylistTimingMode.NONE, }, quickLoop: undefined, } @@ -154,7 +174,8 @@ describe('ActivePlaylistTopic', () => { }) it('provides segment and part with segment timing', async () => { - const topic = new ActivePlaylistTopic(makeMockLogger()) + const handlers = makeMockHandlers() + const topic = new ActivePlaylistTopic(makeMockLogger(), handlers) const mockSubscriber = makeMockSubscriber() const currentPartInstanceId = 'CURRENT_PART_INSTANCE_ID' @@ -167,10 +188,10 @@ describe('ActivePlaylistTopic', () => { partInstanceId: protectString(currentPartInstanceId), rundownId: playlist.rundownIdsInOrder[0], } - await topic.update(PlaylistHandler.name, playlist) + handlers.playlistHandler.notify(playlist) const testShowStyleBase = makeTestShowStyleBase() - await topic.update(ShowStyleBaseHandler.name, testShowStyleBase as ShowStyleBaseExt) + handlers.showStyleBaseHandler.notify(testShowStyleBase as ShowStyleBaseExt) const segment1id = protectString('SEGMENT_1') const part1: Partial = { @@ -198,21 +219,22 @@ describe('ActivePlaylistTopic', () => { }), ] as DBPartInstance[], } - await topic.update(PartInstancesHandler.name, testPartInstances as SelectedPartInstances) + handlers.partInstancesHandler.notify(testPartInstances as SelectedPartInstances) - await topic.update(PartsHandler.name, [part1] as DBPart[]) + handlers.partsHandler.notify([part1] as DBPart[]) - await topic.update(SegmentHandler.name, { + handlers.segmentHandler.notify({ _id: segment1id, segmentTiming: { budgetDuration: 12300, countdownType: CountdownType.SEGMENT_BUDGET_DURATION }, } as DBSegment) topic.addSubscriber(mockSubscriber) - const expectedStatus: ActivePlaylistStatus = { + const expectedStatus: ActivePlaylistEvent = { event: 'activePlaylist', name: playlist.name, id: unprotectString(playlist._id), + externalId: 'NCS_PLAYLIST_1', currentPart: { id: 'PART_1', name: 'Test Part', @@ -229,13 +251,23 @@ describe('ActivePlaylistTopic', () => { expectedDurationMs: 10000, budgetDurationMs: 12300, projectedEndTime: 1600000072300, - countdownType: 'segment_budget_duration', + countdownType: SegmentCountdownType.SEGMENT_BUDGET_DURATION, }, + parts: [ + { + id: 'PART_1', + name: 'Test Part', + timing: { + expectedDurationMs: 10000, + }, + autoNext: undefined, + }, + ], }, rundownIds: unprotectStringArray(playlist.rundownIdsInOrder), publicData: { a: 'b' }, timing: { - timingMode: PlaylistTimingType.None, + timingMode: ActivePlaylistTimingMode.NONE, }, quickLoop: undefined, } diff --git a/packages/live-status-gateway/src/topics/__tests__/adLibs.spec.ts b/packages/live-status-gateway/src/topics/__tests__/adLibs.spec.ts index 48d25ea994..f91bf542dc 100644 --- a/packages/live-status-gateway/src/topics/__tests__/adLibs.spec.ts +++ b/packages/live-status-gateway/src/topics/__tests__/adLibs.spec.ts @@ -1,13 +1,17 @@ import { protectString, unprotectString } from '@sofie-automation/server-core-integration' -import { makeMockLogger, makeMockSubscriber, makeTestParts, makeTestPlaylist, makeTestShowStyleBase } from './utils' -import { AdLibsStatus, AdLibsTopic } from '../adLibsTopic' -import { PlaylistHandler } from '../../collections/playlistHandler' -import { ShowStyleBaseExt, ShowStyleBaseHandler } from '../../collections/showStyleBaseHandler' +import { + makeMockHandlers, + makeMockLogger, + makeMockSubscriber, + makeTestParts, + makeTestPlaylist, + makeTestShowStyleBase, +} from './utils.js' +import { AdLibsTopic } from '../adLibsTopic.js' +import { ShowStyleBaseExt } from '../../collections/showStyleBaseHandler.js' import { AdLibAction } from '@sofie-automation/corelib/dist/dataModel/AdlibAction' import { RundownBaselineAdLibAction } from '@sofie-automation/corelib/dist/dataModel/RundownBaselineAdLibAction' -import { AdLibActionsHandler } from '../../collections/adLibActionsHandler' -import { GlobalAdLibActionsHandler } from '../../collections/globalAdLibActionsHandler' -import { PartsHandler } from '../../collections/partsHandler' +import { AdLibsEvent } from '@sofie-automation/live-status-gateway-api' function makeTestAdLibActions(): AdLibAction[] { return [ @@ -52,32 +56,33 @@ function makeTestGlobalAdLibActions(): RundownBaselineAdLibAction[] { ] } -describe('ActivePlaylistTopic', () => { +describe('AdLibsTopic', () => { it('notifies subscribers', async () => { - const topic = new AdLibsTopic(makeMockLogger()) + const handlers = makeMockHandlers() + const topic = new AdLibsTopic(makeMockLogger(), handlers) const mockSubscriber = makeMockSubscriber() const playlist = makeTestPlaylist() playlist.activationId = protectString('somethingRandom') - await topic.update(PlaylistHandler.name, playlist) + handlers.playlistHandler.notify(playlist) const parts = makeTestParts() - await topic.update(PartsHandler.name, parts) + handlers.partsHandler.notify(parts) const testShowStyleBase = makeTestShowStyleBase() - await topic.update(ShowStyleBaseHandler.name, testShowStyleBase as ShowStyleBaseExt) + handlers.showStyleBaseHandler.notify(testShowStyleBase as ShowStyleBaseExt) const testAdLibActions = makeTestAdLibActions() - await topic.update(AdLibActionsHandler.name, testAdLibActions) + handlers.adLibActionsHandler.notify(testAdLibActions) const testGlobalAdLibActions = makeTestGlobalAdLibActions() - await topic.update(GlobalAdLibActionsHandler.name, testGlobalAdLibActions) + handlers.globalAdLibActionsHandler.notify(testGlobalAdLibActions) // TODO: AdLibPieces and Global AdLibPieces topic.addSubscriber(mockSubscriber) - const expectedStatus: AdLibsStatus = { + const expectedStatus: AdLibsEvent = { event: 'adLibs', rundownPlaylistId: unprotectString(playlist._id), adLibs: [ diff --git a/packages/live-status-gateway/src/topics/__tests__/bucketsTopic.spec.ts b/packages/live-status-gateway/src/topics/__tests__/bucketsTopic.spec.ts new file mode 100644 index 0000000000..f68e4f173f --- /dev/null +++ b/packages/live-status-gateway/src/topics/__tests__/bucketsTopic.spec.ts @@ -0,0 +1,145 @@ +import { protectString } from '@sofie-automation/server-core-integration' +import { + makeMockHandlers, + makeMockLogger, + makeMockSubscriber, + makeTestParts, + makeTestPlaylist, + makeTestShowStyleBase, +} from './utils.js' +import { ShowStyleBaseExt } from '../../collections/showStyleBaseHandler.js' +import { BucketsTopic } from '../bucketsTopic.js' +import { BucketAdLibAction } from '@sofie-automation/corelib/dist/dataModel/BucketAdLibAction' +import { RundownImportVersions } from '@sofie-automation/corelib/dist/dataModel/Rundown' +import { BucketAdLib, BucketAdLibIngestInfo } from '@sofie-automation/corelib/dist/dataModel/BucketAdLibPiece' +import { PieceLifespan } from '@sofie-automation/blueprints-integration' +import { Bucket } from '@sofie-automation/corelib/dist/dataModel/Bucket' +import { BucketsEvent } from '@sofie-automation/live-status-gateway-api' + +describe('BucketsTopic', () => { + it('notifies subscribers', async () => { + const handlers = makeMockHandlers() + const topic = new BucketsTopic(makeMockLogger(), handlers) + const mockSubscriber = makeMockSubscriber() + + const playlist = makeTestPlaylist() + playlist.activationId = protectString('somethingRandom') + handlers.playlistHandler.notify(playlist) + + const parts = makeTestParts() + handlers.partsHandler.notify(parts) + + const testShowStyleBase = makeTestShowStyleBase() + handlers.showStyleBaseHandler.notify(testShowStyleBase as ShowStyleBaseExt) + + const testBuckets = makeTestBuckets() + handlers.bucketsHandler.notify(testBuckets) + + const testAdLibActions = makeTestAdLibActions() + handlers.bucketAdLibActionsHandler.notify(testAdLibActions) + + const testGlobalAdLibActions = makeTestAdLibs() + handlers.bucketAdLibsHandler.notify(testGlobalAdLibActions) + + topic.addSubscriber(mockSubscriber) + + const expectedStatus: BucketsEvent = { + event: 'buckets', + buckets: [ + { + id: 'BUCKET_0', + name: 'A Bucket', + adLibs: [ + { + actionType: [], + id: 'ADLIB_0', + name: 'Bucket AdLib', + outputLayer: 'PGM', + sourceLayer: 'Layer 0', + tags: ['adlib_tag'], + publicData: { c: 'd' }, + externalId: 'BUCKET_ADLIB_0', + }, + { + actionType: [], + id: 'ACTION_0', + name: 'Bucket Action', + outputLayer: 'PGM', + sourceLayer: 'Layer 0', + tags: ['adlib_action_tag'], + publicData: { a: 'b' }, + externalId: 'BUCKET_ACTION_0', + }, + ], + }, + ], + } + + // eslint-disable-next-line @typescript-eslint/unbound-method + expect(mockSubscriber.send).toHaveBeenCalledTimes(1) + expect(JSON.parse(mockSubscriber.send.mock.calls[0][0] as string)).toMatchObject(expectedStatus) + }) +}) + +function makeTestAdLibActions(): BucketAdLibAction[] { + return [ + { + _id: protectString('ACTION_0'), + actionId: 'ACTION_0', + bucketId: protectString('BUCKET_0'), + studioId: protectString('STUDIO_0'), + importVersions: {} as RundownImportVersions, + ingestInfo: {} as BucketAdLibIngestInfo, + showStyleBaseId: protectString('SHOWSTYLE_0'), + showStyleVariantId: null, + display: { + content: {}, + label: { key: 'Bucket Action' }, + sourceLayerId: 'layer0', + outputLayerId: 'pgm', + tags: ['adlib_action_tag'], + }, + externalId: 'BUCKET_ACTION_0', + userData: {}, + userDataManifest: {}, + publicData: { a: 'b' }, + }, + ] +} + +function makeTestAdLibs(): BucketAdLib[] { + return [ + { + _id: protectString('ADLIB_0'), + bucketId: protectString('BUCKET_0'), + studioId: protectString('STUDIO_0'), + importVersions: {} as RundownImportVersions, + ingestInfo: {} as BucketAdLibIngestInfo, + showStyleBaseId: protectString('SHOWSTYLE_0'), + showStyleVariantId: null, + externalId: 'BUCKET_ADLIB_0', + _rank: 0, + content: {}, + lifespan: PieceLifespan.WithinPart, + name: 'Bucket AdLib', + outputLayerId: 'pgm', + sourceLayerId: 'layer0', + publicData: { c: 'd' }, + timelineObjectsString: protectString(''), + tags: ['adlib_tag'], + }, + ] +} + +function makeTestBuckets(): Bucket[] { + return [ + { + _id: protectString('BUCKET_0'), + studioId: protectString('STUDIO_0'), + _rank: 0, + name: 'A Bucket', + buttonHeightScale: 1, + buttonWidthScale: 1, + }, + ] +} diff --git a/packages/live-status-gateway/src/topics/__tests__/packagesTopic.spec.ts b/packages/live-status-gateway/src/topics/__tests__/packagesTopic.spec.ts new file mode 100644 index 0000000000..5045e74e7c --- /dev/null +++ b/packages/live-status-gateway/src/topics/__tests__/packagesTopic.spec.ts @@ -0,0 +1,80 @@ +import { protectString, unprotectString } from '@sofie-automation/server-core-integration' +import { makeMockHandlers, makeMockLogger, makeMockSubscriber } from './utils.js' +import { PackagesTopic } from '../packagesTopic.js' +import { UIPieceContentStatus } from '@sofie-automation/corelib/dist/dataModel/PieceContentStatus' +import { PieceStatusCode } from '@sofie-automation/corelib/dist/dataModel/Piece' +import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' +import { PackagesEvent, PackageStatus } from '@sofie-automation/live-status-gateway-api' + +function makeTestUIPieceContentStatuses(): UIPieceContentStatus[] { + return [ + { + pieceId: protectString('PIECE_0'), + rundownId: protectString('RUNDOWN_0'), + partId: protectString('PART_0'), + segmentId: protectString('SEGMENT_0'), + status: { + packageName: 'Test Package', + status: PieceStatusCode.OK, + thumbnailUrl: 'http://example.com/thumbnail.jpg', + previewUrl: 'http://example.com/preview.mp4', + blacks: [], + contentDuration: 5, + freezes: [], + messages: [], + progress: 0, + scenes: [], + }, + _id: protectString('PIECE_CONTENT_STATUS_0'), + segmentRank: 0, + partRank: 0, + isPieceInstance: false, + name: '', + segmentName: 'Segment', + }, + ] +} + +function makeTestPlaylist(): DBRundownPlaylist { + return { + _id: protectString('PLAYLIST_0'), + activationId: protectString('ACTIVATION_0'), + } as DBRundownPlaylist +} + +describe('PackagesTopic', () => { + it('notifies subscribers', async () => { + const handlers = makeMockHandlers() + const topic = new PackagesTopic(makeMockLogger(), handlers) + const mockSubscriber = makeMockSubscriber() + + const playlist = makeTestPlaylist() + handlers.playlistHandler.notify(playlist) + + const testUIPieceContentStatuses = makeTestUIPieceContentStatuses() + handlers.pieceContentStatusesHandler.notify(testUIPieceContentStatuses) + + topic.addSubscriber(mockSubscriber) + + const expectedStatus: PackagesEvent = { + event: 'packages', + rundownPlaylistId: unprotectString(playlist._id), + packages: [ + { + packageName: 'Test Package', + status: PackageStatus.OK, + pieceOrAdLibId: 'PIECE_0', + rundownId: 'RUNDOWN_0', + partId: 'PART_0', + segmentId: 'SEGMENT_0', + thumbnailUrl: 'http://example.com/thumbnail.jpg', + previewUrl: 'http://example.com/preview.mp4', + }, + ], + } + + // eslint-disable-next-line @typescript-eslint/unbound-method + expect(mockSubscriber.send).toHaveBeenCalledTimes(1) + expect(JSON.parse(mockSubscriber.send.mock.calls[0][0] as string)).toMatchObject(expectedStatus) + }) +}) diff --git a/packages/live-status-gateway/src/topics/__tests__/segmentsTopic.spec.ts b/packages/live-status-gateway/src/topics/__tests__/segmentsTopic.spec.ts index c26f1f1763..a59f1a4bc9 100644 --- a/packages/live-status-gateway/src/topics/__tests__/segmentsTopic.spec.ts +++ b/packages/live-status-gateway/src/topics/__tests__/segmentsTopic.spec.ts @@ -1,11 +1,9 @@ -import { SegmentsStatus, SegmentsTopic } from '../segmentsTopic' -import { PlaylistHandler } from '../../collections/playlistHandler' +import { SegmentsTopic } from '../segmentsTopic.js' import { protectString, unprotectString } from '@sofie-automation/server-core-integration' -import { SegmentsHandler } from '../../collections/segmentsHandler' import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment' -import { makeMockLogger, makeMockSubscriber, makeTestPlaylist } from './utils' +import { makeMockHandlers, makeMockLogger, makeMockSubscriber, makeTestPlaylist } from './utils.js' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' -import { PartsHandler } from '../../collections/partsHandler' +import { SegmentsEvent } from '@sofie-automation/live-status-gateway-api' const RUNDOWN_1_ID = 'RUNDOWN_1' const RUNDOWN_2_ID = 'RUNDOWN_2' @@ -50,12 +48,13 @@ describe('SegmentsTopic', () => { }) it('notifies added subscribers immediately', async () => { - const topic = new SegmentsTopic(makeMockLogger()) + const handlers = makeMockHandlers() + const topic = new SegmentsTopic(makeMockLogger(), handlers) const mockSubscriber = makeMockSubscriber() topic.addSubscriber(mockSubscriber) - const expectedStatus: SegmentsStatus = { + const expectedStatus: SegmentsEvent = { event: 'segments', rundownPlaylistId: null, segments: [], @@ -65,38 +64,41 @@ describe('SegmentsTopic', () => { }) it('notifies subscribers when playlist changes from null', async () => { - const topic = new SegmentsTopic(makeMockLogger()) + const handlers = makeMockHandlers() + const topic = new SegmentsTopic(makeMockLogger(), handlers) const mockSubscriber = makeMockSubscriber() topic.addSubscriber(mockSubscriber) mockSubscriber.send.mockClear() const testPlaylist = makeTestPlaylist() - await topic.update(PlaylistHandler.name, testPlaylist) + handlers.playlistHandler.notify(testPlaylist) - const expectedStatus: SegmentsStatus = { + const expectedStatus: SegmentsEvent = { event: 'segments', rundownPlaylistId: unprotectString(testPlaylist._id), segments: [], } + jest.advanceTimersByTime(THROTTLE_PERIOD_MS) expect(mockSubscriber.send.mock.calls).toEqual([[JSON.stringify(expectedStatus)]]) }) it('notifies subscribers when playlist id changes', async () => { - const topic = new SegmentsTopic(makeMockLogger()) + const handlers = makeMockHandlers() + const topic = new SegmentsTopic(makeMockLogger(), handlers) const mockSubscriber = makeMockSubscriber() const testPlaylist = makeTestPlaylist() - await topic.update(PlaylistHandler.name, testPlaylist) + handlers.playlistHandler.notify(testPlaylist) topic.addSubscriber(mockSubscriber) mockSubscriber.send.mockClear() const testPlaylist2 = makeTestPlaylist('PLAYLIST_2') - await topic.update(PlaylistHandler.name, testPlaylist2) + handlers.playlistHandler.notify(testPlaylist2) jest.advanceTimersByTime(THROTTLE_PERIOD_MS) - const expectedStatus2: SegmentsStatus = { + const expectedStatus2: SegmentsEvent = { event: 'segments', rundownPlaylistId: unprotectString(testPlaylist2._id), segments: [], @@ -104,45 +106,18 @@ describe('SegmentsTopic', () => { expect(mockSubscriber.send.mock.calls).toEqual([[JSON.stringify(expectedStatus2)]]) }) - it('does not notify subscribers when an unimportant property of the playlist changes', async () => { - const topic = new SegmentsTopic(makeMockLogger()) - const mockSubscriber = makeMockSubscriber() - - const testPlaylist = makeTestPlaylist() - await topic.update(PlaylistHandler.name, testPlaylist) - - topic.addSubscriber(mockSubscriber) - mockSubscriber.send.mockClear() - - const testPlaylist2 = makeTestPlaylist() - testPlaylist2.currentPartInfo = { - partInstanceId: protectString('PI_1'), - consumesQueuedSegmentId: true, - manuallySelected: false, - rundownId: protectString(RUNDOWN_1_ID), - } - testPlaylist2.name = 'Another Playlist' - testPlaylist2.startedPlayback = Date.now() - // ... this is enough to prove that it works as expected - - await topic.update(PlaylistHandler.name, testPlaylist2) - jest.advanceTimersByTime(THROTTLE_PERIOD_MS) - - // eslint-disable-next-line @typescript-eslint/unbound-method - expect(mockSubscriber.send).toHaveBeenCalledTimes(0) - }) - it('notifies subscribers when segments change', async () => { - const topic = new SegmentsTopic(makeMockLogger()) + const handlers = makeMockHandlers() + const topic = new SegmentsTopic(makeMockLogger(), handlers) const mockSubscriber = makeMockSubscriber() const testPlaylist = makeTestPlaylist() - await topic.update(PlaylistHandler.name, testPlaylist) + handlers.playlistHandler.notify(testPlaylist) topic.addSubscriber(mockSubscriber) mockSubscriber.send.mockClear() - await topic.update(SegmentsHandler.name, [ + handlers.segmentsHandler.notify([ makeTestSegment('2_1', 1, RUNDOWN_2_ID), makeTestSegment('2_2', 2, RUNDOWN_2_ID), makeTestSegment('1_2', 2, RUNDOWN_1_ID), @@ -150,7 +125,7 @@ describe('SegmentsTopic', () => { ]) jest.advanceTimersByTime(THROTTLE_PERIOD_MS) - const expectedStatus: SegmentsStatus = { + const expectedStatus: SegmentsEvent = { event: 'segments', rundownPlaylistId: unprotectString(testPlaylist._id), segments: [ @@ -188,12 +163,13 @@ describe('SegmentsTopic', () => { }) it('notifies subscribers when rundown order changes', async () => { - const topic = new SegmentsTopic(makeMockLogger()) + const handlers = makeMockHandlers() + const topic = new SegmentsTopic(makeMockLogger(), handlers) const mockSubscriber = makeMockSubscriber() const testPlaylist = makeTestPlaylist() - await topic.update(PlaylistHandler.name, testPlaylist) - await topic.update(SegmentsHandler.name, [ + handlers.playlistHandler.notify(testPlaylist) + handlers.segmentsHandler.notify([ makeTestSegment('2_1', 1, RUNDOWN_2_ID), makeTestSegment('2_2', 2, RUNDOWN_2_ID), makeTestSegment('1_2', 2, RUNDOWN_1_ID), @@ -205,10 +181,10 @@ describe('SegmentsTopic', () => { const testPlaylist2 = makeTestPlaylist() testPlaylist2.rundownIdsInOrder = [protectString(RUNDOWN_2_ID), protectString(RUNDOWN_1_ID)] - await topic.update(PlaylistHandler.name, testPlaylist2) + handlers.playlistHandler.notify(testPlaylist2) jest.advanceTimersByTime(THROTTLE_PERIOD_MS) - const expectedStatus: SegmentsStatus = { + const expectedStatus: SegmentsEvent = { event: 'segments', rundownPlaylistId: unprotectString(testPlaylist._id), segments: [ @@ -246,11 +222,12 @@ describe('SegmentsTopic', () => { }) it('exposes budgetDuration', async () => { - const topic = new SegmentsTopic(makeMockLogger()) + const handlers = makeMockHandlers() + const topic = new SegmentsTopic(makeMockLogger(), handlers) const mockSubscriber = makeMockSubscriber() const testPlaylist = makeTestPlaylist() - await topic.update(PlaylistHandler.name, testPlaylist) + handlers.playlistHandler.notify(testPlaylist) topic.addSubscriber(mockSubscriber) mockSubscriber.send.mockClear() @@ -258,14 +235,14 @@ describe('SegmentsTopic', () => { const segment_1_1_id = '1_1' const segment_1_2_id = '1_2' const segment_2_2_id = '2_2' - await topic.update(SegmentsHandler.name, [ + handlers.segmentsHandler.notify([ makeTestSegment('2_1', 1, RUNDOWN_2_ID), makeTestSegment(segment_2_2_id, 2, RUNDOWN_2_ID, { segmentTiming: { budgetDuration: 51000 } }), makeTestSegment(segment_1_2_id, 2, RUNDOWN_1_ID, { segmentTiming: { budgetDuration: 15000 } }), makeTestSegment(segment_1_1_id, 1, RUNDOWN_1_ID, { segmentTiming: { budgetDuration: 5000 } }), ]) mockSubscriber.send.mockClear() - await topic.update(PartsHandler.name, [ + handlers.partsHandler.notify([ makeTestPart('1_2_1', 1, RUNDOWN_1_ID, segment_1_2_id), makeTestPart('2_2_1', 1, RUNDOWN_1_ID, segment_2_2_id), makeTestPart('1_2_2', 2, RUNDOWN_1_ID, segment_1_2_id), @@ -276,7 +253,7 @@ describe('SegmentsTopic', () => { ]) jest.advanceTimersByTime(THROTTLE_PERIOD_MS) - const expectedStatus: SegmentsStatus = { + const expectedStatus: SegmentsEvent = { event: 'segments', rundownPlaylistId: unprotectString(testPlaylist._id), segments: [ @@ -319,11 +296,12 @@ describe('SegmentsTopic', () => { }) it('exposes expectedDuration', async () => { - const topic = new SegmentsTopic(makeMockLogger()) + const handlers = makeMockHandlers() + const topic = new SegmentsTopic(makeMockLogger(), handlers) const mockSubscriber = makeMockSubscriber() const testPlaylist = makeTestPlaylist() - await topic.update(PlaylistHandler.name, testPlaylist) + handlers.playlistHandler.notify(testPlaylist) topic.addSubscriber(mockSubscriber) mockSubscriber.send.mockClear() @@ -331,14 +309,14 @@ describe('SegmentsTopic', () => { const segment_1_1_id = '1_1' const segment_1_2_id = '1_2' const segment_2_2_id = '2_2' - await topic.update(SegmentsHandler.name, [ + handlers.segmentsHandler.notify([ makeTestSegment('2_1', 1, RUNDOWN_2_ID), makeTestSegment(segment_2_2_id, 2, RUNDOWN_2_ID), makeTestSegment(segment_1_2_id, 2, RUNDOWN_1_ID), makeTestSegment(segment_1_1_id, 1, RUNDOWN_1_ID), ]) mockSubscriber.send.mockClear() - await topic.update(PartsHandler.name, [ + handlers.partsHandler.notify([ makeTestPart('1_2_1', 1, RUNDOWN_1_ID, segment_1_2_id, { expectedDurationWithTransition: 10000, }), @@ -363,7 +341,7 @@ describe('SegmentsTopic', () => { ]) jest.advanceTimersByTime(THROTTLE_PERIOD_MS) - const expectedStatus: SegmentsStatus = { + const expectedStatus: SegmentsEvent = { event: 'segments', rundownPlaylistId: unprotectString(testPlaylist._id), segments: [ @@ -401,12 +379,13 @@ describe('SegmentsTopic', () => { }) it('includes segment identifier', async () => { - const topic = new SegmentsTopic(makeMockLogger()) + const handlers = makeMockHandlers() + const topic = new SegmentsTopic(makeMockLogger(), handlers) const mockSubscriber = makeMockSubscriber() const testPlaylist = makeTestPlaylist() - await topic.update(PlaylistHandler.name, testPlaylist) - await topic.update(SegmentsHandler.name, [ + handlers.playlistHandler.notify(testPlaylist) + handlers.segmentsHandler.notify([ { ...makeTestSegment('1_2', 2, RUNDOWN_1_ID), identifier: 'SomeIdentifier' }, makeTestSegment('1_1', 1, RUNDOWN_1_ID), ]) @@ -416,17 +395,17 @@ describe('SegmentsTopic', () => { const testPlaylist2 = makeTestPlaylist() testPlaylist2.rundownIdsInOrder = [protectString(RUNDOWN_2_ID), protectString(RUNDOWN_1_ID)] - await topic.update(PlaylistHandler.name, testPlaylist2) + handlers.playlistHandler.notify(testPlaylist2) jest.advanceTimersByTime(THROTTLE_PERIOD_MS) - const expectedStatus: SegmentsStatus = { + const expectedStatus: SegmentsEvent = { event: 'segments', rundownPlaylistId: unprotectString(testPlaylist._id), segments: [ { id: '1_1', rundownId: RUNDOWN_1_ID, name: 'Segment 1_1' }, { id: '1_2', rundownId: RUNDOWN_1_ID, name: 'Segment 1_2', identifier: 'SomeIdentifier' }, ], - } as SegmentsStatus + } as SegmentsEvent expect(JSON.parse(mockSubscriber.send.mock.calls[0][0] as string)).toMatchObject( JSON.parse(JSON.stringify(expectedStatus)) ) diff --git a/packages/live-status-gateway/src/topics/__tests__/utils.ts b/packages/live-status-gateway/src/topics/__tests__/utils.ts index f3fb929a09..576b1cb743 100644 --- a/packages/live-status-gateway/src/topics/__tests__/utils.ts +++ b/packages/live-status-gateway/src/topics/__tests__/utils.ts @@ -1,12 +1,12 @@ import { PlaylistTimingType } from '@sofie-automation/blueprints-integration/dist/documents/playlistTiming' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { protectString } from '@sofie-automation/shared-lib/dist/lib/protectedString' -// eslint-disable-next-line node/no-extraneous-import import { mock, MockProxy } from 'jest-mock-extended' -import { ShowStyleBaseExt } from '../../collections/showStyleBaseHandler' +import { ShowStyleBaseExt } from '../../collections/showStyleBaseHandler.js' import { Logger } from 'winston' import { WebSocket } from 'ws' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' +import { CollectionHandlers } from '../../liveStatusServer.js' const RUNDOWN_1_ID = 'RUNDOWN_1' const RUNDOWN_2_ID = 'RUNDOWN_2' @@ -58,3 +58,41 @@ export function makeTestParts(): DBPart[] { }, ] } + +export function makeMockHandlers(): CollectionHandlers { + return { + adLibActionsHandler: makeMockHandler(), + adLibsHandler: makeMockHandler(), + bucketAdLibActionsHandler: makeMockHandler(), + bucketAdLibsHandler: makeMockHandler(), + bucketsHandler: makeMockHandler(), + globalAdLibActionsHandler: makeMockHandler(), + globalAdLibsHandler: makeMockHandler(), + partHandler: makeMockHandler(), + partInstancesHandler: makeMockHandler(), + partsHandler: makeMockHandler(), + pieceContentStatusesHandler: makeMockHandler(), + pieceInstancesHandler: makeMockHandler(), + playlistHandler: makeMockHandler(), + playlistsHandler: makeMockHandler(), + rundownHandler: makeMockHandler(), + segmentHandler: makeMockHandler(), + segmentsHandler: makeMockHandler(), + showStyleBaseHandler: makeMockHandler(), + studioHandler: makeMockHandler(), + } as unknown as CollectionHandlers +} + +function makeMockHandler() { + const subscribers: Array<(data: unknown) => void> = [] + return { + subscribe: (callback: (data: unknown) => void) => { + subscribers.push(callback) + }, + notify: (data: unknown) => { + subscribers.forEach((callback) => { + callback(data) + }) + }, + } +} diff --git a/packages/live-status-gateway/src/topics/activePiecesTopic.ts b/packages/live-status-gateway/src/topics/activePiecesTopic.ts index fcb53adf4f..cbb4f909cb 100644 --- a/packages/live-status-gateway/src/topics/activePiecesTopic.ts +++ b/packages/live-status-gateway/src/topics/activePiecesTopic.ts @@ -1,115 +1,80 @@ import { Logger } from 'winston' import { WebSocket } from 'ws' import { unprotectString } from '@sofie-automation/shared-lib/dist/lib/protectedString' -import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { literal } from '@sofie-automation/shared-lib/dist/lib/lib' -import { WebSocketTopicBase, WebSocketTopic, CollectionObserver } from '../wsHandler' -import { PlaylistHandler } from '../collections/playlistHandler' -import { ShowStyleBaseExt, ShowStyleBaseHandler } from '../collections/showStyleBaseHandler' -import _ = require('underscore') -import { SelectedPieceInstances, PieceInstancesHandler, PieceInstanceMin } from '../collections/pieceInstancesHandler' -import { PieceStatus, toPieceStatus } from './helpers/pieceStatus' +import { WebSocketTopicBase, WebSocketTopic } from '../wsHandler.js' +import { ShowStyleBaseExt } from '../collections/showStyleBaseHandler.js' +import { SelectedPieceInstances, PieceInstanceMin } from '../collections/pieceInstancesHandler.js' +import { toPieceStatus } from './helpers/pieceStatus.js' import { RundownPlaylistId } from '@sofie-automation/corelib/dist/dataModel/Ids' +import { CollectionHandlers } from '../liveStatusServer.js' +import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' +import { PickKeys } from '@sofie-automation/shared-lib/dist/lib/types' +import { ActivePiecesEvent } from '@sofie-automation/live-status-gateway-api' const THROTTLE_PERIOD_MS = 100 -export interface ActivePiecesStatus { - event: 'activePieces' - rundownPlaylistId: string | null - activePieces: PieceStatus[] -} +const PLAYLIST_KEYS = ['_id', 'activationId'] as const +type Playlist = PickKeys -export class ActivePiecesTopic - extends WebSocketTopicBase - implements - WebSocketTopic, - CollectionObserver, - CollectionObserver, - CollectionObserver -{ - public observerName = ActivePiecesTopic.name +const PIECE_INSTANCES_KEYS = ['active'] as const +type PieceInstances = PickKeys + +export class ActivePiecesTopic extends WebSocketTopicBase implements WebSocketTopic { private _activePlaylistId: RundownPlaylistId | undefined private _activePieceInstances: PieceInstanceMin[] | undefined private _showStyleBaseExt: ShowStyleBaseExt | undefined - private throttledSendStatusToAll: () => void - constructor(logger: Logger) { - super(ActivePiecesTopic.name, logger) - this.throttledSendStatusToAll = _.throttle(this.sendStatusToAll.bind(this), THROTTLE_PERIOD_MS, { - leading: false, - trailing: true, - }) - } + constructor(logger: Logger, handlers: CollectionHandlers) { + super(ActivePiecesTopic.name, logger, THROTTLE_PERIOD_MS) - addSubscriber(ws: WebSocket): void { - super.addSubscriber(ws) - this.sendStatus([ws]) + handlers.playlistHandler.subscribe(this.onPlaylistUpdate, PLAYLIST_KEYS) + handlers.showStyleBaseHandler.subscribe(this.onShowStyleBaseUpdate) + handlers.pieceInstancesHandler.subscribe(this.onPieceInstancesUpdate, PIECE_INSTANCES_KEYS) } sendStatus(subscribers: Iterable): void { const message = this._activePlaylistId - ? literal({ + ? literal({ event: 'activePieces', rundownPlaylistId: unprotectString(this._activePlaylistId), activePieces: this._activePieceInstances?.map((piece) => toPieceStatus(piece, this._showStyleBaseExt)) ?? [], - }) - : literal({ + }) + : literal({ event: 'activePieces', rundownPlaylistId: null, activePieces: [], - }) + }) this.sendMessage(subscribers, message) } - async update( - source: string, - data: DBRundownPlaylist | ShowStyleBaseExt | SelectedPieceInstances | undefined - ): Promise { - let hasAnythingChanged = false - switch (source) { - case PlaylistHandler.name: { - const rundownPlaylist = data ? (data as DBRundownPlaylist) : undefined - this._logger.info( - `${this._name} received playlist update ${rundownPlaylist?._id}, activationId ${rundownPlaylist?.activationId}` - ) - const previousActivePlaylistId = this._activePlaylistId - this._activePlaylistId = unprotectString(rundownPlaylist?.activationId) - ? rundownPlaylist?._id - : undefined + private onShowStyleBaseUpdate = (showStyleBase: ShowStyleBaseExt | undefined): void => { + this.logUpdateReceived('showStyleBase') + this._showStyleBaseExt = showStyleBase + this.throttledSendStatusToAll() + } - if (previousActivePlaylistId !== this._activePlaylistId) { - hasAnythingChanged = true - } - break - } - case ShowStyleBaseHandler.name: { - const showStyleBaseExt = data ? (data as ShowStyleBaseExt) : undefined - this._logger.info(`${this._name} received showStyleBase update from ${source}`) - this._showStyleBaseExt = showStyleBaseExt - hasAnythingChanged = true - break - } - case PieceInstancesHandler.name: { - const pieceInstances = data as SelectedPieceInstances - this._logger.info(`${this._name} received pieceInstances update from ${source}`) - if (pieceInstances.active !== this._activePieceInstances) { - hasAnythingChanged = true - } - this._activePieceInstances = pieceInstances.active - break - } - default: - throw new Error(`${this._name} received unsupported update from ${source}}`) - } + private onPlaylistUpdate = (rundownPlaylist: Playlist | undefined): void => { + this.logUpdateReceived( + 'playlist', + `rundownPlaylistId ${rundownPlaylist?._id}, activationId ${rundownPlaylist?.activationId}` + ) + const previousActivePlaylistId = this._activePlaylistId + this._activePlaylistId = unprotectString(rundownPlaylist?.activationId) ? rundownPlaylist?._id : undefined - if (hasAnythingChanged) { + if (previousActivePlaylistId !== this._activePlaylistId) { this.throttledSendStatusToAll() } } - private sendStatusToAll() { - this.sendStatus(this._subscribers) + private onPieceInstancesUpdate = (pieceInstances: PieceInstances | undefined): void => { + this.logUpdateReceived('pieceInstances') + const prevPieceInstances = this._activePieceInstances + this._activePieceInstances = pieceInstances?.active + if (prevPieceInstances !== this._activePieceInstances) { + this.throttledSendStatusToAll() + } } } diff --git a/packages/live-status-gateway/src/topics/activePlaylistTopic.ts b/packages/live-status-gateway/src/topics/activePlaylistTopic.ts index b557a4e1d9..f1f29c940d 100644 --- a/packages/live-status-gateway/src/topics/activePlaylistTopic.ts +++ b/packages/live-status-gateway/src/topics/activePlaylistTopic.ts @@ -8,89 +8,62 @@ import { } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' import { assertNever, literal } from '@sofie-automation/shared-lib/dist/lib/lib' -import { WebSocketTopicBase, WebSocketTopic, CollectionObserver } from '../wsHandler' -import { SelectedPartInstances, PartInstancesHandler } from '../collections/partInstancesHandler' -import { PlaylistHandler } from '../collections/playlistHandler' -import { ShowStyleBaseExt, ShowStyleBaseHandler } from '../collections/showStyleBaseHandler' -import { CurrentSegmentTiming, calculateCurrentSegmentTiming } from './helpers/segmentTiming' +import { SelectedPartInstances } from '../collections/partInstancesHandler.js' +import { ShowStyleBaseExt } from '../collections/showStyleBaseHandler.js' +import { WebSocketTopicBase, WebSocketTopic } from '../wsHandler.js' +import { calculateCurrentSegmentTiming } from './helpers/segmentTiming.js' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' -import { PartsHandler } from '../collections/partsHandler' -import _ = require('underscore') -import { PartTiming, calculateCurrentPartTiming } from './helpers/partTiming' -import { SelectedPieceInstances, PieceInstancesHandler, PieceInstanceMin } from '../collections/pieceInstancesHandler' -import { PieceStatus, toPieceStatus } from './helpers/pieceStatus' +import _ from 'underscore' +import { calculateCurrentPartTiming } from './helpers/partTiming.js' +import { getCurrentSegmentParts } from './helpers/segmentParts.js' +import { SelectedPieceInstances, PieceInstanceMin } from '../collections/pieceInstancesHandler.js' +import { toPieceStatus } from './helpers/pieceStatus.js' import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment' -import { SegmentHandler } from '../collections/segmentHandler' import { PlaylistTimingType } from '@sofie-automation/blueprints-integration' -import { SegmentsHandler } from '../collections/segmentsHandler' import { normalizeArray } from '@sofie-automation/corelib/dist/lib' +import { + PartStatus, + CurrentPartStatus, + CurrentSegment, + ActivePlaylistEvent, + ActivePlaylistTimingMode, + ActivePlaylistQuickLoop, + QuickLoopMarker as QuickLoopMarkerStatus, + QuickLoopMarkerType as QuickLoopMarkerStatusType, +} from '@sofie-automation/live-status-gateway-api' + +import { CollectionHandlers } from '../liveStatusServer.js' +import areElementsShallowEqual from '@sofie-automation/shared-lib/dist/lib/isShallowEqual' +import { PickKeys } from '@sofie-automation/shared-lib/dist/lib/types' const THROTTLE_PERIOD_MS = 100 -interface PartStatus { - id: string - segmentId: string - name: string - autoNext: boolean | undefined - pieces: PieceStatus[] - publicData: unknown -} +const PLAYLIST_KEYS = [ + '_id', + 'externalId', + 'activationId', + 'name', + 'rundownIdsInOrder', + 'publicData', + 'currentPartInfo', + 'nextPartInfo', + 'timing', + 'startedPlayback', + 'quickLoop', +] as const +type Playlist = PickKeys -interface CurrentPartStatus extends PartStatus { - timing: PartTiming -} +const PART_INSTANCES_KEYS = ['current', 'next', 'inCurrentSegment', 'firstInSegmentPlayout'] as const +type PartInstances = PickKeys -interface CurrentSegmentStatus { - id: string - timing: CurrentSegmentTiming -} +const PIECE_INSTANCES_KEYS = ['currentPartInstance', 'nextPartInstance'] as const +type PieceInstances = PickKeys -interface ActivePlaylistQuickLoopMarker { - type: 'playlist' | 'rundown' | 'segment' | 'part' - rundownId: string | undefined - segmentId: string | undefined - partId: string | undefined -} - -interface ActivePlaylistQuickLoopStatus { - locked: boolean - running: boolean - start: ActivePlaylistQuickLoopMarker | undefined - end: ActivePlaylistQuickLoopMarker | undefined -} - -export interface ActivePlaylistStatus { - event: string - id: string | null - name: string - rundownIds: string[] - currentPart: CurrentPartStatus | null - currentSegment: CurrentSegmentStatus | null - nextPart: PartStatus | null - quickLoop: ActivePlaylistQuickLoopStatus | undefined - publicData: unknown - timing: { - timingMode: PlaylistTimingType - startedPlayback?: number - expectedStart?: number - expectedDurationMs?: number - expectedEnd?: number - } -} +const SEGMENT_KEYS = ['_id', 'segmentTiming'] as const +type Segment = PickKeys -export class ActivePlaylistTopic - extends WebSocketTopicBase - implements - WebSocketTopic, - CollectionObserver, - CollectionObserver, - CollectionObserver, - CollectionObserver, - CollectionObserver, - CollectionObserver -{ - public observerName = ActivePlaylistTopic.name - private _activePlaylist: DBRundownPlaylist | undefined +export class ActivePlaylistTopic extends WebSocketTopicBase implements WebSocketTopic { + private _activePlaylist: Playlist | undefined private _currentPartInstance: DBPartInstance | undefined private _nextPartInstance: DBPartInstance | undefined private _firstInstanceInSegmentPlayout: DBPartInstance | undefined @@ -101,35 +74,37 @@ export class ActivePlaylistTopic private _pieceInstancesInCurrentPartInstance: PieceInstanceMin[] | undefined private _pieceInstancesInNextPartInstance: PieceInstanceMin[] | undefined private _showStyleBaseExt: ShowStyleBaseExt | undefined - private _currentSegment: DBSegment | undefined - private throttledSendStatusToAll: () => void - - constructor(logger: Logger) { - super(ActivePlaylistTopic.name, logger) - this.throttledSendStatusToAll = _.throttle(this.sendStatusToAll.bind(this), THROTTLE_PERIOD_MS, { - leading: false, - trailing: true, - }) - } + private _currentSegment: Segment | undefined + + constructor(logger: Logger, handlers: CollectionHandlers) { + super(ActivePlaylistTopic.name, logger, THROTTLE_PERIOD_MS) - addSubscriber(ws: WebSocket): void { - super.addSubscriber(ws) - this.sendStatus([ws]) + handlers.playlistHandler.subscribe(this.onPlaylistUpdate, PLAYLIST_KEYS) + handlers.partsHandler.subscribe(this.onPartsUpdate) + handlers.partInstancesHandler.subscribe(this.onPartInstancesUpdate, PART_INSTANCES_KEYS) + handlers.pieceInstancesHandler.subscribe(this.onPieceInstancesUpdate, PIECE_INSTANCES_KEYS) + handlers.showStyleBaseHandler.subscribe(this.onShowStyleBaseUpdate) + handlers.segmentHandler.subscribe(this.onSegmentUpdate, SEGMENT_KEYS) + handlers.segmentsHandler.subscribe(this.onSegmentsUpdate) } sendStatus(subscribers: Iterable): void { if (this.isDataInconsistent()) { // data is inconsistent, let's wait + this._logger.debug('Encountered inconsistent data.') return } const currentPart = this._currentPartInstance ? this._currentPartInstance.part : null const nextPart = this._nextPartInstance ? this._nextPartInstance.part : null + const currentSegmentParts = + (currentPart && this._partsBySegmentId[unprotectString(currentPart.segmentId)]) ?? [] const message = this._activePlaylist - ? literal({ + ? literal({ event: 'activePlaylist', id: unprotectString(this._activePlaylist._id), + externalId: this._activePlaylist.externalId, name: this._activePlaylist.name, rundownIds: this._activePlaylist.rundownIdsInOrder.map((r) => unprotectString(r)), currentPart: @@ -148,20 +123,24 @@ export class ActivePlaylistTopic toPieceStatus(piece, this._showStyleBaseExt) ) ?? [], publicData: currentPart.publicData, - }) + }) : null, currentSegment: this._currentPartInstance && currentPart && this._currentSegment - ? literal({ + ? literal({ id: unprotectString(currentPart.segmentId), timing: calculateCurrentSegmentTiming( - this._currentSegment, + this._currentSegment.segmentTiming, this._currentPartInstance, this._firstInstanceInSegmentPlayout, this._partInstancesInCurrentSegment, - this._partsBySegmentId[unprotectString(currentPart.segmentId)] ?? [] + currentSegmentParts ), - }) + parts: getCurrentSegmentParts( + this._partInstancesInCurrentSegment, + currentSegmentParts + ), + }) : null, nextPart: nextPart ? literal({ @@ -174,12 +153,12 @@ export class ActivePlaylistTopic toPieceStatus(piece, this._showStyleBaseExt) ) ?? [], publicData: nextPart.publicData, - }) + }) : null, quickLoop: this.transformQuickLoopStatus(), publicData: this._activePlaylist.publicData, timing: { - timingMode: this._activePlaylist.timing.type, + timingMode: translatePlaylistTimingType(this._activePlaylist.timing.type), startedPlayback: this._activePlaylist.startedPlayback, expectedDurationMs: this._activePlaylist.timing.expectedDuration, expectedStart: @@ -191,10 +170,11 @@ export class ActivePlaylistTopic ? this._activePlaylist.timing.expectedEnd : undefined, }, - }) - : literal({ + }) + : literal({ event: 'activePlaylist', id: null, + externalId: null, name: '', rundownIds: [], currentPart: null, @@ -203,14 +183,14 @@ export class ActivePlaylistTopic quickLoop: undefined, publicData: undefined, timing: { - timingMode: PlaylistTimingType.None, + timingMode: ActivePlaylistTimingMode.NONE, }, - }) + }) this.sendMessage(subscribers, message) } - private transformQuickLoopStatus(): ActivePlaylistQuickLoopStatus | undefined { + private transformQuickLoopStatus(): ActivePlaylistQuickLoop | undefined { if (!this._activePlaylist) return const quickLoopProps = this._activePlaylist.quickLoop @@ -224,22 +204,20 @@ export class ActivePlaylistTopic } } - private transformQuickLoopMarkerStatus( - marker: QuickLoopMarker | undefined - ): ActivePlaylistQuickLoopMarker | undefined { + private transformQuickLoopMarkerStatus(marker: QuickLoopMarker | undefined): QuickLoopMarkerStatus | undefined { if (!marker) return undefined switch (marker.type) { case QuickLoopMarkerType.PLAYLIST: return { - type: 'playlist', + markerType: QuickLoopMarkerStatusType.PLAYLIST, rundownId: undefined, segmentId: undefined, partId: undefined, } case QuickLoopMarkerType.RUNDOWN: return { - type: 'rundown', + markerType: QuickLoopMarkerStatusType.RUNDOWN, rundownId: unprotectString(marker.id), segmentId: undefined, partId: undefined, @@ -248,7 +226,7 @@ export class ActivePlaylistTopic const segment = this._segmentsById[unprotectString(marker.id)] return { - type: 'segment', + markerType: QuickLoopMarkerStatusType.SEGMENT, rundownId: unprotectString(segment?.rundownId), segmentId: unprotectString(marker.id), partId: undefined, @@ -258,7 +236,7 @@ export class ActivePlaylistTopic const part = this._partsById[unprotectString(marker.id)] return { - type: 'part', + markerType: QuickLoopMarkerStatusType.PART, rundownId: unprotectString(part?.rundownId), segmentId: unprotectString(part?.segmentId), partId: unprotectString(marker.id), @@ -282,94 +260,84 @@ export class ActivePlaylistTopic ) } - async update( - source: string, - data: - | DBRundownPlaylist - | ShowStyleBaseExt - | SelectedPartInstances - | DBPart[] - | SelectedPieceInstances - | DBSegment - | DBSegment[] - | undefined - ): Promise { - let hasAnythingChanged = false - switch (source) { - case PlaylistHandler.name: { - const rundownPlaylist = data ? (data as DBRundownPlaylist) : undefined - this.logUpdateReceived( - 'playlist', - source, - `rundownPlaylistId ${rundownPlaylist?._id}, activationId ${rundownPlaylist?.activationId}` - ) - this._activePlaylist = unprotectString(rundownPlaylist?.activationId) ? rundownPlaylist : undefined - hasAnythingChanged = true - break - } - case ShowStyleBaseHandler.name: { - const showStyleBaseExt = data ? (data as ShowStyleBaseExt) : undefined - this.logUpdateReceived('showStyleBase', source) - this._showStyleBaseExt = showStyleBaseExt - hasAnythingChanged = true - break - } - case PartInstancesHandler.name: { - const partInstances = data as SelectedPartInstances - this.logUpdateReceived( - 'partInstances', - source, - `${partInstances.inCurrentSegment.length} instances in segment` - ) - this._currentPartInstance = partInstances.current - this._nextPartInstance = partInstances.next - this._firstInstanceInSegmentPlayout = partInstances.firstInSegmentPlayout - this._partInstancesInCurrentSegment = partInstances.inCurrentSegment - hasAnythingChanged = true - break - } - case PartsHandler.name: { - this._partsById = normalizeArray(data as DBPart[], '_id') - this._partsBySegmentId = _.groupBy(data as DBPart[], 'segmentId') - this.logUpdateReceived('parts', source) - hasAnythingChanged = true // TODO: can this be smarter? - break - } - case PieceInstancesHandler.name: { - const pieceInstances = data as SelectedPieceInstances - this.logUpdateReceived('pieceInstances', source) - if ( - pieceInstances.currentPartInstance !== this._pieceInstancesInCurrentPartInstance || - pieceInstances.nextPartInstance !== this._pieceInstancesInNextPartInstance - ) { - hasAnythingChanged = true - } - this._pieceInstancesInCurrentPartInstance = pieceInstances.currentPartInstance - this._pieceInstancesInNextPartInstance = pieceInstances.nextPartInstance - break - } - case SegmentHandler.name: { - this._currentSegment = data as DBSegment - this.logUpdateReceived('segment', source) - hasAnythingChanged = true - break - } - case SegmentsHandler.name: { - this._segmentsById = normalizeArray(data as DBSegment[], '_id') - this.logUpdateReceived('segments', source) - hasAnythingChanged = true // TODO: can this be smarter? - break - } - default: - throw new Error(`${this._name} received unsupported update from ${source}}`) - } + private onPlaylistUpdate = (rundownPlaylist: Playlist | undefined): void => { + this.logUpdateReceived( + 'playlist', + `rundownPlaylistId ${rundownPlaylist?._id}, activationId ${rundownPlaylist?.activationId}` + ) + this._activePlaylist = unprotectString(rundownPlaylist?.activationId) ? rundownPlaylist : undefined - if (hasAnythingChanged) { + this.throttledSendStatusToAll() + } + + private onPartsUpdate = (parts: DBPart[] | undefined): void => { + const previousParts = this._partsBySegmentId + this._partsBySegmentId = _.groupBy(parts ?? [], 'segmentId') + this.logUpdateReceived('parts') + + const currentSegmentId = unprotectString(this._currentPartInstance?.segmentId) + if ( + currentSegmentId && + !areElementsShallowEqual( + previousParts[currentSegmentId] ?? [], + this._partsBySegmentId[currentSegmentId] ?? [] + ) + ) { + // we have to collect all the parts, but only when those from the current segment change, we should update status this.throttledSendStatusToAll() } } - private sendStatusToAll() { - this.sendStatus(this._subscribers) + private onPartInstancesUpdate = (partInstances: PartInstances | undefined): void => { + this.logUpdateReceived('partInstances', `${partInstances?.inCurrentSegment.length} instances in segment`) + + if (!partInstances) return + this._currentPartInstance = partInstances.current + this._nextPartInstance = partInstances.next + this._firstInstanceInSegmentPlayout = partInstances.firstInSegmentPlayout + this._partInstancesInCurrentSegment = partInstances.inCurrentSegment + this.throttledSendStatusToAll() + } + + private onPieceInstancesUpdate = (pieceInstances: PieceInstances | undefined): void => { + this.logUpdateReceived('pieceInstances') + if (!pieceInstances) return + + this._pieceInstancesInCurrentPartInstance = pieceInstances.currentPartInstance + this._pieceInstancesInNextPartInstance = pieceInstances.nextPartInstance + this.throttledSendStatusToAll() + } + + private onShowStyleBaseUpdate = (showStyleBase: ShowStyleBaseExt | undefined): void => { + this.logUpdateReceived('showStyleBase') + this._showStyleBaseExt = showStyleBase + this.throttledSendStatusToAll() + } + + private onSegmentUpdate = (segment: Segment | undefined): void => { + this.logUpdateReceived('segment') + this._currentSegment = segment + this.throttledSendStatusToAll() + } + + private onSegmentsUpdate = (segments: DBSegment[] | undefined): void => { + this.logUpdateReceived('segments') + this._segmentsById = segments ? normalizeArray(segments, '_id') : {} + this.throttledSendStatusToAll() // TODO: can this be smarter? + } +} + +function translatePlaylistTimingType(type: PlaylistTimingType): ActivePlaylistTimingMode { + switch (type) { + case PlaylistTimingType.None: + return ActivePlaylistTimingMode.NONE + case PlaylistTimingType.BackTime: + return ActivePlaylistTimingMode.BACK_MINUS_TIME + case PlaylistTimingType.ForwardTime: + return ActivePlaylistTimingMode.FORWARD_MINUS_TIME + default: + assertNever(type) + // Cast and return the value anyway, so that the application works + return type as any as ActivePlaylistTimingMode } } diff --git a/packages/live-status-gateway/src/topics/adLibsTopic.ts b/packages/live-status-gateway/src/topics/adLibsTopic.ts index f3f07b8557..9849f9184f 100644 --- a/packages/live-status-gateway/src/topics/adLibsTopic.ts +++ b/packages/live-status-gateway/src/topics/adLibsTopic.ts @@ -1,95 +1,54 @@ import { Logger } from 'winston' import { WebSocket } from 'ws' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' -import { WebSocketTopicBase, WebSocketTopic, CollectionObserver } from '../wsHandler' -import { PlaylistHandler } from '../collections/playlistHandler' +import { WebSocketTopicBase, WebSocketTopic } from '../wsHandler.js' import { literal } from '@sofie-automation/corelib/dist/lib' import { unprotectString } from '@sofie-automation/shared-lib/dist/lib/protectedString' -import _ = require('underscore') import { AdLibAction } from '@sofie-automation/corelib/dist/dataModel/AdlibAction' import { RundownBaselineAdLibAction } from '@sofie-automation/corelib/dist/dataModel/RundownBaselineAdLibAction' -import { AdLibActionsHandler } from '../collections/adLibActionsHandler' -import { GlobalAdLibActionsHandler } from '../collections/globalAdLibActionsHandler' import { AdLibPiece } from '@sofie-automation/corelib/dist/dataModel/AdLibPiece' import { RundownBaselineAdLibItem } from '@sofie-automation/corelib/dist/dataModel/RundownBaselineAdLibPiece' -import { IBlueprintActionManifestDisplayContent } from '@sofie-automation/blueprints-integration' -import { ShowStyleBaseExt, ShowStyleBaseHandler } from '../collections/showStyleBaseHandler' +import { IBlueprintActionManifestDisplayContent, JSONBlob } from '@sofie-automation/blueprints-integration' +import { ShowStyleBaseExt } from '../collections/showStyleBaseHandler.js' import { interpollateTranslation } from '@sofie-automation/corelib/dist/TranslatableMessage' -import { AdLibsHandler } from '../collections/adLibsHandler' -import { GlobalAdLibsHandler } from '../collections/globalAdLibsHandler' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' -import { PartsHandler } from '../collections/partsHandler' import { PartId, SegmentId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { WithSortingMetadata, getRank, sortContent } from './helpers/contentSorting' -import { isDeepStrictEqual } from 'util' +import { WithSortingMetadata, getRank, sortContent } from './helpers/contentSorting.js' import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment' -import { SegmentsHandler } from '../collections/segmentsHandler' +import { AdLibsEvent, AdLibActionType, AdLibStatus, GlobalAdLibStatus } from '@sofie-automation/live-status-gateway-api' +import { CollectionHandlers } from '../liveStatusServer.js' +import { PickKeys } from '@sofie-automation/shared-lib/dist/lib/types' const THROTTLE_PERIOD_MS = 100 -export interface AdLibsStatus { - event: 'adLibs' - rundownPlaylistId: string | null - adLibs: AdLibStatus[] - globalAdLibs: GlobalAdLibStatus[] -} - -interface AdLibActionType { - name: string - label: string -} - -interface AdLibStatus extends AdLibStatusBase { - segmentId: string - partId: string -} +const PLAYLIST_KEYS = ['_id', 'rundownIdsInOrder', 'activationId'] as const +type Playlist = PickKeys -type GlobalAdLibStatus = AdLibStatusBase +const SHOW_STYLE_BASE_KEYS = ['sourceLayerNamesById', 'outputLayerNamesById'] as const +type ShowStyle = PickKeys -interface AdLibStatusBase { - id: string - name: string - sourceLayer: string - outputLayer: string - actionType: AdLibActionType[] - tags?: string[] - publicData: unknown - optionsSchema?: any -} - -export class AdLibsTopic - extends WebSocketTopicBase - implements - WebSocketTopic, - CollectionObserver, - CollectionObserver, - CollectionObserver, - CollectionObserver, - CollectionObserver -{ - public observerName = AdLibsTopic.name - private _activePlaylist: DBRundownPlaylist | undefined +export class AdLibsTopic extends WebSocketTopicBase implements WebSocketTopic { + private _activePlaylist: Playlist | undefined private _sourceLayersMap: ReadonlyMap = new Map() private _outputLayersMap: ReadonlyMap = new Map() private _adLibActions: AdLibAction[] | undefined - private _abLibs: AdLibPiece[] | undefined + private _adLibs: AdLibPiece[] | undefined private _parts: ReadonlyMap = new Map() private _segments: ReadonlyMap = new Map() private _globalAdLibActions: RundownBaselineAdLibAction[] | undefined private _globalAdLibs: RundownBaselineAdLibItem[] | undefined - private throttledSendStatusToAll: () => void - constructor(logger: Logger) { - super(AdLibsTopic.name, logger) - this.throttledSendStatusToAll = _.throttle(this.sendStatusToAll.bind(this), THROTTLE_PERIOD_MS, { - leading: true, - trailing: true, - }) - } + constructor(logger: Logger, handlers: CollectionHandlers) { + super(AdLibsTopic.name, logger, THROTTLE_PERIOD_MS) - addSubscriber(ws: WebSocket): void { - super.addSubscriber(ws) - this.sendStatus([ws]) + handlers.playlistHandler.subscribe(this.onPlaylistUpdate, PLAYLIST_KEYS) + handlers.showStyleBaseHandler.subscribe(this.onShowStyleBaseUpdate, SHOW_STYLE_BASE_KEYS) + handlers.adLibActionsHandler.subscribe(this.onAdLibActionsUpdate) + handlers.adLibsHandler.subscribe(this.onAdLibsUpdate) + handlers.globalAdLibActionsHandler.subscribe(this.onGlobalAdLibActionsUpdate) + handlers.globalAdLibsHandler.subscribe(this.onGlobalAdLibsUpdate) + handlers.segmentsHandler.subscribe(this.onSegmentsUpdate) + handlers.partsHandler.subscribe(this.onPartsUpdate) } sendStatus(subscribers: Iterable): void { @@ -111,7 +70,7 @@ export class AdLibsTopic name: t.data, label: interpollateTranslation(t.display.label.key, t.display.label.args), }) - ) + ) : [] const segmentId = this._parts.get(action.partId)?.segmentId const name = interpollateTranslation(action.display.label.key, action.display.label.args) @@ -126,7 +85,7 @@ export class AdLibsTopic actionType: triggerModes, tags: action.display.tags, publicData: action.publicData, - optionsSchema: action.userDataManifest.optionsSchema, + optionsSchema: unprotectJsonBlob(action.userDataManifest.optionsSchema), }, id: unprotectString(action._id), label: name, @@ -139,9 +98,9 @@ export class AdLibsTopic ) } - if (this._abLibs) { + if (this._adLibs) { adLibs.push( - ...this._abLibs.map((adLib) => { + ...this._adLibs.map((adLib) => { const sourceLayerName = this._sourceLayersMap.get(adLib.sourceLayerId) const outputLayerName = this._outputLayersMap.get(adLib.outputLayerId) const segmentId = adLib.partId ? this._parts.get(adLib.partId)?.segmentId : undefined @@ -183,7 +142,7 @@ export class AdLibsTopic name: t.data, label: interpollateTranslation(t.display.label.key, t.display.label.args), }) - ) + ) : [] const name = interpollateTranslation(action.display.label.key, action.display.label.args) return literal>({ @@ -195,7 +154,7 @@ export class AdLibsTopic actionType: triggerModes, tags: action.display.tags, publicData: action.publicData, - optionsSchema: action.userDataManifest.optionsSchema, + optionsSchema: unprotectJsonBlob(action.userDataManifest.optionsSchema), }, id: unprotectString(action._id), label: name, @@ -230,104 +189,81 @@ export class AdLibsTopic ) } - const adLibsStatus: AdLibsStatus = this._activePlaylist + const adLibsStatus: AdLibsEvent = this._activePlaylist ? { event: 'adLibs', rundownPlaylistId: unprotectString(this._activePlaylist._id), adLibs: sortContent(adLibs), globalAdLibs: sortContent(globalAdLibs), - } + } : { event: 'adLibs', rundownPlaylistId: null, adLibs: [], globalAdLibs: [] } this.sendMessage(subscribers, adLibsStatus) } - async update( - source: string, - data: - | DBRundownPlaylist - | ShowStyleBaseExt - | AdLibAction[] - | RundownBaselineAdLibAction[] - | AdLibPiece[] - | RundownBaselineAdLibItem[] - | DBPart[] - | DBSegment[] - | undefined - ): Promise { - switch (source) { - case PlaylistHandler.name: { - const previousPlaylist = this._activePlaylist - this.logUpdateReceived('playlist', source) - this._activePlaylist = data as DBRundownPlaylist | undefined - // PlaylistHandler is quite chatty (will update on every take), so let's make sure there's a point - // in sending a status - if ( - previousPlaylist?._id === this._activePlaylist?._id && - isDeepStrictEqual(previousPlaylist?.rundownIdsInOrder, this._activePlaylist?.rundownIdsInOrder) - ) - return - break - } - case AdLibActionsHandler.name: { - const adLibActions = data ? (data as AdLibAction[]) : [] - this.logUpdateReceived('adLibActions', source) - this._adLibActions = adLibActions - break - } - case GlobalAdLibActionsHandler.name: { - const globalAdLibActions = data ? (data as RundownBaselineAdLibAction[]) : [] - this.logUpdateReceived('globalAdLibActions', source) - this._globalAdLibActions = globalAdLibActions - break - } - case AdLibsHandler.name: { - const adLibs = data ? (data as AdLibPiece[]) : [] - this.logUpdateReceived('adLibs', source) - this._abLibs = adLibs - break - } - case GlobalAdLibsHandler.name: { - const globalAdLibs = data ? (data as RundownBaselineAdLibItem[]) : [] - this.logUpdateReceived('globalAdLibs', source) - this._globalAdLibs = globalAdLibs - break - } - case ShowStyleBaseHandler.name: { - const showStyleBaseExt = data ? (data as ShowStyleBaseExt) : undefined - this.logUpdateReceived('showStyleBase', source) - this._sourceLayersMap = showStyleBaseExt?.sourceLayerNamesById ?? new Map() - this._outputLayersMap = showStyleBaseExt?.outputLayerNamesById ?? new Map() - break - } - case SegmentsHandler.name: { - const segments = data ? (data as DBPart[]) : [] - this.logUpdateReceived('segments', source) - const newSegments = new Map() - segments.forEach((segment) => { - newSegments.set(segment._id, segment) - }) - this._segments = newSegments - break - } - case PartsHandler.name: { - const parts = data ? (data as DBPart[]) : [] - this.logUpdateReceived('parts', source) - const newParts = new Map() - parts.forEach((part) => { - newParts.set(part._id, part) - }) - this._parts = newParts - break - } - default: - throw new Error(`${this._name} received unsupported update from ${source}}`) - } + private onPlaylistUpdate = (rundownPlaylist: Playlist | undefined): void => { + this.logUpdateReceived( + 'playlist', + `rundownPlaylistId ${rundownPlaylist?._id}, activationId ${rundownPlaylist?.activationId}` + ) + this._activePlaylist = rundownPlaylist + this.throttledSendStatusToAll() + } + + private onShowStyleBaseUpdate = (showStyleBase: ShowStyle | undefined): void => { + this.logUpdateReceived('showStyleBase') + this._sourceLayersMap = showStyleBase?.sourceLayerNamesById ?? new Map() + this._outputLayersMap = showStyleBase?.outputLayerNamesById ?? new Map() + this.throttledSendStatusToAll() + } + private onAdLibActionsUpdate = (adLibActions: AdLibAction[] | undefined): void => { + this.logUpdateReceived('adLibActions') + this._adLibActions = adLibActions this.throttledSendStatusToAll() } - private sendStatusToAll() { - this.sendStatus(this._subscribers) + private onAdLibsUpdate = (adLibs: AdLibPiece[] | undefined): void => { + this.logUpdateReceived('adLibs') + this._adLibs = adLibs + this.throttledSendStatusToAll() } + + private onGlobalAdLibActionsUpdate = (adLibActions: RundownBaselineAdLibAction[] | undefined): void => { + this.logUpdateReceived('globalAdLibActions') + this._globalAdLibActions = adLibActions + this.throttledSendStatusToAll() + } + + private onGlobalAdLibsUpdate = (adLibs: RundownBaselineAdLibItem[] | undefined): void => { + this.logUpdateReceived('globalAdLibs') + this._globalAdLibs = adLibs + this.throttledSendStatusToAll() + } + + private onSegmentsUpdate = (segments: DBSegment[] | undefined): void => { + this.logUpdateReceived('segments') + const newSegments = new Map() + segments ??= [] + segments.forEach((segment) => { + newSegments.set(segment._id, segment) + }) + this._segments = newSegments + this.throttledSendStatusToAll() + } + + private onPartsUpdate = (parts: DBPart[] | undefined): void => { + this.logUpdateReceived('parts') + const newParts = new Map() + parts ??= [] + parts.forEach((part) => { + newParts.set(part._id, part) + }) + this._parts = newParts + this.throttledSendStatusToAll() + } +} + +function unprotectJsonBlob(blob: JSONBlob | undefined): string | undefined { + return blob as string | undefined } diff --git a/packages/live-status-gateway/src/topics/bucketsTopic.ts b/packages/live-status-gateway/src/topics/bucketsTopic.ts new file mode 100644 index 0000000000..480293c2a7 --- /dev/null +++ b/packages/live-status-gateway/src/topics/bucketsTopic.ts @@ -0,0 +1,157 @@ +import { IBlueprintActionManifestDisplayContent } from '@sofie-automation/blueprints-integration' +import { Bucket } from '@sofie-automation/corelib/dist/dataModel/Bucket' +import { BucketAdLibAction } from '@sofie-automation/corelib/dist/dataModel/BucketAdLibAction' +import { BucketAdLib } from '@sofie-automation/corelib/dist/dataModel/BucketAdLibPiece' +import { literal } from '@sofie-automation/corelib/dist/lib' +import { interpollateTranslation } from '@sofie-automation/corelib/dist/TranslatableMessage' +import { unprotectString } from '@sofie-automation/shared-lib/dist/lib/protectedString' +import { PickKeys } from '@sofie-automation/shared-lib/dist/lib/types' +import { Logger } from 'winston' +import { WebSocket } from 'ws' +import { ShowStyleBaseExt } from '../collections/showStyleBaseHandler.js' +import { CollectionHandlers } from '../liveStatusServer.js' +import { WebSocketTopic, WebSocketTopicBase } from '../wsHandler.js' +import { sortContent, WithSortingMetadata } from './helpers/contentSorting.js' +import _ from 'underscore' +import { + BucketsEvent, + BucketStatus, + BucketAdLibStatus, + AdLibActionType, +} from '@sofie-automation/live-status-gateway-api' + +const THROTTLE_PERIOD_MS = 100 + +const _SHOW_STYLE_BASE_KEYS = ['sourceLayerNamesById', 'outputLayerNamesById'] as const +type ShowStyle = PickKeys + +export class BucketsTopic extends WebSocketTopicBase implements WebSocketTopic { + private _buckets: Bucket[] = [] + private _adLibActionsByBucket: Record | undefined + private _adLibsByBucket: Record | undefined + private _sourceLayersMap: ReadonlyMap = new Map() + private _outputLayersMap: ReadonlyMap = new Map() + + constructor(logger: Logger, handlers: CollectionHandlers) { + super(BucketsTopic.name, logger, THROTTLE_PERIOD_MS) + + handlers.bucketsHandler.subscribe(this.onBucketsUpdate) + handlers.bucketAdLibActionsHandler.subscribe(this.onBucketAdLibActionsUpdate) + handlers.bucketAdLibsHandler.subscribe(this.onBucketAdLibsUpdate) + handlers.showStyleBaseHandler.subscribe(this.onShowStyleBaseUpdate) + } + + sendStatus(subscribers: Iterable): void { + const sortedBuckets = sortContent(this._buckets.map(this.addBucketSortingMetadata)) + + const bucketStatuses: BucketStatus[] = sortedBuckets.map((bucket) => { + const bucketId = unprotectString(bucket._id) + + const bucketAdLibs = (this._adLibsByBucket?.[bucketId] ?? []).map(this.toSortableBucketAdLib) + const bucketAdLibActions = (this._adLibActionsByBucket?.[bucketId] ?? []).map( + this.toSortableBucketAdLibAction + ) + + return { + id: bucketId, + name: bucket.name, + adLibs: sortContent([...bucketAdLibs, ...bucketAdLibActions]), + } + }) + + const bucketsStatus: BucketsEvent = { + event: 'buckets', + buckets: bucketStatuses, + } + + this.sendMessage(subscribers, bucketsStatus) + } + + private onShowStyleBaseUpdate = (showStyleBase: ShowStyle | undefined): void => { + this.logUpdateReceived('showStyleBase') + this._sourceLayersMap = showStyleBase?.sourceLayerNamesById ?? new Map() + this._outputLayersMap = showStyleBase?.outputLayerNamesById ?? new Map() + this.throttledSendStatusToAll() + } + + private onBucketsUpdate = (buckets: Bucket[] | undefined): void => { + this.logUpdateReceived('buckets') + buckets ??= [] + this._buckets = sortContent(buckets.map(this.addBucketSortingMetadata)) + this.throttledSendStatusToAll() + } + + private onBucketAdLibActionsUpdate = (adLibActions: BucketAdLibAction[] | undefined): void => { + this.logUpdateReceived('buketAdLibActions') + this._adLibActionsByBucket = _.groupBy(adLibActions ?? [], 'bucketId') + this.throttledSendStatusToAll() + } + + private onBucketAdLibsUpdate = (adLibs: BucketAdLib[] | undefined): void => { + this.logUpdateReceived('bucketAdLibs') + this._adLibsByBucket = _.groupBy(adLibs ?? [], 'bucketId') + this.throttledSendStatusToAll() + } + + private addBucketSortingMetadata = (bucket: Bucket): WithSortingMetadata => { + return { + obj: bucket, + id: unprotectString(bucket._id), + itemRank: bucket._rank, + label: bucket.name, + } + } + + private toSortableBucketAdLib = (adLib: BucketAdLib): WithSortingMetadata => { + const sourceLayerName = this._sourceLayersMap.get(adLib.sourceLayerId) + const outputLayerName = this._outputLayersMap.get(adLib.outputLayerId) + return { + obj: { + id: unprotectString(adLib._id), + name: adLib.name, + sourceLayer: sourceLayerName ?? 'invalid', + outputLayer: outputLayerName ?? 'invalid', + actionType: [], + tags: adLib.tags, + externalId: adLib.externalId, + publicData: adLib.publicData, + }, + id: unprotectString(adLib._id), + itemRank: adLib._rank, + label: adLib.name, + } + } + + private toSortableBucketAdLibAction = (action: BucketAdLibAction): WithSortingMetadata => { + const sourceLayerName = this._sourceLayersMap.get( + (action.display as IBlueprintActionManifestDisplayContent).sourceLayerId + ) + const outputLayerName = this._outputLayersMap.get( + (action.display as IBlueprintActionManifestDisplayContent).outputLayerId + ) + const triggerModes = action.triggerModes + ? action.triggerModes.map((t) => + literal({ + name: t.data, + label: interpollateTranslation(t.display.label.key, t.display.label.args), + }) + ) + : [] + const name = interpollateTranslation(action.display.label.key, action.display.label.args) + return { + obj: { + id: unprotectString(action._id), + name, + sourceLayer: sourceLayerName ?? 'invalid', + outputLayer: outputLayerName ?? 'invalid', + actionType: triggerModes, + tags: action.display.tags, + externalId: action.externalId, + publicData: action.publicData, + }, + id: unprotectString(action._id), + itemRank: action.display._rank, + label: name, + } + } +} diff --git a/packages/live-status-gateway/src/topics/helpers/partTiming.ts b/packages/live-status-gateway/src/topics/helpers/partTiming.ts index 949ba89bfb..d23f4ccb56 100644 --- a/packages/live-status-gateway/src/topics/helpers/partTiming.ts +++ b/packages/live-status-gateway/src/topics/helpers/partTiming.ts @@ -1,15 +1,10 @@ -import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' - -export interface PartTiming { - startTime: number - expectedDurationMs: number - projectedEndTime: number -} +import type { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' +import type { CurrentPartTiming } from '@sofie-automation/live-status-gateway-api' export function calculateCurrentPartTiming( currentPartInstance: DBPartInstance, segmentPartInstances: DBPartInstance[] -): PartTiming { +): CurrentPartTiming { const isMemberOfDisplayDurationGroup = currentPartInstance.part.displayDurationGroup !== undefined let expectedDuration = currentPartInstance.part.expectedDuration ?? 0 diff --git a/packages/live-status-gateway/src/topics/helpers/pieceStatus.ts b/packages/live-status-gateway/src/topics/helpers/pieceStatus.ts index 62ea6fde94..eebcb21803 100644 --- a/packages/live-status-gateway/src/topics/helpers/pieceStatus.ts +++ b/packages/live-status-gateway/src/topics/helpers/pieceStatus.ts @@ -1,15 +1,8 @@ import { unprotectString } from '@sofie-automation/server-core-integration' -import { ShowStyleBaseExt } from '../../collections/showStyleBaseHandler' -import { PieceInstanceMin } from '../../collections/pieceInstancesHandler' - -export interface PieceStatus { - id: string - name: string - sourceLayer: string - outputLayer: string - tags: readonly string[] | undefined - publicData: unknown -} +import type { ShowStyleBaseExt } from '../../collections/showStyleBaseHandler.js' +import type { PieceInstanceMin } from '../../collections/pieceInstancesHandler.js' +import type { PieceStatus } from '@sofie-automation/live-status-gateway-api' +import { clone } from '@sofie-automation/corelib/dist/lib' export function toPieceStatus( pieceInstance: PieceInstanceMin, @@ -22,7 +15,7 @@ export function toPieceStatus( name: pieceInstance.piece.name, sourceLayer: sourceLayerName ?? 'invalid', outputLayer: outputLayerName ?? 'invalid', - tags: pieceInstance.piece.tags, + tags: clone(pieceInstance.piece.tags), publicData: pieceInstance.piece.publicData, } } diff --git a/packages/live-status-gateway/src/topics/helpers/segmentParts.ts b/packages/live-status-gateway/src/topics/helpers/segmentParts.ts new file mode 100644 index 0000000000..6fbe4bac9e --- /dev/null +++ b/packages/live-status-gateway/src/topics/helpers/segmentParts.ts @@ -0,0 +1,37 @@ +import { PartInstanceId } from '@sofie-automation/corelib/dist/dataModel/Ids' +import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' +import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' +import { unprotectString } from '@sofie-automation/server-core-integration' +import _ from 'underscore' +import type { CurrentSegmentPart } from '@sofie-automation/live-status-gateway-api' + +export function getCurrentSegmentParts( + segmentPartInstances: DBPartInstance[], + segmentParts: DBPart[] +): CurrentSegmentPart[] { + const partInstancesByPartId: Record = _.indexBy( + segmentPartInstances, + (partInstance) => unprotectString(partInstance.part._id) + ) + segmentParts.forEach((part) => { + const partId = unprotectString(part._id) + if (partInstancesByPartId[partId]) return + const partInstance = { + _id: partId, + part, + } + partInstancesByPartId[partId] = partInstance + }) + return Object.values<{ _id: string | PartInstanceId; part: DBPart }>(partInstancesByPartId) + .sort((a, b) => a.part._rank - b.part._rank) + .map( + (partInstance): CurrentSegmentPart => ({ + id: unprotectString(partInstance.part._id), + name: partInstance.part.title, + autoNext: partInstance.part.autoNext, + timing: { + expectedDurationMs: partInstance.part.expectedDuration, + }, + }) + ) +} diff --git a/packages/live-status-gateway/src/topics/helpers/segmentTiming.ts b/packages/live-status-gateway/src/topics/helpers/segmentTiming.ts index 693dff9555..b0648e7405 100644 --- a/packages/live-status-gateway/src/topics/helpers/segmentTiming.ts +++ b/packages/live-status-gateway/src/topics/helpers/segmentTiming.ts @@ -1,25 +1,22 @@ +import { SegmentTimingInfo } from '@sofie-automation/blueprints-integration' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance' -import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment' - -export interface SegmentTiming { - budgetDurationMs?: number - expectedDurationMs: number - countdownType?: 'part_expected_duration' | 'segment_budget_duration' -} +import { SegmentCountdownType, SegmentTiming } from '@sofie-automation/live-status-gateway-api' +import { CountdownType } from '@sofie-automation/blueprints-integration' +import { assertNever } from '@sofie-automation/corelib/dist/lib' export interface CurrentSegmentTiming extends SegmentTiming { projectedEndTime: number } export function calculateCurrentSegmentTiming( - segment: DBSegment, + segmentTimingInfo: SegmentTimingInfo | undefined, currentPartInstance: DBPartInstance, firstInstanceInSegmentPlayout: DBPartInstance | undefined, segmentPartInstances: DBPartInstance[], segmentParts: DBPart[] ): CurrentSegmentTiming { - const segmentTiming = calculateSegmentTiming(segment, segmentParts) + const segmentTiming = calculateSegmentTiming(segmentTimingInfo, segmentParts) const playedDurations = segmentPartInstances.reduce((sum, partInstance) => { return (partInstance.timings?.duration ?? 0) + sum }, 0) @@ -39,14 +36,32 @@ export function calculateCurrentSegmentTiming( } } -export function calculateSegmentTiming(segment: DBSegment, segmentParts: DBPart[]): SegmentTiming { +export function calculateSegmentTiming( + segmentTimingInfo: SegmentTimingInfo | undefined, + segmentParts: DBPart[] +): SegmentTiming { return { - budgetDurationMs: segment.segmentTiming?.budgetDuration, + budgetDurationMs: segmentTimingInfo?.budgetDuration, expectedDurationMs: segmentParts.reduce((sum, part): number => { return part.expectedDurationWithTransition != null && !part.untimed ? sum + part.expectedDurationWithTransition : sum }, 0), - countdownType: segment.segmentTiming?.countdownType, + countdownType: translateSegmentCountdownType(segmentTimingInfo?.countdownType), + } +} + +function translateSegmentCountdownType(type: CountdownType | undefined): SegmentCountdownType | undefined { + switch (type) { + case undefined: + return undefined + case CountdownType.PART_EXPECTED_DURATION: + return SegmentCountdownType.PART_EXPECTED_DURATION + case CountdownType.SEGMENT_BUDGET_DURATION: + return SegmentCountdownType.SEGMENT_BUDGET_DURATION + default: + assertNever(type) + // Cast and return the value anyway, so that the application works + return type as any as SegmentCountdownType } } diff --git a/packages/live-status-gateway/src/topics/packagesTopic.ts b/packages/live-status-gateway/src/topics/packagesTopic.ts new file mode 100644 index 0000000000..b87202b631 --- /dev/null +++ b/packages/live-status-gateway/src/topics/packagesTopic.ts @@ -0,0 +1,94 @@ +import { PieceStatusCode } from '@sofie-automation/corelib/dist/dataModel/Piece' +import { UIPieceContentStatus } from '@sofie-automation/corelib/dist/dataModel/PieceContentStatus' +import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' +import { assertNever } from '@sofie-automation/server-core-integration' +import { unprotectString } from '@sofie-automation/shared-lib/dist/lib/protectedString' +import { PickKeys } from '@sofie-automation/shared-lib/dist/lib/types' +import { Logger } from 'winston' +import { WebSocket } from 'ws' +import { CollectionHandlers } from '../liveStatusServer.js' +import { WebSocketTopic, WebSocketTopicBase } from '../wsHandler.js' +import { PackagesEvent, PackageStatus } from '@sofie-automation/live-status-gateway-api' + +const THROTTLE_PERIOD_MS = 200 + +const PLAYLIST_KEYS = ['_id', 'activationId'] as const +type Playlist = PickKeys + +export class PackagesTopic extends WebSocketTopicBase implements WebSocketTopic { + public observerName = PackagesTopic.name + private _activePlaylist: Playlist | undefined + private _pieceContentStatuses: UIPieceContentStatus[] = [] + + constructor(logger: Logger, handlers: CollectionHandlers) { + super(PackagesTopic.name, logger, THROTTLE_PERIOD_MS) + + handlers.playlistHandler.subscribe(this.onPlaylistUpdate, PLAYLIST_KEYS) + handlers.pieceContentStatusesHandler.subscribe(this.onPieceContentStatusUpdate) + } + + sendStatus(subscribers: Iterable): void { + const packagesStatus: PackagesEvent = { + event: 'packages', + rundownPlaylistId: this._activePlaylist ? unprotectString(this._activePlaylist._id) : null, + packages: this._pieceContentStatuses.map((contentStatus) => ({ + packageName: contentStatus.status.packageName ?? undefined, + status: this.toStatusString(contentStatus.status.status), + pieceOrAdLibId: unprotectString(contentStatus.pieceId), + rundownId: unprotectString(contentStatus.rundownId), + partId: unprotectString(contentStatus.partId), + segmentId: unprotectString(contentStatus.segmentId), + previewUrl: contentStatus.status.previewUrl, + thumbnailUrl: contentStatus.status.thumbnailUrl, + })), + } + + for (const subscriber of subscribers) { + this.sendMessage(subscriber, packagesStatus) + } + } + + private toStatusString(status: PieceStatusCode): PackageStatus { + switch (status) { + case PieceStatusCode.UNKNOWN: + return PackageStatus.UNKNOWN + case PieceStatusCode.OK: + return PackageStatus.OK + case PieceStatusCode.SOURCE_BROKEN: + return PackageStatus.SOURCE_BROKEN + case PieceStatusCode.SOURCE_HAS_ISSUES: + return PackageStatus.SOURCE_HAS_ISSUES + case PieceStatusCode.SOURCE_MISSING: + return PackageStatus.SOURCE_MISSING + case PieceStatusCode.SOURCE_NOT_READY: + return PackageStatus.SOURCE_NOT_READY + case PieceStatusCode.SOURCE_NOT_SET: + return PackageStatus.SOURCE_NOT_SET + case PieceStatusCode.SOURCE_UNKNOWN_STATE: + return PackageStatus.SOURCE_UNKNOWN_STATE + default: + assertNever(status) + return PackageStatus.UNKNOWN + } + } + + private onPlaylistUpdate = (rundownPlaylist: Playlist | undefined): void => { + this.logUpdateReceived( + 'playlist', + `rundownPlaylistId ${rundownPlaylist?._id}, activationId ${rundownPlaylist?.activationId}` + ) + const prevPlaylist = this._activePlaylist + this._activePlaylist = rundownPlaylist + + if (prevPlaylist?._id !== this._activePlaylist?._id) { + this.throttledSendStatusToAll() + } + } + + private onPieceContentStatusUpdate = (data: UIPieceContentStatus[] | undefined): void => { + this.logUpdateReceived('pieceContentStatuses') + if (!data) return + this._pieceContentStatuses = data + this.throttledSendStatusToAll() + } +} diff --git a/packages/live-status-gateway/src/topics/root.ts b/packages/live-status-gateway/src/topics/root.ts index 6307aae73a..807af7ad1c 100644 --- a/packages/live-status-gateway/src/topics/root.ts +++ b/packages/live-status-gateway/src/topics/root.ts @@ -1,7 +1,15 @@ import { Logger } from 'winston' import { WebSocket } from 'ws' import { literal } from '@sofie-automation/shared-lib/dist/lib/lib' -import { WebSocketTopicBase, WebSocketTopic } from '../wsHandler' +import { WebSocketTopicBase, WebSocketTopic } from '../wsHandler.js' +import { + PongEvent, + SubscriptionStatusSuccess, + SubscriptionStatusError, + SubscriptionDetails, + SubscriptionStatus, + SubscriptionName, +} from '@sofie-automation/live-status-gateway-api' enum PublishMsg { ping = 'ping', @@ -9,41 +17,11 @@ enum PublishMsg { unsubscribe = 'unsubscribe', } -interface PongMsg { - event: string - reqid: number -} - -enum SubscriptionStatus { - subscribed = 'subscribed', - unsubscribed = 'unsubscribed', -} - -interface SubscriptionDetails { - name: string - status: SubscriptionStatus -} - -interface SubscriptionResponse { - event: string - reqid: number - subscription: SubscriptionDetails - errorMessage?: string -} - -export enum StatusChannels { - studio = 'studio', - activePlaylist = 'activePlaylist', - activePieces = 'activePieces', - segments = 'segments', - adLibs = 'adLibs', -} - interface RootMsg { event: PublishMsg reqid: number subscription: { - name: StatusChannels + name: SubscriptionName } } @@ -66,13 +44,14 @@ export class RootChannel extends WebSocketTopicBase implements WebSocketTopic { } processMessage(ws: WebSocket, msg: object): void { + // eslint-disable-next-line @typescript-eslint/no-base-to-string this._logger.info(`Process root message '${msg}'`) try { const msgObj = JSON.parse(msg as unknown as string) as RootMsg if (typeof msgObj.event === 'string' && typeof msgObj.reqid === 'number') { switch (msgObj.event) { case PublishMsg.ping: - this.sendMessage(ws, literal({ event: 'pong', reqid: msgObj.reqid })) + this.sendMessage(ws, literal({ event: 'pong', reqid: msgObj.reqid })) return case PublishMsg.subscribe: this._logger.info(`Subscribe request to '${msgObj.subscription.name}' channel`) @@ -86,27 +65,28 @@ export class RootChannel extends WebSocketTopicBase implements WebSocketTopic { this._logger.info(`Process root message received unexpected event`) } } else this._logger.error(`Process root message received malformed payload`) - } catch (e) { + } catch (_e) { this._logger.error(`Process root message expected an object as payload`) } } addTopic(channel: string, topic: WebSocketTopic): void { - if (channel in StatusChannels) this._topics.set(channel, topic) + if (Object.values(SubscriptionName).includes(channel)) this._topics.set(channel, topic) } - subscribe(ws: WebSocket, name: string, reqid: number): void { + subscribe(ws: WebSocket, name: SubscriptionName, reqid: number): void { const topic = this._topics.get(name) - const curUnsubscribed = topic && !topic.hasSubscriber(ws) && name in StatusChannels + const curUnsubscribed = + topic && !topic.hasSubscriber(ws) && Object.values(SubscriptionName).includes(name) if (curUnsubscribed) { this.sendMessage( ws, - literal({ + literal({ event: 'subscriptionStatus', reqid: reqid, subscription: literal({ name: name, - status: SubscriptionStatus.subscribed, + status: SubscriptionStatus.SUBSCRIBED, }), }) ) @@ -114,48 +94,52 @@ export class RootChannel extends WebSocketTopicBase implements WebSocketTopic { } else { this.sendMessage( ws, - literal({ + literal({ errorMessage: `Subscribe to '${name}' topic failed`, event: 'subscriptionStatus', reqid: reqid, subscription: literal({ name: name, - status: curUnsubscribed ? SubscriptionStatus.unsubscribed : SubscriptionStatus.subscribed, + status: curUnsubscribed ? SubscriptionStatus.UNSUBSCRIBED : SubscriptionStatus.SUBSCRIBED, }), }) ) } } - unsubscribe(ws: WebSocket, name: string, reqid: number): void { + unsubscribe(ws: WebSocket, name: SubscriptionName, reqid: number): void { const topic = this._topics.get(name) - const curSubscribed = topic && topic.hasSubscriber(ws) && name in StatusChannels + const curSubscribed = topic && topic.hasSubscriber(ws) && Object.values(SubscriptionName).includes(name) if (curSubscribed) { topic.removeSubscriber(ws) this.sendMessage( ws, - literal({ + literal({ event: 'subscriptionStatus', reqid: reqid, subscription: literal({ name: name, - status: SubscriptionStatus.unsubscribed, + status: SubscriptionStatus.UNSUBSCRIBED, }), }) ) } else { this.sendMessage( ws, - literal({ + literal({ errorMessage: `Unsubscribe from '${name}' topic failed`, event: 'subscriptionStatus', reqid: reqid, subscription: literal({ name: name, - status: curSubscribed ? SubscriptionStatus.subscribed : SubscriptionStatus.unsubscribed, + status: curSubscribed ? SubscriptionStatus.SUBSCRIBED : SubscriptionStatus.UNSUBSCRIBED, }), }) ) } } + + sendStatus(): void { + // no status here + } } diff --git a/packages/live-status-gateway/src/topics/segmentsTopic.ts b/packages/live-status-gateway/src/topics/segmentsTopic.ts index 3f9e17247a..e778a51903 100644 --- a/packages/live-status-gateway/src/topics/segmentsTopic.ts +++ b/packages/live-status-gateway/src/topics/segmentsTopic.ts @@ -1,65 +1,38 @@ import { Logger } from 'winston' import { WebSocket } from 'ws' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' -import { WebSocketTopicBase, WebSocketTopic, CollectionObserver } from '../wsHandler' +import { WebSocketTopicBase, WebSocketTopic } from '../wsHandler.js' import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment' -import { PlaylistHandler } from '../collections/playlistHandler' import { groupByToMap } from '@sofie-automation/corelib/dist/lib' import { unprotectString } from '@sofie-automation/shared-lib/dist/lib/protectedString' -import { SegmentsHandler } from '../collections/segmentsHandler' -import areElementsShallowEqual from '@sofie-automation/shared-lib/dist/lib/isShallowEqual' -import { PartsHandler } from '../collections/partsHandler' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' -import _ = require('underscore') -import { SegmentTiming, calculateSegmentTiming } from './helpers/segmentTiming' +import _ from 'underscore' +import { calculateSegmentTiming } from './helpers/segmentTiming.js' +import { SegmentsEvent } from '@sofie-automation/live-status-gateway-api' +import { CollectionHandlers } from '../liveStatusServer.js' +import { PickKeys } from '@sofie-automation/shared-lib/dist/lib/types' const THROTTLE_PERIOD_MS = 200 -interface SegmentStatus { - id: string - identifier?: string - rundownId: string - name: string - timing: SegmentTiming - publicData: unknown -} - -export interface SegmentsStatus { - event: 'segments' - rundownPlaylistId: string | null - segments: SegmentStatus[] -} +const PLAYLIST_KEYS = ['_id', 'rundownIdsInOrder', 'activationId'] as const +type Playlist = PickKeys -export class SegmentsTopic - extends WebSocketTopicBase - implements - WebSocketTopic, - CollectionObserver, - CollectionObserver, - CollectionObserver -{ - public observerName = SegmentsTopic.name - private _activePlaylist: DBRundownPlaylist | undefined +export class SegmentsTopic extends WebSocketTopicBase implements WebSocketTopic { + private _activePlaylist: Playlist | undefined private _segments: DBSegment[] = [] private _partsBySegment: Record = {} private _orderedSegments: DBSegment[] = [] - private throttledSendStatusToAll: () => void - constructor(logger: Logger) { - super(SegmentsTopic.name, logger) - this.throttledSendStatusToAll = _.throttle(this.sendStatusToAll.bind(this), THROTTLE_PERIOD_MS, { - leading: true, - trailing: true, - }) - } + constructor(logger: Logger, handlers: CollectionHandlers) { + super(SegmentsTopic.name, logger, THROTTLE_PERIOD_MS) - addSubscriber(ws: WebSocket): void { - super.addSubscriber(ws) - this.sendStatus([ws]) + handlers.playlistHandler.subscribe(this.onPlaylistUpdate, PLAYLIST_KEYS) + handlers.segmentsHandler.subscribe(this.onSegmentsUpdate) + handlers.partsHandler.subscribe(this.onPartsUpdate) } sendStatus(subscribers: Iterable): void { - const segmentsStatus: SegmentsStatus = { + const segmentsStatus: SegmentsEvent = { event: 'segments', rundownPlaylistId: this._activePlaylist ? unprotectString(this._activePlaylist._id) : null, segments: this._orderedSegments.map((segment) => { @@ -68,7 +41,7 @@ export class SegmentsTopic id: segmentId, rundownId: unprotectString(segment.rundownId), name: segment.name, - timing: calculateSegmentTiming(segment, this._partsBySegment[segmentId] ?? []), + timing: calculateSegmentTiming(segment.segmentTiming, this._partsBySegment[segmentId] ?? []), identifier: segment.identifier, publicData: segment.publicData, } @@ -78,51 +51,33 @@ export class SegmentsTopic this.sendMessage(subscribers, segmentsStatus) } - async update(source: string, data: DBRundownPlaylist | DBSegment[] | DBPart[] | undefined): Promise { - const prevSegments = this._segments - const prevRundownOrder = this._activePlaylist?.rundownIdsInOrder ?? [] - const prevParts = this._partsBySegment - const prevPlaylistId = this._activePlaylist?._id - switch (source) { - case PlaylistHandler.name: { - this._activePlaylist = data as DBRundownPlaylist | undefined - this.logUpdateReceived('playlist', source) - break - } - case SegmentsHandler.name: { - this._segments = data as DBSegment[] - this.logUpdateReceived('segments', source) - break - } - case PartsHandler.name: { - this._partsBySegment = _.groupBy(data as DBPart[], 'segmentId') - this.logUpdateReceived('parts', source) - break - } - default: - throw new Error(`${this._name} received unsupported update from ${source}}`) - } + private onPlaylistUpdate = (rundownPlaylist: Playlist | undefined): void => { + this.logUpdateReceived( + 'playlist', + `rundownPlaylistId ${rundownPlaylist?._id}, activationId ${rundownPlaylist?.activationId}` + ) + this._activePlaylist = rundownPlaylist + this.updateAndSendStatusToAll() + } - if (this._activePlaylist) { - if ( - this._activePlaylist._id !== prevPlaylistId || - prevSegments !== this._segments || - prevParts !== this._partsBySegment || - !areElementsShallowEqual(prevRundownOrder, this._activePlaylist.rundownIdsInOrder) - ) { - const segmentsByRundownId = groupByToMap(this._segments, 'rundownId') - this._orderedSegments = this._activePlaylist.rundownIdsInOrder.flatMap((rundownId) => { - return segmentsByRundownId.get(rundownId)?.sort((a, b) => a._rank - b._rank) ?? [] - }) - this.throttledSendStatusToAll() - } - } else { - this._orderedSegments = [] - this.throttledSendStatusToAll() - } + private onSegmentsUpdate = (segments: DBSegment[] | undefined): void => { + this.logUpdateReceived('segments') + this._segments = segments ?? [] + this.updateAndSendStatusToAll() + } + + private onPartsUpdate = (parts: DBPart[] | undefined): void => { + this.logUpdateReceived('parts') + this._partsBySegment = _.groupBy(parts ?? [], 'segmentId') + this.updateAndSendStatusToAll() } - private sendStatusToAll() { - this.sendStatus(this._subscribers) + private updateAndSendStatusToAll() { + const segmentsByRundownId = groupByToMap(this._segments, 'rundownId') + this._orderedSegments = + this._activePlaylist?.rundownIdsInOrder.flatMap((rundownId) => { + return segmentsByRundownId.get(rundownId)?.sort((a, b) => a._rank - b._rank) ?? [] + }) ?? [] + this.throttledSendStatusToAll() } } diff --git a/packages/live-status-gateway/src/topics/studioTopic.ts b/packages/live-status-gateway/src/topics/studioTopic.ts index 945317718d..d1f533b8f6 100644 --- a/packages/live-status-gateway/src/topics/studioTopic.ts +++ b/packages/live-status-gateway/src/topics/studioTopic.ts @@ -4,96 +4,73 @@ import { unprotectString } from '@sofie-automation/shared-lib/dist/lib/protected import { DBStudio } from '@sofie-automation/corelib/dist/dataModel/Studio' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { literal } from '@sofie-automation/shared-lib/dist/lib/lib' -import { WebSocketTopicBase, WebSocketTopic, CollectionObserver } from '../wsHandler' -import { StudioHandler } from '../collections/studioHandler' -import { PlaylistsHandler } from '../collections/playlistHandler' +import { StudioEvent, PlaylistStatus, PlaylistActivationStatus } from '@sofie-automation/live-status-gateway-api' +import { WebSocketTopicBase, WebSocketTopic } from '../wsHandler.js' +import { CollectionHandlers } from '../liveStatusServer.js' +import _ from 'underscore' -type PlaylistActivationStatus = 'deactivated' | 'rehearsal' | 'activated' - -interface PlaylistStatus { - id: string - name: string - activationStatus: PlaylistActivationStatus -} - -interface StudioStatus { - event: string - id: string | null - name: string - playlists: PlaylistStatus[] -} - -export class StudioTopic - extends WebSocketTopicBase - implements WebSocketTopic, CollectionObserver, CollectionObserver -{ - public observerName = 'StudioTopic' +export class StudioTopic extends WebSocketTopicBase implements WebSocketTopic { private _studio: DBStudio | undefined private _playlists: PlaylistStatus[] = [] + private _lastSentPlaylists: PlaylistStatus[] = [] - constructor(logger: Logger) { + constructor(logger: Logger, handlers: CollectionHandlers) { super(StudioTopic.name, logger) - } - addSubscriber(ws: WebSocket): void { - super.addSubscriber(ws) - this.sendStatus([ws]) + handlers.studioHandler.subscribe(this.onStudioUpdate) + handlers.playlistsHandler.subscribe(this.onPlaylistsUpdate) } sendStatus(subscribers: Iterable): void { - const studioStatus: StudioStatus = this._studio + const studioStatus: StudioEvent = this._studio ? { event: 'studio', id: unprotectString(this._studio._id), name: this._studio.name, playlists: this._playlists, - } + } : { event: 'studio', id: null, name: '', playlists: [], - } + } this.sendMessage(subscribers, studioStatus) } - async update(source: string, data: DBStudio | DBRundownPlaylist[] | undefined): Promise { - const prevPlaylistsStatus = this._playlists - const rundownPlaylists = data ? (data as DBRundownPlaylist[]) : [] - const studio = data ? (data as DBStudio) : undefined - switch (source) { - case StudioHandler.name: - this.logUpdateReceived('studio', source, `studioId ${studio?._id}`) - this._studio = studio - break - case PlaylistsHandler.name: - this.logUpdateReceived('playlists', source) - this._playlists = rundownPlaylists.map((p) => { - let activationStatus: PlaylistActivationStatus = - p.activationId === undefined ? 'deactivated' : 'activated' - if (p.activationId && p.rehearsal) activationStatus = 'rehearsal' - return literal({ - id: unprotectString(p._id), - name: p.name, - activationStatus: activationStatus, - }) + private onStudioUpdate = (studio: DBStudio | undefined): void => { + this.logUpdateReceived('studio', `studioId ${studio?._id}`) + this._studio = studio + this.sendStatusToAll() + } + + private onPlaylistsUpdate = (rundownPlaylists: DBRundownPlaylist[] | undefined): void => { + this.logUpdateReceived('playlists') + this._playlists = + rundownPlaylists?.map((p) => { + let activationStatus: PlaylistActivationStatus = + p.activationId === undefined + ? PlaylistActivationStatus.DEACTIVATED + : PlaylistActivationStatus.ACTIVATED + if (p.activationId && p.rehearsal) activationStatus = PlaylistActivationStatus.REHEARSAL + return literal({ + id: unprotectString(p._id), + externalId: p.externalId, + name: p.name, + activationStatus: activationStatus, }) - break - default: - throw new Error(`${this._name} received unsupported update from ${source}}`) - } + }) ?? [] + this.sendStatusToAll() + } + protected sendStatusToAll = (): void => { const sameStatus = - this._playlists.length === prevPlaylistsStatus.length && - this._playlists.reduce( - (same, status, i) => - same && - !!prevPlaylistsStatus[i] && - status.id === prevPlaylistsStatus[i].id && - status.activationStatus === prevPlaylistsStatus[i].activationStatus, - true - ) - if (!sameStatus) this.sendStatus(this._subscribers) + this._playlists.length === this._lastSentPlaylists.length && + _.isEqual(this._playlists, this._lastSentPlaylists) + if (!sameStatus) { + this.sendStatus(this._subscribers) + this._lastSentPlaylists = this._playlists + } } } diff --git a/packages/live-status-gateway/src/wsHandler.ts b/packages/live-status-gateway/src/wsHandler.ts index dfa5ef411b..b3d7f36b76 100644 --- a/packages/live-status-gateway/src/wsHandler.ts +++ b/packages/live-status-gateway/src/wsHandler.ts @@ -1,25 +1,32 @@ -import { StudioId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { CoreConnection, Observer, ProtectedString, SubscriptionId } from '@sofie-automation/server-core-integration' import { Logger } from 'winston' import { WebSocket } from 'ws' -import { CoreHandler } from './coreHandler' -import { CorelibPubSub, CorelibPubSubCollections, CorelibPubSubTypes } from '@sofie-automation/corelib/dist/pubsub' +import { AllMessages } from '@sofie-automation/live-status-gateway-api' +import _ from 'underscore' export abstract class WebSocketTopicBase { protected _name: string protected _logger: Logger protected _subscribers: Set = new Set() + protected throttledSendStatusToAll: () => void - constructor(name: string, logger: Logger) { + constructor(name: string, logger: Logger, throttlePeriodMs = 0) { this._name = name this._logger = logger this._logger.info(`Starting ${this._name} topic`) + this.throttledSendStatusToAll = + throttlePeriodMs > 0 + ? _.throttle(this.sendStatusToAll, throttlePeriodMs, { + leading: false, + trailing: true, + }) + : this.sendStatusToAll } addSubscriber(ws: WebSocket): void { this._logger.info(`${this._name} adding a websocket subscriber`) this._subscribers.add(ws) + this.sendStatus([ws]) } hasSubscriber(ws: WebSocket): boolean { @@ -34,7 +41,7 @@ export abstract class WebSocketTopicBase { this._logger.error(`Process ${this._name} message not expected '${JSON.stringify(msg)}'`) } - sendMessage(recipients: WebSocket | Iterable, msg: object): void { + sendMessage(recipients: WebSocket | Iterable, msg: AllMessages): void { recipients = isIterable(recipients) ? recipients : [recipients] let count = 0 @@ -54,13 +61,19 @@ export abstract class WebSocketTopicBase { } } - protected logUpdateReceived(collectionName: string, source: string, extraInfo?: string): void { - let message = `${this._name} received ${collectionName} update from ${source}` + protected logUpdateReceived(collectionName: string, extraInfo?: string): void { + let message = `${this._name} received ${collectionName} update` if (extraInfo) { message += `, ${extraInfo}` } this._logger.debug(message) } + + abstract sendStatus(_subscribers: Iterable): void + + protected sendStatusToAll = (): void => { + this.sendStatus(this._subscribers) + } } export interface WebSocketTopic { @@ -71,108 +84,6 @@ export interface WebSocketTopic { sendMessage(ws: WebSocket, msg: object): void } -export type ObserverForCollection = T extends keyof CorelibPubSubCollections - ? Observer - : undefined - -export abstract class CollectionBase< - T, - TPubSub extends CorelibPubSub | undefined, - TCollection extends keyof CorelibPubSubCollections -> { - protected _name: string - protected _collectionName: TCollection - protected _publicationName: TPubSub - protected _logger: Logger - protected _coreHandler: CoreHandler - protected _studioId!: StudioId - protected _subscribers: Set = new Set() - protected _observers: Set> = new Set() - protected _collectionData: T | undefined - protected _subscriptionId: SubscriptionId | undefined - protected _dbObserver: ObserverForCollection | undefined - - protected get _core(): CoreConnection { - return this._coreHandler.core - } - - constructor(name: string, collection: TCollection, publication: TPubSub, logger: Logger, coreHandler: CoreHandler) { - this._name = name - this._collectionName = collection - this._publicationName = publication - this._logger = logger - this._coreHandler = coreHandler - - this._logger.info(`Starting ${this._name} handler`) - } - - async init(): Promise { - if (!this._coreHandler.studioId) throw new Error('StudioId is not defined') - this._studioId = this._coreHandler.studioId - } - - close(): void { - this._logger.info(`Closing ${this._name} handler`) - if (this._subscriptionId) this._coreHandler.unsubscribe(this._subscriptionId) - if (this._dbObserver) this._dbObserver.stop() - } - - async subscribe(observer: CollectionObserver): Promise { - this._logger.info(`${observer.observerName}' added observer for '${this._name}'`) - if (this._collectionData) await observer.update(this._name, this._collectionData) - this._observers.add(observer) - } - - async unsubscribe(observer: CollectionObserver): Promise { - this._logger.info(`${observer.observerName}' removed observer for '${this._name}'`) - this._observers.delete(observer) - } - - async notify(data: T | undefined): Promise { - for (const observer of this._observers) { - await observer.update(this._name, data) - } - } - - protected logDocumentChange(documentId: string | ProtectedString, changeType: string): void { - this._logger.silly(`${this._name} ${changeType} ${documentId}`) - } - - protected logUpdateReceived(collectionName: string, updateCount: number | undefined): void - protected logUpdateReceived(collectionName: string, source: string, extraInfo?: string): void - protected logUpdateReceived( - collectionName: string, - sourceOrUpdateCount: string | number | undefined, - extraInfo?: string - ): void { - if (typeof sourceOrUpdateCount === 'string') { - let message = `${this._name} received ${collectionName} update from ${sourceOrUpdateCount}` - if (extraInfo) { - message += `, ${extraInfo}` - } - this._logger.debug(message) - } else { - this._logger.debug(`'${this._name}' handler received ${sourceOrUpdateCount} ${collectionName}`) - } - } - - protected logNotifyingUpdate(updateCount: number | undefined): void { - this._logger.debug(`${this._name} notifying update with ${updateCount} ${this._collectionName}`) - } -} - -export interface Collection { - init(): Promise - close(): void - subscribe(observer: CollectionObserver): Promise - unsubscribe(observer: CollectionObserver): Promise - notify(data: T | undefined): Promise -} - -export interface CollectionObserver { - observerName: string - update(source: string, data: T | undefined): Promise -} function isIterable(obj: T | Iterable): obj is Iterable { // checks for null and undefined if (obj == null) { diff --git a/packages/live-status-gateway/tsconfig.build.json b/packages/live-status-gateway/tsconfig.build.json index eab08503db..cf0800867a 100644 --- a/packages/live-status-gateway/tsconfig.build.json +++ b/packages/live-status-gateway/tsconfig.build.json @@ -10,6 +10,8 @@ "live-status-gateway": ["./src/index.ts"] }, "types": ["node"], - "resolveJsonModule": true - }, + "resolveJsonModule": true, + "skipLibCheck": true, + "esModuleInterop": true + } } diff --git a/packages/live-status-gateway/tsconfig.eslint.json b/packages/live-status-gateway/tsconfig.eslint.json deleted file mode 100644 index a7c8b3f61b..0000000000 --- a/packages/live-status-gateway/tsconfig.eslint.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "extends": "./tsconfig.json", - "include": ["*.js", "src/**/*.ts", "api/**/*.yaml"], - "exclude": ["node_modules", "dist", "client", "server", "coverage"] -} diff --git a/packages/live-status-gateway/tsconfig.json b/packages/live-status-gateway/tsconfig.json index 39cf9672dc..d7335519f7 100644 --- a/packages/live-status-gateway/tsconfig.json +++ b/packages/live-status-gateway/tsconfig.json @@ -1,5 +1,6 @@ { "extends": "./tsconfig.build.json", + "include": ["src/**/*.ts"], "exclude": ["node_modules/**"], "compilerOptions": { "types": ["jest", "node"] diff --git a/packages/meteor-lib/.eslintrc.json b/packages/meteor-lib/.eslintrc.json deleted file mode 100644 index 3b809efa88..0000000000 --- a/packages/meteor-lib/.eslintrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "../node_modules/@sofie-automation/code-standard-preset/eslint/main" -} diff --git a/packages/meteor-lib/eslint.config.mjs b/packages/meteor-lib/eslint.config.mjs new file mode 100644 index 0000000000..b9e5a88fd8 --- /dev/null +++ b/packages/meteor-lib/eslint.config.mjs @@ -0,0 +1,3 @@ +import { generateEslintConfig } from '@sofie-automation/code-standard-preset/eslint/main.mjs' + +export default generateEslintConfig({}) diff --git a/packages/meteor-lib/jest.config.js b/packages/meteor-lib/jest.config.js index 2fe89196ee..76ff2b14f1 100644 --- a/packages/meteor-lib/jest.config.js +++ b/packages/meteor-lib/jest.config.js @@ -9,6 +9,9 @@ module.exports = { }, ], }, + moduleNameMapper: { + '(.+)\\.js$': '$1', + }, testMatch: ['**/__tests__/**/*.(spec|test).(ts|js)'], testPathIgnorePatterns: ['integrationTests'], testEnvironment: 'node', diff --git a/packages/meteor-lib/package.json b/packages/meteor-lib/package.json index cb1f148c5b..b7574f0a59 100644 --- a/packages/meteor-lib/package.json +++ b/packages/meteor-lib/package.json @@ -1,6 +1,6 @@ { "name": "@sofie-automation/meteor-lib", - "version": "1.52.0", + "version": "1.53.0-in-development", "private": true, "description": "Temporary internal library for some types shared by meteor and webui", "main": "dist/index.js", @@ -18,7 +18,7 @@ "scripts": { "build": "run -T rimraf dist && run build:main", "build:main": "run -T tsc -p tsconfig.build.json", - "lint:raw": "run -T eslint --ext .ts --ext .js --ignore-pattern dist", + "lint:raw": "run -T eslint", "lint": "run lint:raw .", "unit": "run -T jest", "test": "run lint && run unit", @@ -30,7 +30,7 @@ "license-validate": "run -T sofie-licensecheck" }, "engines": { - "node": ">=22.11" + "node": ">=22.13.1" }, "files": [ "/dist", @@ -40,9 +40,9 @@ ], "dependencies": { "@mos-connection/helper": "^4.2.2", - "@sofie-automation/blueprints-integration": "1.52.0", - "@sofie-automation/corelib": "1.52.0", - "@sofie-automation/shared-lib": "1.52.0", + "@sofie-automation/blueprints-integration": "1.53.0-in-development", + "@sofie-automation/corelib": "1.53.0-in-development", + "@sofie-automation/shared-lib": "1.53.0-in-development", "deep-extend": "0.6.0", "semver": "^7.6.3", "type-fest": "^4.33.0", @@ -55,7 +55,7 @@ }, "peerDependencies": { "i18next": "^21.10.0", - "mongodb": "^5.5.0" + "mongodb": "^6.12.0" }, "prettier": "@sofie-automation/code-standard-preset/.prettierrc.json", "lint-staged": { diff --git a/packages/meteor-lib/src/__tests__/time.spec.ts b/packages/meteor-lib/src/__tests__/time.spec.ts index 738172a964..08748213a2 100644 --- a/packages/meteor-lib/src/__tests__/time.spec.ts +++ b/packages/meteor-lib/src/__tests__/time.spec.ts @@ -1,9 +1,10 @@ -import { formatDateTime } from '../time' +import { formatDateTime } from '../time.js' test('formatDateTime', () => { expect(formatDateTime(1556194064374)).toMatch(/2019-04-\d{2} \d{2}:\d{2}:\d{2}/) }) +// eslint-disable-next-line jest/no-commented-out-tests // test('formatDateTime2', () => { // if (process.platform === 'win32') { // // Due to a bug in how timezones are handled in Windows & Node, we just have to skip these tests when running tests locally.. diff --git a/packages/meteor-lib/src/api/__tests__/client.test.ts b/packages/meteor-lib/src/api/__tests__/client.test.ts index 5a373df758..969ed62ec5 100644 --- a/packages/meteor-lib/src/api/__tests__/client.test.ts +++ b/packages/meteor-lib/src/api/__tests__/client.test.ts @@ -1,4 +1,4 @@ -import { ClientAPI } from '../client' +import { ClientAPI } from '../client.js' import { UserError, UserErrorMessage } from '@sofie-automation/corelib/dist/error' describe('ClientAPI', () => { @@ -22,7 +22,7 @@ describe('ClientAPI', () => { expect(error).toMatchObject({ error: { key: UserErrorMessage.InactiveRundown, - message: { + userMessage: { args: mockArgs, key: 'Rundown must be active!', }, @@ -34,14 +34,18 @@ describe('ClientAPI', () => { { const rawErr = new Error(mockErrorMessage) const error = ClientAPI.responseError(UserError.from(rawErr, UserErrorMessage.InternalError, mockArgs)) + expect(error).toMatchObject({ error: { key: UserErrorMessage.InternalError, - message: { + userMessage: { args: mockArgs, key: 'An internal error occured!', }, - rawError: rawErr, + rawError: expect.objectContaining({ + message: mockErrorMessage, + name: 'UserError', + }), }, }) } diff --git a/packages/meteor-lib/src/api/__tests__/pubsub.test.ts b/packages/meteor-lib/src/api/__tests__/pubsub.test.ts index a3e7f377b6..904ce47c74 100644 --- a/packages/meteor-lib/src/api/__tests__/pubsub.test.ts +++ b/packages/meteor-lib/src/api/__tests__/pubsub.test.ts @@ -1,5 +1,5 @@ import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub' -import { MeteorPubSub } from '../pubsub' +import { MeteorPubSub } from '../pubsub.js' import { PeripheralDevicePubSub } from '@sofie-automation/shared-lib/dist/pubsub/peripheralDevice' describe('Pubsub', () => { diff --git a/packages/meteor-lib/src/api/client.ts b/packages/meteor-lib/src/api/client.ts index 9243d8fe31..3f301e9b02 100644 --- a/packages/meteor-lib/src/api/client.ts +++ b/packages/meteor-lib/src/api/client.ts @@ -1,6 +1,6 @@ -import * as _ from 'underscore' +import _ from 'underscore' import { Time } from '@sofie-automation/shared-lib/dist/lib/lib' -import { UserError } from '@sofie-automation/corelib/dist/error' +import { SerializedUserError, UserError } from '@sofie-automation/corelib/dist/error' import { PeripheralDeviceId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { TSR } from '@sofie-automation/blueprints-integration' @@ -43,17 +43,23 @@ export enum ClientAPIMethods { export namespace ClientAPI { /** Response from a method that's called from the client */ export interface ClientResponseError { - /** On error, return status code (by default, use 500) */ + /** + * On error, return status code (by default, use 500) + * @deprecated The value of this is identical to error.errorCode (will be removed in a later release) + */ errorCode: number /** On error, provide a human-readable error message */ - error: UserError + error: SerializedUserError } + /** - * Used to reply to the user that the action didn't succeed (but it's not bad enough to log it as an error) - * @param errorMessage + * Returns a `ClientResponseError` object from a given `UserError`. + * + * @param userError - The `UserError` instance containing error details. + * @returns A `ClientResponseError` object containing the error and the resolved error code. */ - export function responseError(error: UserError, errorCode?: number): ClientResponseError { - return { error, errorCode: errorCode ?? 500 } + export function responseError(userError: UserError): ClientResponseError { + return { error: UserError.serialize(userError), errorCode: userError.errorCode } } export interface ClientResponseSuccess { /** On success, return success code (by default, use 200) */ @@ -63,7 +69,7 @@ export namespace ClientAPI { } export function responseSuccess(result: Result, code?: number): ClientResponseSuccess { if (isClientResponseSuccess(result)) result = result.result - else if (isClientResponseError(result)) throw result.error + else if (isClientResponseError(result)) throw UserError.fromSerialized(result.error) return { success: code ?? 200, @@ -72,8 +78,10 @@ export namespace ClientAPI { } export type ClientResponse = ClientResponseError | ClientResponseSuccess export function isClientResponseError(res: unknown): res is ClientResponseError { - const res0 = res as Partial - return !!res0 && typeof res0 === 'object' && 'error' in res0 && UserError.isUserError(res0.error) + const res0 = res as ClientResponseError + return ( + !!res0 && typeof res0 === 'object' && 'error' in res0 && UserError.isSerializedUserErrorObject(res0.error) + ) } export function isClientResponseSuccess(res: unknown): res is ClientResponseSuccess { const res0 = res as any diff --git a/packages/meteor-lib/src/api/mediaManager.ts b/packages/meteor-lib/src/api/mediaManager.ts deleted file mode 100644 index 01843ae319..0000000000 --- a/packages/meteor-lib/src/api/mediaManager.ts +++ /dev/null @@ -1,10 +0,0 @@ -import * as Shared from '@sofie-automation/shared-lib/dist/peripheralDevice/mediaManager' - -// eslint-disable-next-line @typescript-eslint/no-namespace -export namespace MediaManagerAPI { - export type WorkStepStatus = Shared.WorkStepStatus - export const WorkStepStatus = Shared.WorkStepStatus - - export type WorkStepAction = Shared.WorkStepAction - export const WorkStepAction = Shared.WorkStepAction -} diff --git a/packages/meteor-lib/src/api/methods.ts b/packages/meteor-lib/src/api/methods.ts index 72b6219547..c7ad382f75 100644 --- a/packages/meteor-lib/src/api/methods.ts +++ b/packages/meteor-lib/src/api/methods.ts @@ -1,24 +1,25 @@ -import * as _ from 'underscore' -import { NewBlueprintAPI, BlueprintAPIMethods } from './blueprint' -import { NewClientAPI, ClientAPIMethods } from './client' -import { NewExternalMessageQueueAPI, ExternalMessageQueueAPIMethods } from './ExternalMessageQueue' -import { NewMigrationAPI, MigrationAPIMethods } from './migration' -import { NewPlayoutAPI, PlayoutAPIMethods } from './playout' -import { NewRundownAPI, RundownAPIMethods } from './rundown' -import { NewRundownLayoutsAPI, RundownLayoutsAPIMethods } from './rundownLayouts' -import { NewShowStylesAPI, ShowStylesAPIMethods } from './showStyles' -import { NewSnapshotAPI, SnapshotAPIMethods } from './shapshot' -import { NewSystemStatusAPI, SystemStatusAPIMethods } from './systemStatus' -import { NewUserActionAPI, UserActionAPIMethods } from './userActions' -import { StudiosAPIMethods, NewStudiosAPI } from './studios' -import { NewOrganizationAPI, OrganizationAPIMethods } from './organization' -import { NewUserAPI, UserAPIMethods } from './user' -import { SystemAPIMethods, SystemAPI } from './system' -import { NewTriggeredActionsAPI, TriggeredActionsAPIMethods } from './triggeredActions' +import _ from 'underscore' +import { NewBlueprintAPI, BlueprintAPIMethods } from './blueprint.js' +import { NewClientAPI, ClientAPIMethods } from './client.js' +import { NewExternalMessageQueueAPI, ExternalMessageQueueAPIMethods } from './ExternalMessageQueue.js' +import { NewMigrationAPI, MigrationAPIMethods } from './migration.js' +import { NewPlayoutAPI, PlayoutAPIMethods } from './playout.js' +import { NewRundownAPI, RundownAPIMethods } from './rundown.js' +import { NewRundownLayoutsAPI, RundownLayoutsAPIMethods } from './rundownLayouts.js' +import { NewShowStylesAPI, ShowStylesAPIMethods } from './showStyles.js' +import { NewSnapshotAPI, SnapshotAPIMethods } from './shapshot.js' +import { NewSystemStatusAPI, SystemStatusAPIMethods } from './systemStatus.js' +import { NewUserActionAPI, UserActionAPIMethods } from './userActions.js' +import { StudiosAPIMethods, NewStudiosAPI } from './studios.js' +import { NewOrganizationAPI, OrganizationAPIMethods } from './organization.js' +import { NewUserAPI, UserAPIMethods } from './user.js' +import { SystemAPIMethods, SystemAPI } from './system.js' +import { NewTriggeredActionsAPI, TriggeredActionsAPIMethods } from './triggeredActions.js' import { NewPeripheralDeviceAPI, PeripheralDeviceAPIMethods, } from '@sofie-automation/shared-lib/dist/peripheralDevice/methodsAPI' +import { MongoAPI, MongoAPIMethods } from './mongo.js' /** All methods typings are defined here, the actual implementation is defined in other places */ export interface IMeteorCall { @@ -39,6 +40,7 @@ export interface IMeteorCall { userAction: NewUserActionAPI organization: NewOrganizationAPI system: SystemAPI + mongo: MongoAPI } export type MakeMeteorMethodCall = (name: string, args: any[], options?: { noRetry?: boolean }) => Promise @@ -81,5 +83,6 @@ export function MakeMeteorCall(makeMethodCall: MakeMeteorMethodCall): IMeteorCal userAction: makeMethods(UserActionAPIMethods, ['storeRundownSnapshot']), organization: makeMethods(OrganizationAPIMethods), system: makeMethods(SystemAPIMethods), + mongo: makeMethods(MongoAPIMethods), } } diff --git a/packages/meteor-lib/src/api/mongo.ts b/packages/meteor-lib/src/api/mongo.ts new file mode 100644 index 0000000000..e8d9520089 --- /dev/null +++ b/packages/meteor-lib/src/api/mongo.ts @@ -0,0 +1,14 @@ +import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' +import { ProtectedString } from '@sofie-automation/corelib/dist/protectedString' + +export interface MongoAPI { + insertDocument(collectionName: CollectionName, newDocument: any): Promise> + updateDocument(collectionName: CollectionName, selector: any, modifier: any, options: any): Promise + removeDocument(collectionName: CollectionName, selector: any): Promise +} + +export enum MongoAPIMethods { + 'insertDocument' = 'mongo.insert', + 'updateDocument' = 'mongo.update', + 'removeDocument' = 'mongo.remove', +} diff --git a/packages/meteor-lib/src/api/pieceContentStatus.ts b/packages/meteor-lib/src/api/pieceContentStatus.ts deleted file mode 100644 index d6612512c2..0000000000 --- a/packages/meteor-lib/src/api/pieceContentStatus.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { PackageInfo } from '@sofie-automation/blueprints-integration' -import { PieceStatusCode } from '@sofie-automation/corelib/dist/dataModel/Piece' -import { ITranslatableMessage } from '@sofie-automation/corelib/dist/TranslatableMessage' - -export interface PieceContentStatusObj { - status: PieceStatusCode - messages: ITranslatableMessage[] - - freezes: Array - blacks: Array - scenes: Array - - thumbnailUrl: string | undefined - previewUrl: string | undefined - - packageName: string | null - - contentDuration: number | undefined - - progress: number | undefined -} diff --git a/packages/meteor-lib/src/api/pubsub.ts b/packages/meteor-lib/src/api/pubsub.ts index 2accecb010..75da6e0765 100644 --- a/packages/meteor-lib/src/api/pubsub.ts +++ b/packages/meteor-lib/src/api/pubsub.ts @@ -8,23 +8,21 @@ import { ShowStyleBaseId, StudioId, } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { Bucket } from '../collections/Buckets' -import { ICoreSystem } from '../collections/CoreSystem' -import { Evaluation } from '../collections/Evaluations' +import { Bucket } from '@sofie-automation/corelib/dist/dataModel/Bucket' +import { ICoreSystem } from '../collections/CoreSystem.js' +import { Evaluation } from '../collections/Evaluations.js' import { ExpectedPlayoutItem } from '@sofie-automation/corelib/dist/dataModel/ExpectedPlayoutItem' -import { MediaWorkFlow } from '@sofie-automation/shared-lib/dist/core/model/MediaWorkFlows' -import { MediaWorkFlowStep } from '@sofie-automation/shared-lib/dist/core/model/MediaWorkFlowSteps' -import { DBOrganization } from '../collections/Organization' -import { RundownLayoutBase } from '../collections/RundownLayouts' -import { SnapshotItem } from '../collections/Snapshots' -import { TranslationsBundle } from '../collections/TranslationsBundles' -import { DBTriggeredActions, UITriggeredActionsObj } from '../collections/TriggeredActions' -import { UserActionsLogItem } from '../collections/UserActionsLog' -import { UIBucketContentStatus, UIPieceContentStatus, UISegmentPartNote } from './rundownNotifications' -import { UIShowStyleBase } from './showStyles' -import { UIStudio } from './studios' -import { UIDeviceTriggerPreview } from './MountedTriggers' -import { UIBlueprintUpgradeStatus } from './upgradeStatus' +import { DBOrganization } from '../collections/Organization.js' +import { RundownLayoutBase } from '../collections/RundownLayouts.js' +import { SnapshotItem } from '../collections/Snapshots.js' +import { TranslationsBundle } from '../collections/TranslationsBundles.js' +import { DBTriggeredActions, UITriggeredActionsObj } from '../collections/TriggeredActions.js' +import { UserActionsLogItem } from '../collections/UserActionsLog.js' +import { UIBucketContentStatus, UISegmentPartNote } from './rundownNotifications.js' +import { UIShowStyleBase } from './showStyles.js' +import { UIStudio } from './studios.js' +import { UIDeviceTriggerPreview } from './MountedTriggers.js' +import { UIBlueprintUpgradeStatus } from './upgradeStatus.js' import { PeripheralDevicePubSub, PeripheralDevicePubSubTypes, @@ -34,7 +32,7 @@ import { import { CorelibPubSub, CorelibPubSubCollections, CorelibPubSubTypes } from '@sofie-automation/corelib/dist/pubsub' import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' -import { PartInstance } from '../collections/PartInstances' +import { PartInstance } from '../collections/PartInstances.js' import type { DBNotificationObj } from '@sofie-automation/corelib/dist/dataModel/Notifications' /** @@ -75,16 +73,6 @@ export enum MeteorPubSub { * Fetch all User Action Log entries for the specified time range */ userActionsLog = 'userActionsLog', - /** - * Fetch all MediaManager workflows in the system - * @deprecated - */ - mediaWorkFlows = 'mediaWorkFlows', - /** - * Fetch all MediaManager workflow steps in the system - * @deprecated - */ - mediaWorkFlowSteps = 'mediaWorkFlowSteps', /** * Fetch either all RundownLayouts or limited to the specified ShowStyleBases */ @@ -94,10 +82,6 @@ export enum MeteorPubSub { * If null is provided, nothing will be returned */ organization = 'organization', - /** - * Fetch either all buckets for the given Studio, or the Bucket specified. - */ - buckets = 'buckets', /** * Fetch all translation bundles */ @@ -147,11 +131,6 @@ export enum MeteorPubSub { * If the id is null, nothing will be returned */ uiSegmentPartNotes = 'uiSegmentPartNotes', - /** - * Fetch the Pieces content-status in the given RundownPlaylist - * If the id is null, nothing will be returned - */ - uiPieceContentStatuses = 'uiPieceContentStatuses', /** * Fetch the Pieces content-status in the given Bucket */ @@ -200,17 +179,12 @@ export interface MeteorPubSubTypes { ) => CollectionName.TriggeredActions [MeteorPubSub.snapshots]: (token?: string) => CollectionName.Snapshots [MeteorPubSub.userActionsLog]: (dateFrom: number, dateTo: number, token?: string) => CollectionName.UserActionsLog - /** @deprecated */ - [MeteorPubSub.mediaWorkFlows]: (token?: string) => CollectionName.MediaWorkFlows - /** @deprecated */ - [MeteorPubSub.mediaWorkFlowSteps]: (token?: string) => CollectionName.MediaWorkFlowSteps [MeteorPubSub.rundownLayouts]: ( /** ShowStyleBaseIds to fetch for, or null to fetch all */ showStyleBaseIds: ShowStyleBaseId[] | null, token?: string ) => CollectionName.RundownLayouts [MeteorPubSub.organization]: (organizationId: OrganizationId | null, token?: string) => CollectionName.Organizations - [MeteorPubSub.buckets]: (studioId: StudioId, bucketId: BucketId | null, token?: string) => CollectionName.Buckets [MeteorPubSub.translationsBundles]: (token?: string) => CollectionName.TranslationsBundles [MeteorPubSub.notificationsForRundown]: (studioId: StudioId, rundownId: RundownId) => CollectionName.Notifications [MeteorPubSub.notificationsForRundownPlaylist]: ( @@ -242,9 +216,6 @@ export interface MeteorPubSubTypes { /** Custom publications for the UI */ [MeteorPubSub.uiSegmentPartNotes]: (playlistId: RundownPlaylistId | null) => CustomCollectionName.UISegmentPartNotes - [MeteorPubSub.uiPieceContentStatuses]: ( - rundownPlaylistId: RundownPlaylistId | null - ) => CustomCollectionName.UIPieceContentStatuses [MeteorPubSub.uiBucketContentStatuses]: ( studioId: StudioId, bucketId: BucketId @@ -288,9 +259,6 @@ export type MeteorPubSubCollections = { [CollectionName.TranslationsBundles]: TranslationsBundle [CollectionName.ExpectedPlayoutItems]: ExpectedPlayoutItem [CollectionName.Notifications]: DBNotificationObj - - [CollectionName.MediaWorkFlows]: MediaWorkFlow - [CollectionName.MediaWorkFlowSteps]: MediaWorkFlowStep } & MeteorPubSubCustomCollections export type MeteorPubSubCustomCollections = { @@ -299,7 +267,6 @@ export type MeteorPubSubCustomCollections = { [CustomCollectionName.UITriggeredActions]: UITriggeredActionsObj [CustomCollectionName.UIDeviceTriggerPreviews]: UIDeviceTriggerPreview [CustomCollectionName.UISegmentPartNotes]: UISegmentPartNote - [CustomCollectionName.UIPieceContentStatuses]: UIPieceContentStatus [CustomCollectionName.UIBucketContentStatuses]: UIBucketContentStatus [CustomCollectionName.UIBlueprintUpgradeStatuses]: UIBlueprintUpgradeStatus [CustomCollectionName.UIParts]: DBPart diff --git a/packages/meteor-lib/src/api/rundownLayouts.ts b/packages/meteor-lib/src/api/rundownLayouts.ts index afc0921227..3c9dfba9cb 100644 --- a/packages/meteor-lib/src/api/rundownLayouts.ts +++ b/packages/meteor-lib/src/api/rundownLayouts.ts @@ -1,4 +1,4 @@ -import { RundownLayoutType } from '../collections/RundownLayouts' +import { RundownLayoutType } from '../collections/RundownLayouts.js' import { RundownLayoutId, ShowStyleBaseId } from '@sofie-automation/corelib/dist/dataModel/Ids' export interface NewRundownLayoutsAPI { diff --git a/packages/meteor-lib/src/api/rundownNotifications.ts b/packages/meteor-lib/src/api/rundownNotifications.ts index bd21db24c6..f441407d04 100644 --- a/packages/meteor-lib/src/api/rundownNotifications.ts +++ b/packages/meteor-lib/src/api/rundownNotifications.ts @@ -1,20 +1,15 @@ import { TrackedNote } from '@sofie-automation/corelib/dist/dataModel/Notes' import { - AdLibActionId, BucketAdLibActionId, BucketAdLibId, BucketId, - PartId, - PieceId, - PieceInstanceId, - RundownBaselineAdLibActionId, RundownId, RundownPlaylistId, SegmentId, } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { PieceContentStatusObj } from './pieceContentStatus' import { ProtectedString } from '@sofie-automation/corelib/dist/protectedString' import { ITranslatableMessage } from '@sofie-automation/corelib/dist/TranslatableMessage' +import { PieceContentStatusObj } from '@sofie-automation/corelib/dist/dataModel/PieceContentStatus' export type UISegmentPartNoteId = ProtectedString<'UISegmentPartNote'> export interface UISegmentPartNote { @@ -26,26 +21,6 @@ export interface UISegmentPartNote { note: TrackedNote } -export type UIPieceContentStatusId = ProtectedString<'UIPieceContentStatus'> -export interface UIPieceContentStatus { - _id: UIPieceContentStatusId - - segmentRank: number - partRank: number - - rundownId: RundownId - partId: PartId | undefined - segmentId: SegmentId | undefined - - pieceId: PieceId | AdLibActionId | RundownBaselineAdLibActionId | PieceInstanceId - isPieceInstance: boolean - - name: string | ITranslatableMessage - segmentName: string | undefined - - status: PieceContentStatusObj -} - export type UIBucketContentStatusId = ProtectedString<'UIBucketContentStatus'> export interface UIBucketContentStatus { _id: UIBucketContentStatusId diff --git a/packages/meteor-lib/src/api/system.ts b/packages/meteor-lib/src/api/system.ts index d9c39c0758..8d12639436 100644 --- a/packages/meteor-lib/src/api/system.ts +++ b/packages/meteor-lib/src/api/system.ts @@ -1,6 +1,6 @@ import { TranslationsBundleId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { TranslationsBundle } from '../collections/TranslationsBundles' -import { ClientAPI } from './client' +import { TranslationsBundle } from '../collections/TranslationsBundles.js' +import { ClientAPI } from './client.js' export interface CollectionCleanupResult { [index: string]: { diff --git a/packages/meteor-lib/src/api/systemStatus.ts b/packages/meteor-lib/src/api/systemStatus.ts index be14a7bc98..232df41ec5 100644 --- a/packages/meteor-lib/src/api/systemStatus.ts +++ b/packages/meteor-lib/src/api/systemStatus.ts @@ -27,6 +27,7 @@ export interface StatusResponseBase { statusMessage?: string // Tekstlig beskrivelse av status. (Eks: OK, Running, Standby, Completed successfully, 2/3 nodes running, Slow response time). instanceId?: ProtectedString + parentId?: ProtectedString utilises?: Array consumers?: Array version?: '3' // version of healthcheck diff --git a/packages/meteor-lib/src/api/triggeredActions.ts b/packages/meteor-lib/src/api/triggeredActions.ts index 2f6c0828fb..5d1f3119fd 100644 --- a/packages/meteor-lib/src/api/triggeredActions.ts +++ b/packages/meteor-lib/src/api/triggeredActions.ts @@ -1,6 +1,6 @@ import { ITranslatableMessage, SomeAction } from '@sofie-automation/blueprints-integration' import { ShowStyleBaseId, TriggeredActionId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { DBBlueprintTrigger } from '../collections/TriggeredActions' +import { DBBlueprintTrigger } from '../collections/TriggeredActions.js' export interface NewTriggeredActionsAPI { createTriggeredActions( diff --git a/packages/meteor-lib/src/api/user.ts b/packages/meteor-lib/src/api/user.ts index 83881d2819..1167bb89cf 100644 --- a/packages/meteor-lib/src/api/user.ts +++ b/packages/meteor-lib/src/api/user.ts @@ -1,4 +1,4 @@ -import { UserPermissions } from '../userPermissions' +import { UserPermissions } from '../userPermissions.js' export interface NewUserAPI { getUserPermissions(): Promise diff --git a/packages/meteor-lib/src/api/userActions.ts b/packages/meteor-lib/src/api/userActions.ts index 5ff3351320..fd1a07347e 100644 --- a/packages/meteor-lib/src/api/userActions.ts +++ b/packages/meteor-lib/src/api/userActions.ts @@ -1,6 +1,6 @@ -import { ClientAPI } from './client' -import { EvaluationBase } from '../collections/Evaluations' -import { Bucket } from '../collections/Buckets' +import { ClientAPI } from './client.js' +import { EvaluationBase } from '../collections/Evaluations.js' +import { Bucket } from '@sofie-automation/corelib/dist/dataModel/Bucket' import { IngestAdlib, ActionUserData, UserOperationTarget } from '@sofie-automation/blueprints-integration' import { BucketAdLib } from '@sofie-automation/corelib/dist/dataModel/BucketAdLibPiece' import { AdLibActionCommon } from '@sofie-automation/corelib/dist/dataModel/AdlibAction' @@ -9,8 +9,9 @@ import { Time } from '@sofie-automation/blueprints-integration' import { ExecuteActionResult, QueueNextSegmentResult } from '@sofie-automation/corelib/dist/worker/studio' import { AdLibActionId, + BucketAdLibActionId, + BucketAdLibId, BucketId, - MediaWorkFlowId, PartId, PartInstanceId, PeripheralDeviceId, @@ -120,7 +121,7 @@ export interface NewUserActionAPI { userEvent: string, eventTime: Time, rundownPlaylistId: RundownPlaylistId, - actionDocId: AdLibActionId | RundownBaselineAdLibActionId, + actionDocId: AdLibActionId | RundownBaselineAdLibActionId | BucketAdLibActionId, actionId: string, userData: ActionUserData, triggerMode?: string @@ -166,7 +167,7 @@ export interface NewUserActionAPI { eventTime: Time, rundownPlaylistId: RundownPlaylistId, partInstanceId: PartInstanceId, - bucketAdlibId: PieceId, + bucketAdlibId: BucketAdLibId, queue?: boolean ): Promise> activateHold( @@ -210,26 +211,6 @@ export interface NewUserActionAPI { rundownId: RundownId ): Promise> unsyncRundown(userEvent: string, eventTime: Time, rundownId: RundownId): Promise> // - mediaRestartWorkflow( - userEvent: string, - eventTime: Time, - deviceId: PeripheralDeviceId, - workflowId: MediaWorkFlowId - ): Promise> - mediaAbortWorkflow( - userEvent: string, - eventTime: Time, - deviceId: PeripheralDeviceId, - workflowId: MediaWorkFlowId - ): Promise> - mediaPrioritizeWorkflow( - userEvent: string, - eventTime: Time, - deviceId: PeripheralDeviceId, - workflowId: MediaWorkFlowId - ): Promise> - mediaRestartAllWorkflows(userEvent: string, eventTime: Time): Promise> - mediaAbortAllWorkflows(userEvent: string, eventTime: Time): Promise> packageManagerRestartExpectation( userEvent: string, eventTime: Time, @@ -275,22 +256,26 @@ export interface NewUserActionAPI { studioId: StudioId, name: string ): Promise> - bucketsRemoveBucketAdLib(userEvent: string, eventTime: Time, id: PieceId): Promise> + bucketsRemoveBucketAdLib( + userEvent: string, + eventTime: Time, + id: BucketAdLibId + ): Promise> bucketsRemoveBucketAdLibAction( userEvent: string, eventTime: Time, - id: AdLibActionId + id: BucketAdLibActionId ): Promise> bucketsModifyBucketAdLib( userEvent: string, eventTime: Time, - id: PieceId, + id: BucketAdLibId, bucket: Partial> ): Promise> bucketsModifyBucketAdLibAction( userEvent: string, eventTime: Time, - id: AdLibActionId, + id: BucketAdLibActionId, action: Partial> ): Promise> bucketsSaveActionIntoBucket( @@ -422,12 +407,6 @@ export enum UserActionAPIMethods { 'moveRundown' = 'userAction.moveRundown', 'restoreRundownOrder' = 'userAction.restoreRundownOrder', - 'mediaRestartWorkflow' = 'userAction.mediamanager.restartWorkflow', - 'mediaAbortWorkflow' = 'userAction.mediamanager.abortWorkflow', - 'mediaRestartAllWorkflows' = 'userAction.mediamanager.restartAllWorkflows', - 'mediaAbortAllWorkflows' = 'userAction.mediamanager.abortAllWorkflows', - 'mediaPrioritizeWorkflow' = 'userAction.mediamanager.mediaPrioritizeWorkflow', - 'packageManagerRestartExpectation' = 'userAction.packagemanager.restartExpectation', 'packageManagerRestartAllExpectations' = 'userAction.packagemanager.restartAllExpectations', 'packageManagerAbortExpectation' = 'userAction.packagemanager.abortExpectation', diff --git a/packages/meteor-lib/src/collections/CoreSystem.ts b/packages/meteor-lib/src/collections/CoreSystem.ts index e710091a16..5b193b380b 100644 --- a/packages/meteor-lib/src/collections/CoreSystem.ts +++ b/packages/meteor-lib/src/collections/CoreSystem.ts @@ -1,5 +1,5 @@ import { LastBlueprintConfig } from '@sofie-automation/corelib/dist/dataModel/Blueprint' -import { LogLevel } from '../lib' +import { LogLevel } from '../lib.js' import { CoreSystemId, BlueprintId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { protectString } from '@sofie-automation/corelib/dist/protectedString' import { ObjectWithOverrides } from '@sofie-automation/corelib/dist/settings/objectWithOverrides' diff --git a/packages/meteor-lib/src/collections/ExpectedPackages.ts b/packages/meteor-lib/src/collections/ExpectedPackages.ts index 046799c5c1..ca7d656a5c 100644 --- a/packages/meteor-lib/src/collections/ExpectedPackages.ts +++ b/packages/meteor-lib/src/collections/ExpectedPackages.ts @@ -1,7 +1,7 @@ import { ExpectedPackage } from '@sofie-automation/blueprints-integration' import { assertNever, literal } from '@sofie-automation/corelib/dist/lib' import { StudioLight } from '@sofie-automation/corelib/dist/dataModel/Studio' -import * as deepExtend from 'deep-extend' +import deepExtend from 'deep-extend' import { htmlTemplateGetSteps, htmlTemplateGetFileNamesFromSteps, diff --git a/packages/meteor-lib/src/collections/Studios.ts b/packages/meteor-lib/src/collections/Studios.ts index d7caa2e49f..6ddb74d40f 100644 --- a/packages/meteor-lib/src/collections/Studios.ts +++ b/packages/meteor-lib/src/collections/Studios.ts @@ -68,11 +68,11 @@ export function getRoutedMappings( lookahead: route.remapping.lookahead ?? LookaheadMode.NONE, device: route.deviceType, deviceId: protectString(route.remapping.deviceId), - } as M) + } as M) : { ...inputMapping, ...(route.remapping || {}), - } + } outputMappings[route.outputMappedLayer] = routedMapping } } else { diff --git a/packages/meteor-lib/src/triggers/RundownViewEventBus.ts b/packages/meteor-lib/src/triggers/RundownViewEventBus.ts index 8460e67108..60b575aeba 100644 --- a/packages/meteor-lib/src/triggers/RundownViewEventBus.ts +++ b/packages/meteor-lib/src/triggers/RundownViewEventBus.ts @@ -1,5 +1,4 @@ -import * as EventEmitter from 'events' -import { Bucket } from '../collections/Buckets' +import { EventEmitter } from 'events' import { BucketId, PartId, @@ -10,10 +9,11 @@ import { SegmentId, TriggeredActionId, } from '@sofie-automation/corelib/dist/dataModel/Ids' -import type { PieceUi } from '../uiTypes/Piece' -import type { ShelfTabs } from '../uiTypes/ShelfTabs' -import type { IAdLibListItem } from '../uiTypes/Adlib' -import type { BucketAdLibItem } from '../uiTypes/Bucket' +import type { PieceUi } from '../uiTypes/Piece.js' +import type { ShelfTabs } from '../uiTypes/ShelfTabs.js' +import type { IAdLibListItem } from '../uiTypes/Adlib.js' +import type { BucketAdLibItem } from '../uiTypes/Bucket.js' +import { Bucket } from '@sofie-automation/corelib/dist/dataModel/Bucket' export enum RundownViewEvents { ACTIVATE_RUNDOWN_PLAYLIST = 'activateRundownPlaylist', @@ -127,74 +127,38 @@ export interface ItemDroppedEvent extends IEventContext { ev: any } -class RundownViewEventBus0 extends EventEmitter { - emit(event: RundownViewEvents.ACTIVATE_RUNDOWN_PLAYLIST, e: ActivateRundownPlaylistEvent): boolean - emit(event: RundownViewEvents.DEACTIVATE_RUNDOWN_PLAYLIST, e: DeactivateRundownPlaylistEvent): boolean - emit(event: RundownViewEvents.RESYNC_RUNDOWN_PLAYLIST, e: BaseEvent): boolean - emit(event: RundownViewEvents.RESET_RUNDOWN_PLAYLIST, e: BaseEvent): boolean - emit(event: RundownViewEvents.TAKE, e: BaseEvent): boolean - emit(event: RundownViewEvents.REWIND_SEGMENTS): boolean - emit(event: RundownViewEvents.GO_TO_LIVE_SEGMENT): boolean - emit(event: RundownViewEvents.GO_TO_TOP): boolean - emit(event: RundownViewEvents.SEGMENT_ZOOM_ON): boolean - emit(event: RundownViewEvents.SEGMENT_ZOOM_OFF): boolean - emit(event: RundownViewEvents.SHELF_STATE, e: ShelfStateEvent): boolean - emit(event: RundownViewEvents.REVEAL_IN_SHELF, e: RevealInShelfEvent): boolean - emit(event: RundownViewEvents.SWITCH_SHELF_TAB, e: SwitchToShelfTabEvent): boolean - emit(event: RundownViewEvents.MINI_SHELF_QUEUE_ADLIB, e: MiniShelfQueueAdLibEvent): boolean - emit(event: RundownViewEvents.GO_TO_PART, e: GoToPartEvent): boolean - emit(event: RundownViewEvents.GO_TO_PART_INSTANCE, e: GoToPartInstanceEvent): boolean - emit(event: RundownViewEvents.SELECT_PIECE, e: SelectPieceEvent): boolean - emit(event: RundownViewEvents.HIGHLIGHT, e: HighlightEvent): boolean - emit(event: RundownViewEvents.TRIGGER_ACTION, e: TriggerActionEvent): boolean - emit(event: RundownViewEvents.EMPTY_BUCKET, e: BucketEvent): boolean - emit(event: RundownViewEvents.DELETE_BUCKET, e: BucketEvent): boolean - emit(event: RundownViewEvents.RENAME_BUCKET, e: BucketEvent): boolean - emit(event: RundownViewEvents.CREATE_BUCKET, e: IEventContext): boolean - emit(event: RundownViewEvents.DELETE_BUCKET_ADLIB, e: BucketAdLibEvent): boolean - emit(event: RundownViewEvents.RENAME_BUCKET_ADLIB, e: BucketAdLibEvent): boolean - emit(event: RundownViewEvents.CREATE_SNAPSHOT_FOR_DEBUG, e: BaseEvent): boolean - emit(event: RundownViewEvents.TOGGLE_SHELF_DROPZONE, e: ToggleShelfDropzoneEvent): boolean - emit(event: RundownViewEvents.ITEM_DROPPED, e: ItemDroppedEvent): boolean - emit(event: string, ...args: any[]) { - return super.emit(event, ...args) - } - - on(event: RundownViewEvents.ACTIVATE_RUNDOWN_PLAYLIST, listener: (e: ActivateRundownPlaylistEvent) => void): this - on( - event: RundownViewEvents.DEACTIVATE_RUNDOWN_PLAYLIST, - listener: (e: DeactivateRundownPlaylistEvent) => void - ): this - on(event: RundownViewEvents.RESYNC_RUNDOWN_PLAYLIST, listener: (e: BaseEvent) => void): this - on(event: RundownViewEvents.RESET_RUNDOWN_PLAYLIST, listener: (e: BaseEvent) => void): this - on(event: RundownViewEvents.TAKE, listener: (e: BaseEvent) => void): this - on(event: RundownViewEvents.REWIND_SEGMENTS, listener: () => void): this - on(event: RundownViewEvents.GO_TO_LIVE_SEGMENT, listener: () => void): this - on(event: RundownViewEvents.GO_TO_TOP, listener: () => void): this - on(event: RundownViewEvents.SEGMENT_ZOOM_ON, listener: () => void): this - on(event: RundownViewEvents.SEGMENT_ZOOM_OFF, listener: () => void): this - on(event: RundownViewEvents.REVEAL_IN_SHELF, listener: (e: RevealInShelfEvent) => void): this - on(event: RundownViewEvents.SHELF_STATE, listener: (e: ShelfStateEvent) => void): this - on(event: RundownViewEvents.SWITCH_SHELF_TAB, listener: (e: SwitchToShelfTabEvent) => void): this - on(event: RundownViewEvents.MINI_SHELF_QUEUE_ADLIB, listener: (e: MiniShelfQueueAdLibEvent) => void): this - on(event: RundownViewEvents.GO_TO_PART, listener: (e: GoToPartEvent) => void): this - on(event: RundownViewEvents.GO_TO_PART_INSTANCE, listener: (e: GoToPartInstanceEvent) => void): this - on(event: RundownViewEvents.SELECT_PIECE, listener: (e: SelectPieceEvent) => void): this - on(event: RundownViewEvents.HIGHLIGHT, listener: (e: HighlightEvent) => void): this - on(event: RundownViewEvents.TRIGGER_ACTION, listener: (e: TriggerActionEvent) => void): this - on(event: RundownViewEvents.EMPTY_BUCKET, listener: (e: BucketEvent) => void): this - on(event: RundownViewEvents.DELETE_BUCKET, listener: (e: BucketEvent) => void): this - on(event: RundownViewEvents.RENAME_BUCKET, listener: (e: BucketEvent) => void): this - on(event: RundownViewEvents.CREATE_BUCKET, listener: (e: IEventContext) => void): this - on(event: RundownViewEvents.DELETE_BUCKET_ADLIB, listener: (e: BucketAdLibEvent) => void): this - on(event: RundownViewEvents.RENAME_BUCKET_ADLIB, listener: (e: BucketAdLibEvent) => void): this - on(event: RundownViewEvents.CREATE_SNAPSHOT_FOR_DEBUG, listener: (e: BaseEvent) => void): this - on(event: RundownViewEvents.TOGGLE_SHELF_DROPZONE, listener: (e: ToggleShelfDropzoneEvent) => void): this - on(event: RundownViewEvents.ITEM_DROPPED, listener: (e: ItemDroppedEvent) => void): this - on(event: string, listener: (...args: any[]) => void) { - return super.on(event, listener) - } -} +export interface RundownViewEventBusEvents { + [RundownViewEvents.ACTIVATE_RUNDOWN_PLAYLIST]: [e: ActivateRundownPlaylistEvent] + [RundownViewEvents.DEACTIVATE_RUNDOWN_PLAYLIST]: [e: DeactivateRundownPlaylistEvent] + [RundownViewEvents.RESYNC_RUNDOWN_PLAYLIST]: [e: BaseEvent] + [RundownViewEvents.RESET_RUNDOWN_PLAYLIST]: [e: BaseEvent] + [RundownViewEvents.TAKE]: [e: BaseEvent] + [RundownViewEvents.REWIND_SEGMENTS]: [] + [RundownViewEvents.GO_TO_LIVE_SEGMENT]: [] + [RundownViewEvents.GO_TO_TOP]: [] + [RundownViewEvents.SEGMENT_ZOOM_ON]: [] + [RundownViewEvents.SEGMENT_ZOOM_OFF]: [] + [RundownViewEvents.SHELF_STATE]: [e: ShelfStateEvent] + [RundownViewEvents.REVEAL_IN_SHELF]: [e: RevealInShelfEvent] + [RundownViewEvents.SWITCH_SHELF_TAB]: [e: SwitchToShelfTabEvent] + [RundownViewEvents.MINI_SHELF_QUEUE_ADLIB]: [e: MiniShelfQueueAdLibEvent] + [RundownViewEvents.GO_TO_PART]: [e: GoToPartEvent] + [RundownViewEvents.GO_TO_PART_INSTANCE]: [e: GoToPartInstanceEvent] + [RundownViewEvents.SELECT_PIECE]: [e: SelectPieceEvent] + [RundownViewEvents.HIGHLIGHT]: [e: HighlightEvent] + [RundownViewEvents.TRIGGER_ACTION]: [e: TriggerActionEvent] + [RundownViewEvents.EMPTY_BUCKET]: [e: BucketEvent] + [RundownViewEvents.DELETE_BUCKET]: [e: BucketEvent] + [RundownViewEvents.RENAME_BUCKET]: [e: BucketEvent] + [RundownViewEvents.CREATE_BUCKET]: [e: IEventContext] + [RundownViewEvents.DELETE_BUCKET_ADLIB]: [e: BucketAdLibEvent] + [RundownViewEvents.RENAME_BUCKET_ADLIB]: [e: BucketAdLibEvent] + [RundownViewEvents.CREATE_SNAPSHOT_FOR_DEBUG]: [e: BaseEvent] + [RundownViewEvents.TOGGLE_SHELF_DROPZONE]: [e: ToggleShelfDropzoneEvent] + [RundownViewEvents.ITEM_DROPPED]: [e: ItemDroppedEvent] +} + +class RundownViewEventBus0 extends EventEmitter {} const RundownViewEventBus = new RundownViewEventBus0() RundownViewEventBus.setMaxListeners(Number.MAX_SAFE_INTEGER) diff --git a/packages/meteor-lib/src/triggers/actionFactory.ts b/packages/meteor-lib/src/triggers/actionFactory.ts index 99667b8a76..e7410ce173 100644 --- a/packages/meteor-lib/src/triggers/actionFactory.ts +++ b/packages/meteor-lib/src/triggers/actionFactory.ts @@ -12,10 +12,10 @@ import { TFunction } from 'i18next' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { DBShowStyleBase, SourceLayers } from '@sofie-automation/corelib/dist/dataModel/ShowStyleBase' import { DBStudio } from '@sofie-automation/corelib/dist/dataModel/Studio' -import RundownViewEventBus, { RundownViewEvents } from '../triggers/RundownViewEventBus' -import { UserAction } from '../userAction' -import { AdLibFilterChainLink, compileAdLibFilter, IWrappedAdLib } from './actionFilterChainCompilers' -import { ClientAPI } from '../api/client' +import RundownViewEventBus, { RundownViewEvents } from '../triggers/RundownViewEventBus.js' +import { UserAction } from '../userAction.js' +import { AdLibFilterChainLink, compileAdLibFilter, IWrappedAdLib } from './actionFilterChainCompilers.js' +import { ClientAPI } from '../api/client.js' import { PartId, PartInstanceId, @@ -25,14 +25,13 @@ import { } from '@sofie-automation/corelib/dist/dataModel/Ids' import { DeviceActions } from '@sofie-automation/shared-lib/dist/core/model/ShowStyle' import { UserError, UserErrorMessage } from '@sofie-automation/corelib/dist/error' -import { MountedAdLibTriggerType } from '../api/MountedTriggers' -import { DummyReactiveVar, TriggerReactiveVar } from './reactive-var' -import { TriggersContext, TriggerTrackerComputation } from './triggersContext' +import { MountedAdLibTriggerType } from '../api/MountedTriggers.js' +import { DummyReactiveVar, TriggerReactiveVar } from './reactive-var.js' +import { TriggersContext, TriggerTrackerComputation } from './triggersContext.js' import { assertNever } from '@sofie-automation/corelib/dist/lib' // as described in this issue: https://github.com/Microsoft/TypeScript/issues/14094 type Without = { [P in Exclude]?: never } -// eslint-disable-next-line @typescript-eslint/ban-types type XOR = T | U extends object ? (Without & U) | (Without & T) : T | U export interface ReactivePlaylistActionContext { @@ -197,7 +196,7 @@ function createAdLibAction( currentPartInstanceId, wrappedAdLib.item._id, false - ) + ) : ClientAPI.responseSuccess(undefined) ) break @@ -211,7 +210,7 @@ function createAdLibAction( currentPartInstanceId, wrappedAdLib.item._id, false - ) + ) : ClientAPI.responseSuccess(undefined) ) break @@ -555,7 +554,9 @@ export function createAction( UserAction.CREATE_SNAPSHOT_FOR_DEBUG, async (e, ts, ctx) => triggersContext.MeteorCall.system.generateSingleUseToken().then(async (tokenResult) => { - if (ClientAPI.isClientResponseError(tokenResult) || !tokenResult.result) throw tokenResult + if (ClientAPI.isClientResponseError(tokenResult)) + throw UserError.fromSerialized(tokenResult.error) + if (!tokenResult.result) throw new Error('Failed to generate token') return triggersContext.MeteorCall.userAction.storeRundownSnapshot( e, ts, diff --git a/packages/meteor-lib/src/triggers/actionFilterChainCompilers.ts b/packages/meteor-lib/src/triggers/actionFilterChainCompilers.ts index d8afa19d94..31c2ec9b06 100644 --- a/packages/meteor-lib/src/triggers/actionFilterChainCompilers.ts +++ b/packages/meteor-lib/src/triggers/actionFilterChainCompilers.ts @@ -18,14 +18,14 @@ import { SourceLayers } from '@sofie-automation/corelib/dist/dataModel/ShowStyle import { MongoQuery } from '@sofie-automation/corelib/dist/mongo' import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment' -import { sortAdlibs } from '../adlibs' -import { ReactivePlaylistActionContext } from './actionFactory' +import { sortAdlibs } from '../adlibs.js' +import { ReactivePlaylistActionContext } from './actionFactory.js' import { PartId, RundownId, SegmentId } from '@sofie-automation/corelib/dist/dataModel/Ids' import { IWrappedAdLibBase } from '@sofie-automation/shared-lib/dist/input-gateway/deviceTriggerPreviews' -import { MountedAdLibTriggerType } from '../api/MountedTriggers' +import { MountedAdLibTriggerType } from '../api/MountedTriggers.js' import { assertNever, generateTranslation } from '@sofie-automation/corelib/dist/lib' -import { FindOptions } from '../collections/lib' -import { TriggersContext, TriggerTrackerComputation } from './triggersContext' +import { FindOptions } from '../collections/lib.js' +import { TriggersContext, TriggerTrackerComputation } from './triggersContext.js' export type AdLibFilterChainLink = IRundownPlaylistFilterLink | IGUIContextFilterLink | IAdLibFilterLink @@ -48,7 +48,12 @@ type CompiledFilter = { skip?: true } -type SomeAdLib = RundownBaselineAdLibItem | RundownBaselineAdLibAction | AdLibPiece | AdLibAction +type SomeAdLib = + | RundownBaselineAdLibItem + | RundownBaselineAdLibAction + // eslint-disable-next-line @typescript-eslint/no-duplicate-type-constituents + | AdLibPiece + | AdLibAction interface IWrappedAdLibType extends IWrappedAdLibBase { _id: T['_id'] @@ -59,6 +64,7 @@ interface IWrappedAdLibType( +function wrapAdLibPiece< + T extends + | RundownBaselineAdLibItem + // eslint-disable-next-line @typescript-eslint/no-duplicate-type-constituents + | AdLibPiece, +>( adLib: T, type: MountedAdLibTriggerType.adLibPiece | MountedAdLibTriggerType.rundownBaselineAdLibItem ): IWrappedAdLib { @@ -384,7 +397,10 @@ function compileAdLibActionFilter( } } -type AdLibPieceType = RundownBaselineAdLibItem | AdLibPiece +type AdLibPieceType = + | RundownBaselineAdLibItem + // eslint-disable-next-line @typescript-eslint/no-duplicate-type-constituents + | AdLibPiece function compileAdLibPieceFilter( filterChain: IAdLibFilterLink[], @@ -507,15 +523,15 @@ export function compileAdLibFilter( adLibPieceTypeFilter.segment === 'current' ? context.currentSegmentPartIds.get(computation) : adLibPieceTypeFilter.segment === 'next' - ? context.nextSegmentPartIds.get(computation) - : undefined + ? context.nextSegmentPartIds.get(computation) + : undefined const singlePartId = adLibPieceTypeFilter.part === 'current' ? context.currentPartId.get(computation) : adLibPieceTypeFilter.part === 'next' - ? context.nextPartId.get(computation) - : undefined + ? context.nextPartId.get(computation) + : undefined /** Note: undefined means that all parts are to be considered */ let partFilter: PartId[] | undefined = undefined diff --git a/packages/meteor-lib/src/triggers/reactive-var.ts b/packages/meteor-lib/src/triggers/reactive-var.ts index 765174dd7f..71eb9eddda 100644 --- a/packages/meteor-lib/src/triggers/reactive-var.ts +++ b/packages/meteor-lib/src/triggers/reactive-var.ts @@ -1,4 +1,4 @@ -import type { TriggerTrackerComputation } from './triggersContext' +import type { TriggerTrackerComputation } from './triggersContext.js' // Copied from Meteor export interface TriggerReactiveVar { diff --git a/packages/meteor-lib/src/triggers/triggersContext.ts b/packages/meteor-lib/src/triggers/triggersContext.ts index 94b179cb77..74e1985610 100644 --- a/packages/meteor-lib/src/triggers/triggersContext.ts +++ b/packages/meteor-lib/src/triggers/triggersContext.ts @@ -1,8 +1,8 @@ -import { UserAction } from '../userAction' -import { IMeteorCall } from '../api/methods' +import { UserAction } from '../userAction.js' +import { IMeteorCall } from '../api/methods.js' import { Time } from '@sofie-automation/shared-lib/dist/lib/lib' -import { ClientAPI } from '../api/client' -import { FindOneOptions, FindOptions } from '../collections/lib' +import { ClientAPI } from '../api/client.js' +import { FindOneOptions, FindOptions } from '../collections/lib.js' import { AdLibAction } from '@sofie-automation/corelib/dist/dataModel/AdlibAction' import { AdLibPiece } from '@sofie-automation/corelib/dist/dataModel/AdLibPiece' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' @@ -14,7 +14,7 @@ import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment' import { LoggerInstanceFixed } from '@sofie-automation/corelib/dist/logging' import { IBaseFilterLink } from '@sofie-automation/blueprints-integration' import { StudioId } from '@sofie-automation/corelib/dist/dataModel/Ids' -import { ReactivePlaylistActionContext } from './actionFactory' +import { ReactivePlaylistActionContext } from './actionFactory.js' import { TFunction } from 'i18next' import { ProtectedString } from '@sofie-automation/corelib/dist/protectedString' import { MongoQuery } from '@sofie-automation/corelib/dist/mongo' diff --git a/packages/meteor-lib/src/uiTypes/Adlib.ts b/packages/meteor-lib/src/uiTypes/Adlib.ts index aa5c144e1c..c87673e023 100644 --- a/packages/meteor-lib/src/uiTypes/Adlib.ts +++ b/packages/meteor-lib/src/uiTypes/Adlib.ts @@ -9,7 +9,6 @@ export interface AdLibPieceUi extends Omit sourceLayer?: ISourceLayer outputLayer?: IOutputLayer isGlobal?: boolean - isHidden?: boolean isSticky?: boolean isAction?: boolean isClearSourceLayer?: boolean @@ -21,7 +20,6 @@ export interface AdLibPieceUi extends Omit export interface IAdLibListItem extends AdLibPieceUi { sourceLayer?: ISourceLayer outputLayer?: IOutputLayer - isHidden?: boolean invalid?: boolean floated?: boolean } diff --git a/packages/meteor-lib/src/uiTypes/OutputLayer.ts b/packages/meteor-lib/src/uiTypes/OutputLayer.ts index a00540526b..90200df06c 100644 --- a/packages/meteor-lib/src/uiTypes/OutputLayer.ts +++ b/packages/meteor-lib/src/uiTypes/OutputLayer.ts @@ -1,5 +1,5 @@ import type { IOutputLayer } from '@sofie-automation/shared-lib/dist/core/model/ShowStyle' -import type { ISourceLayerExtended } from './SourceLayer' +import type { ISourceLayerExtended } from './SourceLayer.js' export interface IOutputLayerExtended extends IOutputLayer { /** Is this output layer used in this segment */ diff --git a/packages/meteor-lib/src/uiTypes/Piece.ts b/packages/meteor-lib/src/uiTypes/Piece.ts index a25376a5e7..d17407b354 100644 --- a/packages/meteor-lib/src/uiTypes/Piece.ts +++ b/packages/meteor-lib/src/uiTypes/Piece.ts @@ -1,6 +1,6 @@ import type { PieceInstanceWithTimings } from '@sofie-automation/corelib/dist/playout/processAndPrune' -import type { IOutputLayerExtended } from './OutputLayer' -import type { ISourceLayerExtended } from './SourceLayer' +import type { IOutputLayerExtended } from './OutputLayer.js' +import type { ISourceLayerExtended } from './SourceLayer.js' export interface PieceExtended { instance: PieceInstanceWithTimings diff --git a/packages/meteor-lib/src/uiTypes/SourceLayer.ts b/packages/meteor-lib/src/uiTypes/SourceLayer.ts index 6f509d7584..bfc4e02b07 100644 --- a/packages/meteor-lib/src/uiTypes/SourceLayer.ts +++ b/packages/meteor-lib/src/uiTypes/SourceLayer.ts @@ -1,5 +1,5 @@ import type { ISourceLayer } from '@sofie-automation/shared-lib/dist/core/model/ShowStyle' -import type { PieceExtended } from './Piece' +import type { PieceExtended } from './Piece.js' export interface ISourceLayerExtended extends ISourceLayer { /** Pieces present on this source layer */ diff --git a/packages/meteor-lib/tsconfig.build.json b/packages/meteor-lib/tsconfig.build.json index 761f83db92..69627fd13d 100755 --- a/packages/meteor-lib/tsconfig.build.json +++ b/packages/meteor-lib/tsconfig.build.json @@ -8,9 +8,10 @@ "baseUrl": "./", "paths": { "*": ["./node_modules/*"], - "@sofie-automation/corelib": ["./src/index.ts"] + "@sofie-automation/meteor-lib": ["./src/index.ts"] }, "resolveJsonModule": true, - "types": ["node"] + "types": ["node"], + "esModuleInterop": true } } diff --git a/packages/mos-gateway/.eslintrc.json b/packages/mos-gateway/.eslintrc.json deleted file mode 100644 index 3b809efa88..0000000000 --- a/packages/mos-gateway/.eslintrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "../node_modules/@sofie-automation/code-standard-preset/eslint/main" -} diff --git a/packages/mos-gateway/CHANGELOG.md b/packages/mos-gateway/CHANGELOG.md index 9f45700d9a..d924c004fd 100644 --- a/packages/mos-gateway/CHANGELOG.md +++ b/packages/mos-gateway/CHANGELOG.md @@ -43,141 +43,85 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ## [1.51.7](https://github.com/nrkno/sofie-core/compare/v1.51.6...v1.51.7) (2025-05-06) -**Note:** Version bump only for package mos-gateway - +### Bug Fixes +- dis-/en-able heartbeat when openMediaHotStandby ([e2fe446](https://github.com/nrkno/sofie-core/commit/e2fe4467df8b578661c74c5755c110f730f3c3d4)) +- make openMediaHotStandby option pr subdevice, and rename from hotStandby to openMediaHotStandby ([ce68543](https://github.com/nrkno/sofie-core/commit/ce6854336f4df8fc4f4b512a3de1f039fc0f1309)) +- MosGateway hotstandby - send message for both servers if both connections are offline ([72c765f](https://github.com/nrkno/sofie-core/commit/72c765f56f4acf991bbb566fefb2b99106536587)) +- update mos-connection dependency (SOFIE-3006) ([#1251](https://github.com/nrkno/sofie-core/issues/1251)) ([d5c2cad](https://github.com/nrkno/sofie-core/commit/d5c2cad8e154703df2a9fb7698d54c35ef3f17f8)) +- update mos-connection dependency: fixes an issue where ExternalMetadata.MosPayload was not passed through if content is a string ([d499893](https://github.com/nrkno/sofie-core/commit/d4998939b463de518c7e12f32462cb77b6a40975)) +### Features +- meteor 3.0.4 ([8670727](https://github.com/nrkno/sofie-core/commit/8670727bba5ac9cffe0e5d36b4bd45d6664482be)) +- update meteor to 3.1 and node to 22 ([61b6854](https://github.com/nrkno/sofie-core/commit/61b6854261a03f04e81416b9d37ee995e3a10108)) ## [1.51.6](https://github.com/nrkno/sofie-core/compare/v1.51.5...v1.51.6) (2025-01-14) **Note:** Version bump only for package mos-gateway - - - - ## [1.51.5](https://github.com/nrkno/sofie-core/compare/v1.51.4...v1.51.5) (2025-01-07) **Note:** Version bump only for package mos-gateway - - - - ## [1.51.4](https://github.com/nrkno/sofie-core/compare/v1.51.3...v1.51.4) (2024-12-04) **Note:** Version bump only for package mos-gateway - - - - ## [1.51.3](https://github.com/nrkno/sofie-core/compare/v1.51.2...v1.51.3) (2024-11-21) - ### Bug Fixes -* change CMD in GHA Dockerfile ([b13ba2d](https://github.com/nrkno/sofie-core/commit/b13ba2d60afb5a95314fcd217b4e63b4b5f241fa)) - - - - +- change CMD in GHA Dockerfile ([b13ba2d](https://github.com/nrkno/sofie-core/commit/b13ba2d60afb5a95314fcd217b4e63b4b5f241fa)) ## [1.51.2](https://github.com/nrkno/sofie-core/compare/v1.51.1...v1.51.2) (2024-11-21) **Note:** Version bump only for package mos-gateway - - - - ## [1.51.1](https://github.com/nrkno/sofie-core/compare/v1.51.1-2...v1.51.1) (2024-11-13) **Note:** Version bump only for package mos-gateway - - - - ## [1.51.1-2](https://github.com/nrkno/sofie-core/compare/v1.51.1-1...v1.51.1-2) (2024-10-24) **Note:** Version bump only for package mos-gateway - - - - ## [1.51.1-2](https://github.com/nrkno/sofie-core/compare/v1.51.1-1...v1.51.1-2) (2024-10-24) **Note:** Version bump only for package mos-gateway - - - - ## [1.51.1-1](https://github.com/nrkno/sofie-core/compare/v1.51.1-0...v1.51.1-1) (2024-10-18) **Note:** Version bump only for package mos-gateway - - - - ## [1.51.1-0](https://github.com/nrkno/sofie-core/compare/v1.51.0...v1.51.1-0) (2024-10-18) **Note:** Version bump only for package mos-gateway - - - - ## [1.51.1-0](https://github.com/nrkno/sofie-core/compare/v1.51.0...v1.51.1-0) (2024-10-18) **Note:** Version bump only for package mos-gateway - - - - # [1.51.0](https://github.com/nrkno/sofie-core/compare/v1.51.0-in-testing.3...v1.51.0) (2024-10-07) **Note:** Version bump only for package mos-gateway - - - - # [1.51.0](https://github.com/nrkno/sofie-core/compare/v1.51.0-in-testing.3...v1.51.0) (2024-10-07) **Note:** Version bump only for package mos-gateway - - - - # [1.51.0-in-testing.3](https://github.com/nrkno/sofie-core/compare/v1.51.0-in-testing.2...v1.51.0-in-testing.3) (2024-09-25) **Note:** Version bump only for package mos-gateway - - - - # [1.51.0-in-testing.2](https://github.com/nrkno/sofie-core/compare/v1.51.0-in-testing.1...v1.51.0-in-testing.2) (2024-09-24) **Note:** Version bump only for package mos-gateway - - - - # [1.51.0-in-testing.1](https://github.com/nrkno/sofie-core/compare/v1.51.0-in-testing.0...v1.51.0-in-testing.1) (2024-09-06) - # [1.51.0-in-testing.1](https://github.com/nrkno/sofie-core/compare/v1.51.0-in-testing.0...v1.51.0-in-testing.1) (2024-09-06) - **Note:** Version bump only for package mos-gateway # [1.51.0-in-testing.0](https://github.com/nrkno/sofie-core/compare/v1.50.4...v1.51.0-in-testing.0) (2024-08-19) @@ -194,7 +138,6 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline **Note:** Version bump only for package mos-gateway - ## [1.50.5-LSG-updates](https://github.com/nrkno/sofie-core/compare/v1.50.4-LSG-updates...v1.50.5-LSG-updates) (2024-08-08) ## [1.50.4-LSG-updates](https://github.com/nrkno/sofie-core/compare/v1.50.3-LSG-updates...v1.50.4-LSG-updates) (2024-07-30) diff --git a/packages/mos-gateway/Dockerfile b/packages/mos-gateway/Dockerfile index 044af5cd17..0d446cdddf 100644 --- a/packages/mos-gateway/Dockerfile +++ b/packages/mos-gateway/Dockerfile @@ -9,7 +9,6 @@ RUN corepack enable RUN yarn install --immutable RUN yarn run pinst --disable RUN yarn lerna run --scope \*\*/mos-gateway --include-dependencies --stream build -RUN yarn plugin import workspace-tools RUN yarn workspaces focus mos-gateway --production # purge dev-dependencies # DEPLOY IMAGE @@ -25,4 +24,4 @@ COPY --from=0 /opt/shared-lib /opt/shared-lib WORKDIR /opt/mos-gateway RUN chown -R 1000:1000 /opt/mos-gateway USER 1000 -CMD ["node", "dist/index.js"] +ENTRYPOINT ["node", "dist/index.js"] diff --git a/packages/mos-gateway/Dockerfile.circle b/packages/mos-gateway/Dockerfile.circle index d315404ffb..05a1f73dfd 100644 --- a/packages/mos-gateway/Dockerfile.circle +++ b/packages/mos-gateway/Dockerfile.circle @@ -10,4 +10,4 @@ COPY shared-lib /opt/shared-lib WORKDIR /opt/mos-gateway RUN chown -R 1000:1000 /opt/mos-gateway USER 1000 -CMD ["node", "dist/index.js"] +ENTRYPOINT ["node", "dist/index.js"] diff --git a/packages/mos-gateway/eslint.config.mjs b/packages/mos-gateway/eslint.config.mjs new file mode 100644 index 0000000000..b9e5a88fd8 --- /dev/null +++ b/packages/mos-gateway/eslint.config.mjs @@ -0,0 +1,3 @@ +import { generateEslintConfig } from '@sofie-automation/code-standard-preset/eslint/main.mjs' + +export default generateEslintConfig({}) diff --git a/packages/mos-gateway/jest-integration.config.js b/packages/mos-gateway/jest-integration.config.js index 8637acfa0b..ffbf1a1598 100644 --- a/packages/mos-gateway/jest-integration.config.js +++ b/packages/mos-gateway/jest-integration.config.js @@ -8,6 +8,9 @@ module.exports = { transform: { '^.+\\.(ts|tsx)$': 'ts-jest', }, + moduleNameMapper: { + '(.+)\\.js$': '$1', + }, testMatch: ['**/integrationTests/**/*.spec.(ts|js)'], testEnvironment: 'node', coverageThreshold: { diff --git a/packages/mos-gateway/jest.config.js b/packages/mos-gateway/jest.config.js index 2fe89196ee..76ff2b14f1 100644 --- a/packages/mos-gateway/jest.config.js +++ b/packages/mos-gateway/jest.config.js @@ -9,6 +9,9 @@ module.exports = { }, ], }, + moduleNameMapper: { + '(.+)\\.js$': '$1', + }, testMatch: ['**/__tests__/**/*.(spec|test).(ts|js)'], testPathIgnorePatterns: ['integrationTests'], testEnvironment: 'node', diff --git a/packages/mos-gateway/package.json b/packages/mos-gateway/package.json index 84ada3c759..5ae463bc2b 100644 --- a/packages/mos-gateway/package.json +++ b/packages/mos-gateway/package.json @@ -1,6 +1,6 @@ { "name": "mos-gateway", - "version": "1.52.0", + "version": "1.53.0-in-development", "private": true, "description": "MOS-Gateway for the Sofie project", "license": "MIT", @@ -30,7 +30,7 @@ "buildstart": "run build && run dev", "buildinspect": "run build && run inspect", "build:main": "run -T tsc -p tsconfig.build.json", - "lint:raw": "run -T eslint --ext .ts --ext .tsx --ignore-pattern dist", + "lint:raw": "run -T eslint", "lint": "run lint:raw .", "lint-fix": "run lint --fix", "unit": "run -T jest", @@ -48,7 +48,7 @@ "license-validate": "run -T sofie-licensecheck" }, "engines": { - "node": ">=22.11" + "node": ">=22.13.1" }, "keywords": [ "mos", @@ -66,8 +66,8 @@ ], "dependencies": { "@mos-connection/connector": "^4.2.2", - "@sofie-automation/server-core-integration": "1.52.0", - "@sofie-automation/shared-lib": "1.52.0", + "@sofie-automation/server-core-integration": "1.53.0-in-development", + "@sofie-automation/shared-lib": "1.53.0-in-development", "tslib": "^2.8.1", "type-fest": "^4.33.0", "underscore": "^1.13.7", diff --git a/packages/mos-gateway/src/$schemas/devices.json b/packages/mos-gateway/src/$schemas/devices.json index ae44a97199..78a895f86f 100644 --- a/packages/mos-gateway/src/$schemas/devices.json +++ b/packages/mos-gateway/src/$schemas/devices.json @@ -63,18 +63,11 @@ "default": 10542 } }, - "required": [ - "lower", - "upper", - "query" - ], + "required": ["lower", "upper", "query"], "additionalProperties": false } }, - "required": [ - "id", - "host" - ], + "required": ["id", "host"], "additionalProperties": false }, "secondary": { @@ -141,23 +134,14 @@ "default": 10542 } }, - "required": [ - "lower", - "upper", - "query" - ], + "required": ["lower", "upper", "query"], "additionalProperties": false } }, - "required": [ - "id", - "host" - ], + "required": ["id", "host"], "additionalProperties": false } }, - "required": [ - "primary" - ], + "required": ["primary"], "additionalProperties": false -} \ No newline at end of file +} diff --git a/packages/mos-gateway/src/CoreMosDeviceHandler.ts b/packages/mos-gateway/src/CoreMosDeviceHandler.ts index 1ce92433dc..242cc84055 100644 --- a/packages/mos-gateway/src/CoreMosDeviceHandler.ts +++ b/packages/mos-gateway/src/CoreMosDeviceHandler.ts @@ -29,10 +29,10 @@ import { stringifyMosObject, stringifyMosType, } from '@mos-connection/connector' -import * as _ from 'underscore' -import { MosHandler } from './mosHandler' +import _ from 'underscore' +import { MosHandler } from './mosHandler.js' import { PartialDeep } from 'type-fest' -import type { CoreHandler } from './coreHandler' +import type { CoreHandler } from './coreHandler.js' import { CoreConnectionChild } from '@sofie-automation/server-core-integration/dist/lib/CoreConnectionChild' import { Queue } from '@sofie-automation/server-core-integration/dist/lib/queue' @@ -56,8 +56,8 @@ interface IStoryItemChange { itemID: string timestamp: number - resolve: (value?: IMOSROAck | PromiseLike | undefined) => void - reject: (error: any) => void + resolve: (value?: IMOSROAck | PromiseLike) => void + reject: (error: Error) => void itemDiff: PartialDeep } @@ -410,7 +410,7 @@ export class CoreMosDeviceHandler { !result.mos.roAck.roStatus || result.mos.roAck.roStatus.toString() !== 'OK' ) { - return Promise.reject(result) + return Promise.reject(new Error(`Bad result: ${JSON.stringify(result)}`)) } else { // When the result of the replaceStoryItem operation comes in, // it is not confirmed if the change actually was performed or not. @@ -442,7 +442,7 @@ export class CoreMosDeviceHandler { ) promiseResolve(value || result) } - pendingChange.reject = (reason) => { + pendingChange.reject = (reason: Error) => { this.removePendingChange(pendingChange) this._coreParentHandler.logger.debug( `pending change rejected: ${pendingChange.storyID}:${pendingChange.itemID}` @@ -452,7 +452,7 @@ export class CoreMosDeviceHandler { }) this.addPendingChange(pendingChange) setTimeout(() => { - pendingChange.reject('Pending change timed out') + pendingChange.reject(new Error('Pending change timed out')) }, this._pendingChangeTimeout) return promise } diff --git a/packages/mos-gateway/src/__tests__/index.spec.ts b/packages/mos-gateway/src/__tests__/index.spec.ts index 0ee71cfeee..89e03836e1 100644 --- a/packages/mos-gateway/src/__tests__/index.spec.ts +++ b/packages/mos-gateway/src/__tests__/index.spec.ts @@ -1,4 +1,4 @@ -import { Connector } from '../connector' +import { Connector } from '../connector.js' import * as Winston from 'winston' test('Simple test', async () => { diff --git a/packages/mos-gateway/src/connector.ts b/packages/mos-gateway/src/connector.ts index 82ccb6f035..a6ea0de258 100644 --- a/packages/mos-gateway/src/connector.ts +++ b/packages/mos-gateway/src/connector.ts @@ -1,5 +1,5 @@ -import { MosHandler, MosConfig } from './mosHandler' -import { CoreHandler, CoreConfig } from './coreHandler' +import { MosHandler, MosConfig } from './mosHandler.js' +import { CoreHandler, CoreConfig } from './coreHandler.js' import * as Winston from 'winston' import { PeripheralDeviceId, @@ -50,7 +50,7 @@ export class Connector { this.dispose().catch((e2) => this._logger.error(e2)) setTimeout(() => { - // eslint-disable-next-line no-process-exit + // eslint-disable-next-line n/no-process-exit process.exit(0) }, 10 * 1000) } diff --git a/packages/mos-gateway/src/coreHandler.ts b/packages/mos-gateway/src/coreHandler.ts index c4257a09c9..e6a38c5849 100644 --- a/packages/mos-gateway/src/coreHandler.ts +++ b/packages/mos-gateway/src/coreHandler.ts @@ -14,11 +14,11 @@ import { import * as Winston from 'winston' import { IMOSDevice } from '@mos-connection/connector' -import { MosHandler } from './mosHandler' -import { DeviceConfig } from './connector' -import { MOS_DEVICE_CONFIG_MANIFEST } from './configManifest' -import { getVersions } from './versions' -import { CoreMosDeviceHandler, CoreMosDeviceHandlerOptions } from './CoreMosDeviceHandler' +import { MosHandler } from './mosHandler.js' +import { DeviceConfig } from './connector.js' +import { MOS_DEVICE_CONFIG_MANIFEST } from './configManifest.js' +import { getVersions } from './versions.js' +import { CoreMosDeviceHandler, CoreMosDeviceHandlerOptions } from './CoreMosDeviceHandler.js' import { PeripheralDeviceCommandId } from '@sofie-automation/shared-lib/dist/core/model/Ids' export interface CoreConfig { @@ -297,7 +297,7 @@ export class CoreHandler { killProcess(): void { this.logger.info('KillProcess command received, shutting down in 1000ms!') setTimeout(() => { - // eslint-disable-next-line no-process-exit + // eslint-disable-next-line n/no-process-exit process.exit(0) }, 1000) } diff --git a/packages/mos-gateway/src/index.ts b/packages/mos-gateway/src/index.ts index 54e7404fc8..1b3b9b1a7c 100644 --- a/packages/mos-gateway/src/index.ts +++ b/packages/mos-gateway/src/index.ts @@ -1,6 +1,6 @@ -import { Connector, Config } from './connector' +import { Connector, Config } from './connector.js' import * as Winston from 'winston' -import _ = require('underscore') +import _ from 'underscore' import { protectString, stringifyError } from '@sofie-automation/server-core-integration' console.log('process started') // This is a message all Sofie processes log upon startup @@ -66,7 +66,7 @@ CLI ENV -debug Debug mode -h, -help Displays this help message `) - // eslint-disable-next-line no-process-exit + // eslint-disable-next-line n/no-process-exit process.exit(0) } @@ -85,7 +85,7 @@ const JSONStringifyCircular = () => { try { // If this value does not reference a parent it can be deduped return JSON.parse(JSON.stringify(value)) - } catch (error) { + } catch (_error) { // discard key if value cannot be deduped return '[circular of ' + (cacheKeys[i] || '*root*') + ']' } diff --git a/packages/mos-gateway/src/integrationTests/index.spec.ts b/packages/mos-gateway/src/integrationTests/index.spec.ts index 924ffc625d..5fb4897866 100644 --- a/packages/mos-gateway/src/integrationTests/index.spec.ts +++ b/packages/mos-gateway/src/integrationTests/index.spec.ts @@ -1,4 +1,4 @@ -import { Connector } from '../connector' +import { Connector } from '../connector.js' import * as Winston from 'winston' test('Simple test', async () => { diff --git a/packages/mos-gateway/src/mosHandler.ts b/packages/mos-gateway/src/mosHandler.ts index 6a61e5c6fc..6f0ffd241f 100644 --- a/packages/mos-gateway/src/mosHandler.ts +++ b/packages/mos-gateway/src/mosHandler.ts @@ -25,15 +25,15 @@ import { } from '@mos-connection/connector' import * as Winston from 'winston' -import { CoreHandler } from './coreHandler' -import { CoreMosDeviceHandler } from './CoreMosDeviceHandler' +import { CoreHandler } from './coreHandler.js' +import { CoreMosDeviceHandler } from './CoreMosDeviceHandler.js' import { Observer, PeripheralDevicePubSubCollectionsNames } from '@sofie-automation/server-core-integration' import { DEFAULT_MOS_TIMEOUT_TIME, DEFAULT_MOS_HEARTBEAT_INTERVAL, } from '@sofie-automation/shared-lib/dist/core/constants' -import { MosGatewayConfig } from './generated/options' -import { MosDeviceConfig } from './generated/devices' +import { MosGatewayConfig } from '@sofie-automation/shared-lib/dist/generated/MosGatewayOptionsTypes' +import { MosDeviceConfig } from '@sofie-automation/shared-lib/dist/generated/MosGatewayDevicesTypes' import { PeripheralDeviceForDevice } from '@sofie-automation/server-core-integration' export interface MosConfig { @@ -424,7 +424,8 @@ export class MosHandler { for (const [deviceId, device] of Object.entries<{ options: MosDeviceConfig }>(devices)) { if (device) { if (device.options.secondary) { - this._openMediaHotStandby[device.options.secondary.id] = + const fullSecondaryId = this._settings?.mosId + '_' + device.options.secondary.id + this._openMediaHotStandby[fullSecondaryId] = device.options.secondary?.openMediaHotStandby || false // If the host isn't set, don't use secondary: if (!device.options.secondary.host || !device.options.secondary.id) diff --git a/packages/mos-gateway/src/versions.ts b/packages/mos-gateway/src/versions.ts index 8cacd8223a..c0b3293662 100644 --- a/packages/mos-gateway/src/versions.ts +++ b/packages/mos-gateway/src/versions.ts @@ -12,7 +12,7 @@ export function getVersions(logger: Winston.Logger): { [packageName: string]: st try { for (const pkgName of pkgNames) { try { - // eslint-disable-next-line @typescript-eslint/no-var-requires + // eslint-disable-next-line @typescript-eslint/no-require-imports const pkgInfo = require(`${pkgName}/package.json`) versions[pkgName] = pkgInfo.version || 'N/A' } catch (e) { diff --git a/packages/mos-gateway/tsconfig.build.json b/packages/mos-gateway/tsconfig.build.json index af0aae5107..5b6439320c 100644 --- a/packages/mos-gateway/tsconfig.build.json +++ b/packages/mos-gateway/tsconfig.build.json @@ -10,6 +10,8 @@ "mos-gateway": ["./src/index.ts"] }, "types": ["node"], - "resolveJsonModule": true + "resolveJsonModule": true, + "skipLibCheck": true, + "esModuleInterop": true } } diff --git a/packages/openapi/.eslintignore b/packages/openapi/.eslintignore deleted file mode 100644 index 33c030bd61..0000000000 --- a/packages/openapi/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage -client -server diff --git a/packages/openapi/.eslintrc.json b/packages/openapi/.eslintrc.json deleted file mode 100644 index f663c757a1..0000000000 --- a/packages/openapi/.eslintrc.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "extends": ["../node_modules/@sofie-automation/code-standard-preset/eslint/main", "plugin:yml/recommended"], - "env": { "browser": true }, - "overrides": [ - { - "files": ["*.yaml"], - "rules": { - "yml/quotes": ["error", { "prefer": "single" }], - "yml/spaced-comment": ["error"], - "spaced-comment": ["off"] - } - } - ], - "rules": { - "prettier/prettier": ["error", { "endOfLine": "auto" }] - }, - "parserOptions": { - "sourceType": "module", - "project": ["./tsconfig.eslint.json"] - } -} diff --git a/packages/openapi/README.md b/packages/openapi/README.md index 9832c79988..746ced46c4 100644 --- a/packages/openapi/README.md +++ b/packages/openapi/README.md @@ -32,20 +32,23 @@ npm install @sofie-automation/openapi ``` ```typescript -import { Configuration, PlaylistsApi, ResponseError, API_VERSION } from '@sofie-automation/openapi' +import { API_VERSION, Configuration, PlaylistsApi, SofieApi } from '@sofie-automation/openapi' const config = new Configuration({ basePath: `http://mysofie:3000/api/${API_VERSION}`, }) +const sofieApi = new SofieApi(config) const sofieVersion = await sofieApi.index() + if (sofieVersion.status !== 200) throw new Error('Bad initial response code') // Check Sofie version: console.log(`Talking to Sofie version ${sofieVersion.result.version}`) +const playlistsApi = new PlaylistsApi(config) const playlists = await playlistsApi.playlists() -const firstPlaylist = playlists.result[0] +const firstPlaylist = playlists.result ? playlists.result[0] : undefined if (!firstPlaylist) throw new Error('No playlists found') await playlistsApi.activate({ diff --git a/packages/openapi/api/actions.yaml b/packages/openapi/api/actions.yaml index f2b61596ad..70f1788148 100644 --- a/packages/openapi/api/actions.yaml +++ b/packages/openapi/api/actions.yaml @@ -20,6 +20,8 @@ tags: paths: /: $ref: 'definitions/sofie.yaml#/resources/index' + /health: + $ref: 'definitions/sofie.yaml#/resources/health' /system/blueprint: $ref: 'definitions/sofie.yaml#/resources/systemBlueprint' /system/migrations: diff --git a/packages/openapi/api/definitions/devices.yaml b/packages/openapi/api/definitions/devices.yaml index 05feb9e85d..998b89c112 100644 --- a/packages/openapi/api/definitions/devices.yaml +++ b/packages/openapi/api/definitions/devices.yaml @@ -73,18 +73,7 @@ resources: description: Service messages from the device. deviceType: type: string - enum: - [ - unknown, - mos, - spreadsheet, - inews, - playout, - media_manager, - package_manager, - live_status, - input, - ] + enum: [unknown, mos, spreadsheet, inews, playout, package_manager, live_status, input] description: Device type. example: playout connected: diff --git a/packages/openapi/api/definitions/playlists.yaml b/packages/openapi/api/definitions/playlists.yaml index 7e8d0c0133..943778f641 100644 --- a/packages/openapi/api/definitions/playlists.yaml +++ b/packages/openapi/api/definitions/playlists.yaml @@ -722,8 +722,11 @@ components: properties: id: type: string + externalId: + type: string required: - id + - externalId additionalProperties: false responses: putSuccess: diff --git a/packages/openapi/api/definitions/sofie.yaml b/packages/openapi/api/definitions/sofie.yaml index c73071b660..d285d5fb74 100644 --- a/packages/openapi/api/definitions/sofie.yaml +++ b/packages/openapi/api/definitions/sofie.yaml @@ -131,6 +131,21 @@ resources: type: string 500: $ref: '#/components/responses/internalServerError' + health: + get: + operationId: getHealth + tags: + - sofie + summary: Gets the current health status of Sofie and all its components + responses: + 200: + description: Command successfully handled - returns an object with detailed health status + content: + application/json: + schema: + $ref: '#/components/schemas/healthStatus' + 500: + $ref: '#/components/responses/internalServerError' components: schemas: migrationInputs: @@ -204,6 +219,88 @@ components: - attributeId - migrationValue additionalProperties: false + healthStatus: + type: object + properties: + name: + type: string + description: Name of the running system + example: Sofie Automation system + updated: + type: string + format: date-time + description: Time when the status of Sofie was updated + example: '2023-11-29T16:50:06.057Z' + status: + type: string + enum: [OK, FAIL, WARNING, UNDEFINED] + description: Sofie status string + example: OK + version: + type: string + description: Sofie core software version + example: '1.50.10' + blueprintsVersion: + type: string + description: Sofie blueprints version + example: '1.0.60' + components: + type: array + description: Array of components that are part of the Sofie software + items: + $ref: '#/components/schemas/healthComponentStatus' + statusMessage: + type: string + description: Concatenation of Sofie status and all component statuses, separated by semicolons + example: 'Playout gateway: Disconnected' + required: + - name + - updated + - status + - version + - blueprintsVersion + - components + - statusMessage + additionalProperties: false + healthComponentStatus: + type: object + properties: + name: + type: string + description: Name of the component + example: Playout Gateway + updated: + type: string + format: date-time + description: Time when the component status was updated + status: + type: string + enum: [OK, FAIL, WARNING, UNDEFINED] + description: Component status string + example: OK + version: + type: string + description: Component software version + example: '0.1.13' + components: + type: array + description: Array of components that are children of this component. Can recurse - components with no child will have no components member + items: + type: object + description: Components conforming to the same definition as the parent object + example: + - name: atem + updated: '2023-11-28T15:17:21.712Z' + status: OK + statusMessage: + type: string + description: Status messages for this component + example: Disconnected + required: + - name + - updated + - status + additionalProperties: false responses: postSuccess: description: POST success. diff --git a/packages/openapi/api/definitions/studios.yaml b/packages/openapi/api/definitions/studios.yaml index ae1e4851d8..b543628d27 100644 --- a/packages/openapi/api/definitions/studios.yaml +++ b/packages/openapi/api/definitions/studios.yaml @@ -552,6 +552,9 @@ components: allowAdlibTestingSegment: type: boolean description: Whether to allow adlib testing mode, before a Part is playing in a Playlist + allowTestingAdlibsToPersist: + type: boolean + description: Whether to allow infinite adlib from adlib testing mode to persist in the rundown allowHold: type: boolean description: Whether to allow hold operations for Rundowns in this Studio diff --git a/packages/openapi/eslint.config.mjs b/packages/openapi/eslint.config.mjs new file mode 100644 index 0000000000..6b708af6b4 --- /dev/null +++ b/packages/openapi/eslint.config.mjs @@ -0,0 +1,17 @@ +import { generateEslintConfig } from '@sofie-automation/code-standard-preset/eslint/main.mjs' +import pluginYaml from 'eslint-plugin-yml' + +const extendedRules = await generateEslintConfig({ + ignores: ['client', 'server'], +}) +extendedRules.push(...pluginYaml.configs['flat/recommended'], { + files: ['**/*.yaml'], + + rules: { + 'yml/quotes': ['error', { prefer: 'single' }], + 'yml/spaced-comment': ['error'], + 'spaced-comment': ['off'], + }, +}) + +export default extendedRules diff --git a/packages/openapi/index.ts b/packages/openapi/index.ts index 41d13f0696..d99d175b88 100644 --- a/packages/openapi/index.ts +++ b/packages/openapi/index.ts @@ -1,2 +1,2 @@ -export * from './client/ts' +export * from './client/ts/index.js' export const API_VERSION = 'v1.0' diff --git a/packages/openapi/install_swagger.js b/packages/openapi/install_swagger.mjs similarity index 73% rename from packages/openapi/install_swagger.js rename to packages/openapi/install_swagger.mjs index 15439cade7..cb89f8b104 100644 --- a/packages/openapi/install_swagger.js +++ b/packages/openapi/install_swagger.mjs @@ -1,7 +1,7 @@ -const fs = require('fs/promises') -const fs_constants = require('fs').constants -// eslint-disable-next-line node/no-unpublished-require -const wget = require('wget-improved') +import fs from 'fs/promises' +import { exit } from 'process' +// eslint-disable-next-line n/no-unpublished-import +import wget from 'wget-improved' async function get(url, path) { let totalBytes = 0 @@ -23,7 +23,7 @@ async function get(url, path) { } }) download.on('end', function (output) { - process.stdout.write(`Downloaded 100% of '${path}'. Total length ${totalBytes} bytes.\n`) + process.stdout.write(`${output}, total length ${totalBytes} bytes.\n`) resolve(output) }) }) @@ -37,11 +37,13 @@ async function checkInstall() { }) const srcPath = - 'https://repo1.maven.org/maven2/io/swagger/codegen/v3/swagger-codegen-cli/3.0.34/swagger-codegen-cli-3.0.34.jar' + 'https://repo1.maven.org/maven2/io/swagger/codegen/v3/swagger-codegen-cli/3.0.51/swagger-codegen-cli-3.0.51.jar' const swaggerFilename = 'swagger-codegen-cli.jar' await fs - .access(`jars/${swaggerFilename}`, fs_constants.R_OK) + .access(`jars/${swaggerFilename}`, fs.constants.R_OK) .catch(async () => get(srcPath, `jars/${swaggerFilename}`)) } -checkInstall() +await checkInstall() + +exit(0) diff --git a/packages/openapi/jest.config.js b/packages/openapi/jest.config.js index bb124774ad..423eeb19d6 100644 --- a/packages/openapi/jest.config.js +++ b/packages/openapi/jest.config.js @@ -9,6 +9,9 @@ module.exports = { }, ], }, + moduleNameMapper: { + '(.+)\\.js$': '$1', + }, testMatch: ['**/__tests__/**/*.spec.(ts|js)'], testEnvironment: 'node', coverageThreshold: { diff --git a/packages/openapi/openapitools.json b/packages/openapi/openapitools.json index 19be28eb55..59118dcd7e 100644 --- a/packages/openapi/openapitools.json +++ b/packages/openapi/openapitools.json @@ -1,7 +1,7 @@ { - "$schema": "../node_modules/@openapitools/openapi-generator-cli/config.schema.json", - "spaces": 2, - "generator-cli": { - "version": "6.2.0" - } + "$schema": "../node_modules/@openapitools/openapi-generator-cli/config.schema.json", + "spaces": 2, + "generator-cli": { + "version": "6.2.0" + } } diff --git a/packages/openapi/package.json b/packages/openapi/package.json index ca47a79ab2..0575981fa3 100644 --- a/packages/openapi/package.json +++ b/packages/openapi/package.json @@ -1,6 +1,6 @@ { "name": "@sofie-automation/openapi", - "version": "1.52.0", + "version": "1.53.0-in-development", "license": "MIT", "repository": { "type": "git", @@ -14,31 +14,33 @@ "cov": "run unit && open-cli coverage/lcov-report/index.html", "cov-open": "open-cli coverage/lcov-report/index.html", "unit": "run genserver && node --experimental-fetch run_server_tests.mjs", - "lint:raw": "run -T eslint . --ext .ts --ext .js --ext .yaml --ignore-pattern dist", + "lint:raw": "run -T eslint", "lint": "run lint:raw .", "lint-fix": "run lint --fix", "genclient:ts": "run -T rimraf client/ts && openapi-generator-cli generate -i ./api/actions.yaml -o client/ts -g typescript-fetch -p supportsES6=true", "genclient:rs": "run -T rimraf client/rs && openapi-generator-cli generate -i ./api/actions.yaml -o client/rs -g rust", - "gendocs": "run -T rimraf docs && node install_swagger.js && java -jar ./jars/swagger-codegen-cli.jar generate -i ./api/actions.yaml -l html2 -o ./docs", - "genserver": "run -T rimraf server && node install_swagger.js && java -jar ./jars/swagger-codegen-cli.jar generate -i ./api/actions.yaml -l nodejs-server -o server && cd server && npm install && cd ../", + "genclient:cs": "run -T rimraf client/cs && openapi-generator-cli generate -i ./api/actions.yaml -o client/cs -g csharp", + "gendocs": "run -T rimraf docs && node install_swagger.mjs && java -jar ./jars/swagger-codegen-cli.jar generate -i ./api/actions.yaml -l html2 -o ./docs", + "genserver": "run -T rimraf server && node install_swagger.mjs && java -jar ./jars/swagger-codegen-cli.jar generate -i ./api/actions.yaml -l nodejs-server -o server && cd server && npm install && cd ../", "runserver": "run genserver && cd server && node index.js", "test": "run lint && run genclient:ts && run unit", "unit:no-server": "node --experimental-fetch ../node_modules/jest/bin/jest.js --detectOpenHandles --forceExit" }, "prettier": "@sofie-automation/code-standard-preset/.prettierrc.json", "engines": { - "node": ">=18.18" + "node": ">=22.13.1" }, "files": [ "/api", "/dist", - "install_swagger.js" + "install_swagger.mjs" ], "dependencies": { "tslib": "^2.8.1" }, "devDependencies": { - "@openapitools/openapi-generator-cli": "^2.16.3", + "@openapitools/openapi-generator-cli": "^2.20.2", + "eslint": "^9.18.0", "eslint-plugin-yml": "^1.16.0", "js-yaml": "^4.1.0", "wget-improved": "^3.4.0" @@ -50,5 +52,6 @@ "*.{ts,tsx,js,jsx,yaml}": [ "yarn lint:raw" ] - } + }, + "packageManager": "yarn@4.6.0" } diff --git a/packages/openapi/run_server_tests.mjs b/packages/openapi/run_server_tests.mjs index 8a13fbb4c8..80c3dacd83 100644 --- a/packages/openapi/run_server_tests.mjs +++ b/packages/openapi/run_server_tests.mjs @@ -8,6 +8,7 @@ import { exec } from 'child_process' import { exit } from 'process' import { join } from 'path' import { createServer } from 'http' +// eslint-disable-next-line n/no-missing-import import { expressAppConfig } from './server/node_modules/oas3-tools/dist/index.js' const testTimeout = 120000 diff --git a/packages/openapi/src/__tests__/blueprints.spec.ts b/packages/openapi/src/__tests__/blueprints.spec.ts index a4b76d2028..ad3b5ba4ed 100644 --- a/packages/openapi/src/__tests__/blueprints.spec.ts +++ b/packages/openapi/src/__tests__/blueprints.spec.ts @@ -1,7 +1,6 @@ -// eslint-disable-next-line node/no-missing-import -import { Configuration, BlueprintsApi } from '../../client/ts' -import { checkServer } from '../checkServer' -import Logging from '../httpLogging' +import { Configuration, BlueprintsApi } from '../../client/ts/index.js' +import { checkServer } from '../checkServer.js' +import Logging from '../httpLogging.js' const httpLogging = false diff --git a/packages/openapi/src/__tests__/buckets.spec.ts b/packages/openapi/src/__tests__/buckets.spec.ts index e87fc9b0b0..2a425f7278 100644 --- a/packages/openapi/src/__tests__/buckets.spec.ts +++ b/packages/openapi/src/__tests__/buckets.spec.ts @@ -1,7 +1,6 @@ -// eslint-disable-next-line node/no-missing-import -import { Configuration, BucketsApi } from '../../client/ts' -import { checkServer } from '../checkServer' -import Logging from '../httpLogging' +import { Configuration, BucketsApi } from '../../client/ts/index.js' +import { checkServer } from '../checkServer.js' +import Logging from '../httpLogging.js' const httpLogging = false let testServer = false diff --git a/packages/openapi/src/__tests__/devices.spec.ts b/packages/openapi/src/__tests__/devices.spec.ts index d77e3d2a50..788bee3fbb 100644 --- a/packages/openapi/src/__tests__/devices.spec.ts +++ b/packages/openapi/src/__tests__/devices.spec.ts @@ -1,7 +1,6 @@ -// eslint-disable-next-line node/no-missing-import -import { Configuration, DevicesApi } from '../../client/ts' -import { checkServer } from '../checkServer' -import Logging from '../httpLogging' +import { Configuration, DevicesApi } from '../../client/ts/index.js' +import { checkServer } from '../checkServer.js' +import Logging from '../httpLogging.js' const httpLogging = false let testServer diff --git a/packages/openapi/src/__tests__/playlists.spec.ts b/packages/openapi/src/__tests__/playlists.spec.ts index e9aecdb988..4e5ed1d69a 100644 --- a/packages/openapi/src/__tests__/playlists.spec.ts +++ b/packages/openapi/src/__tests__/playlists.spec.ts @@ -1,7 +1,6 @@ -// eslint-disable-next-line node/no-missing-import -import { Configuration, PlaylistsApi, ResponseError } from '../../client/ts' -import { checkServer } from '../checkServer' -import Logging from '../httpLogging' +import { Configuration, PlaylistsApi, ResponseError } from '../../client/ts/index.js' +import { checkServer } from '../checkServer.js' +import Logging from '../httpLogging.js' const httpLogging = false let testServer = false diff --git a/packages/openapi/src/__tests__/showstyles.spec.ts b/packages/openapi/src/__tests__/showstyles.spec.ts index c4a6d803da..60520ff9ba 100644 --- a/packages/openapi/src/__tests__/showstyles.spec.ts +++ b/packages/openapi/src/__tests__/showstyles.spec.ts @@ -1,13 +1,12 @@ -// eslint-disable-next-line node/no-missing-import import { Configuration, GetShowStyleConfig200ResponseResult, ShowStyleBase, ShowstylesApi, ShowStyleVariant, -} from '../../client/ts' -import { checkServer } from '../checkServer' -import Logging from '../httpLogging' +} from '../../client/ts/index.js' +import { checkServer } from '../checkServer.js' +import Logging from '../httpLogging.js' const httpLogging = false diff --git a/packages/openapi/src/__tests__/snapshots.spec.ts b/packages/openapi/src/__tests__/snapshots.spec.ts index e8fa30ede2..a00aeeac68 100644 --- a/packages/openapi/src/__tests__/snapshots.spec.ts +++ b/packages/openapi/src/__tests__/snapshots.spec.ts @@ -1,8 +1,7 @@ -// eslint-disable-next-line node/no-missing-import import { randomUUID } from 'crypto' -import { Configuration, SnapshotsApi, PlaylistsApi } from '../../client/ts' -import { checkServer } from '../checkServer' -import Logging from '../httpLogging' +import { Configuration, SnapshotsApi, PlaylistsApi } from '../../client/ts/index.js' +import { checkServer } from '../checkServer.js' +import Logging from '../httpLogging.js' const httpLogging = false diff --git a/packages/openapi/src/__tests__/sofie.spec.ts b/packages/openapi/src/__tests__/sofie.spec.ts index 235e840eb8..8cedc5f416 100644 --- a/packages/openapi/src/__tests__/sofie.spec.ts +++ b/packages/openapi/src/__tests__/sofie.spec.ts @@ -1,7 +1,6 @@ -// eslint-disable-next-line node/no-missing-import -import { Configuration, SofieApi } from '../../client/ts' -import { checkServer } from '../checkServer' -import Logging from '../httpLogging' +import { Configuration, SofieApi } from '../../client/ts/index.js' +import { checkServer } from '../checkServer.js' +import Logging from '../httpLogging.js' const httpLogging = false let testServer diff --git a/packages/openapi/src/__tests__/sourceLayers.spec.ts b/packages/openapi/src/__tests__/sourceLayers.spec.ts index 6fa3235e3c..7209fcc792 100644 --- a/packages/openapi/src/__tests__/sourceLayers.spec.ts +++ b/packages/openapi/src/__tests__/sourceLayers.spec.ts @@ -1,7 +1,6 @@ -// eslint-disable-next-line node/no-missing-import -import { Configuration, PlaylistsApi, SourceLayersApi } from '../../client/ts' -import { checkServer } from '../checkServer' -import Logging from '../httpLogging' +import { Configuration, PlaylistsApi, SourceLayersApi } from '../../client/ts/index.js' +import { checkServer } from '../checkServer.js' +import Logging from '../httpLogging.js' const httpLogging = false let testServer diff --git a/packages/openapi/src/__tests__/studios.spec.ts b/packages/openapi/src/__tests__/studios.spec.ts index f0c601ffc4..7cb36682b3 100644 --- a/packages/openapi/src/__tests__/studios.spec.ts +++ b/packages/openapi/src/__tests__/studios.spec.ts @@ -1,7 +1,6 @@ -// eslint-disable-next-line node/no-missing-import -import { Configuration, GetStudioConfig200ResponseResult, Studio, StudiosApi } from '../../client/ts' -import { checkServer } from '../checkServer' -import Logging from '../httpLogging' +import { Configuration, GetStudioConfig200ResponseResult, Studio, StudiosApi } from '../../client/ts/index.js' +import { checkServer } from '../checkServer.js' +import Logging from '../httpLogging.js' const httpLogging = false let testServer diff --git a/packages/openapi/src/checkServer.ts b/packages/openapi/src/checkServer.ts index 1bf567a03b..7de29225b0 100644 --- a/packages/openapi/src/checkServer.ts +++ b/packages/openapi/src/checkServer.ts @@ -1,5 +1,4 @@ -// eslint-disable-next-line node/no-missing-import -import { Configuration, SofieApi } from '../client/ts' +import { Configuration, SofieApi } from '../client/ts/index.js' async function wait(ms: number): Promise { return new Promise((resolve) => { @@ -13,10 +12,9 @@ export async function checkServer(config: Configuration): Promise { try { await sofieApi.index() // Throws an error if API is not available return - } catch ( - err - // eslint-disable-next-line no-empty - ) {} + } catch (_err) { + // Ignore + } await wait(1000) } diff --git a/packages/openapi/src/httpLogging.ts b/packages/openapi/src/httpLogging.ts index af2e7064c4..035104de54 100644 --- a/packages/openapi/src/httpLogging.ts +++ b/packages/openapi/src/httpLogging.ts @@ -1,5 +1,4 @@ -// eslint-disable-next-line node/no-missing-import -import { Middleware, ResponseContext, ErrorContext, RequestContext, FetchParams } from '../client/ts' +import { Middleware, ResponseContext, ErrorContext, RequestContext, FetchParams } from '../client/ts/index.js' class TestError extends Error { override name: 'TestError' = 'TestError' as const @@ -19,7 +18,7 @@ export default class Logging implements Middleware { // parse body to help readability of logging const req = { ...context.init, - body: context.init.body ? JSON.parse(context.init.body.toString()) : undefined, + body: typeof context.init.body === 'string' ? JSON.parse(context.init.body.toString()) : undefined, } console.log(`Request ${context.url} - ${JSON.stringify(req, null, 2)}`) } @@ -39,8 +38,8 @@ export default class Logging implements Middleware { let message: string try { message = JSON.stringify(await response.json(), null, 2) - } catch (e) { - message = 'Response body is not JSON!' + } catch (e: any) { + message = `Response body is not JSON! Error: "${e}"` } console.log(`Response ${response.url} ${response.status} ${response.statusText} - ${message}`) } diff --git a/packages/package.json b/packages/package.json index ba7869f8b9..77d7ef8192 100644 --- a/packages/package.json +++ b/packages/package.json @@ -2,6 +2,7 @@ "private": true, "workspaces": { "packages": [ + "live-status-gateway-api", "*-integration", "*-gateway", "corelib", @@ -15,10 +16,9 @@ }, "scripts": { "prepare": "lerna run prepare", - "postinstall": "cd .. && \"$PROJECT_CWD/node_modules/.bin/husky\" install", "build": "lerna run build --ignore @sofie-automation/openapi", "build:all": "lerna run build", - "build:try": "lerna run --no-bail build --ignore @sofie-automation/openapi", + "build:try": "lerna run --no-bail build --ignore @sofie-automation/openapi || true", "watch": "lerna run --parallel build:main --ignore @sofie-automation/openapi -- --watch --preserveWatchOutput", "stage-versions": "git add -u \"*/package.json\" \"*/CHANGELOG.md\" lerna.json yarn.lock", "set-version": "lerna version --exact --no-changelog --no-git-tag-version --no-push --yes", @@ -40,7 +40,7 @@ "devDependencies": { "@babel/core": "^7.26.7", "@babel/plugin-transform-modules-commonjs": "^7.26.3", - "@sofie-automation/code-standard-preset": "~2.4.7", + "@sofie-automation/code-standard-preset": "^3.0.0", "@types/amqplib": "^0.10.6", "@types/debug": "^4.1.12", "@types/ejson": "^2.2.2", @@ -51,6 +51,7 @@ "@types/underscore": "^1.13.0", "babel-jest": "^29.7.0", "copyfiles": "^2.4.1", + "eslint": "^9.18.0", "eslint-plugin-react": "^7.37.4", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", @@ -60,16 +61,21 @@ "nodemon": "^2.0.22", "open-cli": "^8.0.0", "pinst": "^3.0.0", + "prettier": "^3.4.2", "rimraf": "^6.0.1", "semver": "^7.6.3", "ts-jest": "^29.2.5", "ts-node": "^10.9.2", "typedoc": "^0.27.6", - "typescript": "~5.1.6" + "typescript": "~5.7.3" }, "name": "packages", "packageManager": "yarn@4.6.0", "resolutions": { - "timecode@0.0.4": "patch:timecode@npm%3A0.0.4#./.yarn/patches/timecode-npm-0.0.4-82bde9e6fe.patch" + "timecode@0.0.4": "patch:timecode@npm%3A0.0.4#./.yarn/patches/timecode-npm-0.0.4-82bde9e6fe.patch", + "@hyperjump/json-schema-core@^0.28.0": "patch:@hyperjump/json-schema-core@npm%3A0.28.5#./.yarn/patches/@hyperjump-json-schema-core-npm-0.28.5-e8b590eb0d.patch", + "@hyperjump/json-pointer@^0.9.4": "patch:@hyperjump/json-pointer@npm%3A0.9.8#./.yarn/patches/@hyperjump-json-pointer-npm-0.9.8-edc0d22296.patch", + "@hyperjump/json-pointer@^0.9.2": "patch:@hyperjump/json-pointer@npm%3A0.9.8#./.yarn/patches/@hyperjump-json-pointer-npm-0.9.8-edc0d22296.patch", + "@hyperjump/pact@^0.2.3": "patch:@hyperjump/pact@npm%3A0.2.5#./.yarn/patches/@hyperjump-pact-npm-0.2.5-a816d03fba.patch" } } diff --git a/packages/playout-gateway/.eslintignore b/packages/playout-gateway/.eslintignore deleted file mode 100644 index 0bdb976219..0000000000 --- a/packages/playout-gateway/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -scratch \ No newline at end of file diff --git a/packages/playout-gateway/.eslintrc.json b/packages/playout-gateway/.eslintrc.json deleted file mode 100644 index 3b809efa88..0000000000 --- a/packages/playout-gateway/.eslintrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "../node_modules/@sofie-automation/code-standard-preset/eslint/main" -} diff --git a/packages/playout-gateway/CHANGELOG.md b/packages/playout-gateway/CHANGELOG.md index 65613006b4..c77632bc66 100644 --- a/packages/playout-gateway/CHANGELOG.md +++ b/packages/playout-gateway/CHANGELOG.md @@ -37,12 +37,12 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [1.52.0-in-testing.0](https://github.com/nrkno/sofie-core/compare/v1.51.6...v1.52.0-in-testing.0) (2025-02-04) - ### Features -* meteor 3.0.4 ([8670727](https://github.com/nrkno/sofie-core/commit/8670727bba5ac9cffe0e5d36b4bd45d6664482be)) -* modify datastore in `onRundownActivate` SOFIE-3310 ([#1240](https://github.com/nrkno/sofie-core/issues/1240)) ([8a0759f](https://github.com/nrkno/sofie-core/commit/8a0759f610497e37493e8a798aa0dd13f4f57119)) -* update meteor to 3.1 and node to 22 ([61b6854](https://github.com/nrkno/sofie-core/commit/61b6854261a03f04e81416b9d37ee995e3a10108)) +- meteor 3.0.4 ([8670727](https://github.com/nrkno/sofie-core/commit/8670727bba5ac9cffe0e5d36b4bd45d6664482be)) +- modify datastore in `onRundownActivate` SOFIE-3310 ([#1240](https://github.com/nrkno/sofie-core/issues/1240)) ([8a0759f](https://github.com/nrkno/sofie-core/commit/8a0759f610497e37493e8a798aa0dd13f4f57119)) +- update meteor to 3.1 and node to 22 ([61b6854](https://github.com/nrkno/sofie-core/commit/61b6854261a03f04e81416b9d37ee995e3a10108)) + ## [1.51.7](https://github.com/nrkno/sofie-core/compare/v1.51.6...v1.51.7) (2025-05-06) @@ -56,221 +56,127 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ## [1.51.6](https://github.com/nrkno/sofie-core/compare/v1.51.5...v1.51.6) (2025-01-14) - ### Bug Fixes -* **PoGw:** filter log output to ensure that message field in JSONL output is never an object ([0d2b844](https://github.com/nrkno/sofie-core/commit/0d2b84451751a859d6a3d67e0f3083c735905578)) - - - - +- **PoGw:** filter log output to ensure that message field in JSONL output is never an object ([0d2b844](https://github.com/nrkno/sofie-core/commit/0d2b84451751a859d6a3d67e0f3083c735905578)) ## [1.51.5](https://github.com/nrkno/sofie-core/compare/v1.51.4...v1.51.5) (2025-01-07) **Note:** Version bump only for package playout-gateway - - - - ## [1.51.4](https://github.com/nrkno/sofie-core/compare/v1.51.3...v1.51.4) (2024-12-04) **Note:** Version bump only for package playout-gateway - - - - ## [1.51.3](https://github.com/nrkno/sofie-core/compare/v1.51.2...v1.51.3) (2024-11-21) - ### Bug Fixes -* change CMD in GHA Dockerfile ([b13ba2d](https://github.com/nrkno/sofie-core/commit/b13ba2d60afb5a95314fcd217b4e63b4b5f241fa)) - - - - +- change CMD in GHA Dockerfile ([b13ba2d](https://github.com/nrkno/sofie-core/commit/b13ba2d60afb5a95314fcd217b4e63b4b5f241fa)) ## [1.51.2](https://github.com/nrkno/sofie-core/compare/v1.51.1...v1.51.2) (2024-11-21) **Note:** Version bump only for package playout-gateway - - - - ## [1.51.1](https://github.com/nrkno/sofie-core/compare/v1.51.1-2...v1.51.1) (2024-11-13) **Note:** Version bump only for package playout-gateway - - - - ## [1.51.1-2](https://github.com/nrkno/sofie-core/compare/v1.51.1-1...v1.51.1-2) (2024-10-24) **Note:** Version bump only for package playout-gateway - - - - ## [1.51.1-2](https://github.com/nrkno/sofie-core/compare/v1.51.1-1...v1.51.1-2) (2024-10-24) **Note:** Version bump only for package playout-gateway - - - - ## [1.51.1-1](https://github.com/nrkno/sofie-core/compare/v1.51.1-0...v1.51.1-1) (2024-10-18) **Note:** Version bump only for package playout-gateway - - - - ## [1.51.1-0](https://github.com/nrkno/sofie-core/compare/v1.51.0...v1.51.1-0) (2024-10-18) **Note:** Version bump only for package playout-gateway - - - - ## [1.51.1-0](https://github.com/nrkno/sofie-core/compare/v1.51.0...v1.51.1-0) (2024-10-18) **Note:** Version bump only for package playout-gateway - - - - # [1.51.0](https://github.com/nrkno/sofie-core/compare/v1.51.0-in-testing.3...v1.51.0) (2024-10-07) **Note:** Version bump only for package playout-gateway - - - - # [1.51.0](https://github.com/nrkno/sofie-core/compare/v1.51.0-in-testing.3...v1.51.0) (2024-10-07) **Note:** Version bump only for package playout-gateway - - - - # [1.51.0-in-testing.3](https://github.com/nrkno/sofie-core/compare/v1.51.0-in-testing.2...v1.51.0-in-testing.3) (2024-09-25) **Note:** Version bump only for package playout-gateway - - - - # [1.51.0-in-testing.2](https://github.com/nrkno/sofie-core/compare/v1.51.0-in-testing.1...v1.51.0-in-testing.2) (2024-09-24) **Note:** Version bump only for package playout-gateway - - - - # [1.51.0-in-testing.1](https://github.com/nrkno/sofie-core/compare/v1.51.0-in-testing.0...v1.51.0-in-testing.1) (2024-09-06) - ### Bug Fixes -* playout-gateway not passing datastore to tsr at startup ([82f6fb2](https://github.com/nrkno/sofie-core/commit/82f6fb2720992581f26ff18d161e787784195c95)) -* update TSR dependency (to fix timeline bug) ([746e0d2](https://github.com/nrkno/sofie-core/commit/746e0d2c822b95927172e76cbd6a4436d1a99192)) - - - - +- playout-gateway not passing datastore to tsr at startup ([82f6fb2](https://github.com/nrkno/sofie-core/commit/82f6fb2720992581f26ff18d161e787784195c95)) +- update TSR dependency (to fix timeline bug) ([746e0d2](https://github.com/nrkno/sofie-core/commit/746e0d2c822b95927172e76cbd6a4436d1a99192)) # [1.51.0-in-testing.1](https://github.com/nrkno/sofie-core/compare/v1.51.0-in-testing.0...v1.51.0-in-testing.1) (2024-09-06) - ### Bug Fixes -* playout-gateway not passing datastore to tsr at startup ([82f6fb2](https://github.com/nrkno/sofie-core/commit/82f6fb2720992581f26ff18d161e787784195c95)) -* update TSR dependency (to fix timeline bug) ([746e0d2](https://github.com/nrkno/sofie-core/commit/746e0d2c822b95927172e76cbd6a4436d1a99192)) - - - - +- playout-gateway not passing datastore to tsr at startup ([82f6fb2](https://github.com/nrkno/sofie-core/commit/82f6fb2720992581f26ff18d161e787784195c95)) +- update TSR dependency (to fix timeline bug) ([746e0d2](https://github.com/nrkno/sofie-core/commit/746e0d2c822b95927172e76cbd6a4436d1a99192)) # [1.51.0-in-testing.0](https://github.com/nrkno/sofie-core/compare/v1.50.4...v1.51.0-in-testing.0) (2024-08-19) - ### Features -* Ensure peripheralDevice subdevice removal when requested ([#1227](https://github.com/nrkno/sofie-core/issues/1227)) ([d5cafe8](https://github.com/nrkno/sofie-core/commit/d5cafe8db5e453f87f8d46262f23e118b580d4d5)) - - +- Ensure peripheralDevice subdevice removal when requested ([#1227](https://github.com/nrkno/sofie-core/issues/1227)) ([d5cafe8](https://github.com/nrkno/sofie-core/commit/d5cafe8db5e453f87f8d46262f23e118b580d4d5)) ## [1.50.5-LSG-updates](https://github.com/nrkno/sofie-core/compare/v1.50.4-LSG-updates...v1.50.5-LSG-updates) (2024-08-08) - - ## [1.50.4-LSG-updates](https://github.com/nrkno/sofie-core/compare/v1.50.3-LSG-updates...v1.50.4-LSG-updates) (2024-07-30) - ### Bug Fixes -* improve error logging: use stringifyError() ([8da63de](https://github.com/nrkno/sofie-core/commit/8da63dec44915439ea436eee9697f3774241537b)) -* include timestamp when logging to file ([#1207](https://github.com/nrkno/sofie-core/issues/1207)) ([2dcca21](https://github.com/nrkno/sofie-core/commit/2dcca215403cc0256c78f5f8f5f6befa2a1ca683)) -* **playout-gateway:** improve handling and typing of TSR events (fixes some logging issues) ([26a8613](https://github.com/nrkno/sofie-core/commit/26a8613cd64d7e077dfd7ff2092555c1b7805f4d)) -* use helper function to keep the scope of 'unsafe' code small ([c58a6de](https://github.com/nrkno/sofie-core/commit/c58a6de80597373e158316d33661ac0e8a07956a)) - +- improve error logging: use stringifyError() ([8da63de](https://github.com/nrkno/sofie-core/commit/8da63dec44915439ea436eee9697f3774241537b)) +- include timestamp when logging to file ([#1207](https://github.com/nrkno/sofie-core/issues/1207)) ([2dcca21](https://github.com/nrkno/sofie-core/commit/2dcca215403cc0256c78f5f8f5f6befa2a1ca683)) +- **playout-gateway:** improve handling and typing of TSR events (fixes some logging issues) ([26a8613](https://github.com/nrkno/sofie-core/commit/26a8613cd64d7e077dfd7ff2092555c1b7805f4d)) +- use helper function to keep the scope of 'unsafe' code small ([c58a6de](https://github.com/nrkno/sofie-core/commit/c58a6de80597373e158316d33661ac0e8a07956a)) ### Features -* backport of release51 live-status-gateway onto release50 ([0a87a95](https://github.com/nrkno/sofie-core/commit/0a87a9519ca1f344429e9b4d47a44c1a9acddff2)) -* refactor server-core-integration subscription handling to reduce duplication ([8eaedd2](https://github.com/nrkno/sofie-core/commit/8eaedd22e8efb9750f00ff472301c6b3f2d0f0af)) -* typed publications in gateways/peripheraldevices SOFIE-1183 ([#1056](https://github.com/nrkno/sofie-core/issues/1056)) ([0c3c1bf](https://github.com/nrkno/sofie-core/commit/0c3c1bfd2bb779034976dc34e49aa6e664ea874b)) - - - - +- backport of release51 live-status-gateway onto release50 ([0a87a95](https://github.com/nrkno/sofie-core/commit/0a87a9519ca1f344429e9b4d47a44c1a9acddff2)) +- refactor server-core-integration subscription handling to reduce duplication ([8eaedd2](https://github.com/nrkno/sofie-core/commit/8eaedd22e8efb9750f00ff472301c6b3f2d0f0af)) +- typed publications in gateways/peripheraldevices SOFIE-1183 ([#1056](https://github.com/nrkno/sofie-core/issues/1056)) ([0c3c1bf](https://github.com/nrkno/sofie-core/commit/0c3c1bfd2bb779034976dc34e49aa6e664ea874b)) # [1.51.0-in-testing.0](https://github.com/nrkno/sofie-core/compare/v1.50.4...v1.51.0-in-testing.0) (2024-08-19) - ### Features -* Ensure peripheralDevice subdevice removal when requested ([#1227](https://github.com/nrkno/sofie-core/issues/1227)) ([d5cafe8](https://github.com/nrkno/sofie-core/commit/d5cafe8db5e453f87f8d46262f23e118b580d4d5)) - - +- Ensure peripheralDevice subdevice removal when requested ([#1227](https://github.com/nrkno/sofie-core/issues/1227)) ([d5cafe8](https://github.com/nrkno/sofie-core/commit/d5cafe8db5e453f87f8d46262f23e118b580d4d5)) ## [1.50.5-LSG-updates](https://github.com/nrkno/sofie-core/compare/v1.50.4-LSG-updates...v1.50.5-LSG-updates) (2024-08-08) - - ## [1.50.4-LSG-updates](https://github.com/nrkno/sofie-core/compare/v1.50.3-LSG-updates...v1.50.4-LSG-updates) (2024-07-30) - ### Bug Fixes -* improve error logging: use stringifyError() ([8da63de](https://github.com/nrkno/sofie-core/commit/8da63dec44915439ea436eee9697f3774241537b)) -* include timestamp when logging to file ([#1207](https://github.com/nrkno/sofie-core/issues/1207)) ([2dcca21](https://github.com/nrkno/sofie-core/commit/2dcca215403cc0256c78f5f8f5f6befa2a1ca683)) -* **playout-gateway:** improve handling and typing of TSR events (fixes some logging issues) ([26a8613](https://github.com/nrkno/sofie-core/commit/26a8613cd64d7e077dfd7ff2092555c1b7805f4d)) -* use helper function to keep the scope of 'unsafe' code small ([c58a6de](https://github.com/nrkno/sofie-core/commit/c58a6de80597373e158316d33661ac0e8a07956a)) - +- improve error logging: use stringifyError() ([8da63de](https://github.com/nrkno/sofie-core/commit/8da63dec44915439ea436eee9697f3774241537b)) +- include timestamp when logging to file ([#1207](https://github.com/nrkno/sofie-core/issues/1207)) ([2dcca21](https://github.com/nrkno/sofie-core/commit/2dcca215403cc0256c78f5f8f5f6befa2a1ca683)) +- **playout-gateway:** improve handling and typing of TSR events (fixes some logging issues) ([26a8613](https://github.com/nrkno/sofie-core/commit/26a8613cd64d7e077dfd7ff2092555c1b7805f4d)) +- use helper function to keep the scope of 'unsafe' code small ([c58a6de](https://github.com/nrkno/sofie-core/commit/c58a6de80597373e158316d33661ac0e8a07956a)) ### Features -* backport of release51 live-status-gateway onto release50 ([0a87a95](https://github.com/nrkno/sofie-core/commit/0a87a9519ca1f344429e9b4d47a44c1a9acddff2)) -* refactor server-core-integration subscription handling to reduce duplication ([8eaedd2](https://github.com/nrkno/sofie-core/commit/8eaedd22e8efb9750f00ff472301c6b3f2d0f0af)) -* typed publications in gateways/peripheraldevices SOFIE-1183 ([#1056](https://github.com/nrkno/sofie-core/issues/1056)) ([0c3c1bf](https://github.com/nrkno/sofie-core/commit/0c3c1bfd2bb779034976dc34e49aa6e664ea874b)) - - - - +- backport of release51 live-status-gateway onto release50 ([0a87a95](https://github.com/nrkno/sofie-core/commit/0a87a9519ca1f344429e9b4d47a44c1a9acddff2)) +- refactor server-core-integration subscription handling to reduce duplication ([8eaedd2](https://github.com/nrkno/sofie-core/commit/8eaedd22e8efb9750f00ff472301c6b3f2d0f0af)) +- typed publications in gateways/peripheraldevices SOFIE-1183 ([#1056](https://github.com/nrkno/sofie-core/issues/1056)) ([0c3c1bf](https://github.com/nrkno/sofie-core/commit/0c3c1bfd2bb779034976dc34e49aa6e664ea874b)) ## [1.50.5](https://github.com/nrkno/tv-automation-server-core/compare/v1.50.4...v1.50.5) (2024-09-19) @@ -278,140 +184,85 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline **Note:** Version bump only for package playout-gateway - - - - ## [1.50.4](https://github.com/nrkno/tv-automation-server-core/compare/v1.50.3-LSG-updates...v1.50.4) (2024-07-30) - ### Bug Fixes -* improve error logging: use stringifyError() ([8da63de](https://github.com/nrkno/tv-automation-server-core/commit/8da63dec44915439ea436eee9697f3774241537b)) - - - - +- improve error logging: use stringifyError() ([8da63de](https://github.com/nrkno/tv-automation-server-core/commit/8da63dec44915439ea436eee9697f3774241537b)) ## [1.50.3](https://github.com/nrkno/tv-automation-server-core/compare/v1.50.2...v1.50.3) (2024-06-24) **Note:** Version bump only for package playout-gateway - - - - ## [1.50.2](https://github.com/nrkno/tv-automation-server-core/compare/v1.49.6...v1.50.2) (2024-05-15) - - ## [1.50.1](https://github.com/nrkno/tv-automation-server-core/compare/v1.49.5-0...v1.50.1) (2024-03-11) - ### Bug Fixes -* strip unused node dependencies from docker images ([#1159](https://github.com/nrkno/tv-automation-server-core/issues/1159)) ([6d86132](https://github.com/nrkno/tv-automation-server-core/commit/6d86132c1bc36219f04f00d5360940dfcbd6df7c)) - - +- strip unused node dependencies from docker images ([#1159](https://github.com/nrkno/tv-automation-server-core/issues/1159)) ([6d86132](https://github.com/nrkno/tv-automation-server-core/commit/6d86132c1bc36219f04f00d5360940dfcbd6df7c)) ## [1.50.1-0](https://github.com/nrkno/tv-automation-server-core/compare/v1.50.0...v1.50.1-0) (2024-03-05) - - # [1.50.0](https://github.com/nrkno/tv-automation-server-core/compare/v1.49.4...v1.50.0) (2024-02-23) - ### Bug Fixes -* improve disposal of core connection ([dc52fe5](https://github.com/nrkno/tv-automation-server-core/commit/dc52fe5b362e308f157e5009b0f8359ba6c63630)) -* playout device config changes not being detected ([a28eae9](https://github.com/nrkno/tv-automation-server-core/commit/a28eae9f78f1aeb59316c2fb450b9da4e79213a9)) -* update tsr ([673e631](https://github.com/nrkno/tv-automation-server-core/commit/673e6313a30459ce1f8519f06df40b1b7363a7af)) - +- improve disposal of core connection ([dc52fe5](https://github.com/nrkno/tv-automation-server-core/commit/dc52fe5b362e308f157e5009b0f8359ba6c63630)) +- playout device config changes not being detected ([a28eae9](https://github.com/nrkno/tv-automation-server-core/commit/a28eae9f78f1aeb59316c2fb450b9da4e79213a9)) +- update tsr ([673e631](https://github.com/nrkno/tv-automation-server-core/commit/673e6313a30459ce1f8519f06df40b1b7363a7af)) ### Reverts -* Revert "chore: improve logging" ([c2f4a11](https://github.com/nrkno/tv-automation-server-core/commit/c2f4a111bfeaf90ee9387c21184262354b9b60af)) - - +- Revert "chore: improve logging" ([c2f4a11](https://github.com/nrkno/tv-automation-server-core/commit/c2f4a111bfeaf90ee9387c21184262354b9b60af)) # [1.50.0-in-testing.5](https://github.com/nrkno/tv-automation-server-core/compare/v1.50.0-in-testing.4...v1.50.0-in-testing.5) (2023-08-25) - - # [1.50.0-in-testing.4](https://github.com/nrkno/tv-automation-server-core/compare/v1.49.0-in-testing.7...v1.50.0-in-testing.4) (2023-08-23) - - # [1.50.0-in-testing.2](https://github.com/nrkno/tv-automation-server-core/compare/v1.50.0-in-testing.1...v1.50.0-in-testing.2) (2023-07-17) - ### Features -* bumps nightly tsr and types ([77f0bf2](https://github.com/nrkno/tv-automation-server-core/commit/77f0bf2efe569ea7cc348f981c3f17e55273c6e4)) -* move gateway settings onto Studio SOFIE-1330 ([#907](https://github.com/nrkno/tv-automation-server-core/issues/907)) ([523c061](https://github.com/nrkno/tv-automation-server-core/commit/523c061c51296e21814deeeabbe9aafca21cd5a6)) -* peripheral device tidying ([#906](https://github.com/nrkno/tv-automation-server-core/issues/906)) ([0795ae5](https://github.com/nrkno/tv-automation-server-core/commit/0795ae5c0517114a34e350d5a5afbf7a731e9794)) -* trs actions in blueprints rundown hooks ([bb5e442](https://github.com/nrkno/tv-automation-server-core/commit/bb5e4422fa32e1af1e520e0c288360b304da4289)) - - - - +- bumps nightly tsr and types ([77f0bf2](https://github.com/nrkno/tv-automation-server-core/commit/77f0bf2efe569ea7cc348f981c3f17e55273c6e4)) +- move gateway settings onto Studio SOFIE-1330 ([#907](https://github.com/nrkno/tv-automation-server-core/issues/907)) ([523c061](https://github.com/nrkno/tv-automation-server-core/commit/523c061c51296e21814deeeabbe9aafca21cd5a6)) +- peripheral device tidying ([#906](https://github.com/nrkno/tv-automation-server-core/issues/906)) ([0795ae5](https://github.com/nrkno/tv-automation-server-core/commit/0795ae5c0517114a34e350d5a5afbf7a731e9794)) +- trs actions in blueprints rundown hooks ([bb5e442](https://github.com/nrkno/tv-automation-server-core/commit/bb5e4422fa32e1af1e520e0c288360b304da4289)) ## [1.50.1](https://github.com/nrkno/tv-automation-server-core/compare/v1.50.1-0...v1.50.1) (2024-03-11) - ### Bug Fixes -* strip unused node dependencies from docker images ([#1159](https://github.com/nrkno/tv-automation-server-core/issues/1159)) ([6d86132](https://github.com/nrkno/tv-automation-server-core/commit/6d86132c1bc36219f04f00d5360940dfcbd6df7c)) - - - - +- strip unused node dependencies from docker images ([#1159](https://github.com/nrkno/tv-automation-server-core/issues/1159)) ([6d86132](https://github.com/nrkno/tv-automation-server-core/commit/6d86132c1bc36219f04f00d5360940dfcbd6df7c)) ## [1.50.1-0](https://github.com/nrkno/tv-automation-server-core/compare/v1.50.0...v1.50.1-0) (2024-03-05) **Note:** Version bump only for package playout-gateway - - - - # [1.50.0](https://github.com/nrkno/tv-automation-server-core/compare/v1.49.4...v1.50.0) (2024-02-23) - ### Bug Fixes -* improve disposal of core connection ([dc52fe5](https://github.com/nrkno/tv-automation-server-core/commit/dc52fe5b362e308f157e5009b0f8359ba6c63630)) -* playout device config changes not being detected ([a28eae9](https://github.com/nrkno/tv-automation-server-core/commit/a28eae9f78f1aeb59316c2fb450b9da4e79213a9)) -* update tsr ([673e631](https://github.com/nrkno/tv-automation-server-core/commit/673e6313a30459ce1f8519f06df40b1b7363a7af)) - +- improve disposal of core connection ([dc52fe5](https://github.com/nrkno/tv-automation-server-core/commit/dc52fe5b362e308f157e5009b0f8359ba6c63630)) +- playout device config changes not being detected ([a28eae9](https://github.com/nrkno/tv-automation-server-core/commit/a28eae9f78f1aeb59316c2fb450b9da4e79213a9)) +- update tsr ([673e631](https://github.com/nrkno/tv-automation-server-core/commit/673e6313a30459ce1f8519f06df40b1b7363a7af)) ### Reverts -* Revert "chore: improve logging" ([c2f4a11](https://github.com/nrkno/tv-automation-server-core/commit/c2f4a111bfeaf90ee9387c21184262354b9b60af)) - - +- Revert "chore: improve logging" ([c2f4a11](https://github.com/nrkno/tv-automation-server-core/commit/c2f4a111bfeaf90ee9387c21184262354b9b60af)) # [1.50.0-in-testing.5](https://github.com/nrkno/tv-automation-server-core/compare/v1.50.0-in-testing.4...v1.50.0-in-testing.5) (2023-08-25) - - # [1.50.0-in-testing.4](https://github.com/nrkno/tv-automation-server-core/compare/v1.49.0-in-testing.7...v1.50.0-in-testing.4) (2023-08-23) - - # [1.50.0-in-testing.2](https://github.com/nrkno/tv-automation-server-core/compare/v1.50.0-in-testing.1...v1.50.0-in-testing.2) (2023-07-17) - ### Features -* bumps nightly tsr and types ([77f0bf2](https://github.com/nrkno/tv-automation-server-core/commit/77f0bf2efe569ea7cc348f981c3f17e55273c6e4)) -* move gateway settings onto Studio SOFIE-1330 ([#907](https://github.com/nrkno/tv-automation-server-core/issues/907)) ([523c061](https://github.com/nrkno/tv-automation-server-core/commit/523c061c51296e21814deeeabbe9aafca21cd5a6)) -* peripheral device tidying ([#906](https://github.com/nrkno/tv-automation-server-core/issues/906)) ([0795ae5](https://github.com/nrkno/tv-automation-server-core/commit/0795ae5c0517114a34e350d5a5afbf7a731e9794)) -* trs actions in blueprints rundown hooks ([bb5e442](https://github.com/nrkno/tv-automation-server-core/commit/bb5e4422fa32e1af1e520e0c288360b304da4289)) - - - - +- bumps nightly tsr and types ([77f0bf2](https://github.com/nrkno/tv-automation-server-core/commit/77f0bf2efe569ea7cc348f981c3f17e55273c6e4)) +- move gateway settings onto Studio SOFIE-1330 ([#907](https://github.com/nrkno/tv-automation-server-core/issues/907)) ([523c061](https://github.com/nrkno/tv-automation-server-core/commit/523c061c51296e21814deeeabbe9aafca21cd5a6)) +- peripheral device tidying ([#906](https://github.com/nrkno/tv-automation-server-core/issues/906)) ([0795ae5](https://github.com/nrkno/tv-automation-server-core/commit/0795ae5c0517114a34e350d5a5afbf7a731e9794)) +- trs actions in blueprints rundown hooks ([bb5e442](https://github.com/nrkno/tv-automation-server-core/commit/bb5e4422fa32e1af1e520e0c288360b304da4289)) # [1.50.0-in-testing.5](https://github.com/nrkno/tv-automation-server-core/compare/v1.50.0-in-testing.4...v1.50.0-in-testing.5) (2023-08-25) @@ -443,23 +294,14 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ## [1.49.3](https://github.com/nrkno/tv-automation-server-core/compare/v1.49.2...v1.49.3) (2023-12-21) - ### Bug Fixes -* suppress quantel disconnection warnings temporarily ([f9c1dae](https://github.com/nrkno/tv-automation-server-core/commit/f9c1dae2fcc346cb2c10d89ccf1a812aec6d0bc0)) - - - - +- suppress quantel disconnection warnings temporarily ([f9c1dae](https://github.com/nrkno/tv-automation-server-core/commit/f9c1dae2fcc346cb2c10d89ccf1a812aec6d0bc0)) ## [1.49.2](https://github.com/nrkno/tv-automation-server-core/compare/v1.49.1...v1.49.2) (2023-11-29) **Note:** Version bump only for package playout-gateway - - - - ## [1.49.1](https://github.com/nrkno/tv-automation-server-core/compare/v1.49.0...v1.49.1) (2023-10-20) ### Features diff --git a/packages/playout-gateway/Dockerfile b/packages/playout-gateway/Dockerfile index b6573f6e43..108f589103 100644 --- a/packages/playout-gateway/Dockerfile +++ b/packages/playout-gateway/Dockerfile @@ -9,7 +9,6 @@ RUN corepack enable RUN yarn install --immutable RUN yarn run pinst --disable RUN yarn lerna run --scope \*\*/playout-gateway --include-dependencies --stream build -RUN yarn plugin import workspace-tools RUN yarn workspaces focus playout-gateway --production # purge dev-dependencies # DEPLOY IMAGE @@ -25,4 +24,4 @@ COPY --from=0 /opt/shared-lib /opt/shared-lib WORKDIR /opt/playout-gateway RUN chown -R 1000:1000 /opt/playout-gateway USER 1000 -CMD ["node", "dist/index.js"] +ENTRYPOINT ["node", "dist/index.js"] diff --git a/packages/playout-gateway/Dockerfile.circle b/packages/playout-gateway/Dockerfile.circle index 50495cc959..05affe55f8 100644 --- a/packages/playout-gateway/Dockerfile.circle +++ b/packages/playout-gateway/Dockerfile.circle @@ -10,4 +10,4 @@ COPY shared-lib /opt/shared-lib WORKDIR /opt/playout-gateway RUN chown -R 1000:1000 /opt/playout-gateway USER 1000 -CMD ["node", "dist/index.js"] +ENTRYPOINT ["node", "dist/index.js"] diff --git a/packages/playout-gateway/eslint.config.mjs b/packages/playout-gateway/eslint.config.mjs new file mode 100644 index 0000000000..b9e5a88fd8 --- /dev/null +++ b/packages/playout-gateway/eslint.config.mjs @@ -0,0 +1,3 @@ +import { generateEslintConfig } from '@sofie-automation/code-standard-preset/eslint/main.mjs' + +export default generateEslintConfig({}) diff --git a/packages/playout-gateway/jest.config.js b/packages/playout-gateway/jest.config.js index 64ca6cea47..60dc56d5bf 100644 --- a/packages/playout-gateway/jest.config.js +++ b/packages/playout-gateway/jest.config.js @@ -9,6 +9,9 @@ module.exports = { }, ], }, + moduleNameMapper: { + '(.+)\\.js$': '$1', + }, testMatch: ['**/__tests__/**/*.spec.(ts|js)'], testPathIgnorePatterns: ['integrationTests'], testEnvironment: 'node', diff --git a/packages/playout-gateway/package.json b/packages/playout-gateway/package.json index d2bcf13410..b04709f23f 100644 --- a/packages/playout-gateway/package.json +++ b/packages/playout-gateway/package.json @@ -1,6 +1,6 @@ { "name": "playout-gateway", - "version": "1.52.0", + "version": "1.53.0-in-development", "private": true, "description": "Connect to Core, play stuff", "license": "MIT", @@ -24,7 +24,7 @@ "buildstart": "run build && run dev", "buildinspect": "run build && run inspect", "build:main": "run -T tsc -p tsconfig.build.json", - "lint:raw": "run -T eslint --ext .ts --ext .js --ignore-pattern dist", + "lint:raw": "run -T eslint", "lint": "run lint:raw .", "unit": "run -T jest", "test": "run lint && run unit", @@ -40,7 +40,7 @@ "license-validate": "run -T sofie-licensecheck" }, "engines": { - "node": ">=22.11" + "node": ">=22.13.1" }, "keywords": [ "broadcast", @@ -56,11 +56,11 @@ "production" ], "dependencies": { - "@sofie-automation/server-core-integration": "1.52.0", - "@sofie-automation/shared-lib": "1.52.0", + "@sofie-automation/server-core-integration": "1.53.0-in-development", + "@sofie-automation/shared-lib": "1.53.0-in-development", "debug": "^4.4.0", "influx": "^5.9.7", - "timeline-state-resolver": "9.3.0", + "timeline-state-resolver": "9.4.0-nightly-release53-20250730-145840-ce6dce9c1.0", "tslib": "^2.8.1", "underscore": "^1.13.7", "winston": "^3.17.0" diff --git a/packages/playout-gateway/src/atemUploader.ts b/packages/playout-gateway/src/atemUploader.ts index e7ef9983bc..41357de918 100644 --- a/packages/playout-gateway/src/atemUploader.ts +++ b/packages/playout-gateway/src/atemUploader.ts @@ -1,9 +1,9 @@ -/* eslint-disable no-process-exit */ -// eslint-disable-next-line node/no-extraneous-import +/* eslint-disable n/no-process-exit */ +// eslint-disable-next-line n/no-extraneous-import import { Atem } from 'atem-connection' import * as fs from 'fs' import { AtemMediaPoolAsset, AtemMediaPoolType } from 'timeline-state-resolver' -import * as _ from 'underscore' +import _ from 'underscore' import * as path from 'path' /** @@ -31,12 +31,8 @@ export class AtemUploadScript { public async connect(ip: string): Promise { return new Promise((resolve, reject) => { - this.connection.once('connected', () => { - resolve() - }) - this.connection.connect(ip).catch((err) => { - reject(err) - }) + this.connection.once('connected', resolve) + this.connection.connect(ip).catch(reject) }) } diff --git a/packages/playout-gateway/src/config.ts b/packages/playout-gateway/src/config.ts index d47e20572e..8893f34742 100644 --- a/packages/playout-gateway/src/config.ts +++ b/packages/playout-gateway/src/config.ts @@ -1,5 +1,5 @@ -import { Config } from './connector' -import * as _ from 'underscore' +import { Config } from './connector.js' +import _ from 'underscore' import { protectString } from '@sofie-automation/server-core-integration' // CLI arguments / Environment variables -------------- diff --git a/packages/playout-gateway/src/configManifest.ts b/packages/playout-gateway/src/configManifest.ts index 91316391eb..034efc0381 100644 --- a/packages/playout-gateway/src/configManifest.ts +++ b/packages/playout-gateway/src/configManifest.ts @@ -5,38 +5,41 @@ import { JSONSchema, SubdeviceManifest, } from '@sofie-automation/server-core-integration' -import { manifest as TSRManifest, TSRDevicesManifestEntry } from 'timeline-state-resolver' - -import Translations = require('timeline-state-resolver/dist/translations.json') +import type { TSRDevicesManifestEntry } from 'timeline-state-resolver' +import { TSRDeviceRegistry } from './tsrDeviceRegistry.js' import ConfigSchema = require('./$schemas/options.json') -const subdeviceManifest: SubdeviceManifest = Object.fromEntries( - Object.entries(TSRManifest.subdevices).map(([id, dev]) => { - return [ - id, - { - displayName: dev.displayName, - configSchema: stringToJsonBlob(dev.configSchema), - playoutMappings: Object.fromEntries>( - Object.entries(dev.mappingsSchemas).map(([id, str]) => [id, stringToJsonBlob(str)]) - ), - actions: dev.actions?.map((action) => ({ - ...action, - payload: action.payload ? stringToJsonBlob(action.payload) : undefined, - })), - }, - ] - }) -) +export function compilePlayoutGatewayConfigManifest(): DeviceConfigManifest { + const tsrManifest = TSRDeviceRegistry.manifest + + const subdeviceManifest: SubdeviceManifest = Object.fromEntries( + Object.entries(tsrManifest.subdevices).map(([id, dev]) => { + return [ + id, + { + displayName: dev.displayName, + configSchema: stringToJsonBlob(dev.configSchema), + playoutMappings: Object.fromEntries>( + Object.entries(dev.mappingsSchemas).map(([id, str]) => [id, stringToJsonBlob(str)]) + ), + actions: dev.actions?.map((action) => ({ + ...action, + payload: action.payload ? stringToJsonBlob(action.payload) : undefined, + })), + }, + ] + }) + ) -export const PLAYOUT_DEVICE_CONFIG: DeviceConfigManifest = { - deviceConfigSchema: JSONBlobStringify(ConfigSchema as any), + return { + deviceConfigSchema: JSONBlobStringify(ConfigSchema as any), - subdeviceConfigSchema: stringToJsonBlob(TSRManifest.commonOptions), - subdeviceManifest, + subdeviceConfigSchema: stringToJsonBlob(tsrManifest.commonOptions), + subdeviceManifest, - translations: Translations as any, + translations: TSRDeviceRegistry.translations, + } } function stringToJsonBlob(str: string): JSONBlob { diff --git a/packages/playout-gateway/src/connector.ts b/packages/playout-gateway/src/connector.ts index c13d2e0c8f..cc9dea1a19 100644 --- a/packages/playout-gateway/src/connector.ts +++ b/packages/playout-gateway/src/connector.ts @@ -1,7 +1,7 @@ -import { TSRHandler, TSRConfig } from './tsrHandler' -import { CoreHandler, CoreConfig } from './coreHandler' +import { TSRHandler, TSRConfig } from './tsrHandler.js' +import { CoreHandler, CoreConfig } from './coreHandler.js' import { Logger } from 'winston' -import { InfluxConfig } from './influxdb' +import { InfluxConfig } from './influxdb.js' import { CertificatesConfig, PeripheralDeviceId, @@ -67,7 +67,7 @@ export class Connector { this._logger.info('Shutting down in 10 seconds!') setTimeout(() => { - // eslint-disable-next-line no-process-exit + // eslint-disable-next-line n/no-process-exit process.exit(0) }, 10 * 1000) return diff --git a/packages/playout-gateway/src/coreHandler.ts b/packages/playout-gateway/src/coreHandler.ts index 54227a78fa..0337549fd2 100644 --- a/packages/playout-gateway/src/coreHandler.ts +++ b/packages/playout-gateway/src/coreHandler.ts @@ -13,17 +13,17 @@ import { PeripheralDevicePubSubCollectionsNames, } from '@sofie-automation/server-core-integration' import { MediaObject, DeviceOptionsAny, ActionExecutionResult } from 'timeline-state-resolver' -import * as _ from 'underscore' -import { DeviceConfig } from './connector' -import { TSRHandler } from './tsrHandler' +import _ from 'underscore' +import { DeviceConfig } from './connector.js' +import { TSRHandler } from './tsrHandler.js' import { Logger } from 'winston' -// eslint-disable-next-line node/no-extraneous-import +// eslint-disable-next-line n/no-extraneous-import import { MemUsageReport as ThreadMemUsageReport } from 'threadedclass' -import { PLAYOUT_DEVICE_CONFIG } from './configManifest' +import { compilePlayoutGatewayConfigManifest } from './configManifest.js' import { BaseRemoteDeviceIntegration } from 'timeline-state-resolver/dist/service/remoteDeviceInstance' -import { getVersions } from './versions' +import { getVersions } from './versions.js' import { CoreConnectionChild } from '@sofie-automation/server-core-integration/dist/lib/CoreConnectionChild' -import { PlayoutGatewayConfig } from './generated/options' +import { PlayoutGatewayConfig } from '@sofie-automation/shared-lib/dist/generated/PlayoutGatewayConfigTypes' import { PeripheralDeviceCommandId } from '@sofie-automation/shared-lib/dist/core/model/Ids' export interface CoreConfig { @@ -156,7 +156,7 @@ export class CoreHandler { deviceName: 'Playout gateway', watchDog: this._coreConfig ? this._coreConfig.watchdog : true, - configManifest: PLAYOUT_DEVICE_CONFIG, + configManifest: compilePlayoutGatewayConfigManifest(), versions: getVersions(this.logger), @@ -239,7 +239,7 @@ export class CoreHandler { } this._executedFunctions.add(cmd._id) // @ts-expect-error Untyped bunch of functions - // eslint-disable-next-line @typescript-eslint/ban-types + // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type const fcn: Function = fcnObject[cmd.functionName] try { if (!fcn) throw Error(`Function "${cmd.functionName}" not found on device "${cmd.deviceId}"!`) @@ -311,7 +311,7 @@ export class CoreHandler { killProcess(): void { this.logger.info('KillProcess command received, shutting down in 1000ms!') setTimeout(() => { - // eslint-disable-next-line no-process-exit + // eslint-disable-next-line n/no-process-exit process.exit(0) }, 1000) } @@ -557,6 +557,6 @@ export class CoreTSRDeviceHandler { this._coreParentHandler.logger.info(`Exec ${actionId} on ${this._deviceId}`) const device = this._device.device - return device.executeAction(actionId, payload) + return device.executeAction(actionId, payload || {}) } } diff --git a/packages/playout-gateway/src/index.ts b/packages/playout-gateway/src/index.ts index 1f6d955d42..248fa89f44 100644 --- a/packages/playout-gateway/src/index.ts +++ b/packages/playout-gateway/src/index.ts @@ -1,5 +1,6 @@ -import { Connector } from './connector' -import { config, logPath, disableWatchdog, logLevel } from './config' +import { Connector } from './connector.js' +import { config, logPath, disableWatchdog, logLevel } from './config.js' +import { loadTSRPlugins } from './tsrDeviceRegistry.js' import * as Winston from 'winston' import { stringifyError } from '@sofie-automation/server-core-integration' @@ -89,8 +90,14 @@ logger.info('Starting Playout Gateway') if (disableWatchdog) logger.info('Watchdog is disabled!') const connector = new Connector(logger) -logger.info('Core: ' + config.core.host + ':' + config.core.port) -logger.info('------------------------------------------------------------------') -connector.init(config).catch((e) => { - logger.error(e) -}) +Promise.resolve() + .then(async () => { + await loadTSRPlugins(logger) + + logger.info('Core: ' + config.core.host + ':' + config.core.port) + logger.info('------------------------------------------------------------------') + await connector.init(config) + }) + .catch((e) => { + logger.error(e) + }) diff --git a/packages/playout-gateway/src/influxdb.ts b/packages/playout-gateway/src/influxdb.ts index eabd4b6f27..6c58548d3b 100644 --- a/packages/playout-gateway/src/influxdb.ts +++ b/packages/playout-gateway/src/influxdb.ts @@ -1,6 +1,6 @@ import { unprotectString } from '@sofie-automation/server-core-integration' import * as Influx from 'influx' -import { config } from './config' +import { config } from './config.js' export interface InfluxConfig { host: string | undefined @@ -21,7 +21,7 @@ const client = config.influx.host username: config.influx.user, password: config.influx.password, protocol, - }) + }) : undefined const versions = getVersions() @@ -101,10 +101,9 @@ function getVersions(): Record { } try { - // eslint-disable-next-line @typescript-eslint/no-var-requires const pkgInfo = require(`timeline-state-resolver/package.json`) versions['tsrVersion'] = pkgInfo.version || 'N/A' - } catch (e) { + } catch (_e) { // this.logger.error(`Failed to load package.json for lib "${pkgName}": ${stringifyError(e)}`) } diff --git a/packages/playout-gateway/src/tsrDeviceRegistry.ts b/packages/playout-gateway/src/tsrDeviceRegistry.ts new file mode 100644 index 0000000000..659a600eee --- /dev/null +++ b/packages/playout-gateway/src/tsrDeviceRegistry.ts @@ -0,0 +1,29 @@ +import { stringifyError } from '@sofie-automation/server-core-integration' +import { DevicesRegistry } from 'timeline-state-resolver' +import type * as Winston from 'winston' + +export const TSRDeviceRegistry = new DevicesRegistry() + +/** + * Load TSR plugins from the paths specified in the TSR_PLUGIN_PATHS environment variable. + */ +export async function loadTSRPlugins(logger: Winston.Logger): Promise { + const paths = process.env.TSR_PLUGIN_PATHS + if (!paths) { + logger.debug('No TSR_PLUGIN_PATHS set, skipping loading of plugins') + return + } + + const pathsArray = paths.split(';').filter((p) => !!p) + logger.info(`Loading TSR plugins from ${pathsArray.length} paths`) + + for (const pluginPath of pathsArray) { + try { + const deviceTypes = await TSRDeviceRegistry.loadDeviceIntegrationsFromPath(pluginPath) + + logger.info(`Loaded TSR plugins from path "${pluginPath}": ${deviceTypes.join(', ')}`) + } catch (e) { + logger.error(`Failed to load TSR plugins from "${pluginPath}": ${stringifyError(e)}`) + } + } +} diff --git a/packages/playout-gateway/src/tsrHandler.ts b/packages/playout-gateway/src/tsrHandler.ts index f1c647977d..16ed508531 100644 --- a/packages/playout-gateway/src/tsrHandler.ts +++ b/packages/playout-gateway/src/tsrHandler.ts @@ -14,20 +14,20 @@ import { StatusCode, Datastore, } from 'timeline-state-resolver' -import { CoreHandler, CoreTSRDeviceHandler } from './coreHandler' +import { CoreHandler, CoreTSRDeviceHandler } from './coreHandler.js' import * as crypto from 'crypto' import * as cp from 'child_process' -import * as _ from 'underscore' +import _ from 'underscore' import { Observer, PeripheralDevicePubSubCollectionsNames, stringifyError, } from '@sofie-automation/server-core-integration' import { Logger } from 'winston' -import { disableAtemUpload } from './config' +import { disableAtemUpload } from './config.js' import Debug from 'debug' -import { FinishedTrace, sendTrace } from './influxdb' +import { FinishedTrace, sendTrace } from './influxdb.js' import { RundownId, RundownPlaylistId, StudioId, TimelineHash } from '@sofie-automation/shared-lib/dist/core/model/Ids' import { @@ -36,24 +36,22 @@ import { RoutedTimeline, TimelineObjGeneric, } from '@sofie-automation/shared-lib/dist/core/model/Timeline' -import { PLAYOUT_DEVICE_CONFIG } from './configManifest' -import { PlayoutGatewayConfig } from './generated/options' +import { PlayoutGatewayConfig } from '@sofie-automation/shared-lib/dist/generated/PlayoutGatewayConfigTypes' import { assertNever, getSchemaDefaultValues, - JSONBlobParse, PeripheralDeviceAPI, PeripheralDeviceForDevice, protectString, - SubdeviceManifest, unprotectObject, unprotectString, } from '@sofie-automation/server-core-integration' import { BaseRemoteDeviceIntegration } from 'timeline-state-resolver/dist/service/remoteDeviceInstance' +import { TSRDeviceRegistry } from './tsrDeviceRegistry.js' const debug = Debug('playout-gateway') -// eslint-disable-next-line @typescript-eslint/no-empty-interface +// eslint-disable-next-line @typescript-eslint/no-empty-object-type export interface TSRConfig {} // ---------------------------------------------------------------------------- @@ -85,7 +83,6 @@ export class TSRHandler { private _triggerUpdateDevicesCheckAgain = false private _triggerUpdateDevicesTimeout: NodeJS.Timeout | undefined - private defaultDeviceOptions: { [deviceType: string]: Record } = {} private _debugStates: Map = new Map() constructor(logger: Logger) { @@ -112,9 +109,9 @@ export class TSRHandler { multiThreadedResolver: settings.multiThreadedResolver === true, useCacheWhenResolving: settings.useCacheWhenResolving === true, proActiveResolve: true, - } - this.defaultDeviceOptions = this.loadSubdeviceConfigurations() + devicesRegistry: TSRDeviceRegistry, + } this.tsr = new Conductor(c) this._triggerupdateTimelineAndMappings('TSRHandler.init()') @@ -283,6 +280,7 @@ export class TSRHandler { coreTsrHandler.statusChanged(status) + if (!coreTsrHandler._device) return // When the status has changed, the deviceName might have changed: coreTsrHandler._device.reloadProps().catch((err) => { this.logger.error(`Error in reloadProps: ${stringifyError(err)}`) @@ -302,7 +300,7 @@ export class TSRHandler { coreTsrHandler._device, assets.filter((asset) => _.isNumber(asset.position) && asset.path) ) - } catch (e) { + } catch (_e) { // don't worry about it. } } @@ -393,19 +391,6 @@ export class TSRHandler { }) } - private loadSubdeviceConfigurations(): { [deviceType: string]: Record } { - const defaultDeviceOptions: { [deviceType: string]: Record } = {} - - for (const [deviceType, deviceManifest] of Object.entries( - PLAYOUT_DEVICE_CONFIG.subdeviceManifest - )) { - const schema = JSONBlobParse(deviceManifest.configSchema) - defaultDeviceOptions[deviceType] = getSchemaDefaultValues(schema) - } - - return defaultDeviceOptions - } - private setupObservers(): void { if (this._observers.length) { this.logger.debug('Clearing observers..') @@ -688,11 +673,21 @@ export class TSRHandler { } private populateDefaultValuesIfMissing(deviceOptions: DeviceOptionsAny): DeviceOptionsAny { - const options = Object.fromEntries( - Object.entries({ ...deviceOptions.options }).filter(([_key, value]) => value !== '') - ) - deviceOptions.options = { ...this.defaultDeviceOptions[deviceOptions.type], ...options } - return deviceOptions + const schema = TSRDeviceRegistry.manifest.subdevices[deviceOptions.type]?.configSchema + if (!schema) return deviceOptions + + try { + const defaultValues = getSchemaDefaultValues(JSON.parse(schema)) + + const options = Object.fromEntries( + Object.entries({ ...deviceOptions.options }).filter(([_key, value]) => value !== '') + ) + deviceOptions.options = { ...defaultValues, ...options } + return deviceOptions + } catch (e) { + this.logger.warn(`Failed to populate default values for device ${deviceOptions.type}: ${stringifyError(e)}`) + return deviceOptions + } } /** * This function is a quick and dirty solution to load a still to the atem mixers. @@ -844,7 +839,10 @@ export class TSRHandler { time: number, objId: string, callbackName0: string, - data: PeripheralDeviceAPI.PartPlaybackCallbackData | PeripheralDeviceAPI.PiecePlaybackCallbackData + data: + | PeripheralDeviceAPI.PartPlaybackCallbackData + | PeripheralDeviceAPI.PiecePlaybackCallbackData + | PeripheralDeviceAPI.TriggerRegenerationCallbackData ): void { if ( ![ @@ -852,6 +850,7 @@ export class TSRHandler { PeripheralDeviceAPI.PlayoutChangedType.PART_PLAYBACK_STOPPED, PeripheralDeviceAPI.PlayoutChangedType.PIECE_PLAYBACK_STARTED, PeripheralDeviceAPI.PlayoutChangedType.PIECE_PLAYBACK_STOPPED, + PeripheralDeviceAPI.PlayoutChangedType.TRIGGER_REGENERATION, ].includes(callbackName0 as PeripheralDeviceAPI.PlayoutChangedType) ) { // @ts-expect-error Untyped bunch of methods @@ -914,6 +913,16 @@ export class TSRHandler { }, }) break + case PeripheralDeviceAPI.PlayoutChangedType.TRIGGER_REGENERATION: + this.changedResults.changes.push({ + type: callbackName, + objId, + data: { + regenerationToken: (data as PeripheralDeviceAPI.TriggerRegenerationCallbackData) + .regenerationToken, + }, + }) + break default: assertNever(callbackName) } diff --git a/packages/playout-gateway/src/versions.ts b/packages/playout-gateway/src/versions.ts index 7c98a78995..f97f09b11e 100644 --- a/packages/playout-gateway/src/versions.ts +++ b/packages/playout-gateway/src/versions.ts @@ -20,7 +20,7 @@ export function getVersions(logger: Winston.Logger): { [packageName: string]: st try { for (const pkgName of pkgNames) { try { - // eslint-disable-next-line @typescript-eslint/no-var-requires + // eslint-disable-next-line @typescript-eslint/no-require-imports const pkgInfo = require(`${pkgName}/package.json`) versions[pkgName] = pkgInfo.version || 'N/A' } catch (e) { diff --git a/packages/scripts/schema-types.mjs b/packages/scripts/schema-types.mjs index 03ba65f454..8561e3c78e 100644 --- a/packages/scripts/schema-types.mjs +++ b/packages/scripts/schema-types.mjs @@ -22,7 +22,7 @@ try { bannerComment: '', }) - await fs.writeFile('./playout-gateway/src/generated/options.ts', BANNER + '\n' + schema) + await fs.writeFile('./shared-lib/src/generated/PlayoutGatewayConfigTypes.ts', BANNER + '\n' + schema) } catch (e) { console.error('Error while generating playout-gateway options.json, continuing...') console.error(e) @@ -36,7 +36,7 @@ try { bannerComment: '', }) - await fs.writeFile('./mos-gateway/src/generated/options.ts', BANNER + '\n' + schema) + await fs.writeFile('./shared-lib/src/generated/MosGatewayOptionsTypes.ts', BANNER + '\n' + schema) } catch (e) { console.error('Error while generating mos-gateway options.json, continuing...') console.error(e) @@ -48,7 +48,7 @@ try { bannerComment: '', }) - await fs.writeFile('./mos-gateway/src/generated/devices.ts', BANNER + '\n' + schema) + await fs.writeFile('./shared-lib/src/generated/MosGatewayDevicesTypes.ts', BANNER + '\n' + schema) } catch (e) { console.error('Error while generating mos-gateway devices.json, continuing...') console.error(e) @@ -62,7 +62,7 @@ try { bannerComment: '', }) - await fs.writeFile('./live-status-gateway/src/generated/options.ts', BANNER + '\n' + schema) + await fs.writeFile('./shared-lib/src/generated/LiveStatusGatewayOptionsTypes.ts', BANNER + '\n' + schema) } catch (e) { console.error('Error while generating live-status-gateway options.json, continuing...') console.error(e) diff --git a/packages/server-core-integration/.eslintrc.json b/packages/server-core-integration/.eslintrc.json deleted file mode 100644 index 3b809efa88..0000000000 --- a/packages/server-core-integration/.eslintrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "../node_modules/@sofie-automation/code-standard-preset/eslint/main" -} diff --git a/packages/server-core-integration/CHANGELOG-legacy.md b/packages/server-core-integration/CHANGELOG-legacy.md index c84108e5b2..9b2e6a0f29 100644 --- a/packages/server-core-integration/CHANGELOG-legacy.md +++ b/packages/server-core-integration/CHANGELOG-legacy.md @@ -4,347 +4,290 @@ All notable changes to this project will be documented in this file. See [standa ## [2.2.0](https://github.com/nrkno/tv-automation-server-core-integration/compare/2.1.0...2.2.0) (2020-12-08) - ### Features -* Add dataRundownGet and dataSegmentGet methods ([9be7a5b](https://github.com/nrkno/tv-automation-server-core-integration/commit/9be7a5bda75e577f8f04d72516b5077cc2a29a5e)) - +- Add dataRundownGet and dataSegmentGet methods ([9be7a5b](https://github.com/nrkno/tv-automation-server-core-integration/commit/9be7a5bda75e577f8f04d72516b5077cc2a29a5e)) ### Bug Fixes -* Add clearMediaObjectCollection method ([#32](https://github.com/nrkno/tv-automation-server-core-integration/issues/32)) ([ad947f4](https://github.com/nrkno/tv-automation-server-core-integration/commit/ad947f46597f02a5fe3415c84e05cfa457c38c44)) -* change when the connectionChanged event handler is attached so that it doesn't trip on the first ddp.connect() ([#36](https://github.com/nrkno/tv-automation-server-core-integration/issues/36)) ([5ff6b8a](https://github.com/nrkno/tv-automation-server-core-integration/commit/5ff6b8a0e280ea0ca2982c19fa7bcc93eedddcc3)) +- Add clearMediaObjectCollection method ([#32](https://github.com/nrkno/tv-automation-server-core-integration/issues/32)) ([ad947f4](https://github.com/nrkno/tv-automation-server-core-integration/commit/ad947f46597f02a5fe3415c84e05cfa457c38c44)) +- change when the connectionChanged event handler is attached so that it doesn't trip on the first ddp.connect() ([#36](https://github.com/nrkno/tv-automation-server-core-integration/issues/36)) ([5ff6b8a](https://github.com/nrkno/tv-automation-server-core-integration/commit/5ff6b8a0e280ea0ca2982c19fa7bcc93eedddcc3)) ## [2.1.0](https://github.com/nrkno/tv-automation-server-core-integration/compare/2.0.0...2.1.0) (2020-11-10) - ### Features -* merge in and update/upgrade DDP client and id generation ([#34](https://github.com/nrkno/tv-automation-server-core-integration/issues/34)) ([9602fc2](https://github.com/nrkno/tv-automation-server-core-integration/commit/9602fc2a8acee6eb0139f47e9d698afd81b48385)) +- merge in and update/upgrade DDP client and id generation ([#34](https://github.com/nrkno/tv-automation-server-core-integration/issues/34)) ([9602fc2](https://github.com/nrkno/tv-automation-server-core-integration/commit/9602fc2a8acee6eb0139f47e9d698afd81b48385)) ## [2.0.0](https://github.com/nrkno/tv-automation-server-core-integration/compare/1.5.1...2.0.0) (2020-09-02) - ### ⚠ BREAKING CHANGES -* drop support for node 8 +- drop support for node 8 ### Features -* drop support for node 8 ([f5b88e1](https://github.com/nrkno/tv-automation-server-core-integration/commit/f5b88e1d99bcd7d0b8cde07595575fa7ca2b64f2)) -* Multiline strings ([1daca67](https://github.com/nrkno/tv-automation-server-core-integration/commit/1daca67c6f0a0b57d5a5739a438e321a6484bce6)) - +- drop support for node 8 ([f5b88e1](https://github.com/nrkno/tv-automation-server-core-integration/commit/f5b88e1d99bcd7d0b8cde07595575fa7ca2b64f2)) +- Multiline strings ([1daca67](https://github.com/nrkno/tv-automation-server-core-integration/commit/1daca67c6f0a0b57d5a5739a438e321a6484bce6)) ### Bug Fixes -* reduced amount of watchdogs calls ([c9d621a](https://github.com/nrkno/tv-automation-server-core-integration/commit/c9d621ae7aa36a5afc7caef85d310d411d06a595)) +- reduced amount of watchdogs calls ([c9d621a](https://github.com/nrkno/tv-automation-server-core-integration/commit/c9d621ae7aa36a5afc7caef85d310d411d06a595)) ### [1.5.1](https://github.com/nrkno/tv-automation-server-core-integration/compare/1.5.0...1.5.1) (2020-05-28) ## [1.5.0](https://github.com/nrkno/tv-automation-server-core-integration/compare/1.4.0...1.5.0) (2020-05-07) - ### Features -* Add INEWS device ([32ec234](https://github.com/nrkno/tv-automation-server-core-integration/commit/32ec234350d3971a02ddf9d6a50f8ad785ee8c7b)) - +- Add INEWS device ([32ec234](https://github.com/nrkno/tv-automation-server-core-integration/commit/32ec234350d3971a02ddf9d6a50f8ad785ee8c7b)) ### Bug Fixes -* remove test code from configManifest ([6449e16](https://github.com/nrkno/tv-automation-server-core-integration/commit/6449e16338b09780946aa9c563ba1b509a66295c)) +- remove test code from configManifest ([6449e16](https://github.com/nrkno/tv-automation-server-core-integration/commit/6449e16338b09780946aa9c563ba1b509a66295c)) ## [1.4.0](https://github.com/nrkno/tv-automation-server-core-integration/compare/1.3.0...1.4.0) (2020-02-26) - ### Features -* add placeholder option to config manifest entry ([00a6c31](https://github.com/nrkno/tv-automation-server-core-integration/commit/00a6c312513c4802e60a2156038577e1a9e2db8a)) +- add placeholder option to config manifest entry ([00a6c31](https://github.com/nrkno/tv-automation-server-core-integration/commit/00a6c312513c4802e60a2156038577e1a9e2db8a)) ## [1.3.0](https://github.com/nrkno/tv-automation-server-core-integration/compare/1.2.1...1.3.0) (2020-01-07) - ### Features -* device config manifests ([15e7c7f](https://github.com/nrkno/tv-automation-server-core-integration/commit/15e7c7fce4a6e318f03404247e2cbe9e70d86625)) -* update ci to run for node 8,10,12 ([24cebc3](https://github.com/nrkno/tv-automation-server-core-integration/commit/24cebc3a396afa860e98b5c86464fc87ab2ef2af)) +- device config manifests ([15e7c7f](https://github.com/nrkno/tv-automation-server-core-integration/commit/15e7c7fce4a6e318f03404247e2cbe9e70d86625)) +- update ci to run for node 8,10,12 ([24cebc3](https://github.com/nrkno/tv-automation-server-core-integration/commit/24cebc3a396afa860e98b5c86464fc87ab2ef2af)) ### [1.2.1](https://github.com/nrkno/tv-automation-server-core-integration/compare/1.2.0...1.2.1) (2019-08-26) - ### Bug Fixes -* an issue with getCollection ([cc870c9](https://github.com/nrkno/tv-automation-server-core-integration/commit/cc870c9)) -* minimize Collection scope size ([0fa7943](https://github.com/nrkno/tv-automation-server-core-integration/commit/0fa7943)) +- an issue with getCollection ([cc870c9](https://github.com/nrkno/tv-automation-server-core-integration/commit/cc870c9)) +- minimize Collection scope size ([0fa7943](https://github.com/nrkno/tv-automation-server-core-integration/commit/0fa7943)) -# [1.2.0](https://github.com/nrkno/tv-automation-server-core-integration/compare/1.1.0...1.2.0) (2019-06-05) +# [1.2.0](https://github.com/nrkno/tv-automation-server-core-integration/compare/1.1.0...1.2.0) (2019-06-05) ### Features -* add method ([ebb741b](https://github.com/nrkno/tv-automation-server-core-integration/commit/ebb741b)) - - +- add method ([ebb741b](https://github.com/nrkno/tv-automation-server-core-integration/commit/ebb741b)) -# [1.1.0](https://github.com/nrkno/tv-automation-server-core-integration/compare/1.0.1...1.1.0) (2019-05-03) +# [1.1.0](https://github.com/nrkno/tv-automation-server-core-integration/compare/1.0.1...1.1.0) (2019-05-03) ### Features -* updated typings from Core; devices & subDevices ([3170577](https://github.com/nrkno/tv-automation-server-core-integration/commit/3170577)) - - +- updated typings from Core; devices & subDevices ([3170577](https://github.com/nrkno/tv-automation-server-core-integration/commit/3170577)) -## [1.0.1](https://github.com/nrkno/tv-automation-server-core-integration/compare/1.0.0...1.0.1) (2019-04-30) +## [1.0.1](https://github.com/nrkno/tv-automation-server-core-integration/compare/1.0.0...1.0.1) (2019-04-30) ### Bug Fixes -* update typings from core ([8e2a837](https://github.com/nrkno/tv-automation-server-core-integration/commit/8e2a837)) -* update typings from core ([#23](https://github.com/nrkno/tv-automation-server-core-integration/issues/23)) ([944fa7a](https://github.com/nrkno/tv-automation-server-core-integration/commit/944fa7a)) - - +- update typings from core ([8e2a837](https://github.com/nrkno/tv-automation-server-core-integration/commit/8e2a837)) +- update typings from core ([#23](https://github.com/nrkno/tv-automation-server-core-integration/issues/23)) ([944fa7a](https://github.com/nrkno/tv-automation-server-core-integration/commit/944fa7a)) -# [1.0.0](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.9.0...1.0.0) (2019-04-30) +# [1.0.0](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.9.0...1.0.0) (2019-04-30) ### Bug Fixes -* remove built files ([bc24f52](https://github.com/nrkno/tv-automation-server-core-integration/commit/bc24f52)) -* rename properties ([e7a64f9](https://github.com/nrkno/tv-automation-server-core-integration/commit/e7a64f9)) -* update some interface names ([2f4f2e9](https://github.com/nrkno/tv-automation-server-core-integration/commit/2f4f2e9)) -* upgrade dependencies ([014a0b5](https://github.com/nrkno/tv-automation-server-core-integration/commit/014a0b5)) - +- remove built files ([bc24f52](https://github.com/nrkno/tv-automation-server-core-integration/commit/bc24f52)) +- rename properties ([e7a64f9](https://github.com/nrkno/tv-automation-server-core-integration/commit/e7a64f9)) +- update some interface names ([2f4f2e9](https://github.com/nrkno/tv-automation-server-core-integration/commit/2f4f2e9)) +- upgrade dependencies ([014a0b5](https://github.com/nrkno/tv-automation-server-core-integration/commit/014a0b5)) ### Features -* noop, just to get the next version right ([89b3cb7](https://github.com/nrkno/tv-automation-server-core-integration/commit/89b3cb7)) -* update typings with copy from Core ([b2bbb74](https://github.com/nrkno/tv-automation-server-core-integration/commit/b2bbb74)) - +- noop, just to get the next version right ([89b3cb7](https://github.com/nrkno/tv-automation-server-core-integration/commit/89b3cb7)) +- update typings with copy from Core ([b2bbb74](https://github.com/nrkno/tv-automation-server-core-integration/commit/b2bbb74)) ### BREAKING CHANGES -* interface to Core has changed (the big renaming) - - +- interface to Core has changed (the big renaming) -# [0.9.0](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.8.0...0.9.0) (2019-04-11) +# [0.9.0](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.8.0...0.9.0) (2019-04-11) ### Bug Fixes -* export DDPConnectorOptions ([6fc695c](https://github.com/nrkno/tv-automation-server-core-integration/commit/6fc695c)) -* increase setMaxListeners when attaching children ([1291f67](https://github.com/nrkno/tv-automation-server-core-integration/commit/1291f67)) -* ts3 + lint errors ([aa59ee8](https://github.com/nrkno/tv-automation-server-core-integration/commit/aa59ee8)) -* update dependencies ([ad25978](https://github.com/nrkno/tv-automation-server-core-integration/commit/ad25978)) -* update jest config ([154c384](https://github.com/nrkno/tv-automation-server-core-integration/commit/154c384)) -* update to ts3 and audit fix ([08df508](https://github.com/nrkno/tv-automation-server-core-integration/commit/08df508)) -* update yarn.lock, rm package-lock ([a391834](https://github.com/nrkno/tv-automation-server-core-integration/commit/a391834)) - +- export DDPConnectorOptions ([6fc695c](https://github.com/nrkno/tv-automation-server-core-integration/commit/6fc695c)) +- increase setMaxListeners when attaching children ([1291f67](https://github.com/nrkno/tv-automation-server-core-integration/commit/1291f67)) +- ts3 + lint errors ([aa59ee8](https://github.com/nrkno/tv-automation-server-core-integration/commit/aa59ee8)) +- update dependencies ([ad25978](https://github.com/nrkno/tv-automation-server-core-integration/commit/ad25978)) +- update jest config ([154c384](https://github.com/nrkno/tv-automation-server-core-integration/commit/154c384)) +- update to ts3 and audit fix ([08df508](https://github.com/nrkno/tv-automation-server-core-integration/commit/08df508)) +- update yarn.lock, rm package-lock ([a391834](https://github.com/nrkno/tv-automation-server-core-integration/commit/a391834)) ### Features -* add general data-manipulation methods ([1ee437f](https://github.com/nrkno/tv-automation-server-core-integration/commit/1ee437f)) -* add Queue, to be used for sequential commands ([e132575](https://github.com/nrkno/tv-automation-server-core-integration/commit/e132575)) -* add spreadsheet-device type ([cd58d07](https://github.com/nrkno/tv-automation-server-core-integration/commit/cd58d07)) - - +- add general data-manipulation methods ([1ee437f](https://github.com/nrkno/tv-automation-server-core-integration/commit/1ee437f)) +- add Queue, to be used for sequential commands ([e132575](https://github.com/nrkno/tv-automation-server-core-integration/commit/e132575)) +- add spreadsheet-device type ([cd58d07](https://github.com/nrkno/tv-automation-server-core-integration/commit/cd58d07)) -# [0.8.0](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.7.0...0.8.0) (2019-02-04) +# [0.8.0](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.7.0...0.8.0) (2019-02-04) ### Bug Fixes -* readable error message ([8c2c8ca](https://github.com/nrkno/tv-automation-server-core-integration/commit/8c2c8ca)) - +- readable error message ([8c2c8ca](https://github.com/nrkno/tv-automation-server-core-integration/commit/8c2c8ca)) ### Features -* ddp support tls-options ([d53e42d](https://github.com/nrkno/tv-automation-server-core-integration/commit/d53e42d)) - - +- ddp support tls-options ([d53e42d](https://github.com/nrkno/tv-automation-server-core-integration/commit/d53e42d)) -# [0.7.0](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.6.3...0.7.0) (2019-01-11) +# [0.7.0](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.6.3...0.7.0) (2019-01-11) ### Bug Fixes -* throw error on missing argument ([1ce1a90](https://github.com/nrkno/tv-automation-server-core-integration/commit/1ce1a90)) - +- throw error on missing argument ([1ce1a90](https://github.com/nrkno/tv-automation-server-core-integration/commit/1ce1a90)) ### Features -* Add Media_Manager DeviceType ([0c40194](https://github.com/nrkno/tv-automation-server-core-integration/commit/0c40194)) -* updated typings from Core ([d668257](https://github.com/nrkno/tv-automation-server-core-integration/commit/d668257)) - - +- Add Media_Manager DeviceType ([0c40194](https://github.com/nrkno/tv-automation-server-core-integration/commit/0c40194)) +- updated typings from Core ([d668257](https://github.com/nrkno/tv-automation-server-core-integration/commit/d668257)) -## [0.6.3](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.6.2...0.6.3) (2018-12-11) - +## [0.6.3](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.6.2...0.6.3) (2018-12-11) -## [0.6.2](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.6.1...0.6.2) (2018-10-24) +## [0.6.2](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.6.1...0.6.2) (2018-10-24) ### Bug Fixes -* properly close socket connection before creating a new ([c1a4470](https://github.com/nrkno/tv-automation-server-core-integration/commit/c1a4470)) - - +- properly close socket connection before creating a new ([c1a4470](https://github.com/nrkno/tv-automation-server-core-integration/commit/c1a4470)) -## [0.6.1](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.6.0...0.6.1) (2018-10-22) +## [0.6.1](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.6.0...0.6.1) (2018-10-22) ### Bug Fixes -* update data-store dependency ([56d80df](https://github.com/nrkno/tv-automation-server-core-integration/commit/56d80df)) - - +- update data-store dependency ([56d80df](https://github.com/nrkno/tv-automation-server-core-integration/commit/56d80df)) -# [0.6.0](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.5.1...0.6.0) (2018-10-17) +# [0.6.0](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.5.1...0.6.0) (2018-10-17) ### Bug Fixes -* added mock of ddp/Core, to run tests as unit tests, rather than integration tests ([92bfbdd](https://github.com/nrkno/tv-automation-server-core-integration/commit/92bfbdd)) -* const definitions ([e225c75](https://github.com/nrkno/tv-automation-server-core-integration/commit/e225c75)) -* refactoring, cleaned up emitters, added watchdog to destroy(), added tests ([af885b1](https://github.com/nrkno/tv-automation-server-core-integration/commit/af885b1)) -* updated data-store dependency, du to 3.0.3 containing a bug related to folder creation ([894d2ac](https://github.com/nrkno/tv-automation-server-core-integration/commit/894d2ac)) - +- added mock of ddp/Core, to run tests as unit tests, rather than integration tests ([92bfbdd](https://github.com/nrkno/tv-automation-server-core-integration/commit/92bfbdd)) +- const definitions ([e225c75](https://github.com/nrkno/tv-automation-server-core-integration/commit/e225c75)) +- refactoring, cleaned up emitters, added watchdog to destroy(), added tests ([af885b1](https://github.com/nrkno/tv-automation-server-core-integration/commit/af885b1)) +- updated data-store dependency, du to 3.0.3 containing a bug related to folder creation ([894d2ac](https://github.com/nrkno/tv-automation-server-core-integration/commit/894d2ac)) ### Features -* queued method calls implementation ([040dbb7](https://github.com/nrkno/tv-automation-server-core-integration/commit/040dbb7)) - - +- queued method calls implementation ([040dbb7](https://github.com/nrkno/tv-automation-server-core-integration/commit/040dbb7)) -## [0.5.1](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.5.0...0.5.1) (2018-09-04) - +## [0.5.1](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.5.0...0.5.1) (2018-09-04) -# [0.5.0](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.4.1...0.5.0) (2018-08-14) +# [0.5.0](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.4.1...0.5.0) (2018-08-14) ### Bug Fixes -* updated dependencies ([a5f95fb](https://github.com/nrkno/tv-automation-server-core-integration/commit/a5f95fb)) - +- updated dependencies ([a5f95fb](https://github.com/nrkno/tv-automation-server-core-integration/commit/a5f95fb)) ### Features -* added "ping" function, making a ping to the core. Only pinging when the watchdog isn't doing its stuff. ([75435e0](https://github.com/nrkno/tv-automation-server-core-integration/commit/75435e0)) -* because ddp.connect() is async, createClient must also be asynchronous. ([8e34ae0](https://github.com/nrkno/tv-automation-server-core-integration/commit/8e34ae0)) - - +- added "ping" function, making a ping to the core. Only pinging when the watchdog isn't doing its stuff. ([75435e0](https://github.com/nrkno/tv-automation-server-core-integration/commit/75435e0)) +- because ddp.connect() is async, createClient must also be asynchronous. ([8e34ae0](https://github.com/nrkno/tv-automation-server-core-integration/commit/8e34ae0)) -## [0.4.1](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.4.0...0.4.1) (2018-08-03) +## [0.4.1](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.4.0...0.4.1) (2018-08-03) ### Bug Fixes -* bug in collection.find using function selector ([59847ff](https://github.com/nrkno/tv-automation-server-core-integration/commit/59847ff)) - - +- bug in collection.find using function selector ([59847ff](https://github.com/nrkno/tv-automation-server-core-integration/commit/59847ff)) -# [0.4.0](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.3.2...0.4.0) (2018-07-04) +# [0.4.0](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.3.2...0.4.0) (2018-07-04) ### Features -* Add segmentLineItemPlaybackStarted callback ([8823613](https://github.com/nrkno/tv-automation-server-core-integration/commit/8823613)) - - +- Add segmentLineItemPlaybackStarted callback ([8823613](https://github.com/nrkno/tv-automation-server-core-integration/commit/8823613)) -## [0.3.2](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.3.1...0.3.2) (2018-06-26) +## [0.3.2](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.3.1...0.3.2) (2018-06-26) ### Bug Fixes -* refactoring & how events are fired ([2a2966d](https://github.com/nrkno/tv-automation-server-core-integration/commit/2a2966d)) -* updated ddp dependency ([5d09770](https://github.com/nrkno/tv-automation-server-core-integration/commit/5d09770)) - - +- refactoring & how events are fired ([2a2966d](https://github.com/nrkno/tv-automation-server-core-integration/commit/2a2966d)) +- updated ddp dependency ([5d09770](https://github.com/nrkno/tv-automation-server-core-integration/commit/5d09770)) -## [0.3.1](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.3.0...0.3.1) (2018-06-25) +## [0.3.1](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.3.0...0.3.1) (2018-06-25) ### Bug Fixes -* updated data-store dep to fork, awaiting PR ([303ec5b](https://github.com/nrkno/tv-automation-server-core-integration/commit/303ec5b)) - - +- updated data-store dep to fork, awaiting PR ([303ec5b](https://github.com/nrkno/tv-automation-server-core-integration/commit/303ec5b)) -# [0.3.0](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.2.0...0.3.0) (2018-06-25) +# [0.3.0](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.2.0...0.3.0) (2018-06-25) ### Bug Fixes -* removing listeners upon destruction ([5df77c3](https://github.com/nrkno/tv-automation-server-core-integration/commit/5df77c3)) - +- removing listeners upon destruction ([5df77c3](https://github.com/nrkno/tv-automation-server-core-integration/commit/5df77c3)) ### Features -* added autoSubscribe method, that automatically renews subscriptions upon reconnection ([46c4c07](https://github.com/nrkno/tv-automation-server-core-integration/commit/46c4c07)) - - +- added autoSubscribe method, that automatically renews subscriptions upon reconnection ([46c4c07](https://github.com/nrkno/tv-automation-server-core-integration/commit/46c4c07)) -# [0.2.0](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.1.2...0.2.0) (2018-06-20) +# [0.2.0](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.1.2...0.2.0) (2018-06-20) ### Features -* added watchDog ([2c03b58](https://github.com/nrkno/tv-automation-server-core-integration/commit/2c03b58)) - - +- added watchDog ([2c03b58](https://github.com/nrkno/tv-automation-server-core-integration/commit/2c03b58)) -## [0.1.2](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.1.1...0.1.2) (2018-06-18) - +## [0.1.2](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.1.1...0.1.2) (2018-06-18) -## [0.1.1](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.1.0...0.1.1) (2018-06-15) - +## [0.1.1](https://github.com/nrkno/tv-automation-server-core-integration/compare/0.1.0...0.1.1) (2018-06-15) -# 0.1.0 (2018-06-15) +# 0.1.0 (2018-06-15) ### Bug Fixes -* bugfix ([0fd20e6](https://bitbucket.org/nrkno/tv-automation-server-core-integration/commits/0fd20e6)) -* explicitly set request version in dependency to prevent voulnerability ([b0d0880](https://bitbucket.org/nrkno/tv-automation-server-core-integration/commits/b0d0880)) -* lint errors ([294bb92](https://bitbucket.org/nrkno/tv-automation-server-core-integration/commits/294bb92)) -* readme and new ssh fingerprint ([a6031c8](https://bitbucket.org/nrkno/tv-automation-server-core-integration/commits/a6031c8)) -* remove ssh keys accidentally added to the repo ([d1d3942](https://bitbucket.org/nrkno/tv-automation-server-core-integration/commits/d1d3942)) -* yarn update to hopefully fix npm package voulnerability ([ee95c5d](https://bitbucket.org/nrkno/tv-automation-server-core-integration/commits/ee95c5d)) - +- bugfix ([0fd20e6](https://bitbucket.org/nrkno/tv-automation-server-core-integration/commits/0fd20e6)) +- explicitly set request version in dependency to prevent voulnerability ([b0d0880](https://bitbucket.org/nrkno/tv-automation-server-core-integration/commits/b0d0880)) +- lint errors ([294bb92](https://bitbucket.org/nrkno/tv-automation-server-core-integration/commits/294bb92)) +- readme and new ssh fingerprint ([a6031c8](https://bitbucket.org/nrkno/tv-automation-server-core-integration/commits/a6031c8)) +- remove ssh keys accidentally added to the repo ([d1d3942](https://bitbucket.org/nrkno/tv-automation-server-core-integration/commits/d1d3942)) +- yarn update to hopefully fix npm package voulnerability ([ee95c5d](https://bitbucket.org/nrkno/tv-automation-server-core-integration/commits/ee95c5d)) ### Features -* added connectionId ([f26fe54](https://bitbucket.org/nrkno/tv-automation-server-core-integration/commits/f26fe54)) -* basic functionality and tests ([8feef39](https://bitbucket.org/nrkno/tv-automation-server-core-integration/commits/8feef39)) -* CircleCI features ([2a1b730](https://bitbucket.org/nrkno/tv-automation-server-core-integration/commits/2a1b730)) -* linting & added credentials generator ([851e6f8](https://bitbucket.org/nrkno/tv-automation-server-core-integration/commits/851e6f8)) -* Rename package ([99e4fdf](https://bitbucket.org/nrkno/tv-automation-server-core-integration/commits/99e4fdf)) -* support for having multiple mosdevices over same core-connection. Also added methods for mos data piping ([cf21e67](https://bitbucket.org/nrkno/tv-automation-server-core-integration/commits/cf21e67)) -* timesync implementation ([9b38df3](https://bitbucket.org/nrkno/tv-automation-server-core-integration/commits/9b38df3)) +- added connectionId ([f26fe54](https://bitbucket.org/nrkno/tv-automation-server-core-integration/commits/f26fe54)) +- basic functionality and tests ([8feef39](https://bitbucket.org/nrkno/tv-automation-server-core-integration/commits/8feef39)) +- CircleCI features ([2a1b730](https://bitbucket.org/nrkno/tv-automation-server-core-integration/commits/2a1b730)) +- linting & added credentials generator ([851e6f8](https://bitbucket.org/nrkno/tv-automation-server-core-integration/commits/851e6f8)) +- Rename package ([99e4fdf](https://bitbucket.org/nrkno/tv-automation-server-core-integration/commits/99e4fdf)) +- support for having multiple mosdevices over same core-connection. Also added methods for mos data piping ([cf21e67](https://bitbucket.org/nrkno/tv-automation-server-core-integration/commits/cf21e67)) +- timesync implementation ([9b38df3](https://bitbucket.org/nrkno/tv-automation-server-core-integration/commits/9b38df3)) diff --git a/packages/server-core-integration/CHANGELOG.md b/packages/server-core-integration/CHANGELOG.md index e9de8fd4e5..5853b34a21 100644 --- a/packages/server-core-integration/CHANGELOG.md +++ b/packages/server-core-integration/CHANGELOG.md @@ -31,157 +31,85 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [1.52.0-in-testing.0](https://github.com/nrkno/sofie-core/compare/v1.51.6...v1.52.0-in-testing.0) (2025-02-04) - ### Features -* always add `dnt=gateway` header for gateway connections ([c7bdfe6](https://github.com/nrkno/sofie-core/commit/c7bdfe6787b76a5d23eb841764abf7b0cc799028)) -* meteor 3.0.4 ([8670727](https://github.com/nrkno/sofie-core/commit/8670727bba5ac9cffe0e5d36b4bd45d6664482be)) -* support for http header in packagemanager ([1e5bbc6](https://github.com/nrkno/sofie-core/commit/1e5bbc669fe67fedf48027524232ad6696fc8909)) -* update meteor to 3.1 and node to 22 ([61b6854](https://github.com/nrkno/sofie-core/commit/61b6854261a03f04e81416b9d37ee995e3a10108)) +- always add `dnt=gateway` header for gateway connections ([c7bdfe6](https://github.com/nrkno/sofie-core/commit/c7bdfe6787b76a5d23eb841764abf7b0cc799028)) +- meteor 3.0.4 ([8670727](https://github.com/nrkno/sofie-core/commit/8670727bba5ac9cffe0e5d36b4bd45d6664482be)) +- support for http header in packagemanager ([1e5bbc6](https://github.com/nrkno/sofie-core/commit/1e5bbc669fe67fedf48027524232ad6696fc8909)) +- update meteor to 3.1 and node to 22 ([61b6854](https://github.com/nrkno/sofie-core/commit/61b6854261a03f04e81416b9d37ee995e3a10108)) + ## [1.51.7](https://github.com/nrkno/sofie-core/compare/v1.51.6...v1.51.7) (2025-05-06) **Note:** Version bump only for package @sofie-automation/server-core-integration - - - - ## [1.51.6](https://github.com/nrkno/sofie-core/compare/v1.51.5...v1.51.6) (2025-01-14) **Note:** Version bump only for package @sofie-automation/server-core-integration - - - - ## [1.51.5](https://github.com/nrkno/sofie-core/compare/v1.51.4...v1.51.5) (2025-01-07) **Note:** Version bump only for package @sofie-automation/server-core-integration - - - - ## [1.51.4](https://github.com/nrkno/sofie-core/compare/v1.51.3...v1.51.4) (2024-12-04) **Note:** Version bump only for package @sofie-automation/server-core-integration - - - - ## [1.51.3](https://github.com/nrkno/sofie-core/compare/v1.51.2...v1.51.3) (2024-11-21) **Note:** Version bump only for package @sofie-automation/server-core-integration - - - - ## [1.51.2](https://github.com/nrkno/sofie-core/compare/v1.51.1...v1.51.2) (2024-11-21) **Note:** Version bump only for package @sofie-automation/server-core-integration - - - - ## [1.51.1](https://github.com/nrkno/sofie-core/compare/v1.51.1-2...v1.51.1) (2024-11-13) **Note:** Version bump only for package @sofie-automation/server-core-integration - - - - ## [1.51.1-2](https://github.com/nrkno/sofie-core/compare/v1.51.1-1...v1.51.1-2) (2024-10-24) **Note:** Version bump only for package @sofie-automation/server-core-integration - - - - ## [1.51.1-2](https://github.com/nrkno/sofie-core/compare/v1.51.1-1...v1.51.1-2) (2024-10-24) **Note:** Version bump only for package @sofie-automation/server-core-integration - - - - ## [1.51.1-1](https://github.com/nrkno/sofie-core/compare/v1.51.1-0...v1.51.1-1) (2024-10-18) **Note:** Version bump only for package @sofie-automation/server-core-integration - - - - ## [1.51.1-0](https://github.com/nrkno/sofie-core/compare/v1.51.0...v1.51.1-0) (2024-10-18) **Note:** Version bump only for package @sofie-automation/server-core-integration - - - - ## [1.51.1-0](https://github.com/nrkno/sofie-core/compare/v1.51.0...v1.51.1-0) (2024-10-18) **Note:** Version bump only for package @sofie-automation/server-core-integration - - - - # [1.51.0](https://github.com/nrkno/sofie-core/compare/v1.51.0-in-testing.3...v1.51.0) (2024-10-07) **Note:** Version bump only for package @sofie-automation/server-core-integration - - - - # [1.51.0](https://github.com/nrkno/sofie-core/compare/v1.51.0-in-testing.3...v1.51.0) (2024-10-07) **Note:** Version bump only for package @sofie-automation/server-core-integration - - - - # [1.51.0-in-testing.3](https://github.com/nrkno/sofie-core/compare/v1.51.0-in-testing.2...v1.51.0-in-testing.3) (2024-09-25) **Note:** Version bump only for package @sofie-automation/server-core-integration - - - - # [1.51.0-in-testing.2](https://github.com/nrkno/sofie-core/compare/v1.51.0-in-testing.1...v1.51.0-in-testing.2) (2024-09-24) **Note:** Version bump only for package @sofie-automation/server-core-integration - - - - # [1.51.0-in-testing.1](https://github.com/nrkno/sofie-core/compare/v1.51.0-in-testing.0...v1.51.0-in-testing.1) (2024-09-06) **Note:** Version bump only for package @sofie-automation/server-core-integration - - - - # [1.51.0-in-testing.1](https://github.com/nrkno/sofie-core/compare/v1.51.0-in-testing.0...v1.51.0-in-testing.1) (2024-09-06) **Note:** Version bump only for package @sofie-automation/server-core-integration - - - - # [1.51.0-in-testing.0](https://github.com/nrkno/sofie-core/compare/v1.50.4...v1.51.0-in-testing.0) (2024-08-19) ## [1.50.5-LSG-updates](https://github.com/nrkno/sofie-core/compare/v1.50.4-LSG-updates...v1.50.5-LSG-updates) (2024-08-08) diff --git a/packages/server-core-integration/eslint.config.mjs b/packages/server-core-integration/eslint.config.mjs new file mode 100644 index 0000000000..b9e5a88fd8 --- /dev/null +++ b/packages/server-core-integration/eslint.config.mjs @@ -0,0 +1,3 @@ +import { generateEslintConfig } from '@sofie-automation/code-standard-preset/eslint/main.mjs' + +export default generateEslintConfig({}) diff --git a/packages/server-core-integration/examples/client.ts b/packages/server-core-integration/examples/client.ts index 32235b4020..27eb4f6047 100644 --- a/packages/server-core-integration/examples/client.ts +++ b/packages/server-core-integration/examples/client.ts @@ -4,7 +4,7 @@ import { PeripheralDeviceCategory, PeripheralDeviceType, } from '@sofie-automation/shared-lib/dist/peripheralDevice/peripheralDeviceAPI' -import { CoreConnection, PeripheralDevicePubSub, PeripheralDevicePubSubCollectionsNames } from '../src/index' +import { CoreConnection, PeripheralDevicePubSub, PeripheralDevicePubSubCollectionsNames } from '../src/index.js' const core = new CoreConnection({ deviceId: protectString('ExampleDevice'), diff --git a/packages/server-core-integration/jest.config.js b/packages/server-core-integration/jest.config.js index 5c5c7a8fd9..c1389299dc 100644 --- a/packages/server-core-integration/jest.config.js +++ b/packages/server-core-integration/jest.config.js @@ -9,6 +9,9 @@ module.exports = { }, ], }, + moduleNameMapper: { + '(.+)\\.js$': '$1', + }, testMatch: ['**/__tests__/**/*.spec.(ts|js)'], testPathIgnorePatterns: ['integrationTests'], testEnvironment: 'node', diff --git a/packages/server-core-integration/package.json b/packages/server-core-integration/package.json index ef6ba03be2..b17e41b589 100644 --- a/packages/server-core-integration/package.json +++ b/packages/server-core-integration/package.json @@ -1,6 +1,6 @@ { "name": "@sofie-automation/server-core-integration", - "version": "1.52.0", + "version": "1.53.0-in-development", "description": "Library for connecting to Core", "main": "dist/index.js", "typings": "dist/index.d.ts", @@ -34,7 +34,7 @@ "scripts": { "build": "run -T rimraf dist && run build:main && run copytypes", "build:main": "run -T tsc -p tsconfig.build.json", - "lint:raw": "run -T eslint --ext .ts --ext .js --ignore-pattern dist", + "lint:raw": "run -T eslint", "lint": "run lint:raw .", "unit": "run -T jest", "test": "run lint && run unit", @@ -48,7 +48,7 @@ "license-validate": "run -T sofie-licensecheck" }, "engines": { - "node": ">=22.11" + "node": ">=22.13.1" }, "files": [ "/dist", @@ -70,7 +70,7 @@ "production" ], "dependencies": { - "@sofie-automation/shared-lib": "1.52.0", + "@sofie-automation/shared-lib": "1.53.0-in-development", "ejson": "^2.2.3", "faye-websocket": "^0.11.4", "got": "^11.8.6", diff --git a/packages/server-core-integration/src/__mocks__/faye-websocket.ts b/packages/server-core-integration/src/__mocks__/faye-websocket.ts index bf5b894113..520e455710 100644 --- a/packages/server-core-integration/src/__mocks__/faye-websocket.ts +++ b/packages/server-core-integration/src/__mocks__/faye-websocket.ts @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ import { EventEmitter } from 'events' -import { AnyMessage } from '../lib/ddpClient' +import { AnyMessage } from '../lib/ddpClient.js' import * as EJSON from 'ejson' // import * as util from 'util' @@ -109,7 +109,7 @@ export class Client extends EventEmitter { error: 418, reason: 'Bad Wolf error', errorType: 'Meteor.Error', - } + } : undefined, }) ), diff --git a/packages/server-core-integration/src/__tests__/index.spec.ts b/packages/server-core-integration/src/__tests__/index.spec.ts index dcb424b6dd..8bd0b4ea4e 100644 --- a/packages/server-core-integration/src/__tests__/index.spec.ts +++ b/packages/server-core-integration/src/__tests__/index.spec.ts @@ -5,8 +5,8 @@ import { PeripheralDeviceType, PERIPHERAL_SUBTYPE_PROCESS, } from '@sofie-automation/shared-lib/dist/peripheralDevice/peripheralDeviceAPI' -import { CoreConnection, PeripheralDevicePubSub, PeripheralDevicePubSubCollectionsNames } from '../index' -import { DDPConnectorOptions } from '../lib/ddpClient' +import { CoreConnection, PeripheralDevicePubSub, PeripheralDevicePubSubCollectionsNames } from '../index.js' +import { DDPConnectorOptions } from '../lib/ddpClient.js' jest.mock('faye-websocket') jest.mock('got') @@ -368,7 +368,7 @@ describe('coreConnection', () => { // temporary scramble the ddp host: options.host = '127.0.0.9' - core.ddp.ddpClient && core.ddp.ddpClient.resetOptions(options) + core.ddp.ddpClient?.resetOptions(options) // Force-close the socket: core.ddp.ddpClient?.socket?.close() @@ -379,7 +379,7 @@ describe('coreConnection', () => { // restore ddp host: options.host = '127.0.0.1' - core.ddp.ddpClient && core.ddp.ddpClient.resetOptions(options) + core.ddp.ddpClient?.resetOptions(options) await wait(1000) // should have reconnected by now diff --git a/packages/server-core-integration/src/index.ts b/packages/server-core-integration/src/index.ts index 9666b98a8e..e864f65557 100644 --- a/packages/server-core-integration/src/index.ts +++ b/packages/server-core-integration/src/index.ts @@ -1,9 +1,9 @@ -export * from './lib/coreConnection' -export * from './lib/configManifest' -export * from './lib/ddpClient' -export * from './lib/methods' -export * from './lib/process' -export { SubscriptionId } from './lib/subscriptions' +export * from './lib/coreConnection.js' +export * from './lib/configManifest.js' +export * from './lib/ddpClient.js' +export * from './lib/methods.js' +export * from './lib/process.js' +export { SubscriptionId } from './lib/subscriptions.js' // Re-export some util from shared-lib export * from '@sofie-automation/shared-lib/dist/lib/lib' diff --git a/packages/server-core-integration/src/integrationTests/index.spec.ts b/packages/server-core-integration/src/integrationTests/index.spec.ts index cdc2badb3c..ceaccdb4d4 100644 --- a/packages/server-core-integration/src/integrationTests/index.spec.ts +++ b/packages/server-core-integration/src/integrationTests/index.spec.ts @@ -6,7 +6,7 @@ import { PeripheralDeviceCategory, PeripheralDeviceType, } from '@sofie-automation/shared-lib/dist/peripheralDevice/peripheralDeviceAPI' -import { CoreConnection, PeripheralDevicePubSub, PeripheralDevicePubSubCollectionsNames } from '../index' +import { CoreConnection, PeripheralDevicePubSub, PeripheralDevicePubSubCollectionsNames } from '../index.js' process.on('unhandledRejection', (reason) => { console.log('Unhandled Promise rejection!', reason) diff --git a/packages/server-core-integration/src/lib/CoreConnectionChild.ts b/packages/server-core-integration/src/lib/CoreConnectionChild.ts index 6f15ad42b9..074d5c5f83 100644 --- a/packages/server-core-integration/src/lib/CoreConnectionChild.ts +++ b/packages/server-core-integration/src/lib/CoreConnectionChild.ts @@ -5,14 +5,14 @@ import { PeripheralDeviceSubType, } from '@sofie-automation/shared-lib/dist/peripheralDevice/peripheralDeviceAPI' import { PeripheralDeviceAPIMethods } from '@sofie-automation/shared-lib/dist/peripheralDevice/methodsAPI' -import { DDPConnector } from './ddpConnector' -import { Observer } from './ddpClient' +import { DDPConnector } from './ddpConnector.js' +import { Observer } from './ddpClient.js' import { PeripheralDeviceId } from '@sofie-automation/shared-lib/dist/core/model/Ids' -import { ConnectionMethodsQueue, ExternalPeripheralDeviceAPI, makeMethods, makeMethodsLowPrio } from './methods' +import { ConnectionMethodsQueue, ExternalPeripheralDeviceAPI, makeMethods, makeMethodsLowPrio } from './methods.js' import { PeripheralDeviceForDevice } from '@sofie-automation/shared-lib/dist/core/model/peripheralDevice' -import { CoreConnection, Collection, CoreOptions, CollectionDocCheck } from './coreConnection' -import { CorePinger } from './ping' -import { ParametersOfFunctionOrNever, SubscriptionId, SubscriptionsHelper } from './subscriptions' +import { CoreConnection, Collection, CoreOptions, CollectionDocCheck } from './coreConnection.js' +import { CorePinger } from './ping.js' +import { ParametersOfFunctionOrNever, SubscriptionId, SubscriptionsHelper } from './subscriptions.js' import { PeripheralDevicePubSubCollections, PeripheralDevicePubSubTypes, @@ -39,7 +39,7 @@ export type ChildCoreConnectionEvents = { export class CoreConnectionChild< PubSubTypes = PeripheralDevicePubSubTypes, - PubSubCollections = PeripheralDevicePubSubCollections + PubSubCollections = PeripheralDevicePubSubCollections, > extends EventEmitter { private _parent: CoreConnection | undefined private _parentOptions!: CoreOptions @@ -147,7 +147,7 @@ export class CoreConnectionChild< */ async callMethodRaw(methodName: string, attrs: Array): Promise { if (this._destroyed) { - throw 'callMethod: CoreConnection has been destroyed' + throw new Error('callMethod: CoreConnection has been destroyed') } return this._methodQueue.callMethodRaw(methodName, attrs) diff --git a/packages/server-core-integration/src/lib/__tests__/ddpClient.spec.ts b/packages/server-core-integration/src/lib/__tests__/ddpClient.spec.ts index 5e501f2342..17e3248e40 100644 --- a/packages/server-core-integration/src/lib/__tests__/ddpClient.spec.ts +++ b/packages/server-core-integration/src/lib/__tests__/ddpClient.spec.ts @@ -1,4 +1,4 @@ -import { DDPClient, DDPConnectorOptions } from '../../index' +import { DDPClient, DDPConnectorOptions } from '../../index.js' jest.mock('faye-websocket') const wait = async (t: number): Promise => diff --git a/packages/server-core-integration/src/lib/__tests__/queue.spec.ts b/packages/server-core-integration/src/lib/__tests__/queue.spec.ts index a1c43681f9..08d310153d 100644 --- a/packages/server-core-integration/src/lib/__tests__/queue.spec.ts +++ b/packages/server-core-integration/src/lib/__tests__/queue.spec.ts @@ -1,5 +1,5 @@ /* eslint-disable jest/no-conditional-expect */ -import { Queue } from '../queue' +import { Queue } from '../queue.js' test('queue', async () => { let runCount = 0 diff --git a/packages/server-core-integration/src/lib/__tests__/timeSync.spec.ts b/packages/server-core-integration/src/lib/__tests__/timeSync.spec.ts index 67e039525f..b1985fce36 100644 --- a/packages/server-core-integration/src/lib/__tests__/timeSync.spec.ts +++ b/packages/server-core-integration/src/lib/__tests__/timeSync.spec.ts @@ -1,4 +1,4 @@ -import { TimeSync } from '../timeSync' +import { TimeSync } from '../timeSync.js' test('timeSync', async () => { const serverDiff = -5000 diff --git a/packages/server-core-integration/src/lib/__tests__/watchDog.spec.ts b/packages/server-core-integration/src/lib/__tests__/watchDog.spec.ts index 51c81092c9..52e6923b3e 100644 --- a/packages/server-core-integration/src/lib/__tests__/watchDog.spec.ts +++ b/packages/server-core-integration/src/lib/__tests__/watchDog.spec.ts @@ -1,4 +1,4 @@ -import { WatchDog } from '../watchDog' +import { WatchDog } from '../watchDog.js' const setTimeoutOrg = setTimeout const delay = async (time: any) => { @@ -19,7 +19,7 @@ describe('watchDog', () => { return new Promise((resolver, reject) => { if (coreIsHappy) resolver() - else if (coreReplies) reject() + else if (coreReplies) reject(new Error('Core is not happy')) }) }) const exitFcn = jest.fn(() => { diff --git a/packages/server-core-integration/src/lib/coreConnection.ts b/packages/server-core-integration/src/lib/coreConnection.ts index f70e1e1bfc..cd142ee328 100644 --- a/packages/server-core-integration/src/lib/coreConnection.ts +++ b/packages/server-core-integration/src/lib/coreConnection.ts @@ -1,5 +1,5 @@ import { EventEmitter } from 'events' -import * as _ from 'underscore' +import _ from 'underscore' import { PeripheralDeviceCategory, PERIPHERAL_SUBTYPE_PROCESS, @@ -9,25 +9,24 @@ import { } from '@sofie-automation/shared-lib/dist/peripheralDevice/peripheralDeviceAPI' import { PeripheralDeviceAPIMethods } from '@sofie-automation/shared-lib/dist/peripheralDevice/methodsAPI' -import { DDPConnector } from './ddpConnector' -import { DDPConnectorOptions, Observer } from './ddpClient' +import { DDPConnector } from './ddpConnector.js' +import { DDPConnectorOptions, Observer } from './ddpClient.js' -import { TimeSync } from './timeSync' -import { WatchDog } from './watchDog' -import { DeviceConfigManifest } from './configManifest' +import { TimeSync } from './timeSync.js' +import { WatchDog } from './watchDog.js' +import { DeviceConfigManifest } from './configManifest.js' import { PeripheralDeviceId } from '@sofie-automation/shared-lib/dist/core/model/Ids' -import { ConnectionMethodsQueue, ExternalPeripheralDeviceAPI, makeMethods, makeMethodsLowPrio } from './methods' +import { ConnectionMethodsQueue, ExternalPeripheralDeviceAPI, makeMethods, makeMethodsLowPrio } from './methods.js' import { PeripheralDeviceForDevice } from '@sofie-automation/shared-lib/dist/core/model/peripheralDevice' import { ProtectedString } from '@sofie-automation/shared-lib/dist/lib/protectedString' -import { ChildCoreOptions, CoreConnectionChild } from './CoreConnectionChild' -import { CorePinger } from './ping' -import { ParametersOfFunctionOrNever, SubscriptionId, SubscriptionsHelper } from './subscriptions' +import { ChildCoreOptions, CoreConnectionChild } from './CoreConnectionChild.js' +import { CorePinger } from './ping.js' +import { ParametersOfFunctionOrNever, SubscriptionId, SubscriptionsHelper } from './subscriptions.js' import { PeripheralDevicePubSubCollections, PeripheralDevicePubSubTypes, } from '@sofie-automation/shared-lib/dist/pubsub/peripheralDevice' -// eslint-disable-next-line @typescript-eslint/no-var-requires const PkgInfo = require('../../package.json') export interface CoreCredentials { @@ -80,7 +79,7 @@ export type CoreConnectionEvents = { } export class CoreConnection< PubSubTypes = PeripheralDevicePubSubTypes, - PubSubCollections = PeripheralDevicePubSubCollections + PubSubCollections = PeripheralDevicePubSubCollections, > extends EventEmitter { private _ddp: DDPConnector | undefined private _methodQueue: ConnectionMethodsQueue | undefined @@ -272,7 +271,7 @@ export class CoreConnection< */ async callMethodRaw(methodName: string, attrs: Array): Promise { if (this._destroyed) { - throw 'callMethod: CoreConnection has been destroyed' + throw new Error('callMethod: CoreConnection has been destroyed') } if (!this._methodQueue) throw new Error('Connection is not ready to call methods') @@ -444,7 +443,7 @@ export class CoreConnection< } else { i++ if (i > 50) { - reject() + reject(new Error('Watchdog ping timeout')) } else { setTimeout(checkPingReply, 300) } diff --git a/packages/server-core-integration/src/lib/ddpClient.ts b/packages/server-core-integration/src/lib/ddpClient.ts index 6c81aa00d4..d5700478a5 100644 --- a/packages/server-core-integration/src/lib/ddpClient.ts +++ b/packages/server-core-integration/src/lib/ddpClient.ts @@ -405,7 +405,7 @@ export class DDPClient extends EventEmitter { constructor(opts?: DDPConnectorOptions) { super() - opts || (opts = { host: '127.0.0.1', port: 3000, tlsOpts: {} }) + opts = opts || { host: '127.0.0.1', port: 3000, tlsOpts: {} } this.resetOptions(opts) this.ddpVersionInt = opts.ddpVersion || '1' @@ -810,7 +810,7 @@ export class DDPClient extends EventEmitter { close(): void { this.isClosing = true - this.socket && this.socket.close() // with mockJS connection, might not get created + this.socket?.close() // with mockJS connection, might not get created this.removeAllListeners('connected') this.removeAllListeners('failed') } diff --git a/packages/server-core-integration/src/lib/ddpConnector.ts b/packages/server-core-integration/src/lib/ddpConnector.ts index 80a8956fd7..d62dca74f4 100644 --- a/packages/server-core-integration/src/lib/ddpConnector.ts +++ b/packages/server-core-integration/src/lib/ddpConnector.ts @@ -1,5 +1,5 @@ import { EventEmitter } from 'events' -import { DDPClient, DDPConnectorOptions } from './ddpClient' +import { DDPClient, DDPConnectorOptions } from './ddpClient.js' export type DDPConnectorEvents = { error: [e: any] diff --git a/packages/server-core-integration/src/lib/methods.ts b/packages/server-core-integration/src/lib/methods.ts index 9c2c616d50..290fb65c40 100644 --- a/packages/server-core-integration/src/lib/methods.ts +++ b/packages/server-core-integration/src/lib/methods.ts @@ -3,10 +3,10 @@ import { NewPeripheralDeviceAPI, PeripheralDeviceAPIMethods, } from '@sofie-automation/shared-lib/dist/peripheralDevice/methodsAPI' -import _ = require('underscore') -import { CoreConnection, CoreCredentials } from './coreConnection' -import { DDPError } from './ddpClient' -import { DDPConnector } from './ddpConnector' +import _ from 'underscore' +import { CoreConnection, CoreCredentials } from './coreConnection.js' +import { DDPError } from './ddpClient.js' +import { DDPConnector } from './ddpConnector.js' export function makeMethods(connection: Pick, methods: object): any { const o: any = {} @@ -76,7 +76,7 @@ export class ConnectionMethodsQueue { async callMethodRaw(methodName: string, attrs: Array): Promise { return new Promise((resolve, reject) => { if (!methodName) { - reject('callMethod: argument missing: methodName') + reject(new Error('callMethod: argument missing: methodName')) return } @@ -84,7 +84,7 @@ export class ConnectionMethodsQueue { this._timeLastMethodCall = Date.now() if (!this._ddp.ddpClient) { - reject('callMehod: DDP client has not been initialized') + reject(new Error('callMehod: DDP client has not been initialized')) return } const timeout = setTimeout(() => { @@ -92,7 +92,9 @@ export class ConnectionMethodsQueue { console.error(`Timeout "${methodName}"`) console.error(JSON.stringify(fullAttrs)) reject( - `Timeout when calling method "${methodName}", arguments: ${JSON.stringify(fullAttrs).slice(0, 200)}` + new Error( + `Timeout when calling method "${methodName}", arguments: ${JSON.stringify(fullAttrs).slice(0, 200)}` + ) ) }, 10 * 1000) // 10 seconds this._ddp.ddpClient.call(methodName, fullAttrs, (err: DDPError | undefined, result: any) => { @@ -109,6 +111,8 @@ export class ConnectionMethodsQueue { } } } + + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(err) } else { resolve(result) diff --git a/packages/server-core-integration/src/lib/ping.ts b/packages/server-core-integration/src/lib/ping.ts index 3c00502083..39a378a5e3 100644 --- a/packages/server-core-integration/src/lib/ping.ts +++ b/packages/server-core-integration/src/lib/ping.ts @@ -3,7 +3,10 @@ export class CorePinger { private _connected = false private _destroyed = false - constructor(private readonly emitError: (err: string) => void, private readonly doPing: () => Promise) {} + constructor( + private readonly emitError: (err: string) => void, + private readonly doPing: () => Promise + ) {} public setConnectedAndTriggerPing(connected: boolean): void { this._connected = connected diff --git a/packages/server-core-integration/src/lib/process.ts b/packages/server-core-integration/src/lib/process.ts index d17586cbd0..d594a56e57 100644 --- a/packages/server-core-integration/src/lib/process.ts +++ b/packages/server-core-integration/src/lib/process.ts @@ -1,4 +1,3 @@ -// eslint-disable-next-line node/no-extraneous-import import * as fs from 'fs' export interface CertificatesConfig { diff --git a/packages/server-core-integration/src/lib/subscriptions.ts b/packages/server-core-integration/src/lib/subscriptions.ts index 7b9345c49b..53fa7278b7 100644 --- a/packages/server-core-integration/src/lib/subscriptions.ts +++ b/packages/server-core-integration/src/lib/subscriptions.ts @@ -1,5 +1,5 @@ import { ProtectedString, protectString, unprotectString } from '@sofie-automation/shared-lib/dist/lib/protectedString' -import type { DDPConnector } from './ddpConnector' +import type { DDPConnector } from './ddpConnector.js' export type SubscriptionId = ProtectedString<'SubscriptionId'> @@ -18,7 +18,11 @@ export class SubscriptionsHelper { >() readonly #otherSubscriptions = new Set() - constructor(private readonly emitError: (err: string) => void, ddp: DDPConnector, deviceToken: string) { + constructor( + private readonly emitError: (err: string) => void, + ddp: DDPConnector, + deviceToken: string + ) { this.#ddp = ddp this.#deviceToken = deviceToken } @@ -40,7 +44,7 @@ export class SubscriptionsHelper { const orgError = new Error() return new Promise((resolve, reject) => { if (!this.#ddp.ddpClient) { - reject('subscribe: DDP client is not initialized') + reject(new Error('subscribe: DDP client is not initialized')) return } try { @@ -63,7 +67,7 @@ export class SubscriptionsHelper { unprotectString(existingSubscriptionId) ) } catch (e) { - reject(e) + reject(e instanceof Error ? e : new Error('subscribe failed: ' + e)) } }) } diff --git a/packages/server-core-integration/src/lib/timeSync.ts b/packages/server-core-integration/src/lib/timeSync.ts index 261ae68b2a..276ff43dc8 100644 --- a/packages/server-core-integration/src/lib/timeSync.ts +++ b/packages/server-core-integration/src/lib/timeSync.ts @@ -1,4 +1,4 @@ -import * as _ from 'underscore' +import _ from 'underscore' export interface TimeSyncOptions { syncPeriod: number // time between syncs diff --git a/packages/server-core-integration/src/lib/watchDog.ts b/packages/server-core-integration/src/lib/watchDog.ts index 6e7ae6023e..ad327d334d 100644 --- a/packages/server-core-integration/src/lib/watchDog.ts +++ b/packages/server-core-integration/src/lib/watchDog.ts @@ -85,7 +85,7 @@ export class WatchDog extends EventEmitter { if (this.listenerCount('exit') > 0) { this.emit('exit') } else { - // eslint-disable-next-line no-process-exit + // eslint-disable-next-line n/no-process-exit process.exit(42) } }, 5000) diff --git a/packages/server-core-integration/tsconfig.build.json b/packages/server-core-integration/tsconfig.build.json index ce14e834d1..8d7a61c0f5 100755 --- a/packages/server-core-integration/tsconfig.build.json +++ b/packages/server-core-integration/tsconfig.build.json @@ -11,6 +11,7 @@ }, "resolveJsonModule": true, "types": ["node"], - "skipLibCheck": true + "skipLibCheck": true, + "esModuleInterop": true } } diff --git a/packages/server-core-integration/tsconfig.json b/packages/server-core-integration/tsconfig.json index b5100a2ca2..899b2ddb7a 100755 --- a/packages/server-core-integration/tsconfig.json +++ b/packages/server-core-integration/tsconfig.json @@ -1,16 +1,8 @@ { "extends": "./tsconfig.build.json", - "exclude": [ - "node_modules/**" - ], - "include": [ - "src/**/*.ts", - "examples/*.ts" - ], + "exclude": ["node_modules/**"], + "include": ["src/**/*.ts", "examples/*.ts"], "compilerOptions": { - "types": [ - "jest", - "node" - ] + "types": ["jest", "node"] } } diff --git a/packages/shared-lib/.eslintrc.json b/packages/shared-lib/.eslintrc.json deleted file mode 100644 index 3b809efa88..0000000000 --- a/packages/shared-lib/.eslintrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "../node_modules/@sofie-automation/code-standard-preset/eslint/main" -} diff --git a/packages/shared-lib/eslint.config.mjs b/packages/shared-lib/eslint.config.mjs new file mode 100644 index 0000000000..b9e5a88fd8 --- /dev/null +++ b/packages/shared-lib/eslint.config.mjs @@ -0,0 +1,3 @@ +import { generateEslintConfig } from '@sofie-automation/code-standard-preset/eslint/main.mjs' + +export default generateEslintConfig({}) diff --git a/packages/shared-lib/jest.config.js b/packages/shared-lib/jest.config.js index 2fe89196ee..76ff2b14f1 100644 --- a/packages/shared-lib/jest.config.js +++ b/packages/shared-lib/jest.config.js @@ -9,6 +9,9 @@ module.exports = { }, ], }, + moduleNameMapper: { + '(.+)\\.js$': '$1', + }, testMatch: ['**/__tests__/**/*.(spec|test).(ts|js)'], testPathIgnorePatterns: ['integrationTests'], testEnvironment: 'node', diff --git a/packages/shared-lib/package.json b/packages/shared-lib/package.json index 7a1289334a..90b2d6751d 100644 --- a/packages/shared-lib/package.json +++ b/packages/shared-lib/package.json @@ -1,23 +1,23 @@ { "name": "@sofie-automation/shared-lib", - "version": "1.52.0", + "version": "1.53.0-in-development", "description": "Library for types & values shared by core, workers and gateways", "main": "dist/index.js", "typings": "dist/index.d.ts", "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/Sofie-Automation/sofie-core.git", - "directory": "packages/sharelib" + "url": "git+https://github.com/nrkno/sofie-core.git", + "directory": "packages/shared-lib" }, "bugs": { - "url": "https://github.com/Sofie-Automation/sofie-core/issues" + "url": "https://github.com/nrkno/sofie-core/issues" }, - "homepage": "https://github.com/Sofie-Automation/sofie-core/blob/main/packages/sharelib#readme", + "homepage": "https://github.com/nrkno/sofie-core/blob/master/packages/shared-lib#readme", "scripts": { "build": "run -T rimraf dist && run build:main", "build:main": "run -T tsc -p tsconfig.build.json", - "lint:raw": "run -T eslint --ext .ts --ext .js --ignore-pattern dist", + "lint:raw": "run -T eslint", "lint": "run lint:raw .", "unit": "run -T jest", "test": "run lint && run unit", @@ -29,7 +29,7 @@ "license-validate": "run -T sofie-licensecheck" }, "engines": { - "node": ">=22.11" + "node": ">=22.13.1" }, "files": [ "/dist", @@ -39,7 +39,7 @@ ], "dependencies": { "@mos-connection/model": "^4.2.2", - "timeline-state-resolver-types": "9.3.0", + "timeline-state-resolver-types": "9.4.0-nightly-release53-20250730-145840-ce6dce9c1.0", "tslib": "^2.8.1", "type-fest": "^4.33.0" }, diff --git a/packages/shared-lib/src/__tests__/JSONBlob.spec.ts b/packages/shared-lib/src/__tests__/JSONBlob.spec.ts index 6f8bad1055..529924a309 100644 --- a/packages/shared-lib/src/__tests__/JSONBlob.spec.ts +++ b/packages/shared-lib/src/__tests__/JSONBlob.spec.ts @@ -1,4 +1,4 @@ -import { JSONBlobParse, JSONBlobStringify } from '../lib/JSONBlob' +import { JSONBlobParse, JSONBlobStringify } from '../lib/JSONBlob.js' test('JSONBlob', () => { // Unit test: diff --git a/packages/shared-lib/src/core/deviceConfigManifest.ts b/packages/shared-lib/src/core/deviceConfigManifest.ts index 8ae00dc2e5..6b385cac8f 100644 --- a/packages/shared-lib/src/core/deviceConfigManifest.ts +++ b/packages/shared-lib/src/core/deviceConfigManifest.ts @@ -11,10 +11,10 @@ * describe some properties to be rendered inside this table */ -import { JSONBlob } from '../lib/JSONBlob' +import { JSONBlob } from '../lib/JSONBlob.js' import { TSRActionSchema } from 'timeline-state-resolver-types' -import { TranslationsBundle } from '../lib/translations' -import { JSONSchema } from '../lib/JSONSchemaTypes' +import { TranslationsBundle } from '../lib/translations.js' +import { JSONSchema } from '../lib/JSONSchemaTypes.js' export interface DeviceConfigManifest { /** diff --git a/packages/shared-lib/src/core/model/Ids.ts b/packages/shared-lib/src/core/model/Ids.ts index 0dbffaff40..f9c989af90 100644 --- a/packages/shared-lib/src/core/model/Ids.ts +++ b/packages/shared-lib/src/core/model/Ids.ts @@ -1,4 +1,4 @@ -import { ProtectedString } from '../../lib/protectedString' +import { ProtectedString } from '../../lib/protectedString.js' /** A string, identifying a Studio */ export type StudioId = ProtectedString<'StudioId'> @@ -26,12 +26,6 @@ export type RundownPlaylistId = ProtectedString<'RundownPlaylistId'> /** A string, identifying a MediaObj */ export type MediaObjId = ProtectedString<'MediaObjId'> -/** A string, identifying a MediaWorkFlow */ -export type MediaWorkFlowId = ProtectedString<'MediaWorkFlowId'> - -/** A string, identifying a MediaWorkFlowStep */ -export type MediaWorkFlowStepId = ProtectedString<'MediaWorkFlowStepId'> - export type ExpectedPackageId = ProtectedString<'ExpectedPackageId'> export type ExpectedPackageWorkStatusId = ProtectedString<'ExpectedPackageStatusId'> diff --git a/packages/shared-lib/src/core/model/MediaObjects.ts b/packages/shared-lib/src/core/model/MediaObjects.ts index 8d988f7044..22d8dec854 100644 --- a/packages/shared-lib/src/core/model/MediaObjects.ts +++ b/packages/shared-lib/src/core/model/MediaObjects.ts @@ -1,5 +1,5 @@ -import { PackageInfo } from '../../package-manager/packageInfo' -import { MediaObjId, StudioId } from './Ids' +import { PackageInfo } from '../../package-manager/packageInfo.js' +import { MediaObjId, StudioId } from './Ids.js' export interface MediaObject0 { _id: MediaObjId diff --git a/packages/shared-lib/src/core/model/MediaWorkFlowSteps.ts b/packages/shared-lib/src/core/model/MediaWorkFlowSteps.ts deleted file mode 100644 index f98170947b..0000000000 --- a/packages/shared-lib/src/core/model/MediaWorkFlowSteps.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { WorkStepStatus } from '../../peripheralDevice/mediaManager' -import { MediaWorkFlowId, MediaWorkFlowStepId, PeripheralDeviceId, StudioId } from './Ids' - -export interface MediaWorkFlowStep { - _id: MediaWorkFlowStepId - _rev: string - - /** Which device this workflow originated from */ - deviceId: PeripheralDeviceId - studioId: StudioId - - workFlowId: MediaWorkFlowId - action: string - status: WorkStepStatus - messages?: Array - - priority: number - /** 0-1 */ - progress?: number - criticalStep?: boolean - /** Calculated time left of this step */ - expectedLeft?: number -} diff --git a/packages/shared-lib/src/core/model/MediaWorkFlows.ts b/packages/shared-lib/src/core/model/MediaWorkFlows.ts deleted file mode 100644 index 2ee3d0b9e9..0000000000 --- a/packages/shared-lib/src/core/model/MediaWorkFlows.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Time } from '../../lib/lib' -import { MediaWorkFlowId, PeripheralDeviceId, StudioId } from './Ids' - -export interface MediaWorkFlow { - _id: MediaWorkFlowId - _rev: string - - name?: string - /** A secondary name, some kind of a comment about the workFlow */ - comment?: string - - /** Which device this workflow originated from */ - deviceId: PeripheralDeviceId - studioId: StudioId - - source: string - /** Id of the expectedMedia Item */ - expectedMediaItemId?: string[] - mediaObjectId?: string - created: Time - - priority: number - - finished: boolean - success: boolean -} diff --git a/packages/shared-lib/src/core/model/PackageContainer.ts b/packages/shared-lib/src/core/model/PackageContainer.ts index f2eeeab894..9283ed32d3 100644 --- a/packages/shared-lib/src/core/model/PackageContainer.ts +++ b/packages/shared-lib/src/core/model/PackageContainer.ts @@ -1,4 +1,4 @@ -import { PackageContainer } from '../../package-manager/package' +import { PackageContainer } from '../../package-manager/package.js' export interface StudioPackageContainer { /** List of which peripheraldevices uses this packageContainer */ diff --git a/packages/shared-lib/src/core/model/PeripheralDeviceCommand.ts b/packages/shared-lib/src/core/model/PeripheralDeviceCommand.ts index 03dcba93a7..58d9330f0e 100644 --- a/packages/shared-lib/src/core/model/PeripheralDeviceCommand.ts +++ b/packages/shared-lib/src/core/model/PeripheralDeviceCommand.ts @@ -1,5 +1,5 @@ -import { Time } from '../../lib/lib' -import { PeripheralDeviceCommandId, PeripheralDeviceId } from './Ids' +import { Time } from '../../lib/lib.js' +import { PeripheralDeviceCommandId, PeripheralDeviceId } from './Ids.js' export interface PeripheralDeviceCommand { _id: PeripheralDeviceCommandId diff --git a/packages/shared-lib/src/core/model/StudioRouteSet.ts b/packages/shared-lib/src/core/model/StudioRouteSet.ts index 4928eb0192..386f56cd8c 100644 --- a/packages/shared-lib/src/core/model/StudioRouteSet.ts +++ b/packages/shared-lib/src/core/model/StudioRouteSet.ts @@ -1,5 +1,5 @@ -import { BlueprintMapping } from './Timeline' -import { TSR } from '../../tsr' +import { BlueprintMapping } from './Timeline.js' +import { TSR } from '../../tsr.js' export type AbPlayerId = number | string diff --git a/packages/shared-lib/src/core/model/StudioSettings.ts b/packages/shared-lib/src/core/model/StudioSettings.ts index 08044eaac2..09254ba173 100644 --- a/packages/shared-lib/src/core/model/StudioSettings.ts +++ b/packages/shared-lib/src/core/model/StudioSettings.ts @@ -43,6 +43,9 @@ export interface IStudioSettings { /** Preserve unsynced segments position in the rundown, relative to the other segments */ preserveOrphanedSegmentPositionInRundown?: boolean + /** Allow inifite adlibs from adlib testing mode to persist in the rundown */ + allowTestingAdlibsToPersist?: boolean + /** * The minimum amount of time, in milliseconds, that must pass after a take before another take may be performed. * Default: 1000 @@ -91,4 +94,9 @@ export interface IStudioSettings { * Doubleclick changes behaviour as selector for userediting */ enableUserEdits?: boolean + + /** + * Override the piece content statuses with fake info - used for developing the UI + */ + mockPieceContentStatus?: boolean } diff --git a/packages/shared-lib/src/core/model/Timeline.ts b/packages/shared-lib/src/core/model/Timeline.ts index 8c6ece2934..105df1582c 100644 --- a/packages/shared-lib/src/core/model/Timeline.ts +++ b/packages/shared-lib/src/core/model/Timeline.ts @@ -1,6 +1,6 @@ -import { unprotectString, protectString } from '../../lib/protectedString' -import { TSR } from '../../tsr' -import { MappingsHash, PeripheralDeviceId, StudioId, TimelineBlob, TimelineHash } from './Ids' +import { unprotectString, protectString } from '../../lib/protectedString.js' +import { TSR } from '../../tsr.js' +import { MappingsHash, PeripheralDeviceId, StudioId, TimelineBlob, TimelineHash } from './Ids.js' /** * This defines a session, indicating that this TimelineObject uses an AB player @@ -38,7 +38,7 @@ export enum TimelineObjHoldMode { export interface TimelineObjectCoreExt< TContent extends { deviceType: TSR.DeviceType }, TMetadata = unknown, - TKeyframeMetadata = unknown + TKeyframeMetadata = unknown, > extends TSR.TSRTimelineObj { /** * AB playback sessions needed for this Object diff --git a/packages/shared-lib/src/core/model/TimelineDatastore.ts b/packages/shared-lib/src/core/model/TimelineDatastore.ts index facfe514e3..e4cef25872 100644 --- a/packages/shared-lib/src/core/model/TimelineDatastore.ts +++ b/packages/shared-lib/src/core/model/TimelineDatastore.ts @@ -1,5 +1,5 @@ -import { Time } from '../../lib/lib' -import { StudioId, TimelineDatastoreEntryId } from './Ids' +import { Time } from '../../lib/lib.js' +import { StudioId, TimelineDatastoreEntryId } from './Ids.js' export enum DatastorePersistenceMode { Temporary = 'temporary', diff --git a/packages/shared-lib/src/core/model/peripheralDevice.ts b/packages/shared-lib/src/core/model/peripheralDevice.ts index e6441956f0..2f896ede8e 100644 --- a/packages/shared-lib/src/core/model/peripheralDevice.ts +++ b/packages/shared-lib/src/core/model/peripheralDevice.ts @@ -1,5 +1,5 @@ -import { TSR } from '../../tsr' -import { PeripheralDeviceId, StudioId } from './Ids' +import { TSR } from '../../tsr.js' +import { PeripheralDeviceId, StudioId } from './Ids.js' export interface IngestDeviceSecretSettingsStatus { /** OAuth: Set to true when secret value exists */ diff --git a/packages/shared-lib/src/expectedPlayoutItem.ts b/packages/shared-lib/src/expectedPlayoutItem.ts index 2aab23dd8c..a788ebde6d 100644 --- a/packages/shared-lib/src/expectedPlayoutItem.ts +++ b/packages/shared-lib/src/expectedPlayoutItem.ts @@ -1,6 +1,6 @@ -import { RundownId } from './core/model/Ids' -import { ProtectedString } from './lib/protectedString' -import { TSR } from './tsr' +import { RundownId } from './core/model/Ids.js' +import { ProtectedString } from './lib/protectedString.js' +import { TSR } from './tsr.js' /** @deprecated */ export interface ExpectedPlayoutItemGeneric { diff --git a/packages/live-status-gateway/src/generated/options.ts b/packages/shared-lib/src/generated/LiveStatusGatewayOptionsTypes.ts similarity index 100% rename from packages/live-status-gateway/src/generated/options.ts rename to packages/shared-lib/src/generated/LiveStatusGatewayOptionsTypes.ts diff --git a/packages/mos-gateway/src/generated/devices.ts b/packages/shared-lib/src/generated/MosGatewayDevicesTypes.ts similarity index 100% rename from packages/mos-gateway/src/generated/devices.ts rename to packages/shared-lib/src/generated/MosGatewayDevicesTypes.ts diff --git a/packages/mos-gateway/src/generated/options.ts b/packages/shared-lib/src/generated/MosGatewayOptionsTypes.ts similarity index 100% rename from packages/mos-gateway/src/generated/options.ts rename to packages/shared-lib/src/generated/MosGatewayOptionsTypes.ts diff --git a/packages/playout-gateway/src/generated/options.ts b/packages/shared-lib/src/generated/PlayoutGatewayConfigTypes.ts similarity index 100% rename from packages/playout-gateway/src/generated/options.ts rename to packages/shared-lib/src/generated/PlayoutGatewayConfigTypes.ts diff --git a/packages/shared-lib/src/input-gateway/deviceTriggerPreviews.ts b/packages/shared-lib/src/input-gateway/deviceTriggerPreviews.ts index fdcab3d567..dadd7ef025 100644 --- a/packages/shared-lib/src/input-gateway/deviceTriggerPreviews.ts +++ b/packages/shared-lib/src/input-gateway/deviceTriggerPreviews.ts @@ -1,8 +1,8 @@ -import { ITranslatableMessage } from '../lib/translations' -import { PartId, ShowStyleBaseId, StudioId, TriggeredActionId } from '../core/model/Ids' -import { ProtectedString } from '../lib/protectedString' -import { ISourceLayer, IOutputLayer, SourceLayerType, SomeActionIdentifier } from '../core/model/ShowStyle' -import { PieceLifespan } from '../core/model/Rundown' +import { ITranslatableMessage } from '../lib/translations.js' +import { PartId, ShowStyleBaseId, StudioId, TriggeredActionId } from '../core/model/Ids.js' +import { ProtectedString } from '../lib/protectedString.js' +import { ISourceLayer, IOutputLayer, SourceLayerType, SomeActionIdentifier } from '../core/model/ShowStyle.js' +import { PieceLifespan } from '../core/model/Rundown.js' export type DeviceTriggerMountedActionId = ProtectedString<'deviceTriggerMountedActionId'> @@ -61,4 +61,6 @@ export type PreviewWrappedAdLib = Omit & { } | undefined styleClassNames: string | undefined + isActive: boolean | undefined + isNext: boolean | undefined } diff --git a/packages/shared-lib/src/lib/JSONBlob.ts b/packages/shared-lib/src/lib/JSONBlob.ts index aac76da771..6820c4d8d3 100644 --- a/packages/shared-lib/src/lib/JSONBlob.ts +++ b/packages/shared-lib/src/lib/JSONBlob.ts @@ -16,7 +16,7 @@ * Data type for stringified data using JSONBlobStringify(). * To parse the data, use JSONBlobParse() */ -// eslint-disable-next-line @typescript-eslint/ban-types +// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types export interface JSONBlob extends String { __internal: T } diff --git a/packages/shared-lib/src/lib/JSONSchemaTypes.ts b/packages/shared-lib/src/lib/JSONSchemaTypes.ts index eac01a221d..476cfb5149 100644 --- a/packages/shared-lib/src/lib/JSONSchemaTypes.ts +++ b/packages/shared-lib/src/lib/JSONSchemaTypes.ts @@ -33,7 +33,9 @@ * POSSIBILITY OF SUCH DAMAGE. */ +// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion export const draft = '2020-12' as const +// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion export const $schema = 'https://json-schema.org/draft/2020-12/schema' as const type MaybeReadonlyArray = Array | ReadonlyArray @@ -47,16 +49,16 @@ export type JSONSchema< SchemaType = Value extends boolean ? 'boolean' : Value extends null - ? 'null' - : Value extends number - ? 'number' | 'integer' - : Value extends string - ? 'string' - : Value extends unknown[] - ? 'array' - : Value extends Record - ? 'object' - : JSONSchema.TypeValue + ? 'null' + : Value extends number + ? 'number' | 'integer' + : Value extends string + ? 'string' + : Value extends unknown[] + ? 'array' + : Value extends Record + ? 'object' + : JSONSchema.TypeValue, > = { /** * Using JSON Pointer fragments requires knowledge of the structure of the diff --git a/packages/shared-lib/src/lib/JSONSchemaUtil.ts b/packages/shared-lib/src/lib/JSONSchemaUtil.ts index 49e6380de0..1b087b3106 100644 --- a/packages/shared-lib/src/lib/JSONSchemaUtil.ts +++ b/packages/shared-lib/src/lib/JSONSchemaUtil.ts @@ -1,4 +1,4 @@ -import { JSONSchema, TypeName } from './JSONSchemaTypes' +import { JSONSchema, TypeName } from './JSONSchemaTypes.js' /** * The custom JSONSchema properties we can use for building the UI diff --git a/packages/shared-lib/src/lib/JobQueueWithClasses.ts b/packages/shared-lib/src/lib/JobQueueWithClasses.ts index 28122b07ba..42d23b0db8 100644 --- a/packages/shared-lib/src/lib/JobQueueWithClasses.ts +++ b/packages/shared-lib/src/lib/JobQueueWithClasses.ts @@ -96,7 +96,6 @@ export class JobQueueWithClasses { Promise.resolve() .then(async () => { this.#paused = false - // eslint-disable-next-line no-constant-condition while (true) { const firstIn = this.#queue.shift() if (!firstIn) { diff --git a/packages/shared-lib/src/lib/__tests__/JobQueueWithClasses.spec.ts b/packages/shared-lib/src/lib/__tests__/JobQueueWithClasses.spec.ts index 00f3bb553a..91a146eb6d 100644 --- a/packages/shared-lib/src/lib/__tests__/JobQueueWithClasses.spec.ts +++ b/packages/shared-lib/src/lib/__tests__/JobQueueWithClasses.spec.ts @@ -1,5 +1,5 @@ -import { JobQueueWithClasses } from '../JobQueueWithClasses' -import { sleep } from '../lib' +import { JobQueueWithClasses } from '../JobQueueWithClasses.js' +import { sleep } from '../lib.js' describe('JobQueueWithClasses', () => { const defaultErrorHandler = jest.fn((e: any) => { diff --git a/packages/shared-lib/src/lib/__tests__/lib.spec.ts b/packages/shared-lib/src/lib/__tests__/lib.spec.ts index 83a0da9833..1bacd01eb2 100644 --- a/packages/shared-lib/src/lib/__tests__/lib.spec.ts +++ b/packages/shared-lib/src/lib/__tests__/lib.spec.ts @@ -1,4 +1,4 @@ -import { equalSets, equivalentArrays } from '../lib' +import { equalSets, equivalentArrays } from '../lib.js' test('equalSets', () => { expect(equalSets(new Set(['a', 'b', 'c']), new Set(['c', 'b', 'a']))).toBe(true) diff --git a/packages/shared-lib/src/lib/__tests__/protectedString.spec.ts b/packages/shared-lib/src/lib/__tests__/protectedString.spec.ts index f788750fd1..f15823db86 100644 --- a/packages/shared-lib/src/lib/__tests__/protectedString.spec.ts +++ b/packages/shared-lib/src/lib/__tests__/protectedString.spec.ts @@ -5,7 +5,7 @@ import { unprotectObject, unprotectString, unprotectStringArray, -} from '../protectedString' +} from '../protectedString.js' describe('ProtectedString', () => { test('stringifies properly', async () => { diff --git a/packages/shared-lib/src/lib/__tests__/stringifyError.spec.ts b/packages/shared-lib/src/lib/__tests__/stringifyError.spec.ts index 829fae8875..eecd7b27a5 100644 --- a/packages/shared-lib/src/lib/__tests__/stringifyError.spec.ts +++ b/packages/shared-lib/src/lib/__tests__/stringifyError.spec.ts @@ -1,4 +1,4 @@ -import { stringifyError } from '../stringifyError' +import { stringifyError } from '../stringifyError.js' test('stringifyError', () => { // string: diff --git a/packages/shared-lib/src/lib/lib.ts b/packages/shared-lib/src/lib/lib.ts index 1eac0d8323..077cea537d 100644 --- a/packages/shared-lib/src/lib/lib.ts +++ b/packages/shared-lib/src/lib/lib.ts @@ -1,4 +1,4 @@ -import { ProtectedString } from './protectedString' +import { ProtectedString } from './protectedString.js' export type Time = number export type TimeDuration = number diff --git a/packages/shared-lib/src/lib/protectedString.ts b/packages/shared-lib/src/lib/protectedString.ts index 8c70a60321..3c9d6c9e1e 100644 --- a/packages/shared-lib/src/lib/protectedString.ts +++ b/packages/shared-lib/src/lib/protectedString.ts @@ -1,5 +1,3 @@ -/* eslint-disable @typescript-eslint/ban-types */ - import { PartialDeep, ReadonlyDeep } from 'type-fest' /** Runtime-wise, this is a string. @@ -52,12 +50,12 @@ export type UnprotectedStringProperties = { [P in keyof T]: T[P] extends ProtectedString ? string : T[P] extends ProtectedString | undefined - ? string | undefined - : T[P] extends object - ? UnprotectedStringProperties - : T[P] extends object | undefined - ? UnprotectedStringProperties - : T[P] + ? string | undefined + : T[P] extends object + ? UnprotectedStringProperties + : T[P] extends object | undefined + ? UnprotectedStringProperties + : T[P] } export function unprotectObject(obj: T): UnprotectedStringProperties export function unprotectObject(obj: T | undefined): UnprotectedStringProperties | undefined diff --git a/packages/shared-lib/src/lib/stringifyError.ts b/packages/shared-lib/src/lib/stringifyError.ts index f97659813f..ae4c0b5b48 100644 --- a/packages/shared-lib/src/lib/stringifyError.ts +++ b/packages/shared-lib/src/lib/stringifyError.ts @@ -12,8 +12,8 @@ export function stringifyError(error: unknown, noStack = false): string { str = `${(error as any).toString()}` } else { const strings: (string | undefined)[] = [ - stringify((error as any).rawError), // UserError - stringify((error as Error).message), // Error + stringify((error as any).rawError?.message), // SerializedUserError + stringify((error as any).message), // UserError or Error stringify((error as any).reason), // Meteor.Error stringify((error as any).details), ] @@ -25,6 +25,7 @@ export function stringifyError(error: unknown, noStack = false): string { // Try to stringify the object: str = JSON.stringify(error) } catch (e) { + // eslint-disable-next-line @typescript-eslint/no-base-to-string str = `${error} (stringifyError: ${e})` } } @@ -37,8 +38,12 @@ export function stringifyError(error: unknown, noStack = false): string { } if (!noStack) { - if (error && typeof error === 'object' && typeof (error as any).stack === 'string') { - str += ', ' + (error as any).stack + if (error && typeof error === 'object') { + if (typeof (error as any).stack === 'string') { + str += ', ' + (error as any).stack + } else if (typeof (error as any).rawError?.stack === 'string') { + str += ', ' + (error as any).rawError.stack + } } } diff --git a/packages/shared-lib/src/lib/translations.ts b/packages/shared-lib/src/lib/translations.ts index 270206fe19..ad3924f591 100644 --- a/packages/shared-lib/src/lib/translations.ts +++ b/packages/shared-lib/src/lib/translations.ts @@ -28,3 +28,13 @@ interface ITranslatableMessage { key: string args?: { [key: string]: any } } + +export function isITranslatableMessage(obj: unknown): obj is ITranslatableMessage { + return ( + typeof obj === 'object' && + obj !== null && + 'key' in obj && + typeof (obj as any).key === 'string' && + (!('args' in obj) || (typeof (obj as any).args === 'object' && (obj as any).args !== null)) + ) +} diff --git a/packages/shared-lib/src/lib/types.ts b/packages/shared-lib/src/lib/types.ts index 94d7ae43f7..681944c585 100644 --- a/packages/shared-lib/src/lib/types.ts +++ b/packages/shared-lib/src/lib/types.ts @@ -38,3 +38,32 @@ export type KeysByType = Diff< }[keyof TObj], undefined > + +/** + * Creates a new type by picking properties from `T` using an array of keys. + * + * @template T - The source type. + * @template K - An array of keys from `T` to pick. + * + * @example + * ```ts + * type User = { + * id: number; + * name: string; + * email: string; + * age: number; + * }; + * + * // Using an inline tuple: + * type PickedInline = PickKeys; + * // Equivalent to: + * // type PickedInline = { id: number; name: string }; + * + * // Using a separate constant array: + * const userKeys = ['id', 'name'] as const; + * type PickedFromConst = PickKeys; + * // Equivalent to: + * // type PickedFromConst = { id: number; name: string }; + * ``` + */ +export type PickKeys = Pick diff --git a/packages/shared-lib/src/package-manager/helpers.ts b/packages/shared-lib/src/package-manager/helpers.ts index c6eb6d8bb1..b99524183c 100644 --- a/packages/shared-lib/src/package-manager/helpers.ts +++ b/packages/shared-lib/src/package-manager/helpers.ts @@ -1,4 +1,4 @@ -import { ExpectedPackage } from './package' +import { ExpectedPackage } from './package.js' // Note: These functions are copied from Package Manager diff --git a/packages/shared-lib/src/package-manager/package.ts b/packages/shared-lib/src/package-manager/package.ts index 08537d57d6..f8309116a6 100644 --- a/packages/shared-lib/src/package-manager/package.ts +++ b/packages/shared-lib/src/package-manager/package.ts @@ -5,7 +5,7 @@ * will fetch from a MAM and copy to the media-folder of CasparCG. */ -import { StatusCode } from '../lib/status' +import { StatusCode } from '../lib/status.js' type AccessorId = string type ExpectedPackageId = string @@ -434,7 +434,7 @@ export namespace AccessorOnPackage { guid?: string title?: string } - // eslint-disable-next-line @typescript-eslint/no-empty-interface + // eslint-disable-next-line @typescript-eslint/no-empty-object-type export interface CorePackageCollection extends Partial { // empty } diff --git a/packages/shared-lib/src/package-manager/publications.ts b/packages/shared-lib/src/package-manager/publications.ts index 48ffbe0953..bd4f0c1d1c 100644 --- a/packages/shared-lib/src/package-manager/publications.ts +++ b/packages/shared-lib/src/package-manager/publications.ts @@ -1,6 +1,6 @@ -import { ExpectedPackage, PackageContainer, PackageContainerOnPackage } from './package' -import { PeripheralDeviceId, PieceInstanceId, RundownId, RundownPlaylistId } from '../core/model/Ids' -import { ProtectedString } from '../lib/protectedString' +import { ExpectedPackage, PackageContainer, PackageContainerOnPackage } from './package.js' +import { PeripheralDeviceId, PieceInstanceId, RundownId, RundownPlaylistId } from '../core/model/Ids.js' +import { ProtectedString } from '../lib/protectedString.js' export interface PackageManagerPlayoutContext { _id: PeripheralDeviceId diff --git a/packages/shared-lib/src/peripheralDevice/mediaManager.ts b/packages/shared-lib/src/peripheralDevice/mediaManager.ts index 97f58b2765..17fb0eeee5 100644 --- a/packages/shared-lib/src/peripheralDevice/mediaManager.ts +++ b/packages/shared-lib/src/peripheralDevice/mediaManager.ts @@ -1,35 +1,4 @@ -import { MediaWorkFlowId, MediaWorkFlowStepId } from '../core/model/Ids' - export interface MediaObjectRevision { id: string rev: string } -export interface MediaWorkFlowRevision { - _id: MediaWorkFlowId - _rev: string -} -export interface MediaWorkFlowStepRevision { - _id: MediaWorkFlowStepId - _rev: string -} - -// Note: These are just the enums from media-manager that core needs to be aware of - -export enum WorkStepStatus { - IDLE = 'idle', - WORKING = 'working', - DONE = 'done', - ERROR = 'error', - CANCELED = 'canceled', - SKIPPED = 'skipped', - BLOCKED = 'blocked', -} - -export enum WorkStepAction { - COPY = 'copy', - DELETE = 'delete', - SCAN = 'scan', - GENERATE_PREVIEW = 'generate_preview', - GENERATE_THUMBNAIL = 'generate_thumbnail', - GENERATE_METADATA = 'generate_metadata', -} diff --git a/packages/shared-lib/src/peripheralDevice/methodsAPI.ts b/packages/shared-lib/src/peripheralDevice/methodsAPI.ts index 80dd4dd366..0bf9314ce2 100644 --- a/packages/shared-lib/src/peripheralDevice/methodsAPI.ts +++ b/packages/shared-lib/src/peripheralDevice/methodsAPI.ts @@ -1,15 +1,13 @@ import { ExpectedPackageId, ExpectedPackageWorkStatusId, - MediaWorkFlowId, - MediaWorkFlowStepId, PeripheralDeviceCommandId, PeripheralDeviceId, TimelineHash, -} from '../core/model/Ids' -import { PeripheralDeviceForDevice } from '../core/model/peripheralDevice' -import { IngestPlaylist, IngestRundown, IngestPart, IngestSegment } from './ingest' -import { MediaObjectRevision, MediaWorkFlowRevision, MediaWorkFlowStepRevision } from './mediaManager' +} from '../core/model/Ids.js' +import { PeripheralDeviceForDevice } from '../core/model/peripheralDevice.js' +import { IngestPlaylist, IngestRundown, IngestPart, IngestSegment } from './ingest.js' +import { MediaObjectRevision } from './mediaManager.js' import { IMOSRunningOrder, IMOSRunningOrderBase, @@ -25,7 +23,7 @@ import { IMOSROFullStory, } from '@mos-connection/model' import { IMOSString128 } from '@mos-connection/model' -import { ExpectedPackageStatusAPI } from '../package-manager/package' +import { ExpectedPackageStatusAPI } from '../package-manager/package.js' import { PeripheralDeviceInitOptions, PeripheralDeviceStatusObject, @@ -33,10 +31,8 @@ import { DiffTimeResult, TimeDiff, PlayoutChangedResults, -} from './peripheralDeviceAPI' -import { MediaObject } from '../core/model/MediaObjects' -import { MediaWorkFlow } from '../core/model/MediaWorkFlows' -import { MediaWorkFlowStep } from '../core/model/MediaWorkFlowSteps' +} from './peripheralDeviceAPI.js' +import { MediaObject } from '../core/model/MediaObjects.js' export type UpdateExpectedPackageWorkStatusesChanges = | { @@ -277,24 +273,6 @@ export interface NewPeripheralDeviceAPI { ): Promise clearMediaObjectCollection(deviceId: PeripheralDeviceId, deviceToken: string, collectionId: string): Promise - getMediaWorkFlowRevisions(deviceId: PeripheralDeviceId, deviceToken: string): Promise - getMediaWorkFlowStepRevisions( - deviceId: PeripheralDeviceId, - deviceToken: string - ): Promise - updateMediaWorkFlow( - deviceId: PeripheralDeviceId, - deviceToken: string, - workFlowId: MediaWorkFlowId, - obj: MediaWorkFlow | null - ): Promise - updateMediaWorkFlowStep( - deviceId: PeripheralDeviceId, - deviceToken: string, - docId: MediaWorkFlowStepId, - obj: MediaWorkFlowStep | null - ): Promise - updateExpectedPackageWorkStatuses( deviceId: PeripheralDeviceId, deviceToken: string, @@ -434,11 +412,6 @@ export enum PeripheralDeviceAPIMethods { 'updateMediaObject' = 'peripheralDevice.mediaScanner.updateMediaObject', 'clearMediaObjectCollection' = 'peripheralDevice.mediaScanner.clearMediaObjectCollection', - 'getMediaWorkFlowRevisions' = 'peripheralDevice.mediaManager.getMediaWorkFlowRevisions', - 'updateMediaWorkFlow' = 'peripheralDevice.mediaManager.updateMediaWorkFlow', - 'getMediaWorkFlowStepRevisions' = 'peripheralDevice.mediaManager.getMediaWorkFlowStepRevisions', - 'updateMediaWorkFlowStep' = 'peripheralDevice.mediaManager.updateMediaWorkFlowStep', - 'updateExpectedPackageWorkStatuses' = 'peripheralDevice.packageManager.updateExpectedPackageWorkStatuses', 'removeAllExpectedPackageWorkStatusOfDevice' = 'peripheralDevice.packageManager.removeAllExpectedPackageWorkStatusOfDevice', diff --git a/packages/shared-lib/src/peripheralDevice/peripheralDeviceAPI.ts b/packages/shared-lib/src/peripheralDevice/peripheralDeviceAPI.ts index 1fb3b8e13d..a195bfd245 100644 --- a/packages/shared-lib/src/peripheralDevice/peripheralDeviceAPI.ts +++ b/packages/shared-lib/src/peripheralDevice/peripheralDeviceAPI.ts @@ -1,6 +1,6 @@ -import { DeviceConfigManifest } from '../core/deviceConfigManifest' -import { PeripheralDeviceId, RundownPlaylistId, PartInstanceId, PieceInstanceId } from '../core/model/Ids' -import { StatusCode } from '../lib/status' +import { DeviceConfigManifest } from '../core/deviceConfigManifest.js' +import { PeripheralDeviceId, RundownPlaylistId, PartInstanceId, PieceInstanceId } from '../core/model/Ids.js' +import { StatusCode } from '../lib/status.js' export interface PartPlaybackCallbackData { rundownPlaylistId: RundownPlaylistId @@ -24,6 +24,12 @@ export interface PiecePlaybackStartedResult extends PiecePlaybackCallbackData { } export type PiecePlaybackStoppedResult = PiecePlaybackStartedResult +export interface TriggerRegenerationCallbackData { + rundownPlaylistId: RundownPlaylistId + // partInstanceId: PartInstanceId + regenerationToken: string +} + export type PlayoutChangedResults = { rundownPlaylistId: RundownPlaylistId changes: PlayoutChangedResult[] @@ -33,6 +39,7 @@ export enum PlayoutChangedType { PART_PLAYBACK_STOPPED = 'partPlaybackStopped', PIECE_PLAYBACK_STARTED = 'piecePlaybackStarted', PIECE_PLAYBACK_STOPPED = 'piecePlaybackStopped', + TRIGGER_REGENERATION = 'triggerRegeneration', } export type PlayoutChangedResult = { objId: string @@ -41,6 +48,7 @@ export type PlayoutChangedResult = { | PlayoutChangedType.PART_PLAYBACK_STOPPED | PlayoutChangedType.PIECE_PLAYBACK_STARTED | PlayoutChangedType.PIECE_PLAYBACK_STOPPED + | PlayoutChangedType.TRIGGER_REGENERATION } & ( | { type: PlayoutChangedType.PART_PLAYBACK_STARTED @@ -58,6 +66,10 @@ export type PlayoutChangedResult = { type: PlayoutChangedType.PIECE_PLAYBACK_STOPPED data: Omit } + | { + type: PlayoutChangedType.TRIGGER_REGENERATION + data: Omit + } ) // Note The actual type of a device is determined by the Category, Type and SubType @@ -70,7 +82,6 @@ export interface PeripheralDeviceStatusObject { export enum PeripheralDeviceCategory { INGEST = 'ingest', PLAYOUT = 'playout', - MEDIA_MANAGER = 'media_manager', PACKAGE_MANAGER = 'package_manager', LIVE_STATUS = 'live_status', TRIGGER_INPUT = 'trigger_input', @@ -82,8 +93,6 @@ export enum PeripheralDeviceType { INEWS = 'inews', // Playout devices: PLAYOUT = 'playout', - // Media-manager devices: - MEDIA_MANAGER = 'media_manager', // Package_manager devices: PACKAGE_MANAGER = 'package_manager', // API devices: diff --git a/packages/shared-lib/src/pubsub/peripheralDevice.ts b/packages/shared-lib/src/pubsub/peripheralDevice.ts index d170835290..421c191a8b 100644 --- a/packages/shared-lib/src/pubsub/peripheralDevice.ts +++ b/packages/shared-lib/src/pubsub/peripheralDevice.ts @@ -1,15 +1,15 @@ -import { PeripheralDeviceForDevice } from '../core/model/peripheralDevice' -import { RoutedMappings, RoutedTimeline } from '../core/model/Timeline' -import { DBTimelineDatastoreEntry } from '../core/model/TimelineDatastore' +import { PeripheralDeviceForDevice } from '../core/model/peripheralDevice.js' +import { RoutedMappings, RoutedTimeline } from '../core/model/Timeline.js' +import { DBTimelineDatastoreEntry } from '../core/model/TimelineDatastore.js' import { PackageManagerPlayoutContext, PackageManagerPackageContainers, PackageManagerExpectedPackage, -} from '../package-manager/publications' -import { PeripheralDeviceId, RundownId, RundownPlaylistId } from '../core/model/Ids' -import { PeripheralDeviceCommand } from '../core/model/PeripheralDeviceCommand' -import { ExpectedPlayoutItemPeripheralDevice } from '../expectedPlayoutItem' -import { DeviceTriggerMountedAction, PreviewWrappedAdLib } from '../input-gateway/deviceTriggerPreviews' +} from '../package-manager/publications.js' +import { PeripheralDeviceId, RundownId, RundownPlaylistId } from '../core/model/Ids.js' +import { PeripheralDeviceCommand } from '../core/model/PeripheralDeviceCommand.js' +import { ExpectedPlayoutItemPeripheralDevice } from '../expectedPlayoutItem.js' +import { DeviceTriggerMountedAction, PreviewWrappedAdLib } from '../input-gateway/deviceTriggerPreviews.js' /** * Ids of possible DDP subscriptions for any PeripheralDevice. diff --git a/packages/webui/.eslintignore b/packages/webui/.eslintignore deleted file mode 100644 index 584fca0cbe..0000000000 --- a/packages/webui/.eslintignore +++ /dev/null @@ -1,4 +0,0 @@ -/public -/dist -/src/fonts -/src/meteor diff --git a/packages/webui/.eslintrc.cjs b/packages/webui/.eslintrc.cjs deleted file mode 100644 index f2437f7255..0000000000 --- a/packages/webui/.eslintrc.cjs +++ /dev/null @@ -1,152 +0,0 @@ -// module.exports = { -// root: true, -// env: { browser: true, es2020: true }, -// extends: [ -// 'eslint:recommended', -// 'plugin:@typescript-eslint/recommended', -// 'plugin:react-hooks/recommended', -// ], -// ignorePatterns: ['dist', '.eslintrc.cjs'], -// parser: '@typescript-eslint/parser', -// plugins: ['react-refresh'], -// rules: { -// 'react-refresh/only-export-components': [ -// 'warn', -// { allowConstantExport: true }, -// ], -// }, -// } - -const { - commonPlugins, - tsPlugins, - commonExtends, - tsExtends, - commonRules, - tsRules, - tsParser, -} = require('@sofie-automation/code-standard-preset/eslint/fragments') // eslint-disable-line node/no-unpublished-require - -const tmpRules = { - // Temporary rules to be removed over time - '@typescript-eslint/ban-types': 'off', - '@typescript-eslint/no-namespace': 'off', - '@typescript-eslint/no-var-requires': 'off', - '@typescript-eslint/no-non-null-assertion': 'off', - '@typescript-eslint/unbound-method': 'off', - '@typescript-eslint/no-misused-promises': 'off', - '@typescript-eslint/no-unnecessary-type-assertion': 'off', -} - -const tsBase = { - extends: [...tsExtends], - plugins: tsPlugins, - ...tsParser, - parserOptions: { project: './tsconfig.eslint.json' }, - settings: { - node: { - tryExtensions: ['.js', '.json', '.node', '.ts', '.tsx', '.d.ts'], - }, - }, - env: { - 'jest/globals': false, // Block jest from this - }, - rules: { - ...commonRules, - ...tsRules, - - // custom - 'no-inner-declarations': 'off', // some functions are unexported and placed inside a namespace next to related ones - 'node/no-missing-import': [ - 'error', - { - allowModules: ['meteor', 'mongodb'], - tryExtensions: ['.js', '.json', '.node', '.ts', '.tsx', '.d.ts'], - }, - ], - 'node/no-extraneous-import': [ - 'error', - { - allowModules: ['meteor', 'mongodb'], - }, - ], - ...tmpRules, - - 'react/react-in-jsx-scope': 'off', - }, -} - -module.exports = { - extends: [...commonExtends, 'plugin:react/recommended'], - plugins: [...commonPlugins, 'react'], - rules: { - 'prettier/prettier': 'error', - }, - env: { browser: true, es2020: true }, - parserOptions: { sourceType: 'module', ecmaVersion: 2020 }, - settings: { - react: { - version: 'detect', // Tells eslint-plugin-react to automatically detect the version of React to use - }, - }, - overrides: [ - // Note: these replace the values defined above, so make sure to extend them if they are needed - { - files: ['*.ts'], - ...tsBase, - }, - { - files: ['*.tsx'], - ...tsBase, - extends: [...tsBase.extends, 'plugin:react/recommended'], - parserOptions: { - ...tsBase.parserOptions, - ecmaFeatures: { - jsx: true, // Allows for the parsing of JSX - }, - }, - rules: { - ...tsBase.rules, - 'node/no-extraneous-import': 'off', // because there are a lot of them as dev-dependencies - 'node/no-missing-import': 'off', // erroring on every single import - 'react/prop-types': 'off', // we don't use this - '@typescript-eslint/no-empty-interface': 'off', // many prop/state types are {} - '@typescript-eslint/promise-function-async': 'off', // event handlers can't be async - }, - }, - { - files: ['*.js'], - env: { - 'jest/globals': false, // Block jest from this - }, - settings: { - node: { - tryExtensions: ['.js', '.json', '.node', '.ts', '.tsx'], - }, - }, - rules: { - ...commonRules, - ...tmpRules, - }, - }, - { - files: ['**/__tests__/**/*.ts', '**/__tests__/**/*.js', '**/__mocks__/**/*.ts'], - ...tsBase, - env: { - 'jest/globals': true, - jest: true, - }, - rules: { - ...tsBase.rules, - '@typescript-eslint/ban-ts-ignore': 'off', - '@typescript-eslint/ban-ts-comment': 'off', - - // custom - 'node/no-unpublished-import': 'off', - 'node/no-unpublished-require': 'off', - '@typescript-eslint/no-non-null-assertion': 'off', - ...tmpRules, - }, - }, - ], -} diff --git a/packages/webui/.prettierignore b/packages/webui/.prettierignore index c6bcdd3925..d94b597e72 100644 --- a/packages/webui/.prettierignore +++ b/packages/webui/.prettierignore @@ -1,3 +1,4 @@ src/meteor +src/fonts package.json CHANGELOG.md \ No newline at end of file diff --git a/packages/webui/eslint.config.mjs b/packages/webui/eslint.config.mjs new file mode 100644 index 0000000000..2017e806bb --- /dev/null +++ b/packages/webui/eslint.config.mjs @@ -0,0 +1,72 @@ +import { generateEslintConfig } from '@sofie-automation/code-standard-preset/eslint/main.mjs' +import pluginReact from 'eslint-plugin-react' +import globals from 'globals' + +const tmpRules = { + // Temporary rules to be removed over time + '@typescript-eslint/ban-types': 'off', + '@typescript-eslint/no-namespace': 'off', + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/unbound-method': 'off', + '@typescript-eslint/no-misused-promises': 'off', + '@typescript-eslint/no-unnecessary-type-assertion': 'off', +} + +const extendedRules = await generateEslintConfig({ + tsconfigName: 'tsconfig.eslint.json', + ignores: ['public', 'dist', 'src/fonts', 'src/meteor', 'vite.config.mts'], + disableNodeRules: true, +}) +extendedRules.push( + { + settings: { + react: { + version: 'detect', + }, + }, + }, + pluginReact.configs.flat.recommended, + pluginReact.configs.flat['jsx-runtime'], + { + files: ['src/**/*'], + languageOptions: { + globals: { + ...globals.browser, + JSX: true, + }, + }, + rules: {}, + }, + { + files: ['src/**/*'], + rules: { + // custom + 'no-inner-declarations': 'off', // some functions are unexported and placed inside a namespace next to related ones + // 'n/no-missing-import': [ + // 'error', + // { + // allowModules: ['meteor', 'mongodb'], + // tryExtensions: ['.js', '.json', '.node', '.ts', '.tsx', '.d.ts'], + // }, + // ], + // 'n/no-extraneous-import': [ + // 'error', + // { + // allowModules: ['meteor', 'mongodb'], + // }, + // ], + + 'n/no-extraneous-import': 'off', // because there are a lot of them as dev-dependencies + 'n/no-missing-import': 'off', // erroring on every single import + 'react/prop-types': 'off', // we don't use this + '@typescript-eslint/no-empty-interface': 'off', // many prop/state types are {} + '@typescript-eslint/no-empty-object-type': 'off', // many prop/state types are {} + '@typescript-eslint/promise-function-async': 'off', // event handlers can't be async + + ...tmpRules, + }, + } +) + +export default extendedRules diff --git a/packages/webui/index.html b/packages/webui/index.html index efd4095594..49eefeabbc 100644 --- a/packages/webui/index.html +++ b/packages/webui/index.html @@ -1,8 +1,7 @@ - + Sofie - diff --git a/packages/webui/jest.config.cjs b/packages/webui/jest.config.cjs index 6458660efb..4132ac19b1 100644 --- a/packages/webui/jest.config.cjs +++ b/packages/webui/jest.config.cjs @@ -7,7 +7,9 @@ module.exports = { globals: {}, moduleFileExtensions: ['js', 'ts', 'tsx'], moduleNameMapper: { + 'sha.js': 'sha.js', 'meteor/(.*)': '/src/meteor/$1', + '(.+)\\.js$': '$1', }, transform: { '^.+\\.(ts|tsx)$': [ diff --git a/packages/webui/package.json b/packages/webui/package.json index 61a5774f55..e8aeb74436 100644 --- a/packages/webui/package.json +++ b/packages/webui/package.json @@ -1,7 +1,7 @@ { "name": "@sofie-automation/webui", "private": true, - "version": "1.52.0", + "version": "1.53.0-in-development", "type": "module", "license": "MIT", "repository": { @@ -20,7 +20,7 @@ "check-types": "tsc -p tsconfig.app.json --noEmit", "watch-types": "run check-types --watch", "preview": "vite preview", - "lint:raw": "run -T eslint --ext .ts,.tsx,.js,.jsx --ignore-pattern dist", + "lint:raw": "run -T eslint", "lint": "run lint:raw .", "unit": "run -T jest", "test": "run lint && run unit", @@ -41,13 +41,14 @@ "@jstarpl/react-contextmenu": "^2.15.1", "@nrk/core-icons": "^9.6.0", "@popperjs/core": "^2.11.8", - "@sofie-automation/blueprints-integration": "1.52.0", - "@sofie-automation/corelib": "1.52.0", - "@sofie-automation/meteor-lib": "1.52.0", - "@sofie-automation/shared-lib": "1.52.0", - "@sofie-automation/sorensen": "^1.5.8", + "@sofie-automation/blueprints-integration": "1.53.0-in-development", + "@sofie-automation/corelib": "1.53.0-in-development", + "@sofie-automation/meteor-lib": "1.53.0-in-development", + "@sofie-automation/shared-lib": "1.53.0-in-development", + "@sofie-automation/sorensen": "^1.5.11", "@testing-library/user-event": "^14.6.1", "@types/sinon": "^10.0.20", + "bootstrap": "^5.3.3", "classnames": "^2.5.1", "cubic-spline": "^3.0.3", "deep-extend": "0.6.0", @@ -63,6 +64,7 @@ "query-string": "^6.14.1", "rc-tooltip": "^6.4.0", "react": "^18.3.1", + "react-bootstrap": "^2.10.9", "react-circular-progressbar": "^2.1.0", "react-datepicker": "^3.8.0", "react-dnd": "^14.0.5", @@ -74,8 +76,8 @@ "react-intersection-observer": "^9.15.1", "react-moment": "^0.9.7", "react-popper": "^2.3.0", + "react-router-bootstrap": "^0.25.0", "react-router-dom": "^5.3.4", - "react-timer-hoc": "^2.3.0", "semver": "^7.6.3", "sha.js": "^2.4.11", "shuttle-webhid": "^0.0.2", @@ -89,6 +91,7 @@ "@testing-library/dom": "^10.4.0", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.2.0", + "@types/bootstrap": "^5", "@types/classnames": "^2.3.4", "@types/deep-extend": "^0.6.2", "@types/react": "^18.3.18", @@ -96,23 +99,24 @@ "@types/react-datepicker": "^3.1.8", "@types/react-dom": "^18.3.5", "@types/react-router": "^5.1.20", + "@types/react-router-bootstrap": "^0", "@types/react-router-dom": "^5.3.3", "@types/sha.js": "^2.4.4", "@types/xml2js": "^0.4.14", - "@typescript-eslint/parser": "^7.18.0", "@vitejs/plugin-react": "^4.3.4", "@welldone-software/why-did-you-render": "^4.3.2", "@xmldom/xmldom": "^0.8.10", "babel-jest": "^29.7.0", + "globals": "^15.14.0", "sass": "^1.83.4", "sinon": "^14.0.2", - "typescript": "~5.5.4", + "typescript": "~5.7.3", "vite": "^6.0.11", "vite-plugin-node-polyfills": "^0.23.0", "vite-tsconfig-paths": "^5.1.4", "xml2js": "^0.6.2" }, "engines": { - "node": ">=22.11" + "node": ">=22.13.1" } } diff --git a/packages/webui/public/dev/dragTest.html b/packages/webui/public/dev/dragTest.html new file mode 100644 index 0000000000..318eda79be --- /dev/null +++ b/packages/webui/public/dev/dragTest.html @@ -0,0 +1,103 @@ + + + + + + + +

Drag&Drop Test page

+ + + + + + diff --git a/packages/webui/public/dev/fakePreview.mp4 b/packages/webui/public/dev/fakePreview.mp4 new file mode 100644 index 0000000000..430c2111b1 Binary files /dev/null and b/packages/webui/public/dev/fakePreview.mp4 differ diff --git a/packages/webui/public/dev/templatePreview.html b/packages/webui/public/dev/templatePreview.html new file mode 100644 index 0000000000..c45780ce8d --- /dev/null +++ b/packages/webui/public/dev/templatePreview.html @@ -0,0 +1,40 @@ + + + + + + + +
Test Box
+ + + + diff --git a/packages/webui/public/locales/en/translations.json b/packages/webui/public/locales/en/translations.json index 9e26dfeeb6..0967ef424b 100644 --- a/packages/webui/public/locales/en/translations.json +++ b/packages/webui/public/locales/en/translations.json @@ -1 +1 @@ -{} \ No newline at end of file +{} diff --git a/packages/webui/public/locales/nb/translations.json b/packages/webui/public/locales/nb/translations.json index 3c2f69b37b..596b186988 100644 --- a/packages/webui/public/locales/nb/translations.json +++ b/packages/webui/public/locales/nb/translations.json @@ -1,974 +1,974 @@ { - "Account Page": "Brukerkontoside", - "Name:": "Navn:", - "Email:": "E-post:", - "Old Password": "Gammelt passord", - "New Password": "Nytt passord", - "Save Changes": "Lagre endringer", - "Edit Account": "Endre brukerkonto", - "Organization": "Organisasjon", - "User roles in organization": "Brukerroller i organisasjon", - "Studio": "Studio", - "Configurator": "Configurator", - "Developer": "Developer", - "Admin": "Admin", - "Remove Self": "Fjern denne brukeren", - "Email Address": "E-postadresse", - "Password": "Passord", - "Sign in": "Logg inn", - "Create New Account": "Opprett ny brukerkonto", - "Lost password?": "Glemt passord?", - "Send reset email": "Send e-post for å nullstille", - "Go back": "Tilbake", - "Password must be atleast 5 characters long": "Passord må være minst 5 tegn langt", - "Enter your new password": "Skriv inn ditt nye passord", - "Set new password": "Lagre nytt passord", - "Your Account": "Din brukerkonto", - "About Your Organization": "Om din oranisasjon", - "We are mainly": "Vi er hovedsaklig", - "Areas": "Områder", - "Invite User": "Inviter brukar", - "New User's Email": "Ny brukers e-post", - "New User's Name": "Ny brukers navn", - "Create New User & Send Enrollment Email": "Opprett ny bruker og send e-post for innmelding", - "Users in organization": "Brukere i organisasjonen", - "Return to list": "Gå tilbake til listen", - "There is no rundown active in this studio.": "Fant ingen aktive kjøreplaner for dette studioet.", - "This studio doesn't exist.": "Dette studioet finnes ikke.", - "There are no active rundowns.": "Fant ingen aktive kjøreplaner.", - "Evaluation": "Evaluering", - "Please take a minute to fill in this form.": "Vennligst fyll ut dette skjemaet.", - "Be aware that while filling out the form keyboard and streamdeck commands will not be executed!": "OBS! Du kan ikke utføre Sofie-kommandoer mens du skriver evaluering!", - "Did you have any problems with the broadcast?": "Hadde du noen problemer med sendingen?", - "Please explain the problems you experienced (what happened and when, what should have happened, what could have triggered the problems, etcetera...)": "Vennligst forklar problemene du opplevde (hva skjedde og når skjedde det, hva skulle skjedd, hva kan ha utløst problemene, o.s.v.)", - "Your name": "Ditt navn", - "Save message": "Lagre melding", - "Save message and Deactivate Rundown": "Send evalueringen og deaktiver kjøreplanen", - "No problems": "Ingen problemer", - "Something went wrong, but it didn't affect the output": "Noe gikk galt, men det påvirket ikke sendingen", - "Something went wrong, and it affected the output": "Noe gikk galt, og det påvirket sendingen", - "Are you sure?": "Er du sikker?", - "Trimming this clip has timed out. It's possible that the story is currently locked for writing in {{nrcsName}} and will eventually be updated. Make sure that the story is not being edited by other users.": "Endring av inn-/utpunkt for dette klippet tar lang tid. Det er mulig manuset i er låst i {{nrcsName}} og at inn-/utpunkt endres om litt. Forsikre deg om at manuset ikke blir redigert av andre brukere.", - "Trimming this clip has failed due to an error: {{error}}.": "Endring av inn-/utpunkt for dette klippet feilet: {{error}}.", - "Trimmed succesfully.": "Endring av inn-/utpunkt var vellykket.", - "Trimming this clip is taking longer than expected. It's possible that the story is locked for writing in {{nrcsName}}.": "Endring av inn-/utpunkt for dette klippet tek meir tid enn forventa. Det er mogleg manuset er låst for redigering i {{nrcsName}}.", - "Trim \"{{name}}\"": "Trim \"{{name}}\"", - "OK": "OK", - "Cancel": "Avbryt", - "Remove in-trimming": "Nullstill innpunkt", - "In": "Inn", - "Remove all trimming": "Nullstill inn- og utpunkt", - "Duration": "Varighet", - "Remove out-trimming": "Nullstill utpunkt", - "Out": "Ut", - "Next": "Neste", - "Test test": "Test test", - "Until next take": "Til neste Take", - "Until next segment": "Til neste segment", - "Until end of segment": "Til slutten av segment", - "Until next rundown": "Til neste kjøreplan", - "Until end of showstyle": "Til slutten av showstyle", - "Script is empty": "Manuset er tomt", - "Clip:": "Klipp:", - "Home": "Hjem", - "Rundowns": "Kjøreplaner", - "Test Tools": "Testverktøy", - "Status": "Status", - "Settings": "Innstillinger", - "Account": "Konto", - "Logout": "Logg ut", - "My name is {{name}}": "Mitt navn er {{name}}", - "Operating Mode": "Styringsmodus", - "Switching operating mode to {{mode}}": "Bytt til {{mode}}", - "Prompter": "Prompter", - "End of script": "Slutt på manus", - "Could not get system status. Please consult system administrator.": "Kan ikke innhente status for systemet. Kontakt systemadministrator.", - "There are no rundowns ingested into Sofie.": "Det er ikke sendt kjøreplaner til Sofie.", - "Click on a rundown to control your studio": "Klikk på en kjøreplan for å kontrollere studioet ditt", - "Rundown": "Kjøreplan", - "Problems": "Problemer", - "Show Style": "Showstyle", - "On Air Start Time": "Sendestart", - "Expected End Time": "Forventet sendeslutt", - "Last updated": "Sist oppdatert", - "View Layout": "Vis layout", - "Today": "I dag", - "Yesterday": "I går", - "Tomorrow": "I morgen", - "Last": "Forrige", - "Getting Started": "Kom i gang", - "Start with giving this browser configuration permissions by adding this to the URL: ": "Først må du gå i konfigurasjonsmodus ved å legge dette til url-en: ", - "Start Here!": "Start her!", - "Then, run the migrations script:": "Kjør så migreringsprosedyren:", - "Run Migrations to get set up": "Kjør migreringsprosedyrer for å sette opp", - "Migrations": "Migrering", - "Documentation is available at": "Dokumentasjon er tilgjengelig på", - "Use {{nrcsName}} order": "Bruk rekkefølge fra {{nrcsName}}", - "Reset Sort Order": "Tilbakestill rekkefølge", - "Enable configuration mode by adding ?configure=1 to the address bar.": "Aktiver konfigurasjonsmodus ved å legge til ?configure=1 på slutten av nettadressen.", - "You need to run migrations to set the system up for operation.": "Du må kjøre migrering for å klargjøre systemet for bruk.", - "Drop Rundown here to move it out of its current Playlist": "Slipp kjøreplanen her for å flytte den ut av spillelisten", - "Sofie Automation": "Sofie", - "version": "versjon", - "System Status": "Systemstatus", - "System has issues which need to be resolved": "Systemet har problemer som må fikses", - "Status Messages:": "Statusmeldinger:", - "{{showStyleVariant}} – {{showStyleBase}}": "{{showStyleVariant}} – {{showStyleBase}}", - "Drag to reorder or move out of playlist": "Dra for å endre rekkefølge eller flytte ut av spillelisten", - "This rundown is currently active": "Denne kjøreplanen er allerede aktiv", - "Not set": "Ikke angitt", - "This rundown will loop indefinitely": "Denne kjøreplanen vil gå i en uendelig loop", - "({{timecode}})": "({{timecode}})", - "Re-sync rundown data with {{nrcsName}}": "Ikke synkronisert med MOS/{{nrcsName}}", - "Delete": "Slett", - "Standalone Shelf": "Frittstående skuff", - "Rundown & Shelf": "Kjøreplan & skuff", - "Default": "Standard", - "Delete rundown?": "Slette kjøreplanen?", - "Are you sure you want to delete the \"{{name}}\" rundown?": "Er du sikker på at du vil slette kjøreplanen \"{{name}}\"?", - "Please note: This action is irreversible!": "Merk: Denne handlingen kan ikke angres!", - "Re-Sync rundown?": "Synkroniser kjøreplanen med ENPS?", - "Re-Sync": "Synkroniser", - "Are you sure you want to re-sync the \"{{name}}\" rundown?": "Er du sikker på at du vil synkronisere kjøreplanen \"{{rundownSlug}}\" med ENPS?", - "Start time is close": "Oppgitt sendestart er hvert øyeblikk", - "Yes": "Ja", - "No": "Nei", - "You are in rehearsal mode, the broadcast starts in less than 1 minute. Do you want to reset the rundown and go into On-Air mode?": "Du er i testmodus og sendingen starter om mindre enn ett minutt. Vil du laste inn kjøreplanen på nytt og gjøre klar til sending?", - "Hold": "Hold", - "Could not find a Piece that can be disabled.": "Kunne ikke finne et element som kan skippes.", - "Failed to execute take": "Kunne ikke gjennomføre Take", - "The rundown you are trying to execute a take on is inactive, would you like to activate this rundown?": "Du prøve å gjøre en Take i en inaktiv kjøreplan. Vil du aktivere denne kjøreplanen?", - "Activate (Rehearsal)": "Aktiver (testmodus)", - "Activate (On-Air)": "Aktiver (gå ON AIR)", - "Failed to activate": "Kunne ikke aktivere", - "Something went wrong, please contact the system administrator if the problem persists.": "Noe gikk galt, kontakt systemadministrator hvis problemet fortsetter.", - "Another Rundown is Already Active!": "En annen kjøreplan er allerede aktiv!", - "The rundown \"{{rundownName}}\" will need to be deactivated in order to activate this one.\n\nAre you sure you want to activate this one anyway?": "Kjøreplanen \"{{rundownName}}\" må deaktiveres for å aktivere denne kjøreplanen.\n\nEr du sikker på at du ønsker å aktivere?", - "Activate Anyway (Rehearsal)": "Aktiver uansett (testmodus)", - "Activate Anyway (On-Air)": "Aktiver uansett (gå ON AIR)", - "Do you want to activate this Rundown?": "Vil du aktivere denne kjøreplanen?", - "The planned end time has passed, are you sure you want to activate this Rundown?": "Det planlagte sluttidspunktet er passert, er du sikker på at du vil aktivere denne kjøreplan?", - "Are you sure you want to activate Rehearsal Mode?": "Er du sikker på at du vil gå i testmodus?", - "Are you sure you want to deactivate this Rundown?\n(This will clear the outputs)": "Er du sikker på at du vil deaktivere denne kjøreplanen?\n(Dette vil nullstille alle utganger.)", - "The rundown can not be reset while it is active": "En aktivert kjøreplan kan ikke tilbakestilles", - "A snapshot of the current Running Order has been created for troubleshooting.": "Et snapshot av den gjeldende kjøreplanen har blitt opprettet for feilsøking.", - "Prepare Studio and Activate (Rehearsal)": "Forbered studio og aktiver testmodus", - "Deactivate": "Deaktiver", - "Take": "Take", - "Reset Rundown": "Tilbakestill kjøreplanen", - "Reload {{nrcsName}} Data": "Last inn {{nrcsName}}-data på nytt", - "Store Snapshot": "Lagre snapshot", - "No actions available": "Ingen kjøreplanvalg tilgjengelige i påsynsmodus", - "Add ?studio=1 to the URL to enter studio mode": "Legg til ?admin=1 på slutten av nettadressen for å starte studiomodus", - "Exit": "Lukk", - "Error": "Feil", - "This rundown is now active. Are you sure you want to exit this screen?": "Denne kjøreplanen er aktiv. Er du sikker på at du vil avslutte?", - "Invalid AdLib": "Ugyldig adlib", - "Cannot play this AdLib because it is marked as Invalid": "Kan ikke spille av adlib fordi den er markert som ugyldig", - "Cannot play this AdLib because it is marked as Floated": "Kan ikke spille av adlib fordi den er markert som på vent (float)", - "Not queueable": "Kan ikke settes i kø", - "Cannot play this adlib because source layer is not queueable": "Kan ikke spille av adlib fordi den ikke kan settes i kø på kildelaget", - "There are no Playout Gateways connected and attached to this studio. Please contact the system administrator to start the Playout Gateway.": "Dette studioet har ingen tilkoblede playout-gatewayer. Kontakt systemadministrator for å starte den.", - "Playout Gateway \"{{playoutDeviceName}}\" is now restarting.": "Playout-gateway \"{{playoutDeviceName}}\" starter på nytt...", - "Could not restart Playout Gateway \"{{playoutDeviceName}}\".": "Playout-gateway \"{{playoutDeviceName}}\" kunne ikke startes på nytt.", - "Restart Playout": "Start Playout-gateway på nytt", - "Restart CasparCG Server": "Restart CasparCG", - "Do you want to restart CasparCG Server \"{{device}}\"?": "Er du sikker på at du vil restarte CasparCG Server \"{{device}}\"?", - "CasparCG on device \"{{deviceName}}\" restarting...": "CasparCG på \"{{deviceName}}\" starter på nytt...", - "Failed to restart CasparCG on device: \"{{deviceName}}\": {{errorMessage}}": "Omstart av CasparCG på \"{{deviceName}}\" feilet: {{errorMessage}}", - "Cancel currently pressed hotkey": "Avbryt den trykte tasten", - "Change to fullscreen mode": "Fullskjermmodus", - "Show Hotkeys": "Vise hurtigtaster", - "Take a Snapshot": "Lagre et snapshot", - "Restart {{device}}": "Start {{device}} på nytt", - "Rundown not found": "Kjøreplan ikke funnet", - "Close": "Lukk", - "Rundown for piece \"{{pieceLabel}}\" could not be found.": "Finner ikke kjøreplan for \"{{pieceLabel}}\".", - "This rundown has been unpublished from Sofie.": "Denne kjøreplanen er ikke lenger tilgjengelig i Sofie.", - "Error: The studio of this Rundown was not found.": "Feil: Kan ikke finne studioet for denne kjøreplanen.", - "This playlist is empty": "Denne spillelisten er tom", - "Error: The ShowStyle of this Rundown was not found.": "Feil: Kan ikke finne showstyle for denne kjøreplanen.", - "Unknown error": "Ukjent feil", - "Rundown {{rundownName}} in Playlist {{playlistName}} is missing in the data from {{nrcsName}}. You can either leave it in Sofie and mark it as Unsynced or remove the rundown from Sofie. What do you want to do?": "Kjøreplan {{rundownName}} i listen {{playlistName}} mangler i data fra {{nrcsName}}. Du kan enten markere den som usynkronisert og beholde den i Sofie, eller fjerne kjøreplanen fra Sofie. Hva vil du gjøre?", - "(Unknown rundown)": "(Ukjent kjøreplan)", - "(Unknown playlist)": "(Ukjent kjøreplanliste)", - "Leave Unsynced": "Behold ikke-synkronisert kjøreplan", - "Remove": "Fjern", - "Remove rundown": "Fjern kjøreplan", - "Do you really want to remove just the rundown \"{{rundownName}}\" in the playlist {{playlistName}} from Sofie? This cannot be undone!": "Er du sikker på at du vil slette kjøreplanen {{rundownName}} i lista {{playlistName}} fra Sofie? Dette kan ikke angres!", - "Loop Start": "Start for loop", - "Loop End": "Slutt for loop", - "(in: {{time}})": "(om: {{time}})", - "({{time}} ago)": "(for {{time}} siden)", - "Planned Start": "Planlagt start", - "Planned Duration": "Planlagt varighet", - "Planned End": "Planlagt slutt", - "The rundown \"{{rundownName}}\" is not published or activated in {{nrcsName}}! No data updates will currently come through.": "Kjøreplanen \"{{rundownName}}\" er ikke synkronisert med MOS/{{nrcsName}}! Kontroller at den er satt MOS Active i ENPS.", - "Re-sync": "Synkroniser med MOS", - "Re-sync Rundown": "Synkroniser kjøreplanen med ENPS på nytt", - "Are you sure you want to re-sync the Rundown?\n(If the currently playing Part has been changed, this can affect the output)": "Er du sikker på at du vil synkronisere denne kjøreplanen?\n(Dette kan påvirke gjennomføring av en pågående sending)", - "Restart": "Restart", - "Fixing this problem requires a restart to the host device. Are you sure you want to restart {{device}}?\n(This might affect output)": "Feilretting krever en omstart av {{device}}. Er du sikker på at du ønsker å starte enheten på nytt?(Dette kan påvirke gjennomføring av en pågående sending)", - "Device \"{{deviceName}}\" restarting...": "\"{{deviceName}}\" starter på nytt...", - "Failed to restart device: \"{{deviceName}}\": {{errorMessage}}": "Kunne ikke starte \"{{deviceName}}\" på nytt: {{errorMessage}}", - "There is an unknown problem with the part.": "Det er et ukjent problem med denne delen.", - "Show issue": "Vis problem", - "There is an unspecified problem with the source.": "Det er et ikke-spesifisert problem med kilden.", - "External message queue has unsent messages.": "Ekstern meldingskø har meldinger som ikke er sendt.", - "The system configuration has been changed since importing this rundown. It might not run correctly": "Systemoppsettet har blitt endret etter at denne kjøreplanen ble importert. Kjøreplanen kan spilles av med feil", - "Unable to check the system configuration for changes": "Kan ikke kontrollere endringer i systemoppsettet", - "The Studio configuration is missing some required fields:": "Studiooppsettet mangler obligatoriske felter:", - "The Show Style configuration \"{{name}}\" could not be validated": "Showstyleoppsettet \"{{name}}\" kunne ikke valideres", - "The ShowStyle \"{{name}}\" configuration is missing some required fields:": "Showstyleoppsettet \"{{name}}\" mangler obligatoriske felter:", - "Unable to validate the system configuration": "Systemoppsettet kunne ikke valideres", - "Device {{deviceName}} is disconnected": "{{deviceName}} er koblet fra", - "Warnings": "Advarsler", - "Just now": "Nå", - "Less than a minute ago": "Under ett minutt siden", - "Less than five minutes ago": "Under fem minutter siden", - "Around 10 minutes ago": "Cirka 10 minutter siden", - "More than 10 minutes ago": "Over 10 minutter siden", - "More than 30 minutes ago": "Over 30 minutter siden", - "More than 2 hours ago": "Over 2 timer siden", - "More than 5 hours ago": "Over 5 timer siden", - "More than a day ago": "Over en dag siden", - "{{nrcsName}} Connection": "{{nrcsName}}-tilkobling", - "Last update": "Nyeste oppdatering", - "Off-line devices": "Frakoblede enheter", - "Devices with issues": "Enheter med problemer", - "All connections working correctly": "Alle tilkoblinger er OK", - "Play-out": "Avspilling", - "All devices working correctly": "Alle enheter fungerer som de skal", - "Auto": "Auto", - "Expected End": "Forventet slutt", - "Next Loop at": "Neste loop starter", - "Diff": "Forskjell", - "Started": "Startet", - "Expected Start": "Forventet slutt", - "{{currentRundownName}} - {{rundownPlaylistName}} (Looping)": "{{currentRundownName}} - {{rundownPlaylistName}} (Looper)", - "{{currentRundownName}} - {{rundownPlaylistName}}": "{{currentRundownName}} - {{rundownPlaylistName}}", - "{{rundownPlaylistName}} (Looping)": "{{currentRundownName}} - {{rundownPlaylistName}} (Looper)", - "Floated AdLib": "Adlib satt på vent", - "Switchboard": "Sentralbord", - "This is not in it's normal setting": "Endret fra standardoppsett", - "Off": "Av", - "On Air At": "On Air klokken", - "On Air In": "On Air om", - "Unsynced": "Ikke synkronisert med MOS", - "On Air": "On Air", - "Loops to top": "Looper til toppen", - "Show End": "Sendeslutt", - "BREAK": "PAUSE", - "Break In": "Pause om", - "part": "punkt", - "Set segment as Next": "Sett tittel som Neste: Starter på neste Take", - "Queue segment": "Cue tittel: Starter når aktiv tittel er ferdig", - "Clear queued segment": "Fjern cuet tittel", - "Set this part as Next": "Sett dette punktet som neste: Starter på neste Take", - "Set Next Here": "Sett Neste her", - "Play from Here": "Spill av herfra", - "Switch to Storyboard mode": "Bytt til storyboard-visning", - "Zoom Out": "Zoom Ut", - "Show All": "Vis alle", - "Zoom In": "Zoom inn", - "Parts Duration": "Varighet for del", - "Unknown": "Ukjent", - "Good": "Bra", - "Minor Warning": "Mindre advarsel (avvik)", - "Warning": "Advarsel", - "Bad": "Feil", - "Fatal": "Kritisk", - "Connected": "Tilkoblet", - "Disconnected": "Frakoblet", - "MOS Gateway": "MOS-gateway", - "Spreadsheet Gateway": "Spreadsheet-gateway", - "Play-out Gateway": "Playout-gateway", - "Media Manager": "Media Manager", - "Unknown Device": "Ukjent enhet", - "Delete this Studio?": "Slett dette studioet?", - "Are you sure you want to delete the studio \"{{studioId}}\"?": "Er du sikker på at du vil slette studioet \"{{studioId}}\"?", - "Delete this Show Style?": "Slett denne showstylen?", - "Are you sure you want to delete the show style \"{{showStyleId}}\"?": "Er du sikker på at du vil slette showstylen \"{{showStyleId}}\"?", - "Delete this Blueprint?": "Slett dette blueprintet?", - "Are you sure you want to delete the blueprint \"{{blueprintId}}\"?": "Er du sikker på at du vil slette blueprintet \"{{blueprintId}}\"?", - "Remove this Device?": "Fjern denne enheten?", - "Are you sure you want to remove the device \"{{deviceName}}\" and all of it's sub-devices?": "Er du sikker på at du vil fjerne enheten \"{{deviceName}}\" og alle dens underenheter?", - "Studios": "Studio", - "Unnamed Studio": "Studio uten navn", - "Show Styles": "Showstyle", - "Unnamed Show Style": "Showstyle uten navn", - "Source Layers": "Kildelag", - "Output Channels": "Utgangskanal", - "Blueprints": "Blueprints", - "Unnamed blueprint": "Blueprint uten navn", - "Type": "Type", - "Version": "Versjon", - "Devices": "Enheter", - "Tools": "Verktøy", - "Core System settings": "Systeminstillinger for Core", - "Upgrade Database": "Oppgrader databasen", - "Manage Snapshots": "Behandle snapshots", - "System Settings": "Systeminstillinger", - "Update Blueprints?": "Oppdater blueprints?", - "Update": "Oppdater", - "Are you sure you want to update the blueprints from the file \"{{fileName}}\"?": "Er du sikker på at du vil oppdatere blueprints fra filen \"{{fileName}}\"?", - "Blueprints updated successfully.": "Blueprints ble oppdatert.", - "Replace Blueprints?": "Erstatte blueprints?", - "Replace": "Erstatt", - "Are you sure you want to replace the blueprints with the file \"{{fileName}}\"?": "Er du sikker på at du vil erstatte blueprints fra filen \"{{fileName}}\"?", - "Failed to update blueprints: {{errorMessage}}": "Oppdatering av blueprints feilet: {{errorMessage}}", - "Assigned Show Styles:": "Tilordnede showstyles:", - "This Blueprint is not being used by any Show Style": "Dette blueprintet er ikke i bruk av noen showstyles", - "Assigned Studios:": "Tilordnede studio:", - "This Blueprint is not compatible with any Studio": "Dette blueprintet er ikke kompatibel med noe studio", - "Unassign": "Fjern tilordning", - "Assign": "Tilordne", - "Blueprint ID": "Blueprint-id", - "Blueprint Name": "Blueprintnavn", - "No name set": "Navn ikke definert", - "Blueprint Type": "Blueprinttype", - "Upload a new blueprint": "Last opp et nytt blueprint", - "Last modified": "Sist endret", - "Blueprint Id": "Blueprint-id", - "Blueprint Version": "Blueprintversjon", - "Disable version check": "Deaktiver versjonsjekk", - "Upload Blueprints": "Last opp blueprints", - "OAuth credentials succesfully uploaded.": "Opplasting av OAuth credentials var vellykket.", - "Failed to upload OAuth credentials: {{errorMessage}}": "Opplasting av OAuth credentials feilet: {{errorMessage}}", - "OAuth credentials successfuly reset": "OAuth credentials nullstilt", - "Failed to reset OAuth credentials: {{errorMessage}}": "Nullstiling av OAuth credentials feilet: {{errorMessage}}", - "Reset Authentication": "Nullstill autentisering", - "Application credentials": "Brukernavn/passord (Application Credentials)", - "Access token": "Tilgangskode (Access Token)", - "Click on the link below and accept the permissions request.": "Klikk på linken under og godta permissions-forespørselen", - "Waiting for gateway to generate URL...": "Venter på at gateway genererer URL...", - "Only Match Global AdLibs": "Vis kun globale adliber", - "Name": "Navn", - "Display Style": "Visningsstil", - "Show thumbnails next to list items": "Vis miniatyrbilder ved siden av listeelementer", - "Button width scale factor": "Breddeskala for knapp", - "Button height scale factor": "Høydeskala for knapp", - "Only Display AdLibs from Current Segment": "Vis kun adliber fra gjeldende tittel", - "Include Global AdLibs": "Inkluder globale adliber", - "Filter Disabled": "Filter deaktivert", - "Include Clear Source Layer in Ad-Libs": "Ta med \"Tøm kildelag\" i adliber", - "Source Layer Types": "Kildelagstyper", - "Filter disabled": "Filter deaktivert", - "Label contains": "Etikett inneholder", - "Tags must contain": "Tagger må inneholde", - "Hide Panel from view": "Ikke vis dette panelet", - "Show panel as a timeline": "Vis panel som en tidslinje", - "Enable search toolbar": "Aktiver søkeverktøy", - "Overflow horizontally": "Horisontal overflyt", - "Display Take buttons": "Vis Take-knapp", - "Queue all adlibs": "Cue alle adliber", - "Toggle AdLibs on single mouse click": "Veksle mellom adliber med enkelt museklikk", - "Hide duplicated AdLibs": "Skjul dupliserte adliber", - "Picks the first instance of an adLib per rundown, identified by uniqueness Id": "Velger den første forekomsten av en adlib i hver kjøreplan, identifisert av unik id", - "URL": "Adresse (url)", - "Display Rank": "Rangering for visning", - "Role": "Rolle", - "Adlib Rank": "Adlib-rang", - "Place label below panel": "Plasser etikett under panel", - "Disabled": "Deaktivert", - "Show segment name": "Vis tittelens navn", - "Show part title": "Vis delens tittel", - "Hide for dynamically inserted parts": "Skjul for dynamisk innsatte deler", - "Planned Start Text": "Tekst for planlagt start", - "Text to show above show start time": "Tekst som vises over klokkeslett for sendestart", - "Hide Diff": "Skjul forskjell", - "Hide Planned Start": "Skjul planlagt start", - "Planned End text": "Tekst for planlagt slutt", - "Text to show above show end time": "Tekst som vises over klokkeslett for sendeslutt", - "Hide Planned End Label": "Skjul etikett for planlagt slutt", - "Hide Diff Label": "Skjul etikett for forskjell", - "Hide Countdown": "Skjul nedtelling", - "Hide End Time": "Skjul sendeslutt", - "Hide Label": "Skjul etikett", - "Text": "Tekst", - "Show Rundown Name": "Vis kjøreplannavn", - "Segment": "Tittel", - "Part": "Del", - "X": "X", - "Y": "Y", - "Width": "Bredde", - "Height": "Høyde", - "Scale": "Skala", - "Custom Classes": "Tilpassede klasser", - "Device ID": "Enhets-id", - "Device Type": "Enhetstype", - "Remove this item?": "Fjern dette elementet?", - "Are you sure you want to remove {{type}} \"{{deviceId}}\"?": "Er du sikker på at du vil fjerne enheten {{type}} \"{{deviceId}}\"?", - "Attached Subdevices": "Tilkoblede underenheter", - "Expected End text": "Tekst for forventet slutt", - "Text to show above countdown to end of show": "Tekst som vises over nedtelling til forventet slutt", - "Hide Expected End timing when a break is next": "Gjem nedtelling til forventet slutt når neste punkt er en pause", - "While there are still breaks coming up in the show, hide the Expected End timers": "Gjem nedtelling til forventet slutt mens det fremdeles er pauser igjen i sendingen", - "Show next break timing": "Vis tid for neste pause", - "Whether to show countdown to next break": "Om nedtelling til neste pause skal vises", - "Last rundown is not break": "Siste kjøreplan er ingen pause", - "Don't treat the end of the last rundown in a playlist as a break": "Ikke behandle slutten av den siste kjøreplanen i en spilleliste som en pause", - "Next Break text": "Tekst for neste pause", - "Text to show above countdown to next break": "Tekst som vises over nedtelling til neste pause", - "Expose as user selectable layout": "Gjør tilgjengelig som brukervalgt layout", - "Shelf Layout": "Layouter for skuffen", - "Mini Shelf Layout": "Layouter for miniskuff", - "Rundown Header Layout": "Layout for kjøreplanens topptekst", - "Hide Rundown Divider": "Skjul kjøreplanskille", - "Hide rundown divider between rundowns in a playlist": "Skjul skille mellom kjøreplaner i en spilleliste", - "Show Breaks as Segments": "Vis pauser som titler", - "Segment countdown requires source layer": "Nedtelling for tittel krever kildelag", - "One of these source layers must have a piece for the countdown to segment on-air to be show": "Et av disse kildelagene må ha et element for at nedtelling til tittelen er OnAir vises", - "Fixed duration in Segment header": "Låst varighet i tittelheader", - "The segment duration in the segment header always displays the planned duration instead of acting as a counter": "Tittelens varighet i tittelheaderen vil alltid vise den planlagte varigheten i stedet for å telle ned", - "Select visible Source Layers": "Velg synlige kildelag", - "Select visible Output Groups": "Velg synlig utgangsgruppe", - "Expose layout as a standalone page": "Gjør layout tilgjengelig som en selvstendig side", - "Open shelf by default": "Åpne skuff som standard", - "Default shelf height": "Standard høyde for skuff", - "Show Buckets": "Vis bøtter", - "Disable Context Menu": "Skru av kontekstmeny", - "This action has an invalid combination of filters": "Denne handlingen har en ugyldig kombinasjon av filtre", - "Force": "Tving", - "Rehearsal": "Testmodus", - "Undo": "Angre", - "Segments: {{delta}}": "Segmenter: {{delta}}", - "Parts: {{delta}}": "Deler: {{delta}}", - "Open": "Åpne", - "Toggle": "Veklse", - "On": "På", - "Activate Rundown": "Aktiver kjøreplan", - "Ad-Lib": "Adlib", - "Deactivate Rundown": "Deaktiver kjøreplan", - "Disable next Piece": "Skip neste element", - "Move Next": "Skip neste", - "Reload NRCS Data": "Last inn MOS-data på nytt", - "Resync with NRCS": "Synkroniser med ENPS", - "Shelf": "Skuff", - "Rewind Segments to start": "Sett alle segmenter tilbake til start", - "Go to On Air line": "Gå til OnAir-posisjon", - "Show entire On Air Segment": "Vis hele tittelen som er OnAir", - "Force (deactivate others)": "Tving (deaktiver andre)", - "Move Segments": "Skip segmenter", - "Move Parts": "Skip del", - "State": "Tilstand", - "Action": "Handling", - "Ad-Lib Action": "Adlib-handling", - "Clear Source Layer": "Tøm kildelag", - "Sticky Piece": "Element er sticky", - "Global AdLibs": "Globale adliber", - "Label": "Etikett", - "Limit": "Grense", - "Output Layer": "Utgangslag", - "Pick": "Plukk", - "Pick last": "Plukk siste", - "Source Layer": "Kildelag", - "Source Layer Type": "Kildelagstyper", - "Tag": "Tag", - "Not Global": "Ikke globale", - "Only Global": "Bare globale", - "OnAir": "OnAir", - "Now active rundown": "Aktiv kjøreplan akkurat nå", - "View": "Visning", - "Executes within the currently open Rundown, requires a Client-side trigger.": "Utføers innenfor den valgte kjøreplanen, men trenger en utløser fra klienten.", - "Select Action": "Velg handling", - "No Ad-Lib matches in the current state of Rundown: \"{{rundownPlaylistName}}\"": "Ingen treff på adliber i nåværende tilstand for kjøreplanen: \"{{rundownPlaylistName}}\"", - "No matching Rundowns available to be used for preview": "Ingen passende kjøreplaner tilgjengelige for forhåndsvisning", - "Multilingual description, editing will overwrite": "Endring vil overskrive flerspråklig beskrivelse", - "Optional description of the action": "Valgfri beskrivelse av handlingen", - "Triggered Actions uploaded successfully.": "Opplasting av handlingsutløsere var vellykket.", - "Triggered Actions failed to upload: {{errorMessage}}": "Opplasting av handlingsutløsere feilet: {{errorMessage}}", - "Append or Replace": "Legg til eller erstatt", - "Do you want to append these to existing Action Triggers, or do you want to replace them?": "Vil du legge disse til de nåværende handlingsutløserne, eller vil du erstatte dem?", - "Append": "Legg til", - "Action Triggers": "Handlingsutløsere", - "Find Trigger...": "Finn utløser...", - "No matching Action Trigger.": "Fikk ikke treff blant handlingsutløsere.", - "No Action Triggers set up.": "Ingen handlingsutløsere er satt opp.", - "System-wide": "Systemvid", - "Upload stored Action Triggers": "Last opp lagrede handlingsutløsere", - "Download Action Triggers": "Last ned handlingsutløsere", - "On release": "På slipp (\"Key up\")", - "Empty": "Tom", - "Hotkey": "Hurtigtast", - "Trigger Type": "Type utløser", - "Failed to update config: {{errorMessage}}": "Oppdatering av konfigurasjon feilet: {{errorMessage}}", - "Export": "Eksporter", - "Import": "Importer", - "true": "true", - "false": "false", - "{{count}} rows": "{{count}} rader", - "Value": "Verdi", - "Create": "Opprett", - "Add config item": "Legg til konfigurasjonselement", - "Add": "Legg til", - "Item": "Element", - "Delete this item?": "Slett dette elementet?", - "Are you sure you want to delete this config item \"{{configId}}\"?": "Er du sikker på at du vil slette konfigurasjonselementet \"{{configId}}\"?", - "Blueprint Configuration": "Blueprintkonfigurasjon", - "More settings specific to this studio can be found here": "Mer spesifikke innstillinger for dette studioet kan du finne her", - "There was an error: {{error}}": "Det skjedde en feil: {{error}}", - "Package Manager status": "Status fo pakkebehandler", - "Reload statuses": "Last inn status på nytt", - "Updated": "Oppdatert", - "Package Manager": "Pakkebehandler", - "Statistics": "Statistikk", - "Times": "Tider", - "Connected Workers": "Tilkoblede arbeidere", - "Work-in-progress": "Pågående jobber", - "WorkForce": "Arbeiderstyrke", - "Kill (debug)": "Kill (debug)", - "Connected App Containers": "Tilkoblede app-kontainere", - "No status loaded": "Ingen status lastet", - "Peripheral Device is outdated": "Tilkoblet enhet er utdatert", - "The config UI is now driven by manifests fed by the device. This device needs updating to provide the configManifest to be configurable": "Brukergrensesnittet for konfigurasjon drives nå av manifester matet fra enhetene. Denne enheten må oppdateres for å gjøre configManifest konfigurerbart", - "Are you sure you want to restart this device?": "Er du sikker på at du vil starte denne enheten på nytt?", - "Restart this Device?": "Start denne enheten på nytt?", - "Check the console for troubleshooting data from device \"{{deviceName}}\"!": "Sjekk konsollen for feilsøkingsdata fra enheten \"{{deviceName}}\"!", - "There was an error when troubleshooting the device: \"{{deviceName}}\": {{errorMessage}}": "Det skjedde en feil under feilsøking av enhenten \"{{deviceName}}\": {{errorMessage}}", - "Generic Properties": "Generelle egenskaper", - "Device Name": "Enhetsnavn", - "Restart Device": "Start enheten på nytt", - "Troubleshoot": "Feilsøk", - "Reset Database Version": "Nullstill databaseversjon", - "Are you sure you want to reset the database version?\nOnly do this if you plan on running the migration right after.": "Er du sikker på at du vil nullstille databaseversjonen?\nBare gjør dette dersom du har tenkt å kjøre en migrering umiddelbart.", - "Version for {{name}}: From {{fromVersion}} to {{toVersion}}": "Versjon for {{name}}: Fra {{fromVersion}} til {{toVersion}}", - "Re-check": "Sjekk på nytt", - "Reset Version to": "Nullstill versjon til", - "Reset All Versions": "Nullstill alle versjoner", - "Migrate database": "Migrer database", - "All steps": "Alle trinn", - "The migration consists of several phases, you will get more options after you've this migration": "Migreringen består av flere faser, du vil få flere valg etter at du har kjørt denne migreringen", - "The migration can be completed automatically.": "Migreringen kan gjennomføres automatisk.", - "Run automatic migration procedure": "Kjør automatisk migreringsprosedyre", - "The migration procedure needs some help from you in order to complete, see below:": "Migreringsprosedyren trenger litt hjelp fra deg for å kunne fullføre. Se under:", - "Double-check Values": "Dobbeltsjekk verdier", - "Are you sure the values you have entered are correct?": "Er du sikker på at verdiene du har oppgitt er korrekte?", - "Run Migration Procedure": "Kjør migreringsprosedyre", - "Warnings During Migration": "Advarsler under migrering", - "Please check the database related to the warnings above. If neccessary, you can": "Vennligst sjekk databasen tilknyttet advarslene over. Hvis nødvendig kan du", - "Force Migration": "Tving migrering", - "Are you sure you want to force the migration? This will bypass the migration checks, so be sure to verify that the values in the settings are correct!": "Er du sikker på at du vil tvinge migreringen? Dette gjør at du hopper over migreringskontrollene, så vær sikker på at verdiene oppgitt i innstillinger er korrekte!", - "Force Migration (unsafe)": "Tving migrering (utrygt)", - "The migration was completed successfully!": "Migreringen var vellykket!", - "All is well, go get a": "Alt er greit, gå og hent deg en", - "New Layout": "Ny layout", - "Button": "Knapp", - "New Filter": "Nytt filter", - "Delete layout?": "Slett layout?", - "Are you sure you want to delete the shelf layout \"{{name}}\"?": "Er du sikker på at du vil slette layouten \"{{name}}\"?", - "Action Buttons": "Handlingsknapper", - "Icon": "Ikon", - "Icon color": "Ikonfarge", - "Filters": "Filtre", - "There are no filters set up yet": "Det er ikke satt opp noen filtre ennå", - "Default Layout": "Standardlayout", - "Add {{filtersTitle}}": "Legg til {{filtersTitle}}", - "Add filter": "Legg til filter", - "Add button": "Legg til knapp", - "Upload Layout?": "Last opp layout?", - "Upload": "Last opp", - "Are you sure you want to upload the shelf layout from the file \"{{fileName}}\"?": "Er du sikker på at du vil laste opp layout for skuff fra filen \"{{fileName}}\"?", - "Shelf layout uploaded successfully.": "Opplastingen av layout for skuff var vellykket.", - "Failed to upload shelf layout: {{errorMessage}}": "Opplasting av layout feilet: {{errorMessage}}", - "Show Style Base Name": "Showstylenavn", - "Blueprint": "Blueprint", - "Blueprint not set": "Blueprint ikke valgt", - "Compatible Studios:": "Kompatible studio:", - "This Show Style is not compatible with any Studio": "Denne showstylen er ikke kompatibelt med noe studio", - "Camera": "Kamera", - "Graphics": "Grafikk", - "Live Speak": "STK", - "Lower Third": "Super", - "Studio Microphone": "Studiomikrofon", - "Remote Source": "RM", - "Generic Script": "Generisk manus", - "Split Screen": "Splitt", - "Clips": "Klipp", - "Metadata": "Metadata", - "Camera Movement": "Kamerabevegelse", - "Unknown Layer": "Ukjent lag", - "Audio Mixing": "Lydmiksing", - "Transition": "Effekt", - "Lights": "Lys", - "Local": "Lokal", - "New Source": "Ny kilde", - "Are you sure you want to delete source layer \"{{sourceLayerId}}\"?": "Er du sikker på at du vil slette kildelaget \"{{sourceLayerId}}\"?", - "Source Name": "Kildenavn", - "Source Abbreviation": "Kildeforkortelse", - "Internal ID": "Intern-id", - "Source Type": "Kildetype", - "Is a Live Remote Input": "Er en RM", - "Is a Guest Input": "Er en gjesteinngang", - "Is hidden": "Er skjult", - "Pieces on this layer can be cleared": "Elementer på dette laget kan tømmes", - "Pieces on this layer are sticky": "Elementer i dette laget er sticky", - "Only Pieces present in rundown are sticky": "Kun elementer tilstede i kjøreplanen er sticky", - "Allow disabling of Pieces": "Tillat deaktivering av elementer", - "AdLibs on this layer can be queued": "Adliber på dette laget kan cues", - "Exclusivity group": "Ekslusivitetsgruppe", - "Add some source layers (e.g. Graphics) for your data to appear in rundowns": "Legg til kildelag (for eksempel Grafikk) for å vise dine data i kjøreplaner", - "No source layers set": "Ingen kildelag definert", - "Delete this output?": "Slett denne utgangen?", - "Are you sure you want to delete source layer \"{{outputId}}\"?": "Er du sikker på at du vil slette kildelaget \"{{outputId}}\"?", - "New Output": "Ny utgang", - "Channel Name": "Kanalnavn", - "Is PGM Output": "Er programutgang", - "Is collapsed by default": "Er minimert som standard", - "Is flattened": "Er slått sammen", - "Output channels are required for your studio to work": "Utgangskanaler er nødvendige for at studioet ditt skal fungere", - "Output channels": "Utgangskanal", - "No output channels set": "Ingen utgangskanal definert", - "No PGM output": "Ingen programutgang", - "Key": "Key", - "Custom Hotkey Labels": "Egendefinerte etiketter for hurtigtaster", - "Remove this Variant?": "Fjern denne varianten?", - "Are you sure you want to remove the variant \"{{showStyleVariantId}}\"?": "Er du sikker på at du vil fjerne denne showstylevarianten \"{{showStyleVariantId}}\"?", - "Unnamed variant": "Variant uten navn", - "Variant Name": "Variantnavn", - "Variants": "Varianter", - "Restore from this Snapshot file?": "Gjenopprette fra denne snapshotfilen?", - "Are you sure you want to restore the system from the snapshot file \"{{fileName}}\"?": "Er du sikker på at du vil gjenopprettet systemet fra snapshotfilen \"{{fileName}}\"?", - "Successfully restored snapshot": "Gjenoppretting fra snapshot var vellykket", - "Snapshot restore failed: {{errorMessage}}": "Gjenoppretting fra snapshot feilet: {{errorMessage}}", - "Full System Snapshot": "Fullt systemsnapshot", - "A Full System Snapshot contains all system settings (studios, showstyles, blueprints, devices, etc.)": "Et systemsnapshot inneholder alle systeminnstillinger (studio, showstyles, blueprints, enheter o.s.v.)", - "Take a Full System Snapshot": "Lagre et fullt systemsnapshot", - "Studio Snapshot": "Studiosnapshot", - "A Studio Snapshot contains all system settings related to that studio": "Et studiosnapshot inneholder alle systeminnstillinger tilknyttet et studio", - "Take a Snapshot for studio \"{{studioName}}\" only": "Lagre et studiosnapshot utelukkende for \"{{studioName}}\"", - "Restore from Snapshot File": "Gjenopprett fra snapshotfil", - "Upload Snapshot": "Last opp snapshot", - "Restore from Stored Snapshots": "Gjenopprett fra lagrede snapshots", - "Restore": "Gjenopprett", - "Show \"Remove snapshots\"-buttons": "Vis \"Fjern snapshots\"-knappene", - "Remove this device?": "Fjern denne enheten?", - "Are you sure you want to remove device \"{{deviceId}}\"?": "Er du sikker på at du vil fjerne enheten \"{{deviceId}}\"?", - "Devices are needed to control your studio hardware": "Enheter er nødvendige for å kontrollere utstyret i studioet ditt", - "Attached Devices": "Tilkoblede enheter", - "No devices connected": "Ingen enheter tilkoblet", - "Playout gateway not connected": "Playout-gateway er ikke tilkoblet", - "Remove this mapping?": "Fjern denne mappingen?", - "Are you sure you want to remove mapping for layer \"{{mappingId}}\"?": "Er du sikker på at du fil fjerne mappingen for laget \"{{mappingId}}\"?", - "This layer is now rerouted by an active Route Set: {{routeSets}}": "Dette laget blir omkoblet av en aktiv omkoplingsgruppe: {{routeSets}}", - "Layer ID": "Lag-id", - "ID of the timeline-layer to map to some output": "Lag-id for tidslinjelaget som skal mappes til en utgang", - "Layer Name": "Lagnavn", - "Human-readable name of the layer": "Leservennlig lagnavn", - "The type of device to use for the output": "Enhetstype som skal brukes for utgangen", - "ID of the device (corresponds to the device ID in the peripheralDevice settings)": "Enhets-id (korresponderer med enhets-id under enhetsinnstillinger)", - "Lookahead Mode": "Lookahead-modus", - "Lookahead Target Objects (Default = 1)": "Lookahead målobjekter (standard = 1)", - "Lookahead Maximum Search Distance (Default = {{limit}})": "Lookahead maksimum søkelengde (standard = {{limit}})", - "Layer Mappings": "Lagmappinger", - "Add a playout device to the studio in order to edit the layer mappings": "For å kunne redigere lagmappinger, må du legge til en playout-enhet til studio", - "Remove this Exclusivity Group?": "Fjern fra denne eksklusivitetsgruppen?", - "Are you sure you want to remove exclusivity group \"{{eGroupName}}\"?\nRoute Sets assigned to this group will be reset to no group.": "Er du sikker på at du vil fjerne eksklusivitetsgruppen \"{{eGroupName}}\"?\nOmkoblinger satt til denne gruppen vil bli resatt til ingen gruppe.", - "Remove this Route from this Route Set?": "Fjern denne omkoblingen fra omkoblingsgruppen?", - "Are you sure you want to remove the Route from \"{{sourceLayerId}}\" to \"{{newLayerId}}\"?": "Er du sikker på at du vil fjerne omkoblingen fra \"{{sourceLayerId}}\" til \"{{newLayerId}}\"?", - "Remove this Route Set?": "Fjern denne omkoblingsgruppen?", - "Are you sure you want to remove the Route Set \"{{routeId}}\"?": "Er du sikker på at du vil fjerne omkoblingsgruppen \"{{routeId}}\"?", - "Routes": "Omkoblinger", - "There are no routes set up yet": "Det er ikke satt opp omkoblinger ennå", - "Original Layer": "Opprinnelig lag", - "None": "Ingen", - "New Layer": "Nytt lag", - "Source Layer not found": "Kildelag ikke funnet", - "There are no exclusivity groups set up.": "Ingen eksklusivitetsgrupper er satt opp.", - "Exclusivity Group ID": "Eksklusivitetsgruppe-id", - "Exclusivity Group Name": "Eksklusivitetsgruppenavn", - "Display name of the Exclusivity Group": "Eksklusivitetsgruppens navn som vises i oversikten", - "Active": "Aktiv", - "Not Active": "Inaktiv", - "Not defined": "Ikke definert", - "There are no Route Sets set up.": "Det er ikke satt opp omkoblinger ennå.", - "Route Set ID": "Omkoblingsgruppe-id", - "Is this Route Set currently active": "Er denne omkoblingsgruppen aktiv nå", - "Default State": "Standardtilstand", - "The default state of this Route Set": "Standardtilstand for denne omkoblingsgruppen", - "Route Set Name": "Omkoblingsgruppens navn", - "Display name of the Route Set": "Omkoblingsgruppens navn som vises i oversikten", - "If set, only one Route Set will be active per exclusivity group": "Bare en omkoblingsgruppe være aktiv per eksklusivitetsgruppe når dette er krysset av for", - "Behavior": "Oppførsel", - "The way this Route Set should behave towards the user": "Måten denne omkoblingsgruppen skal oppføre seg på overfor brukeren", - "Route Sets": "Omkoblingsgrupper", - "Add a playout device to the studio in order to configure the route sets": "For å kunne redigere omkoblingsgrupper, må du legge til en playout-enhet til studio", - "Controls for exposed Route Sets will be displayed to the producer within the Rundown View in the Switchboard.": "Kontroller for eksponerte omkoblingsgrupper vil vises til producer i kjøreplansvisningen i omkoblingspanelet.", - "Exclusivity Groups": "Eksklusivitetsgrupper", - "Remove this Package Container?": "Fjern denne pakkekontaineren?", - "Are you sure you want to remove the Package Container \"{{containerId}}\"?": "Er du sikker på at du vil fjerne pakkekontaineren \"{{containerId}}\"?", - "There are no Package Containers set up.": "Det er ikke satt opp pakkekontainere ennå.", - "Package Container ID": "Pakkekontainer-id", - "Display name/label of the Package Container": "Vis navn/merkelapp for pakkekontaineren", - "Playout devices which uses this package container": "Playout-enheter som benytter denne pakkekontaineren", - "Select playout devices": "Velg playout-enhet", - "Select which playout devices are using this package container": "Velg hvilke playout-enheter som skal benytte denne pakkekontaineren", - "Accessors": "Aksessorer", - "Remove this Package Container Accessor?": "Fjern denne pakkekontainer-aksessoren?", - "Are you sure you want to remove the Package Container Accessor \"{{accessorId}}\"?": "Er du sikker på at du vil fjerne pakkekontainer-aksessoren \"{{accessorId}}\"?", - "There are no Accessors set up.": "Ingen aksessorer er satt opp.", - "Accessor ID": "Aksessor-id", - "Display name of the Package Container": "Pakkekontainerens navn som vises i oversikten", - "Accessor Type": "Aksessortype", - "Folder path": "Mappesti", - "File path to the folder of the local folder": "Sti til lokale mappe", - "Resource Id": "Ressurs-id", - "(Optional) This could be the name of the computer on which the local folder is on": "(Valgfri) Dette kan være navnet til datamaskinen som den lokale mappen er på", - "Base URL": "Base-url", - "Base url to the resource (example: http://myserver/folder)": "Base-url for ressursen (eksempel: http://minserver/mappe)", - "Network Id": "Nettverk-id", - "(Optional) A name/identifier of the local network where the share is located, leave empty if globally accessible": "(Valgfri) Et navn/en identifikator for det lokale nettverket hvor den delte mappen er lokalisert, la være tom dersom den er globalt tilgjengelig", - "Folder path to shared folder": "Sti til delt mappe", - "UserName": "Brukernavn", - "Username for athuentication": "Brukernavn for autentisering", - "Password for authentication": "Passord for autentisering", - "(Optional) A name/identifier of the local network where the share is located": "(Valgfri) Et navn/en identifikator for det lokale nettverket hvor den delte mappen er lokalisert", - "Quantel gateway URL": "Quantel Gateway-adresse (url)", - "URL to the Quantel Gateway": "Start Quantel Gateway på nytt", - "ISA URLs": "ISA-adresse (url)", - "URLs to the ISAs, in order of importance (comma separated)": "Adresser (url-er) for ISA-ene (kommaseparert i prioritert rekkefølge)", - "Zone ID": "Sone-id", - "Zone ID (default value: \"default\")": "Sone-id (standardverdi: \"default\")", - "Server ID": "Server-id", - "Server ID. For sources, this should generally be omitted (or set to 0) so clip-searches are zone-wide. If set, clip-searches are limited to that server.": "Server-ID. For kilder skal denne droppes (eller bli satt til 0) siden klippsøk skjer i heile sonen. Hvis denne er satt skjer klippsøk bare på den serveren.", - "Quantel transformer URL": "Quantel Transformer-adresse (url)", - "URL to the Quantel HTTP transformer": "Adresse til Quantel HTTP transformer", - "Quantel FileFlow URL": "Quantel FileFlow-adresse (url)", - "URL to the Quantel FileFlow Manager": "Adresse til Quantel FileFlow Manager", - "Quantel FileFlow Profile name": "Quantel FileFlow profilnavn", - "Profile name to be used by FileFlow when exporting the clips": "Profilnavn som benyttes av FileFlow når klippene eksporteres", - "Allow Read access": "Tillat lesing", - "Allow Write access": "Tillat skriving/lagring", - "Studio Settings": "Studioinnstillinger", - "Package Containers to use for previews": "Pakkekontainere som skal benyttes til forhåndsvisninger", - "Click to show available Package Containers": "Klikk for å vise tilgjengelige pakkekontainere", - "Package Containers to use for thumbnails": "Pakkekontainere som skal benyttes til miniatyrbilder", - "Package Containers": "Pakkekontainere", - "Studio Baseline needs update: ": "Studio baseline må oppdateres: ", - "Baseline needs reload, this studio may not work until reloaded": "Baseline må lastes på nytt, dette studioet vil kanskje ikke fungere før baseline er lastet på nytt", - "Reload Baseline": "Last inn baseline på nytt", - "Studio Name": "Studionavn", - "Select Compatible Show Styles": "Velg kompatibel showstyles", - "Show style not set": "Showstyle ikke satt", - "Click to show available Show Styles": "Klikk for å vise tilgjengelige showstyles", - "Frame Rate": "Framerate", - "Enable \"Play from Anywhere\"": "Slå på \"Play from Anywhere\"", - "Media Preview URL": "Forhåndsvisnings-URL", - "Sofie Host URL": "Sofie vertadresse (url)", - "Slack Webhook URLs": "Slack Webhook-adresser (url)", - "Supported Media Formats": "Støttede medieformater", - "Supported Audio Formats": "Støttede lydformater", - "Force the Multi-gateway-mode": "Tving multigateway-modus", - "Multi-gateway-mode delay time": "Delaytid for multigateway-modus", - "Allow Rundowns to be reset while on-air": "Tillat tilbakestilling av kjøreplaner som er on-air", - "Remove indexes": "Fjern indexer", - "This will remove {{indexCount}} old indexes, do you want to continue?": "Dette vil fjerne {{indexCount}} gamle indexer. Vil du fortsette?", - "{{indexCount}} indexes was removed.": "{{indexCount}} indexer ble fjernet.", - "Installation name": "Installasjonsnavn", - "This name will be shown in the title bar of the window": "Dette navnet vil vises i tittellinjen for vinduet", - "Logging level": "Loggenivå", - "This affects how much is logged to the console on the server": "Dette påvirker hvor mye som blir logget til serverkonsollen", - "System-wide Notification Message": "Lokal systemmelding", - "Message": "Melding", - "Enabled": "Aktivert", - "Edit Support Panel": "Rediger supportpanel", - "HTML that will be shown in the Support Panel": "HTML-kode som vil bli vist i supportpanelet", - "Application Performance Monitoring": "Overvåkning av applikasjonsytelse (AMP)", - "APM Enabled": "AMP aktivert", - "APM Transaction Sample Rate": "Prøvefrekvens for AMP-transaksjoner", - "How many of the transactions to monitor. Set to -1 to log nothing (max performance), 0.5 to log 50% of the transactions, 1 to log all transactions": "Antall transaksjoner som overvåkes. Sett verdien til -1 for å ikke logge noe (maks ytelse), til 0.5 for å logge halvparten av transaksjonene eller til 1 for å logge alle transaksjonene", - "Note: Core needs to be restarted to apply these settings": "Merknad: Core må startes på nytt for å ta i bruk disse innstillingene", - "Enable": "Aktiver", - "Cron jobs": "Cron-jobber", - "Enable CasparCG restart job": "Aktiver CasparCG restartjobber", - "Cleanup": "Opprydding", - "Cleanup old database indexes": "Rydd opp i gamle databaseindexer", - "Cleanup old data": "Rydd opp i gamle data", - "Disable CasparCG restart job": "Deaktiver CasparCG restartjobber", - "Remove old data from database": "Fjern gamle data fra databasen", - "There are {{count}} documents that can be removed, do you want to continue?": "Det er {{count}} dokumenter som kan fjernes. Vil du fortsette?", - "Documents to be removed:": "Dokumenter som fjernes:", - "Retry": "Prøv igjen", - "Remove old data": "Fjern gamle data", - "The old data was removed.": "Gamle data ble fjernet.", - "Last {{layerName}}": "Siste {{layerName}}", - "Clear {{layerName}}": "Tøm {{layerName}}", - "Search...": "Søk...", - "Are you sure you want to deactivate this Rundown\n(This will clear the outputs)": "Er du sikker på at du vil deaktivere denne kjøreplanen?\n(Dette vil nullstille alle utganger.)", - "Successfully stored snapshot": "Gjenoppretting fra snapshot var vellykket", - "End Words": "Stikkord", - "Global AdLib": "Globale adliber", - "AdLib does not provide any options": "Adlib har ingen valg", - "Execute": "Utfør", - "Save to Bucket": "Lagre til bøtte", - "Reveal in Shelf": "Vis i skuff", - "Edit in Nora": "Rediger i Nora", - "Current Part": "Nåværende del", - "Next Part": "Neste del", - "Part Count Down": "Nedtelling for del", - "Part Count Up": "Opptelling for del", - "Until end of rundown": "Til slutten av kjøreplanen", - "New Bucket": "Ny bøtte", - "Are you sure you want to delete this AdLib?": "Er du sikker på at du vil slette denne adliben?", - "Are you sure you want to delete this Bucket?": "Er du sikker på at du vil slette denne bøtten?", - "Are you sure you want to empty (remove all adlibs inside) this Bucket?": "Er du sikker på at du vil tømme denne bøtten (fjerner alle adliber)?", - "Current Segment": "Nåværende tittel", - "Next Segment": "Neste tittel", - "Segment Count Down": "Nedtelling for tittel", - "Segment Count Up": "Opptelling for tittel", - "Start this AdLib": "Slett denne adliben", - "Queue this AdLib": "Cue denne adliben", - "Inspect this AdLib": "Inspiser denne adliben", - "Rename this AdLib": "Gi denne adliben nytt navn", - "Delete this AdLib": "Slett denne adliben", - "Empty this Bucket": "Tøm denne bøtten", - "Rename this Bucket": "Gi bøtten nytt navn", - "Delete this Bucket": "Slett denne bøtten", - "Create new Bucket": "Opprett ny bøtte", - "AdLib": "Adlib", - "Shortcuts": "Hurtigtaster", - "Show Style Variant": "Showstylevariant", - "Local Time": "Lokal tid", - "System": "System", - "Media": "Media", - "Packages": "Pakker", - "Messages": "Meldinger", - "User Log": "Brukerlogg", - "Evaluations": "Evalueringer", - "Timestamp": "Tidsstempel", - "User Name": "Brukernavn", - "Answers": "Svar", - "Message Queue": "Meldingskø", - "Queued Messages": "Meldinger i kø", - "Sent Messages": "Sendte meldinger", - "File Copy": "Kopier fil", - "File Delete": "Slett fil", - "Check file size": "Sjekk filstørrelse", - "Scan File": "Scan fil", - "Generate Thumbnail": "Generer miniatyrbilder", - "Generate Preview": "Generer forhåndsvisning", - "Unknown action: {{action}}": "Ukjent handling: {{action}}", - "Done": "Utført", - "Failed": "Mislykket", - "Working, Media Available": "Jobber, media er tilgjengelig", - "Working": "Jobber", - "Pending": "Venter", - "Blocked": "Blokkert", - "Canceled": "Avbrutt", - "Idle": "Inaktiv", - "Skipped": "Hoppet over", - "Step progress: {{progress}}": "Fremdrift: {{progress}}", - "Processing": "Prosesserer", - "Unknown: {{status}}": "Ukjent: {{status}}", - "Collapse": "Minimer", - "Details": "Detaljer", - "Abort": "Avbryt", - "Prioritize": "Prioriter", - "Media Transfer Status": "Status for medieoverføringer", - "Abort All": "Avbryt alle", - "Restart All": "Start alle på nytt", - "Unknown Package \"{{packageId}}\"": "Ukjent pakke \"{{packageId}}\"", - "Package Status": "Pakkestatus", - "Package container status": "Status for pakkekontainer", - "Id": "Id", - "Work status": "Jobbstatus", - "Restart All jobs": "Start alle jobber på nytt", - "Created": "Opprettet", - "Ready": "Klar", - "The progress of steps required for playout": "Fremdrift for steg som er nødvendige for avspilling", - "The progress of all steps": "Fremdrift for alle steg", - "This step is required for playout": "Dette steget er nødvendig for avspilling", - "Work description": "Jobbeskrivlese", - "Work status reason": "Årsak for jobbstatus", - "Technical reason: {{reason}}": "Teknisk årsak: {{reason}}", - "Previous work status reasons": "Tidligere årsaker for jobbsatus", - "Priority": "Prioritet", - "Not Connected": "Ikke tilkoblet", - "Do you want to restart CasparCG Server?": "Er du sikker på at du vil restarte CasparCG?", - "Restart Quantel Gateway": "Start Quantel Gateway på nytt", - "Do you want to restart Quantel Gateway?": "Vil du starte Quantel Gateway på nytt?", - "Quantel Gateway restarting...": "Quantel Gateway starter på nytt...", - "Failed to restart Quantel Gateway: {{errorMessage}}": "Klarte ikke å restarte Quantel Gateway: {{errorMessage}}", - "Format HyperDeck disks": "Formater HyperDeck-disker", - "Do you want to format the HyperDeck disks? This is a destructive action and cannot be undone.": "Er du sikker på at du vil formatere HyperDeck-diskene? Dette kan ikke angres.", - "Formatting HyperDeck disks on device \"{{deviceName}}\"...": "Formaterer HyperDeck-disker på \"{{deviceName}}\"...", - "Failed to format HyperDecks on device: \"{{deviceName}}\": {{errorMessage}}": "Formatering av HyperDeck-disker på \"{{deviceName}}\" feilet: {{errorMessage}}", - "Last seen": "Sist sett", - "Connect some devices to the playout gateway": "Koble til en eller flere enheter til playout gatewayen", - "Format disks": "Formater disker", - "Are you sure you want to delete this device: \"{{deviceId}}\"?": "Er du sikker på at du vil fjerne enheten \"{{deviceId}}\"?", - "Sofie Automation Server Core: {{name}}": "Sofie:", - "Restart this system?": "Starte dette Sofie-systemet på nytt?", - "Are you sure you want to restart this Sofie Automation Server Core: {{name}}?": "Er du sikker på at du vil starte Sofie Core: {{name}} på nytt?", - "Could not generate restart token!": "Kunne ikke generere Restart Token!", - "Could not generate restart core: {{err}}": "Kunne ikke generere Restart Core: {{err}}", - "Sofie Automation Server Core will restart in {{time}}s...": "Sofie Core restartes om {{time}}s...", - "Execution times": "Kjøretider", - "User ID": "Bruker-id", - "Client IP": "Klient-ip", - "Method": "Metode", - "Parameters": "Parametre", - "GUI": "Brukergrensesnitt", - "User Activity Log": "Aktivitetslogg", - "in {{days}} days, {{hours}} h {{minutes}} min {{seconds}} s": "om {{days}} dager, {{hours}} t {{minutes}} min {{seconds}} s", - "in {{hours}} h {{minutes}} min {{seconds}} s": "om {{hours}} t {{minutes}} min {{seconds}} s", - "in {{minutes}} min {{seconds}} s": "om {{minutes}} min {{seconds}} s", - "in {{seconds}} s": "om {{seconds}} s", - "{{days}} days, {{hours}} h {{minutes}} min {{seconds}} s ago": "for {{days}} dager, {{hours}} t {{minutes}} min {{seconds}} s siden", - "{{hours}} h {{minutes}} min {{seconds}} s ago": "for {{hours}} t {{minutes}} min {{seconds}} s siden", - "{{minutes}} min {{seconds}} s ago": "for {{minutes}} min {{seconds}} s siden", - "{{seconds}} s ago": "for {{seconds}} s siden", - "Next scheduled show": "Neste planlagte sending", - "Help & Support": "Hjelp og brukerstøtte", - "Disable hints by adding this to the URL:": "Deaktiver hint ved å legge dette til på url-en:", - "Enable hints by adding this to the URL:": "Aktiver hint ved å legge dette til på url-en:", - "More documentation available at:": "Mer dokumentasjon er tilgjengelig på:", - "Timeline": "Tidslinje", - "Mappings": "Lagmappinger", - "User Log Player": "Brukerloggspiller", - "Play from here": "Spill av herfra", - "Exectute Single": "Utfør enslig handling", - "Next Action": "Neste handling", - "Run in": "Kjør i", - "Stop": "Stopp", - "Clip \"{{fileName}}\" can't be played because it doesn't exist on the playout system": "Klippet \"{{fileName}}\" kan ikke spilles av fordi det ikke finnes på utspillingssystemet", - "{{sourceLayer}} is not yet ready on the playout system": "{{sourceLayer}} er ennå ikke klar til å spilles ut fra avviklingsserver", - "{{sourceLayer}} is transferring to the playout system": "{{sourceLayer}} overføres til avviklingsserver", - "{{sourceLayer}} is transferring to the playout system and cannot be played yet": "{{sourceLayer}} overføres til avviklingsserver og kan ikke spilles av ennå", - "{{sourceLayer}} doesn't have both audio & video": "{{sourceLayer}} har ikke lyd og/eller bilde", - "{{sourceLayer}} has the wrong format: {{format}}": "{{sourceLayer}}-formatet er ikke støttet: {{format}}", - "{{sourceLayer}} has {{audioStreams}} audio streams": "{{sourceLayer}} har {{audioStreams}} lydstrømmer", - "Clip starts with {{frames}} {{type}} frames": "Klippet starter med {{frames}} {{type}} ruter", - "This clip ends with {{type}} frames after {{count}} seconds": "Klippet slutter med {{frames}} {{type}} frame", - "{{frames}} {{type}} frames detected within the clip": "{{frames}} {{type}} frame oppdaget inne i klippet", - "{{frames}} {{type}} frames detected in the clip": "{{frames}} {{type}} frame oppdaget inne i klippet", - "black": "svart(e)", - "freeze": "fryst(e)", - "{{sourceLayer}} is missing a file path": "{{sourceLayer}} kan ikke spilles av fordi filnavnet mangler", - "Clip doesn't have audio & video": "Klippet har ikke lyd og/eller bilde", - "Clip starts with {{frames}} {{type}} frame": "Klippet starter med {{frames}} {{type}} frame", - "This clip ends with {{type}} frames after {{count}} second": "Klippet slutter med {{frames}} {{type}} frame", - "{{frames}} {{type}} frame detected within the clip": "{{frames}} {{type}} frame oppdaget inne i klippet", - "{{frames}} {{type}} frame detected in clip": "{{frames}} {{type}} frame oppdaget i klippet", - "{{sourceLayer}} is being ingested": "{{sourceLayer}} blir prosessert", - "Source is missing": "Kilde mangler", - "Segment no longer exists in {{nrcs}}": "Segmenet eksisterer ikke lenger i {{nrcs}}", - "Segment was hidden in {{nrcs}}": "Tittelen eksisterer ikke lenger i {{nrcs}}", - "The following parts no longer exist in {{nrcs}}: {{partNames}}": "De følgende delene eksisterer ikke lenger i {{nrcs}}: {{partNames}}", - "Toggle Shelf": "Skuff", - "Undo Hold": "Angre hold", - "Disable the next element": "Skip neste super", - "Undo Disable the next element": "Unskip neste super", - "Move Next forwards": "Skip neste", - "Move Next to the following segment": "Skip til neste segment", - "Move Next backwards": "Unskip neste", - "Move Next to the previous segment": "Unskip neste segment", - "Rewind segments to start": "Sett segmentene tilbake til start", - "{{count}} rows°°°°°°_°°°°°°plural": "{{count}} rader°°°°°°", - "This layer is now rerouted by an active Route Set: {{routeSets}}°°°°°°_°°°°°°plural": "Dette laget blir omkoblet av flere aktive omkoblingsgrupper: {{routeSets}}°°°°°°", - "There are {{count}} documents that can be removed, do you want to continue?°°°°°°_°°°°°°plural": "Det er {{count}} dokumenter i {{collections}} som kan fjernes. Vil du fortsette?°°°°°°", - "Clip starts with {{frames}} {{type}} frame°°°°°°_°°°°°°plural": "Klippet starter med {{frames}} {{type}} frame°°°°°°", - "This clip ends with {{type}} frames after {{count}} second°°°°°°_°°°°°°plural": "Klippet slutter med {{frames}} {{type}} frame°°°°°°", - "{{frames}} {{type}} frame detected within the clip°°°°°°_°°°°°°plural": "{{frames}} {{type}} frames oppdaget inne i klippet°°°°°°", - "{{frames}} {{type}} frame detected in clip°°°°°°_°°°°°°plural": "{{frames}} {{type}} frames oppdaget i klippet°°°°°°" + "Account Page": "Brukerkontoside", + "Name:": "Navn:", + "Email:": "E-post:", + "Old Password": "Gammelt passord", + "New Password": "Nytt passord", + "Save Changes": "Lagre endringer", + "Edit Account": "Endre brukerkonto", + "Organization": "Organisasjon", + "User roles in organization": "Brukerroller i organisasjon", + "Studio": "Studio", + "Configurator": "Configurator", + "Developer": "Developer", + "Admin": "Admin", + "Remove Self": "Fjern denne brukeren", + "Email Address": "E-postadresse", + "Password": "Passord", + "Sign in": "Logg inn", + "Create New Account": "Opprett ny brukerkonto", + "Lost password?": "Glemt passord?", + "Send reset email": "Send e-post for å nullstille", + "Go back": "Tilbake", + "Password must be atleast 5 characters long": "Passord må være minst 5 tegn langt", + "Enter your new password": "Skriv inn ditt nye passord", + "Set new password": "Lagre nytt passord", + "Your Account": "Din brukerkonto", + "About Your Organization": "Om din oranisasjon", + "We are mainly": "Vi er hovedsaklig", + "Areas": "Områder", + "Invite User": "Inviter brukar", + "New User's Email": "Ny brukers e-post", + "New User's Name": "Ny brukers navn", + "Create New User & Send Enrollment Email": "Opprett ny bruker og send e-post for innmelding", + "Users in organization": "Brukere i organisasjonen", + "Return to list": "Gå tilbake til listen", + "There is no rundown active in this studio.": "Fant ingen aktive kjøreplaner for dette studioet.", + "This studio doesn't exist.": "Dette studioet finnes ikke.", + "There are no active rundowns.": "Fant ingen aktive kjøreplaner.", + "Evaluation": "Evaluering", + "Please take a minute to fill in this form.": "Vennligst fyll ut dette skjemaet.", + "Be aware that while filling out the form keyboard and streamdeck commands will not be executed!": "OBS! Du kan ikke utføre Sofie-kommandoer mens du skriver evaluering!", + "Did you have any problems with the broadcast?": "Hadde du noen problemer med sendingen?", + "Please explain the problems you experienced (what happened and when, what should have happened, what could have triggered the problems, etcetera...)": "Vennligst forklar problemene du opplevde (hva skjedde og når skjedde det, hva skulle skjedd, hva kan ha utløst problemene, o.s.v.)", + "Your name": "Ditt navn", + "Save message": "Lagre melding", + "Save message and Deactivate Rundown": "Send evalueringen og deaktiver kjøreplanen", + "No problems": "Ingen problemer", + "Something went wrong, but it didn't affect the output": "Noe gikk galt, men det påvirket ikke sendingen", + "Something went wrong, and it affected the output": "Noe gikk galt, og det påvirket sendingen", + "Are you sure?": "Er du sikker?", + "Trimming this clip has timed out. It's possible that the story is currently locked for writing in {{nrcsName}} and will eventually be updated. Make sure that the story is not being edited by other users.": "Endring av inn-/utpunkt for dette klippet tar lang tid. Det er mulig manuset i er låst i {{nrcsName}} og at inn-/utpunkt endres om litt. Forsikre deg om at manuset ikke blir redigert av andre brukere.", + "Trimming this clip has failed due to an error: {{error}}.": "Endring av inn-/utpunkt for dette klippet feilet: {{error}}.", + "Trimmed succesfully.": "Endring av inn-/utpunkt var vellykket.", + "Trimming this clip is taking longer than expected. It's possible that the story is locked for writing in {{nrcsName}}.": "Endring av inn-/utpunkt for dette klippet tek meir tid enn forventa. Det er mogleg manuset er låst for redigering i {{nrcsName}}.", + "Trim \"{{name}}\"": "Trim \"{{name}}\"", + "OK": "OK", + "Cancel": "Avbryt", + "Remove in-trimming": "Nullstill innpunkt", + "In": "Inn", + "Remove all trimming": "Nullstill inn- og utpunkt", + "Duration": "Varighet", + "Remove out-trimming": "Nullstill utpunkt", + "Out": "Ut", + "Next": "Neste", + "Test test": "Test test", + "Until next take": "Til neste Take", + "Until next segment": "Til neste segment", + "Until end of segment": "Til slutten av segment", + "Until next rundown": "Til neste kjøreplan", + "Until end of showstyle": "Til slutten av showstyle", + "Script is empty": "Manuset er tomt", + "Clip:": "Klipp:", + "Home": "Hjem", + "Rundowns": "Kjøreplaner", + "Test Tools": "Testverktøy", + "Status": "Status", + "Settings": "Innstillinger", + "Account": "Konto", + "Logout": "Logg ut", + "My name is {{name}}": "Mitt navn er {{name}}", + "Operating Mode": "Styringsmodus", + "Switching operating mode to {{mode}}": "Bytt til {{mode}}", + "Prompter": "Prompter", + "End of script": "Slutt på manus", + "Could not get system status. Please consult system administrator.": "Kan ikke innhente status for systemet. Kontakt systemadministrator.", + "There are no rundowns ingested into Sofie.": "Det er ikke sendt kjøreplaner til Sofie.", + "Click on a rundown to control your studio": "Klikk på en kjøreplan for å kontrollere studioet ditt", + "Rundown": "Kjøreplan", + "Problems": "Problemer", + "Show Style": "Showstyle", + "On Air Start Time": "Sendestart", + "Expected End Time": "Forventet sendeslutt", + "Last updated": "Sist oppdatert", + "View Layout": "Vis layout", + "Today": "I dag", + "Yesterday": "I går", + "Tomorrow": "I morgen", + "Last": "Forrige", + "Getting Started": "Kom i gang", + "Start with giving this browser configuration permissions by adding this to the URL: ": "Først må du gå i konfigurasjonsmodus ved å legge dette til url-en: ", + "Start Here!": "Start her!", + "Then, run the migrations script:": "Kjør så migreringsprosedyren:", + "Run Migrations to get set up": "Kjør migreringsprosedyrer for å sette opp", + "Migrations": "Migrering", + "Documentation is available at": "Dokumentasjon er tilgjengelig på", + "Use {{nrcsName}} order": "Bruk rekkefølge fra {{nrcsName}}", + "Reset Sort Order": "Tilbakestill rekkefølge", + "Enable configuration mode by adding ?configure=1 to the address bar.": "Aktiver konfigurasjonsmodus ved å legge til ?configure=1 på slutten av nettadressen.", + "You need to run migrations to set the system up for operation.": "Du må kjøre migrering for å klargjøre systemet for bruk.", + "Drop Rundown here to move it out of its current Playlist": "Slipp kjøreplanen her for å flytte den ut av spillelisten", + "Sofie Automation": "Sofie", + "version": "versjon", + "System Status": "Systemstatus", + "System has issues which need to be resolved": "Systemet har problemer som må fikses", + "Status Messages:": "Statusmeldinger:", + "{{showStyleVariant}} – {{showStyleBase}}": "{{showStyleVariant}} – {{showStyleBase}}", + "Drag to reorder or move out of playlist": "Dra for å endre rekkefølge eller flytte ut av spillelisten", + "This rundown is currently active": "Denne kjøreplanen er allerede aktiv", + "Not set": "Ikke angitt", + "This rundown will loop indefinitely": "Denne kjøreplanen vil gå i en uendelig loop", + "({{timecode}})": "({{timecode}})", + "Re-sync rundown data with {{nrcsName}}": "Ikke synkronisert med MOS/{{nrcsName}}", + "Delete": "Slett", + "Standalone Shelf": "Frittstående skuff", + "Rundown & Shelf": "Kjøreplan & skuff", + "Default": "Standard", + "Delete rundown?": "Slette kjøreplanen?", + "Are you sure you want to delete the \"{{name}}\" rundown?": "Er du sikker på at du vil slette kjøreplanen \"{{name}}\"?", + "Please note: This action is irreversible!": "Merk: Denne handlingen kan ikke angres!", + "Re-Sync rundown?": "Synkroniser kjøreplanen med ENPS?", + "Re-Sync": "Synkroniser", + "Are you sure you want to re-sync the \"{{name}}\" rundown?": "Er du sikker på at du vil synkronisere kjøreplanen \"{{rundownSlug}}\" med ENPS?", + "Start time is close": "Oppgitt sendestart er hvert øyeblikk", + "Yes": "Ja", + "No": "Nei", + "You are in rehearsal mode, the broadcast starts in less than 1 minute. Do you want to reset the rundown and go into On-Air mode?": "Du er i testmodus og sendingen starter om mindre enn ett minutt. Vil du laste inn kjøreplanen på nytt og gjøre klar til sending?", + "Hold": "Hold", + "Could not find a Piece that can be disabled.": "Kunne ikke finne et element som kan skippes.", + "Failed to execute take": "Kunne ikke gjennomføre Take", + "The rundown you are trying to execute a take on is inactive, would you like to activate this rundown?": "Du prøve å gjøre en Take i en inaktiv kjøreplan. Vil du aktivere denne kjøreplanen?", + "Activate (Rehearsal)": "Aktiver (testmodus)", + "Activate (On-Air)": "Aktiver (gå ON AIR)", + "Failed to activate": "Kunne ikke aktivere", + "Something went wrong, please contact the system administrator if the problem persists.": "Noe gikk galt, kontakt systemadministrator hvis problemet fortsetter.", + "Another Rundown is Already Active!": "En annen kjøreplan er allerede aktiv!", + "The rundown \"{{rundownName}}\" will need to be deactivated in order to activate this one.\n\nAre you sure you want to activate this one anyway?": "Kjøreplanen \"{{rundownName}}\" må deaktiveres for å aktivere denne kjøreplanen.\n\nEr du sikker på at du ønsker å aktivere?", + "Activate Anyway (Rehearsal)": "Aktiver uansett (testmodus)", + "Activate Anyway (On-Air)": "Aktiver uansett (gå ON AIR)", + "Do you want to activate this Rundown?": "Vil du aktivere denne kjøreplanen?", + "The planned end time has passed, are you sure you want to activate this Rundown?": "Det planlagte sluttidspunktet er passert, er du sikker på at du vil aktivere denne kjøreplan?", + "Are you sure you want to activate Rehearsal Mode?": "Er du sikker på at du vil gå i testmodus?", + "Are you sure you want to deactivate this Rundown?\n(This will clear the outputs)": "Er du sikker på at du vil deaktivere denne kjøreplanen?\n(Dette vil nullstille alle utganger.)", + "The rundown can not be reset while it is active": "En aktivert kjøreplan kan ikke tilbakestilles", + "A snapshot of the current Running Order has been created for troubleshooting.": "Et snapshot av den gjeldende kjøreplanen har blitt opprettet for feilsøking.", + "Prepare Studio and Activate (Rehearsal)": "Forbered studio og aktiver testmodus", + "Deactivate": "Deaktiver", + "Take": "Take", + "Reset Rundown": "Tilbakestill kjøreplanen", + "Reload {{nrcsName}} Data": "Last inn {{nrcsName}}-data på nytt", + "Store Snapshot": "Lagre snapshot", + "No actions available": "Ingen kjøreplanvalg tilgjengelige i påsynsmodus", + "Add ?studio=1 to the URL to enter studio mode": "Legg til ?admin=1 på slutten av nettadressen for å starte studiomodus", + "Exit": "Lukk", + "Error": "Feil", + "This rundown is now active. Are you sure you want to exit this screen?": "Denne kjøreplanen er aktiv. Er du sikker på at du vil avslutte?", + "Invalid AdLib": "Ugyldig adlib", + "Cannot play this AdLib because it is marked as Invalid": "Kan ikke spille av adlib fordi den er markert som ugyldig", + "Cannot play this AdLib because it is marked as Floated": "Kan ikke spille av adlib fordi den er markert som på vent (float)", + "Not queueable": "Kan ikke settes i kø", + "Cannot play this adlib because source layer is not queueable": "Kan ikke spille av adlib fordi den ikke kan settes i kø på kildelaget", + "There are no Playout Gateways connected and attached to this studio. Please contact the system administrator to start the Playout Gateway.": "Dette studioet har ingen tilkoblede playout-gatewayer. Kontakt systemadministrator for å starte den.", + "Playout Gateway \"{{playoutDeviceName}}\" is now restarting.": "Playout-gateway \"{{playoutDeviceName}}\" starter på nytt...", + "Could not restart Playout Gateway \"{{playoutDeviceName}}\".": "Playout-gateway \"{{playoutDeviceName}}\" kunne ikke startes på nytt.", + "Restart Playout": "Start Playout-gateway på nytt", + "Restart CasparCG Server": "Restart CasparCG", + "Do you want to restart CasparCG Server \"{{device}}\"?": "Er du sikker på at du vil restarte CasparCG Server \"{{device}}\"?", + "CasparCG on device \"{{deviceName}}\" restarting...": "CasparCG på \"{{deviceName}}\" starter på nytt...", + "Failed to restart CasparCG on device: \"{{deviceName}}\": {{errorMessage}}": "Omstart av CasparCG på \"{{deviceName}}\" feilet: {{errorMessage}}", + "Cancel currently pressed hotkey": "Avbryt den trykte tasten", + "Change to fullscreen mode": "Fullskjermmodus", + "Show Hotkeys": "Vise hurtigtaster", + "Take a Snapshot": "Lagre et snapshot", + "Restart {{device}}": "Start {{device}} på nytt", + "Rundown not found": "Kjøreplan ikke funnet", + "Close": "Lukk", + "Rundown for piece \"{{pieceLabel}}\" could not be found.": "Finner ikke kjøreplan for \"{{pieceLabel}}\".", + "This rundown has been unpublished from Sofie.": "Denne kjøreplanen er ikke lenger tilgjengelig i Sofie.", + "Error: The studio of this Rundown was not found.": "Feil: Kan ikke finne studioet for denne kjøreplanen.", + "This playlist is empty": "Denne spillelisten er tom", + "Error: The ShowStyle of this Rundown was not found.": "Feil: Kan ikke finne showstyle for denne kjøreplanen.", + "Unknown error": "Ukjent feil", + "Rundown {{rundownName}} in Playlist {{playlistName}} is missing in the data from {{nrcsName}}. You can either leave it in Sofie and mark it as Unsynced or remove the rundown from Sofie. What do you want to do?": "Kjøreplan {{rundownName}} i listen {{playlistName}} mangler i data fra {{nrcsName}}. Du kan enten markere den som usynkronisert og beholde den i Sofie, eller fjerne kjøreplanen fra Sofie. Hva vil du gjøre?", + "(Unknown rundown)": "(Ukjent kjøreplan)", + "(Unknown playlist)": "(Ukjent kjøreplanliste)", + "Leave Unsynced": "Behold ikke-synkronisert kjøreplan", + "Remove": "Fjern", + "Remove rundown": "Fjern kjøreplan", + "Do you really want to remove just the rundown \"{{rundownName}}\" in the playlist {{playlistName}} from Sofie? This cannot be undone!": "Er du sikker på at du vil slette kjøreplanen {{rundownName}} i lista {{playlistName}} fra Sofie? Dette kan ikke angres!", + "Loop Start": "Start for loop", + "Loop End": "Slutt for loop", + "(in: {{time}})": "(om: {{time}})", + "({{time}} ago)": "(for {{time}} siden)", + "Planned Start": "Planlagt start", + "Planned Duration": "Planlagt varighet", + "Planned End": "Planlagt slutt", + "The rundown \"{{rundownName}}\" is not published or activated in {{nrcsName}}! No data updates will currently come through.": "Kjøreplanen \"{{rundownName}}\" er ikke synkronisert med MOS/{{nrcsName}}! Kontroller at den er satt MOS Active i ENPS.", + "Re-sync": "Synkroniser med MOS", + "Re-sync Rundown": "Synkroniser kjøreplanen med ENPS på nytt", + "Are you sure you want to re-sync the Rundown?\n(If the currently playing Part has been changed, this can affect the output)": "Er du sikker på at du vil synkronisere denne kjøreplanen?\n(Dette kan påvirke gjennomføring av en pågående sending)", + "Restart": "Restart", + "Fixing this problem requires a restart to the host device. Are you sure you want to restart {{device}}?\n(This might affect output)": "Feilretting krever en omstart av {{device}}. Er du sikker på at du ønsker å starte enheten på nytt?(Dette kan påvirke gjennomføring av en pågående sending)", + "Device \"{{deviceName}}\" restarting...": "\"{{deviceName}}\" starter på nytt...", + "Failed to restart device: \"{{deviceName}}\": {{errorMessage}}": "Kunne ikke starte \"{{deviceName}}\" på nytt: {{errorMessage}}", + "There is an unknown problem with the part.": "Det er et ukjent problem med denne delen.", + "Show issue": "Vis problem", + "There is an unspecified problem with the source.": "Det er et ikke-spesifisert problem med kilden.", + "External message queue has unsent messages.": "Ekstern meldingskø har meldinger som ikke er sendt.", + "The system configuration has been changed since importing this rundown. It might not run correctly": "Systemoppsettet har blitt endret etter at denne kjøreplanen ble importert. Kjøreplanen kan spilles av med feil", + "Unable to check the system configuration for changes": "Kan ikke kontrollere endringer i systemoppsettet", + "The Studio configuration is missing some required fields:": "Studiooppsettet mangler obligatoriske felter:", + "The Show Style configuration \"{{name}}\" could not be validated": "Showstyleoppsettet \"{{name}}\" kunne ikke valideres", + "The ShowStyle \"{{name}}\" configuration is missing some required fields:": "Showstyleoppsettet \"{{name}}\" mangler obligatoriske felter:", + "Unable to validate the system configuration": "Systemoppsettet kunne ikke valideres", + "Device {{deviceName}} is disconnected": "{{deviceName}} er koblet fra", + "Warnings": "Advarsler", + "Just now": "Nå", + "Less than a minute ago": "Under ett minutt siden", + "Less than five minutes ago": "Under fem minutter siden", + "Around 10 minutes ago": "Cirka 10 minutter siden", + "More than 10 minutes ago": "Over 10 minutter siden", + "More than 30 minutes ago": "Over 30 minutter siden", + "More than 2 hours ago": "Over 2 timer siden", + "More than 5 hours ago": "Over 5 timer siden", + "More than a day ago": "Over en dag siden", + "{{nrcsName}} Connection": "{{nrcsName}}-tilkobling", + "Last update": "Nyeste oppdatering", + "Off-line devices": "Frakoblede enheter", + "Devices with issues": "Enheter med problemer", + "All connections working correctly": "Alle tilkoblinger er OK", + "Play-out": "Avspilling", + "All devices working correctly": "Alle enheter fungerer som de skal", + "Auto": "Auto", + "Expected End": "Forventet slutt", + "Next Loop at": "Neste loop starter", + "Diff": "Forskjell", + "Started": "Startet", + "Expected Start": "Forventet slutt", + "{{currentRundownName}} - {{rundownPlaylistName}} (Looping)": "{{currentRundownName}} - {{rundownPlaylistName}} (Looper)", + "{{currentRundownName}} - {{rundownPlaylistName}}": "{{currentRundownName}} - {{rundownPlaylistName}}", + "{{rundownPlaylistName}} (Looping)": "{{currentRundownName}} - {{rundownPlaylistName}} (Looper)", + "Floated AdLib": "Adlib satt på vent", + "Switchboard": "Sentralbord", + "This is not in it's normal setting": "Endret fra standardoppsett", + "Off": "Av", + "On Air At": "On Air klokken", + "On Air In": "On Air om", + "Unsynced": "Ikke synkronisert med MOS", + "On Air": "On Air", + "Loops to top": "Looper til toppen", + "Show End": "Sendeslutt", + "BREAK": "PAUSE", + "Break In": "Pause om", + "part": "punkt", + "Set segment as Next": "Sett tittel som Neste: Starter på neste Take", + "Queue segment": "Cue tittel: Starter når aktiv tittel er ferdig", + "Clear queued segment": "Fjern cuet tittel", + "Set this part as Next": "Sett dette punktet som neste: Starter på neste Take", + "Set Next Here": "Sett Neste her", + "Play from Here": "Spill av herfra", + "Switch to Storyboard mode": "Bytt til storyboard-visning", + "Zoom Out": "Zoom Ut", + "Show All": "Vis alle", + "Zoom In": "Zoom inn", + "Parts Duration": "Varighet for del", + "Unknown": "Ukjent", + "Good": "Bra", + "Minor Warning": "Mindre advarsel (avvik)", + "Warning": "Advarsel", + "Bad": "Feil", + "Fatal": "Kritisk", + "Connected": "Tilkoblet", + "Disconnected": "Frakoblet", + "MOS Gateway": "MOS-gateway", + "Spreadsheet Gateway": "Spreadsheet-gateway", + "Play-out Gateway": "Playout-gateway", + "Media Manager": "Media Manager", + "Unknown Device": "Ukjent enhet", + "Delete this Studio?": "Slett dette studioet?", + "Are you sure you want to delete the studio \"{{studioId}}\"?": "Er du sikker på at du vil slette studioet \"{{studioId}}\"?", + "Delete this Show Style?": "Slett denne showstylen?", + "Are you sure you want to delete the show style \"{{showStyleId}}\"?": "Er du sikker på at du vil slette showstylen \"{{showStyleId}}\"?", + "Delete this Blueprint?": "Slett dette blueprintet?", + "Are you sure you want to delete the blueprint \"{{blueprintId}}\"?": "Er du sikker på at du vil slette blueprintet \"{{blueprintId}}\"?", + "Remove this Device?": "Fjern denne enheten?", + "Are you sure you want to remove the device \"{{deviceName}}\" and all of it's sub-devices?": "Er du sikker på at du vil fjerne enheten \"{{deviceName}}\" og alle dens underenheter?", + "Studios": "Studio", + "Unnamed Studio": "Studio uten navn", + "Show Styles": "Showstyle", + "Unnamed Show Style": "Showstyle uten navn", + "Source Layers": "Kildelag", + "Output Channels": "Utgangskanal", + "Blueprints": "Blueprints", + "Unnamed blueprint": "Blueprint uten navn", + "Type": "Type", + "Version": "Versjon", + "Devices": "Enheter", + "Tools": "Verktøy", + "Core System settings": "Systeminstillinger for Core", + "Upgrade Database": "Oppgrader databasen", + "Manage Snapshots": "Behandle snapshots", + "System Settings": "Systeminstillinger", + "Update Blueprints?": "Oppdater blueprints?", + "Update": "Oppdater", + "Are you sure you want to update the blueprints from the file \"{{fileName}}\"?": "Er du sikker på at du vil oppdatere blueprints fra filen \"{{fileName}}\"?", + "Blueprints updated successfully.": "Blueprints ble oppdatert.", + "Replace Blueprints?": "Erstatte blueprints?", + "Replace": "Erstatt", + "Are you sure you want to replace the blueprints with the file \"{{fileName}}\"?": "Er du sikker på at du vil erstatte blueprints fra filen \"{{fileName}}\"?", + "Failed to update blueprints: {{errorMessage}}": "Oppdatering av blueprints feilet: {{errorMessage}}", + "Assigned Show Styles:": "Tilordnede showstyles:", + "This Blueprint is not being used by any Show Style": "Dette blueprintet er ikke i bruk av noen showstyles", + "Assigned Studios:": "Tilordnede studio:", + "This Blueprint is not compatible with any Studio": "Dette blueprintet er ikke kompatibel med noe studio", + "Unassign": "Fjern tilordning", + "Assign": "Tilordne", + "Blueprint ID": "Blueprint-id", + "Blueprint Name": "Blueprintnavn", + "No name set": "Navn ikke definert", + "Blueprint Type": "Blueprinttype", + "Upload a new blueprint": "Last opp et nytt blueprint", + "Last modified": "Sist endret", + "Blueprint Id": "Blueprint-id", + "Blueprint Version": "Blueprintversjon", + "Disable version check": "Deaktiver versjonsjekk", + "Upload Blueprints": "Last opp blueprints", + "OAuth credentials succesfully uploaded.": "Opplasting av OAuth credentials var vellykket.", + "Failed to upload OAuth credentials: {{errorMessage}}": "Opplasting av OAuth credentials feilet: {{errorMessage}}", + "OAuth credentials successfuly reset": "OAuth credentials nullstilt", + "Failed to reset OAuth credentials: {{errorMessage}}": "Nullstiling av OAuth credentials feilet: {{errorMessage}}", + "Reset Authentication": "Nullstill autentisering", + "Application credentials": "Brukernavn/passord (Application Credentials)", + "Access token": "Tilgangskode (Access Token)", + "Click on the link below and accept the permissions request.": "Klikk på linken under og godta permissions-forespørselen", + "Waiting for gateway to generate URL...": "Venter på at gateway genererer URL...", + "Only Match Global AdLibs": "Vis kun globale adliber", + "Name": "Navn", + "Display Style": "Visningsstil", + "Show thumbnails next to list items": "Vis miniatyrbilder ved siden av listeelementer", + "Button width scale factor": "Breddeskala for knapp", + "Button height scale factor": "Høydeskala for knapp", + "Only Display AdLibs from Current Segment": "Vis kun adliber fra gjeldende tittel", + "Include Global AdLibs": "Inkluder globale adliber", + "Filter Disabled": "Filter deaktivert", + "Include Clear Source Layer in Ad-Libs": "Ta med \"Tøm kildelag\" i adliber", + "Source Layer Types": "Kildelagstyper", + "Filter disabled": "Filter deaktivert", + "Label contains": "Etikett inneholder", + "Tags must contain": "Tagger må inneholde", + "Hide Panel from view": "Ikke vis dette panelet", + "Show panel as a timeline": "Vis panel som en tidslinje", + "Enable search toolbar": "Aktiver søkeverktøy", + "Overflow horizontally": "Horisontal overflyt", + "Display Take buttons": "Vis Take-knapp", + "Queue all adlibs": "Cue alle adliber", + "Toggle AdLibs on single mouse click": "Veksle mellom adliber med enkelt museklikk", + "Hide duplicated AdLibs": "Skjul dupliserte adliber", + "Picks the first instance of an adLib per rundown, identified by uniqueness Id": "Velger den første forekomsten av en adlib i hver kjøreplan, identifisert av unik id", + "URL": "Adresse (url)", + "Display Rank": "Rangering for visning", + "Role": "Rolle", + "Adlib Rank": "Adlib-rang", + "Place label below panel": "Plasser etikett under panel", + "Disabled": "Deaktivert", + "Show segment name": "Vis tittelens navn", + "Show part title": "Vis delens tittel", + "Hide for dynamically inserted parts": "Skjul for dynamisk innsatte deler", + "Planned Start Text": "Tekst for planlagt start", + "Text to show above show start time": "Tekst som vises over klokkeslett for sendestart", + "Hide Diff": "Skjul forskjell", + "Hide Planned Start": "Skjul planlagt start", + "Planned End text": "Tekst for planlagt slutt", + "Text to show above show end time": "Tekst som vises over klokkeslett for sendeslutt", + "Hide Planned End Label": "Skjul etikett for planlagt slutt", + "Hide Diff Label": "Skjul etikett for forskjell", + "Hide Countdown": "Skjul nedtelling", + "Hide End Time": "Skjul sendeslutt", + "Hide Label": "Skjul etikett", + "Text": "Tekst", + "Show Rundown Name": "Vis kjøreplannavn", + "Segment": "Tittel", + "Part": "Del", + "X": "X", + "Y": "Y", + "Width": "Bredde", + "Height": "Høyde", + "Scale": "Skala", + "Custom Classes": "Tilpassede klasser", + "Device ID": "Enhets-id", + "Device Type": "Enhetstype", + "Remove this item?": "Fjern dette elementet?", + "Are you sure you want to remove {{type}} \"{{deviceId}}\"?": "Er du sikker på at du vil fjerne enheten {{type}} \"{{deviceId}}\"?", + "Attached Subdevices": "Tilkoblede underenheter", + "Expected End text": "Tekst for forventet slutt", + "Text to show above countdown to end of show": "Tekst som vises over nedtelling til forventet slutt", + "Hide Expected End timing when a break is next": "Gjem nedtelling til forventet slutt når neste punkt er en pause", + "While there are still breaks coming up in the show, hide the Expected End timers": "Gjem nedtelling til forventet slutt mens det fremdeles er pauser igjen i sendingen", + "Show next break timing": "Vis tid for neste pause", + "Whether to show countdown to next break": "Om nedtelling til neste pause skal vises", + "Last rundown is not break": "Siste kjøreplan er ingen pause", + "Don't treat the end of the last rundown in a playlist as a break": "Ikke behandle slutten av den siste kjøreplanen i en spilleliste som en pause", + "Next Break text": "Tekst for neste pause", + "Text to show above countdown to next break": "Tekst som vises over nedtelling til neste pause", + "Expose as user selectable layout": "Gjør tilgjengelig som brukervalgt layout", + "Shelf Layout": "Layouter for skuffen", + "Mini Shelf Layout": "Layouter for miniskuff", + "Rundown Header Layout": "Layout for kjøreplanens topptekst", + "Hide Rundown Divider": "Skjul kjøreplanskille", + "Hide rundown divider between rundowns in a playlist": "Skjul skille mellom kjøreplaner i en spilleliste", + "Show Breaks as Segments": "Vis pauser som titler", + "Segment countdown requires source layer": "Nedtelling for tittel krever kildelag", + "One of these source layers must have a piece for the countdown to segment on-air to be show": "Et av disse kildelagene må ha et element for at nedtelling til tittelen er OnAir vises", + "Fixed duration in Segment header": "Låst varighet i tittelheader", + "The segment duration in the segment header always displays the planned duration instead of acting as a counter": "Tittelens varighet i tittelheaderen vil alltid vise den planlagte varigheten i stedet for å telle ned", + "Select visible Source Layers": "Velg synlige kildelag", + "Select visible Output Groups": "Velg synlig utgangsgruppe", + "Expose layout as a standalone page": "Gjør layout tilgjengelig som en selvstendig side", + "Open shelf by default": "Åpne skuff som standard", + "Default shelf height": "Standard høyde for skuff", + "Show Buckets": "Vis bøtter", + "Disable Context Menu": "Skru av kontekstmeny", + "This action has an invalid combination of filters": "Denne handlingen har en ugyldig kombinasjon av filtre", + "Force": "Tving", + "Rehearsal": "Testmodus", + "Undo": "Angre", + "Segments: {{delta}}": "Segmenter: {{delta}}", + "Parts: {{delta}}": "Deler: {{delta}}", + "Open": "Åpne", + "Toggle": "Veklse", + "On": "På", + "Activate Rundown": "Aktiver kjøreplan", + "Ad-Lib": "Adlib", + "Deactivate Rundown": "Deaktiver kjøreplan", + "Disable next Piece": "Skip neste element", + "Move Next": "Skip neste", + "Reload NRCS Data": "Last inn MOS-data på nytt", + "Resync with NRCS": "Synkroniser med ENPS", + "Shelf": "Skuff", + "Rewind Segments to start": "Sett alle segmenter tilbake til start", + "Go to On Air line": "Gå til OnAir-posisjon", + "Show entire On Air Segment": "Vis hele tittelen som er OnAir", + "Force (deactivate others)": "Tving (deaktiver andre)", + "Move Segments": "Skip segmenter", + "Move Parts": "Skip del", + "State": "Tilstand", + "Action": "Handling", + "Ad-Lib Action": "Adlib-handling", + "Clear Source Layer": "Tøm kildelag", + "Sticky Piece": "Element er sticky", + "Global AdLibs": "Globale adliber", + "Label": "Etikett", + "Limit": "Grense", + "Output Layer": "Utgangslag", + "Pick": "Plukk", + "Pick last": "Plukk siste", + "Source Layer": "Kildelag", + "Source Layer Type": "Kildelagstyper", + "Tag": "Tag", + "Not Global": "Ikke globale", + "Only Global": "Bare globale", + "OnAir": "OnAir", + "Now active rundown": "Aktiv kjøreplan akkurat nå", + "View": "Visning", + "Executes within the currently open Rundown, requires a Client-side trigger.": "Utføers innenfor den valgte kjøreplanen, men trenger en utløser fra klienten.", + "Select Action": "Velg handling", + "No Ad-Lib matches in the current state of Rundown: \"{{rundownPlaylistName}}\"": "Ingen treff på adliber i nåværende tilstand for kjøreplanen: \"{{rundownPlaylistName}}\"", + "No matching Rundowns available to be used for preview": "Ingen passende kjøreplaner tilgjengelige for forhåndsvisning", + "Multilingual description, editing will overwrite": "Endring vil overskrive flerspråklig beskrivelse", + "Optional description of the action": "Valgfri beskrivelse av handlingen", + "Triggered Actions uploaded successfully.": "Opplasting av handlingsutløsere var vellykket.", + "Triggered Actions failed to upload: {{errorMessage}}": "Opplasting av handlingsutløsere feilet: {{errorMessage}}", + "Append or Replace": "Legg til eller erstatt", + "Do you want to append these to existing Action Triggers, or do you want to replace them?": "Vil du legge disse til de nåværende handlingsutløserne, eller vil du erstatte dem?", + "Append": "Legg til", + "Action Triggers": "Handlingsutløsere", + "Find Trigger...": "Finn utløser...", + "No matching Action Trigger.": "Fikk ikke treff blant handlingsutløsere.", + "No Action Triggers set up.": "Ingen handlingsutløsere er satt opp.", + "System-wide": "Systemvid", + "Upload stored Action Triggers": "Last opp lagrede handlingsutløsere", + "Download Action Triggers": "Last ned handlingsutløsere", + "On release": "På slipp (\"Key up\")", + "Empty": "Tom", + "Hotkey": "Hurtigtast", + "Trigger Type": "Type utløser", + "Failed to update config: {{errorMessage}}": "Oppdatering av konfigurasjon feilet: {{errorMessage}}", + "Export": "Eksporter", + "Import": "Importer", + "true": "true", + "false": "false", + "{{count}} rows": "{{count}} rader", + "Value": "Verdi", + "Create": "Opprett", + "Add config item": "Legg til konfigurasjonselement", + "Add": "Legg til", + "Item": "Element", + "Delete this item?": "Slett dette elementet?", + "Are you sure you want to delete this config item \"{{configId}}\"?": "Er du sikker på at du vil slette konfigurasjonselementet \"{{configId}}\"?", + "Blueprint Configuration": "Blueprintkonfigurasjon", + "More settings specific to this studio can be found here": "Mer spesifikke innstillinger for dette studioet kan du finne her", + "There was an error: {{error}}": "Det skjedde en feil: {{error}}", + "Package Manager status": "Status fo pakkebehandler", + "Reload statuses": "Last inn status på nytt", + "Updated": "Oppdatert", + "Package Manager": "Pakkebehandler", + "Statistics": "Statistikk", + "Times": "Tider", + "Connected Workers": "Tilkoblede arbeidere", + "Work-in-progress": "Pågående jobber", + "WorkForce": "Arbeiderstyrke", + "Kill (debug)": "Kill (debug)", + "Connected App Containers": "Tilkoblede app-kontainere", + "No status loaded": "Ingen status lastet", + "Peripheral Device is outdated": "Tilkoblet enhet er utdatert", + "The config UI is now driven by manifests fed by the device. This device needs updating to provide the configManifest to be configurable": "Brukergrensesnittet for konfigurasjon drives nå av manifester matet fra enhetene. Denne enheten må oppdateres for å gjøre configManifest konfigurerbart", + "Are you sure you want to restart this device?": "Er du sikker på at du vil starte denne enheten på nytt?", + "Restart this Device?": "Start denne enheten på nytt?", + "Check the console for troubleshooting data from device \"{{deviceName}}\"!": "Sjekk konsollen for feilsøkingsdata fra enheten \"{{deviceName}}\"!", + "There was an error when troubleshooting the device: \"{{deviceName}}\": {{errorMessage}}": "Det skjedde en feil under feilsøking av enhenten \"{{deviceName}}\": {{errorMessage}}", + "Generic Properties": "Generelle egenskaper", + "Device Name": "Enhetsnavn", + "Restart Device": "Start enheten på nytt", + "Troubleshoot": "Feilsøk", + "Reset Database Version": "Nullstill databaseversjon", + "Are you sure you want to reset the database version?\nOnly do this if you plan on running the migration right after.": "Er du sikker på at du vil nullstille databaseversjonen?\nBare gjør dette dersom du har tenkt å kjøre en migrering umiddelbart.", + "Version for {{name}}: From {{fromVersion}} to {{toVersion}}": "Versjon for {{name}}: Fra {{fromVersion}} til {{toVersion}}", + "Re-check": "Sjekk på nytt", + "Reset Version to": "Nullstill versjon til", + "Reset All Versions": "Nullstill alle versjoner", + "Migrate database": "Migrer database", + "All steps": "Alle trinn", + "The migration consists of several phases, you will get more options after you've this migration": "Migreringen består av flere faser, du vil få flere valg etter at du har kjørt denne migreringen", + "The migration can be completed automatically.": "Migreringen kan gjennomføres automatisk.", + "Run automatic migration procedure": "Kjør automatisk migreringsprosedyre", + "The migration procedure needs some help from you in order to complete, see below:": "Migreringsprosedyren trenger litt hjelp fra deg for å kunne fullføre. Se under:", + "Double-check Values": "Dobbeltsjekk verdier", + "Are you sure the values you have entered are correct?": "Er du sikker på at verdiene du har oppgitt er korrekte?", + "Run Migration Procedure": "Kjør migreringsprosedyre", + "Warnings During Migration": "Advarsler under migrering", + "Please check the database related to the warnings above. If neccessary, you can": "Vennligst sjekk databasen tilknyttet advarslene over. Hvis nødvendig kan du", + "Force Migration": "Tving migrering", + "Are you sure you want to force the migration? This will bypass the migration checks, so be sure to verify that the values in the settings are correct!": "Er du sikker på at du vil tvinge migreringen? Dette gjør at du hopper over migreringskontrollene, så vær sikker på at verdiene oppgitt i innstillinger er korrekte!", + "Force Migration (unsafe)": "Tving migrering (utrygt)", + "The migration was completed successfully!": "Migreringen var vellykket!", + "All is well, go get a": "Alt er greit, gå og hent deg en", + "New Layout": "Ny layout", + "Button": "Knapp", + "New Filter": "Nytt filter", + "Delete layout?": "Slett layout?", + "Are you sure you want to delete the shelf layout \"{{name}}\"?": "Er du sikker på at du vil slette layouten \"{{name}}\"?", + "Action Buttons": "Handlingsknapper", + "Icon": "Ikon", + "Icon color": "Ikonfarge", + "Filters": "Filtre", + "There are no filters set up yet": "Det er ikke satt opp noen filtre ennå", + "Default Layout": "Standardlayout", + "Add {{filtersTitle}}": "Legg til {{filtersTitle}}", + "Add filter": "Legg til filter", + "Add button": "Legg til knapp", + "Upload Layout?": "Last opp layout?", + "Upload": "Last opp", + "Are you sure you want to upload the shelf layout from the file \"{{fileName}}\"?": "Er du sikker på at du vil laste opp layout for skuff fra filen \"{{fileName}}\"?", + "Shelf layout uploaded successfully.": "Opplastingen av layout for skuff var vellykket.", + "Failed to upload shelf layout: {{errorMessage}}": "Opplasting av layout feilet: {{errorMessage}}", + "Show Style Base Name": "Showstylenavn", + "Blueprint": "Blueprint", + "Blueprint not set": "Blueprint ikke valgt", + "Compatible Studios:": "Kompatible studio:", + "This Show Style is not compatible with any Studio": "Denne showstylen er ikke kompatibelt med noe studio", + "Camera": "Kamera", + "Graphics": "Grafikk", + "Live Speak": "STK", + "Lower Third": "Super", + "Studio Microphone": "Studiomikrofon", + "Remote Source": "RM", + "Generic Script": "Generisk manus", + "Split Screen": "Splitt", + "Clips": "Klipp", + "Metadata": "Metadata", + "Camera Movement": "Kamerabevegelse", + "Unknown Layer": "Ukjent lag", + "Audio Mixing": "Lydmiksing", + "Transition": "Effekt", + "Lights": "Lys", + "Local": "Lokal", + "New Source": "Ny kilde", + "Are you sure you want to delete source layer \"{{sourceLayerId}}\"?": "Er du sikker på at du vil slette kildelaget \"{{sourceLayerId}}\"?", + "Source Name": "Kildenavn", + "Source Abbreviation": "Kildeforkortelse", + "Internal ID": "Intern-id", + "Source Type": "Kildetype", + "Is a Live Remote Input": "Er en RM", + "Is a Guest Input": "Er en gjesteinngang", + "Is hidden": "Er skjult", + "Pieces on this layer can be cleared": "Elementer på dette laget kan tømmes", + "Pieces on this layer are sticky": "Elementer i dette laget er sticky", + "Only Pieces present in rundown are sticky": "Kun elementer tilstede i kjøreplanen er sticky", + "Allow disabling of Pieces": "Tillat deaktivering av elementer", + "AdLibs on this layer can be queued": "Adliber på dette laget kan cues", + "Exclusivity group": "Ekslusivitetsgruppe", + "Add some source layers (e.g. Graphics) for your data to appear in rundowns": "Legg til kildelag (for eksempel Grafikk) for å vise dine data i kjøreplaner", + "No source layers set": "Ingen kildelag definert", + "Delete this output?": "Slett denne utgangen?", + "Are you sure you want to delete source layer \"{{outputId}}\"?": "Er du sikker på at du vil slette kildelaget \"{{outputId}}\"?", + "New Output": "Ny utgang", + "Channel Name": "Kanalnavn", + "Is PGM Output": "Er programutgang", + "Is collapsed by default": "Er minimert som standard", + "Is flattened": "Er slått sammen", + "Output channels are required for your studio to work": "Utgangskanaler er nødvendige for at studioet ditt skal fungere", + "Output channels": "Utgangskanal", + "No output channels set": "Ingen utgangskanal definert", + "No PGM output": "Ingen programutgang", + "Key": "Key", + "Custom Hotkey Labels": "Egendefinerte etiketter for hurtigtaster", + "Remove this Variant?": "Fjern denne varianten?", + "Are you sure you want to remove the variant \"{{showStyleVariantId}}\"?": "Er du sikker på at du vil fjerne denne showstylevarianten \"{{showStyleVariantId}}\"?", + "Unnamed variant": "Variant uten navn", + "Variant Name": "Variantnavn", + "Variants": "Varianter", + "Restore from this Snapshot file?": "Gjenopprette fra denne snapshotfilen?", + "Are you sure you want to restore the system from the snapshot file \"{{fileName}}\"?": "Er du sikker på at du vil gjenopprettet systemet fra snapshotfilen \"{{fileName}}\"?", + "Successfully restored snapshot": "Gjenoppretting fra snapshot var vellykket", + "Snapshot restore failed: {{errorMessage}}": "Gjenoppretting fra snapshot feilet: {{errorMessage}}", + "Full System Snapshot": "Fullt systemsnapshot", + "A Full System Snapshot contains all system settings (studios, showstyles, blueprints, devices, etc.)": "Et systemsnapshot inneholder alle systeminnstillinger (studio, showstyles, blueprints, enheter o.s.v.)", + "Take a Full System Snapshot": "Lagre et fullt systemsnapshot", + "Studio Snapshot": "Studiosnapshot", + "A Studio Snapshot contains all system settings related to that studio": "Et studiosnapshot inneholder alle systeminnstillinger tilknyttet et studio", + "Take a Snapshot for studio \"{{studioName}}\" only": "Lagre et studiosnapshot utelukkende for \"{{studioName}}\"", + "Restore from Snapshot File": "Gjenopprett fra snapshotfil", + "Upload Snapshot": "Last opp snapshot", + "Restore from Stored Snapshots": "Gjenopprett fra lagrede snapshots", + "Restore": "Gjenopprett", + "Show \"Remove snapshots\"-buttons": "Vis \"Fjern snapshots\"-knappene", + "Remove this device?": "Fjern denne enheten?", + "Are you sure you want to remove device \"{{deviceId}}\"?": "Er du sikker på at du vil fjerne enheten \"{{deviceId}}\"?", + "Devices are needed to control your studio hardware": "Enheter er nødvendige for å kontrollere utstyret i studioet ditt", + "Attached Devices": "Tilkoblede enheter", + "No devices connected": "Ingen enheter tilkoblet", + "Playout gateway not connected": "Playout-gateway er ikke tilkoblet", + "Remove this mapping?": "Fjern denne mappingen?", + "Are you sure you want to remove mapping for layer \"{{mappingId}}\"?": "Er du sikker på at du fil fjerne mappingen for laget \"{{mappingId}}\"?", + "This layer is now rerouted by an active Route Set: {{routeSets}}": "Dette laget blir omkoblet av en aktiv omkoplingsgruppe: {{routeSets}}", + "Layer ID": "Lag-id", + "ID of the timeline-layer to map to some output": "Lag-id for tidslinjelaget som skal mappes til en utgang", + "Layer Name": "Lagnavn", + "Human-readable name of the layer": "Leservennlig lagnavn", + "The type of device to use for the output": "Enhetstype som skal brukes for utgangen", + "ID of the device (corresponds to the device ID in the peripheralDevice settings)": "Enhets-id (korresponderer med enhets-id under enhetsinnstillinger)", + "Lookahead Mode": "Lookahead-modus", + "Lookahead Target Objects (Default = 1)": "Lookahead målobjekter (standard = 1)", + "Lookahead Maximum Search Distance (Default = {{limit}})": "Lookahead maksimum søkelengde (standard = {{limit}})", + "Layer Mappings": "Lagmappinger", + "Add a playout device to the studio in order to edit the layer mappings": "For å kunne redigere lagmappinger, må du legge til en playout-enhet til studio", + "Remove this Exclusivity Group?": "Fjern fra denne eksklusivitetsgruppen?", + "Are you sure you want to remove exclusivity group \"{{eGroupName}}\"?\nRoute Sets assigned to this group will be reset to no group.": "Er du sikker på at du vil fjerne eksklusivitetsgruppen \"{{eGroupName}}\"?\nOmkoblinger satt til denne gruppen vil bli resatt til ingen gruppe.", + "Remove this Route from this Route Set?": "Fjern denne omkoblingen fra omkoblingsgruppen?", + "Are you sure you want to remove the Route from \"{{sourceLayerId}}\" to \"{{newLayerId}}\"?": "Er du sikker på at du vil fjerne omkoblingen fra \"{{sourceLayerId}}\" til \"{{newLayerId}}\"?", + "Remove this Route Set?": "Fjern denne omkoblingsgruppen?", + "Are you sure you want to remove the Route Set \"{{routeId}}\"?": "Er du sikker på at du vil fjerne omkoblingsgruppen \"{{routeId}}\"?", + "Routes": "Omkoblinger", + "There are no routes set up yet": "Det er ikke satt opp omkoblinger ennå", + "Original Layer": "Opprinnelig lag", + "None": "Ingen", + "New Layer": "Nytt lag", + "Source Layer not found": "Kildelag ikke funnet", + "There are no exclusivity groups set up.": "Ingen eksklusivitetsgrupper er satt opp.", + "Exclusivity Group ID": "Eksklusivitetsgruppe-id", + "Exclusivity Group Name": "Eksklusivitetsgruppenavn", + "Display name of the Exclusivity Group": "Eksklusivitetsgruppens navn som vises i oversikten", + "Active": "Aktiv", + "Not Active": "Inaktiv", + "Not defined": "Ikke definert", + "There are no Route Sets set up.": "Det er ikke satt opp omkoblinger ennå.", + "Route Set ID": "Omkoblingsgruppe-id", + "Is this Route Set currently active": "Er denne omkoblingsgruppen aktiv nå", + "Default State": "Standardtilstand", + "The default state of this Route Set": "Standardtilstand for denne omkoblingsgruppen", + "Route Set Name": "Omkoblingsgruppens navn", + "Display name of the Route Set": "Omkoblingsgruppens navn som vises i oversikten", + "If set, only one Route Set will be active per exclusivity group": "Bare en omkoblingsgruppe være aktiv per eksklusivitetsgruppe når dette er krysset av for", + "Behavior": "Oppførsel", + "The way this Route Set should behave towards the user": "Måten denne omkoblingsgruppen skal oppføre seg på overfor brukeren", + "Route Sets": "Omkoblingsgrupper", + "Add a playout device to the studio in order to configure the route sets": "For å kunne redigere omkoblingsgrupper, må du legge til en playout-enhet til studio", + "Controls for exposed Route Sets will be displayed to the producer within the Rundown View in the Switchboard.": "Kontroller for eksponerte omkoblingsgrupper vil vises til producer i kjøreplansvisningen i omkoblingspanelet.", + "Exclusivity Groups": "Eksklusivitetsgrupper", + "Remove this Package Container?": "Fjern denne pakkekontaineren?", + "Are you sure you want to remove the Package Container \"{{containerId}}\"?": "Er du sikker på at du vil fjerne pakkekontaineren \"{{containerId}}\"?", + "There are no Package Containers set up.": "Det er ikke satt opp pakkekontainere ennå.", + "Package Container ID": "Pakkekontainer-id", + "Display name/label of the Package Container": "Vis navn/merkelapp for pakkekontaineren", + "Playout devices which uses this package container": "Playout-enheter som benytter denne pakkekontaineren", + "Select playout devices": "Velg playout-enhet", + "Select which playout devices are using this package container": "Velg hvilke playout-enheter som skal benytte denne pakkekontaineren", + "Accessors": "Aksessorer", + "Remove this Package Container Accessor?": "Fjern denne pakkekontainer-aksessoren?", + "Are you sure you want to remove the Package Container Accessor \"{{accessorId}}\"?": "Er du sikker på at du vil fjerne pakkekontainer-aksessoren \"{{accessorId}}\"?", + "There are no Accessors set up.": "Ingen aksessorer er satt opp.", + "Accessor ID": "Aksessor-id", + "Display name of the Package Container": "Pakkekontainerens navn som vises i oversikten", + "Accessor Type": "Aksessortype", + "Folder path": "Mappesti", + "File path to the folder of the local folder": "Sti til lokale mappe", + "Resource Id": "Ressurs-id", + "(Optional) This could be the name of the computer on which the local folder is on": "(Valgfri) Dette kan være navnet til datamaskinen som den lokale mappen er på", + "Base URL": "Base-url", + "Base url to the resource (example: http://myserver/folder)": "Base-url for ressursen (eksempel: http://minserver/mappe)", + "Network Id": "Nettverk-id", + "(Optional) A name/identifier of the local network where the share is located, leave empty if globally accessible": "(Valgfri) Et navn/en identifikator for det lokale nettverket hvor den delte mappen er lokalisert, la være tom dersom den er globalt tilgjengelig", + "Folder path to shared folder": "Sti til delt mappe", + "UserName": "Brukernavn", + "Username for athuentication": "Brukernavn for autentisering", + "Password for authentication": "Passord for autentisering", + "(Optional) A name/identifier of the local network where the share is located": "(Valgfri) Et navn/en identifikator for det lokale nettverket hvor den delte mappen er lokalisert", + "Quantel gateway URL": "Quantel Gateway-adresse (url)", + "URL to the Quantel Gateway": "Start Quantel Gateway på nytt", + "ISA URLs": "ISA-adresse (url)", + "URLs to the ISAs, in order of importance (comma separated)": "Adresser (url-er) for ISA-ene (kommaseparert i prioritert rekkefølge)", + "Zone ID": "Sone-id", + "Zone ID (default value: \"default\")": "Sone-id (standardverdi: \"default\")", + "Server ID": "Server-id", + "Server ID. For sources, this should generally be omitted (or set to 0) so clip-searches are zone-wide. If set, clip-searches are limited to that server.": "Server-ID. For kilder skal denne droppes (eller bli satt til 0) siden klippsøk skjer i heile sonen. Hvis denne er satt skjer klippsøk bare på den serveren.", + "Quantel transformer URL": "Quantel Transformer-adresse (url)", + "URL to the Quantel HTTP transformer": "Adresse til Quantel HTTP transformer", + "Quantel FileFlow URL": "Quantel FileFlow-adresse (url)", + "URL to the Quantel FileFlow Manager": "Adresse til Quantel FileFlow Manager", + "Quantel FileFlow Profile name": "Quantel FileFlow profilnavn", + "Profile name to be used by FileFlow when exporting the clips": "Profilnavn som benyttes av FileFlow når klippene eksporteres", + "Allow Read access": "Tillat lesing", + "Allow Write access": "Tillat skriving/lagring", + "Studio Settings": "Studioinnstillinger", + "Package Containers to use for previews": "Pakkekontainere som skal benyttes til forhåndsvisninger", + "Click to show available Package Containers": "Klikk for å vise tilgjengelige pakkekontainere", + "Package Containers to use for thumbnails": "Pakkekontainere som skal benyttes til miniatyrbilder", + "Package Containers": "Pakkekontainere", + "Studio Baseline needs update: ": "Studio baseline må oppdateres: ", + "Baseline needs reload, this studio may not work until reloaded": "Baseline må lastes på nytt, dette studioet vil kanskje ikke fungere før baseline er lastet på nytt", + "Reload Baseline": "Last inn baseline på nytt", + "Studio Name": "Studionavn", + "Select Compatible Show Styles": "Velg kompatibel showstyles", + "Show style not set": "Showstyle ikke satt", + "Click to show available Show Styles": "Klikk for å vise tilgjengelige showstyles", + "Frame Rate": "Framerate", + "Enable \"Play from Anywhere\"": "Slå på \"Play from Anywhere\"", + "Media Preview URL": "Forhåndsvisnings-URL", + "Sofie Host URL": "Sofie vertadresse (url)", + "Slack Webhook URLs": "Slack Webhook-adresser (url)", + "Supported Media Formats": "Støttede medieformater", + "Supported Audio Formats": "Støttede lydformater", + "Force the Multi-gateway-mode": "Tving multigateway-modus", + "Multi-gateway-mode delay time": "Delaytid for multigateway-modus", + "Allow Rundowns to be reset while on-air": "Tillat tilbakestilling av kjøreplaner som er on-air", + "Remove indexes": "Fjern indexer", + "This will remove {{indexCount}} old indexes, do you want to continue?": "Dette vil fjerne {{indexCount}} gamle indexer. Vil du fortsette?", + "{{indexCount}} indexes was removed.": "{{indexCount}} indexer ble fjernet.", + "Installation name": "Installasjonsnavn", + "This name will be shown in the title bar of the window": "Dette navnet vil vises i tittellinjen for vinduet", + "Logging level": "Loggenivå", + "This affects how much is logged to the console on the server": "Dette påvirker hvor mye som blir logget til serverkonsollen", + "System-wide Notification Message": "Lokal systemmelding", + "Message": "Melding", + "Enabled": "Aktivert", + "Edit Support Panel": "Rediger supportpanel", + "HTML that will be shown in the Support Panel": "HTML-kode som vil bli vist i supportpanelet", + "Application Performance Monitoring": "Overvåkning av applikasjonsytelse (AMP)", + "APM Enabled": "AMP aktivert", + "APM Transaction Sample Rate": "Prøvefrekvens for AMP-transaksjoner", + "How many of the transactions to monitor. Set to -1 to log nothing (max performance), 0.5 to log 50% of the transactions, 1 to log all transactions": "Antall transaksjoner som overvåkes. Sett verdien til -1 for å ikke logge noe (maks ytelse), til 0.5 for å logge halvparten av transaksjonene eller til 1 for å logge alle transaksjonene", + "Note: Core needs to be restarted to apply these settings": "Merknad: Core må startes på nytt for å ta i bruk disse innstillingene", + "Enable": "Aktiver", + "Cron jobs": "Cron-jobber", + "Enable CasparCG restart job": "Aktiver CasparCG restartjobber", + "Cleanup": "Opprydding", + "Cleanup old database indexes": "Rydd opp i gamle databaseindexer", + "Cleanup old data": "Rydd opp i gamle data", + "Disable CasparCG restart job": "Deaktiver CasparCG restartjobber", + "Remove old data from database": "Fjern gamle data fra databasen", + "There are {{count}} documents that can be removed, do you want to continue?": "Det er {{count}} dokumenter som kan fjernes. Vil du fortsette?", + "Documents to be removed:": "Dokumenter som fjernes:", + "Retry": "Prøv igjen", + "Remove old data": "Fjern gamle data", + "The old data was removed.": "Gamle data ble fjernet.", + "Last {{layerName}}": "Siste {{layerName}}", + "Clear {{layerName}}": "Tøm {{layerName}}", + "Search...": "Søk...", + "Are you sure you want to deactivate this Rundown\n(This will clear the outputs)": "Er du sikker på at du vil deaktivere denne kjøreplanen?\n(Dette vil nullstille alle utganger.)", + "Successfully stored snapshot": "Gjenoppretting fra snapshot var vellykket", + "End Words": "Stikkord", + "Global AdLib": "Globale adliber", + "AdLib does not provide any options": "Adlib har ingen valg", + "Execute": "Utfør", + "Save to Bucket": "Lagre til bøtte", + "Reveal in Shelf": "Vis i skuff", + "Edit in Nora": "Rediger i Nora", + "Current Part": "Nåværende del", + "Next Part": "Neste del", + "Part Count Down": "Nedtelling for del", + "Part Count Up": "Opptelling for del", + "Until end of rundown": "Til slutten av kjøreplanen", + "New Bucket": "Ny bøtte", + "Are you sure you want to delete this AdLib?": "Er du sikker på at du vil slette denne adliben?", + "Are you sure you want to delete this Bucket?": "Er du sikker på at du vil slette denne bøtten?", + "Are you sure you want to empty (remove all adlibs inside) this Bucket?": "Er du sikker på at du vil tømme denne bøtten (fjerner alle adliber)?", + "Current Segment": "Nåværende tittel", + "Next Segment": "Neste tittel", + "Segment Count Down": "Nedtelling for tittel", + "Segment Count Up": "Opptelling for tittel", + "Start this AdLib": "Slett denne adliben", + "Queue this AdLib": "Cue denne adliben", + "Inspect this AdLib": "Inspiser denne adliben", + "Rename this AdLib": "Gi denne adliben nytt navn", + "Delete this AdLib": "Slett denne adliben", + "Empty this Bucket": "Tøm denne bøtten", + "Rename this Bucket": "Gi bøtten nytt navn", + "Delete this Bucket": "Slett denne bøtten", + "Create new Bucket": "Opprett ny bøtte", + "AdLib": "Adlib", + "Shortcuts": "Hurtigtaster", + "Show Style Variant": "Showstylevariant", + "Local Time": "Lokal tid", + "System": "System", + "Media": "Media", + "Packages": "Pakker", + "Messages": "Meldinger", + "User Log": "Brukerlogg", + "Evaluations": "Evalueringer", + "Timestamp": "Tidsstempel", + "User Name": "Brukernavn", + "Answers": "Svar", + "Message Queue": "Meldingskø", + "Queued Messages": "Meldinger i kø", + "Sent Messages": "Sendte meldinger", + "File Copy": "Kopier fil", + "File Delete": "Slett fil", + "Check file size": "Sjekk filstørrelse", + "Scan File": "Scan fil", + "Generate Thumbnail": "Generer miniatyrbilder", + "Generate Preview": "Generer forhåndsvisning", + "Unknown action: {{action}}": "Ukjent handling: {{action}}", + "Done": "Utført", + "Failed": "Mislykket", + "Working, Media Available": "Jobber, media er tilgjengelig", + "Working": "Jobber", + "Pending": "Venter", + "Blocked": "Blokkert", + "Canceled": "Avbrutt", + "Idle": "Inaktiv", + "Skipped": "Hoppet over", + "Step progress: {{progress}}": "Fremdrift: {{progress}}", + "Processing": "Prosesserer", + "Unknown: {{status}}": "Ukjent: {{status}}", + "Collapse": "Minimer", + "Details": "Detaljer", + "Abort": "Avbryt", + "Prioritize": "Prioriter", + "Media Transfer Status": "Status for medieoverføringer", + "Abort All": "Avbryt alle", + "Restart All": "Start alle på nytt", + "Unknown Package \"{{packageId}}\"": "Ukjent pakke \"{{packageId}}\"", + "Package Status": "Pakkestatus", + "Package container status": "Status for pakkekontainer", + "Id": "Id", + "Work status": "Jobbstatus", + "Restart All jobs": "Start alle jobber på nytt", + "Created": "Opprettet", + "Ready": "Klar", + "The progress of steps required for playout": "Fremdrift for steg som er nødvendige for avspilling", + "The progress of all steps": "Fremdrift for alle steg", + "This step is required for playout": "Dette steget er nødvendig for avspilling", + "Work description": "Jobbeskrivlese", + "Work status reason": "Årsak for jobbstatus", + "Technical reason: {{reason}}": "Teknisk årsak: {{reason}}", + "Previous work status reasons": "Tidligere årsaker for jobbsatus", + "Priority": "Prioritet", + "Not Connected": "Ikke tilkoblet", + "Do you want to restart CasparCG Server?": "Er du sikker på at du vil restarte CasparCG?", + "Restart Quantel Gateway": "Start Quantel Gateway på nytt", + "Do you want to restart Quantel Gateway?": "Vil du starte Quantel Gateway på nytt?", + "Quantel Gateway restarting...": "Quantel Gateway starter på nytt...", + "Failed to restart Quantel Gateway: {{errorMessage}}": "Klarte ikke å restarte Quantel Gateway: {{errorMessage}}", + "Format HyperDeck disks": "Formater HyperDeck-disker", + "Do you want to format the HyperDeck disks? This is a destructive action and cannot be undone.": "Er du sikker på at du vil formatere HyperDeck-diskene? Dette kan ikke angres.", + "Formatting HyperDeck disks on device \"{{deviceName}}\"...": "Formaterer HyperDeck-disker på \"{{deviceName}}\"...", + "Failed to format HyperDecks on device: \"{{deviceName}}\": {{errorMessage}}": "Formatering av HyperDeck-disker på \"{{deviceName}}\" feilet: {{errorMessage}}", + "Last seen": "Sist sett", + "Connect some devices to the playout gateway": "Koble til en eller flere enheter til playout gatewayen", + "Format disks": "Formater disker", + "Are you sure you want to delete this device: \"{{deviceId}}\"?": "Er du sikker på at du vil fjerne enheten \"{{deviceId}}\"?", + "Sofie Automation Server Core: {{name}}": "Sofie:", + "Restart this system?": "Starte dette Sofie-systemet på nytt?", + "Are you sure you want to restart this Sofie Automation Server Core: {{name}}?": "Er du sikker på at du vil starte Sofie Core: {{name}} på nytt?", + "Could not generate restart token!": "Kunne ikke generere Restart Token!", + "Could not generate restart core: {{err}}": "Kunne ikke generere Restart Core: {{err}}", + "Sofie Automation Server Core will restart in {{time}}s...": "Sofie Core restartes om {{time}}s...", + "Execution times": "Kjøretider", + "User ID": "Bruker-id", + "Client IP": "Klient-ip", + "Method": "Metode", + "Parameters": "Parametre", + "GUI": "Brukergrensesnitt", + "User Activity Log": "Aktivitetslogg", + "in {{days}} days, {{hours}} h {{minutes}} min {{seconds}} s": "om {{days}} dager, {{hours}} t {{minutes}} min {{seconds}} s", + "in {{hours}} h {{minutes}} min {{seconds}} s": "om {{hours}} t {{minutes}} min {{seconds}} s", + "in {{minutes}} min {{seconds}} s": "om {{minutes}} min {{seconds}} s", + "in {{seconds}} s": "om {{seconds}} s", + "{{days}} days, {{hours}} h {{minutes}} min {{seconds}} s ago": "for {{days}} dager, {{hours}} t {{minutes}} min {{seconds}} s siden", + "{{hours}} h {{minutes}} min {{seconds}} s ago": "for {{hours}} t {{minutes}} min {{seconds}} s siden", + "{{minutes}} min {{seconds}} s ago": "for {{minutes}} min {{seconds}} s siden", + "{{seconds}} s ago": "for {{seconds}} s siden", + "Next scheduled show": "Neste planlagte sending", + "Help & Support": "Hjelp og brukerstøtte", + "Disable hints by adding this to the URL:": "Deaktiver hint ved å legge dette til på url-en:", + "Enable hints by adding this to the URL:": "Aktiver hint ved å legge dette til på url-en:", + "More documentation available at:": "Mer dokumentasjon er tilgjengelig på:", + "Timeline": "Tidslinje", + "Mappings": "Lagmappinger", + "User Log Player": "Brukerloggspiller", + "Play from here": "Spill av herfra", + "Exectute Single": "Utfør enslig handling", + "Next Action": "Neste handling", + "Run in": "Kjør i", + "Stop": "Stopp", + "Clip \"{{fileName}}\" can't be played because it doesn't exist on the playout system": "Klippet \"{{fileName}}\" kan ikke spilles av fordi det ikke finnes på utspillingssystemet", + "{{sourceLayer}} is not yet ready on the playout system": "{{sourceLayer}} er ennå ikke klar til å spilles ut fra avviklingsserver", + "{{sourceLayer}} is transferring to the playout system": "{{sourceLayer}} overføres til avviklingsserver", + "{{sourceLayer}} is transferring to the playout system and cannot be played yet": "{{sourceLayer}} overføres til avviklingsserver og kan ikke spilles av ennå", + "{{sourceLayer}} doesn't have both audio & video": "{{sourceLayer}} har ikke lyd og/eller bilde", + "{{sourceLayer}} has the wrong format: {{format}}": "{{sourceLayer}}-formatet er ikke støttet: {{format}}", + "{{sourceLayer}} has {{audioStreams}} audio streams": "{{sourceLayer}} har {{audioStreams}} lydstrømmer", + "Clip starts with {{frames}} {{type}} frames": "Klippet starter med {{frames}} {{type}} ruter", + "This clip ends with {{type}} frames after {{count}} seconds": "Klippet slutter med {{frames}} {{type}} frame", + "{{frames}} {{type}} frames detected within the clip": "{{frames}} {{type}} frame oppdaget inne i klippet", + "{{frames}} {{type}} frames detected in the clip": "{{frames}} {{type}} frame oppdaget inne i klippet", + "black": "svart(e)", + "freeze": "fryst(e)", + "{{sourceLayer}} is missing a file path": "{{sourceLayer}} kan ikke spilles av fordi filnavnet mangler", + "Clip doesn't have audio & video": "Klippet har ikke lyd og/eller bilde", + "Clip starts with {{frames}} {{type}} frame": "Klippet starter med {{frames}} {{type}} frame", + "This clip ends with {{type}} frames after {{count}} second": "Klippet slutter med {{frames}} {{type}} frame", + "{{frames}} {{type}} frame detected within the clip": "{{frames}} {{type}} frame oppdaget inne i klippet", + "{{frames}} {{type}} frame detected in clip": "{{frames}} {{type}} frame oppdaget i klippet", + "{{sourceLayer}} is being ingested": "{{sourceLayer}} blir prosessert", + "Source is missing": "Kilde mangler", + "Segment no longer exists in {{nrcs}}": "Segmenet eksisterer ikke lenger i {{nrcs}}", + "Segment was hidden in {{nrcs}}": "Tittelen eksisterer ikke lenger i {{nrcs}}", + "The following parts no longer exist in {{nrcs}}: {{partNames}}": "De følgende delene eksisterer ikke lenger i {{nrcs}}: {{partNames}}", + "Toggle Shelf": "Skuff", + "Undo Hold": "Angre hold", + "Disable the next element": "Skip neste super", + "Undo Disable the next element": "Unskip neste super", + "Move Next forwards": "Skip neste", + "Move Next to the following segment": "Skip til neste segment", + "Move Next backwards": "Unskip neste", + "Move Next to the previous segment": "Unskip neste segment", + "Rewind segments to start": "Sett segmentene tilbake til start", + "{{count}} rows°°°°°°_°°°°°°plural": "{{count}} rader°°°°°°", + "This layer is now rerouted by an active Route Set: {{routeSets}}°°°°°°_°°°°°°plural": "Dette laget blir omkoblet av flere aktive omkoblingsgrupper: {{routeSets}}°°°°°°", + "There are {{count}} documents that can be removed, do you want to continue?°°°°°°_°°°°°°plural": "Det er {{count}} dokumenter i {{collections}} som kan fjernes. Vil du fortsette?°°°°°°", + "Clip starts with {{frames}} {{type}} frame°°°°°°_°°°°°°plural": "Klippet starter med {{frames}} {{type}} frame°°°°°°", + "This clip ends with {{type}} frames after {{count}} second°°°°°°_°°°°°°plural": "Klippet slutter med {{frames}} {{type}} frame°°°°°°", + "{{frames}} {{type}} frame detected within the clip°°°°°°_°°°°°°plural": "{{frames}} {{type}} frames oppdaget inne i klippet°°°°°°", + "{{frames}} {{type}} frame detected in clip°°°°°°_°°°°°°plural": "{{frames}} {{type}} frames oppdaget i klippet°°°°°°" } diff --git a/packages/webui/public/locales/nn/translations.json b/packages/webui/public/locales/nn/translations.json index e99a0d5e94..fee4ac1e7e 100644 --- a/packages/webui/public/locales/nn/translations.json +++ b/packages/webui/public/locales/nn/translations.json @@ -1,973 +1,973 @@ { - "Account Page": "Brukarkontoside", - "Name:": "Namn:", - "Email:": "E-post:", - "Old Password": "Gammalt passord", - "New Password": "Nytt passord", - "Save Changes": "Lagre endringer", - "Edit Account": "Endre brukarkonto", - "Organization": "Organisasjon", - "User roles in organization": "Brukarroller i organisasjon", - "Studio": "Studio", - "Configurator": "Configurator", - "Developer": "Developer", - "Admin": "Admin", - "Remove Self": "Fjern denne brukarkontoen", - "Email Address": "E-postadresse", - "Password": "Passord", - "Sign in": "Logg inn", - "Create New Account": "Opprett ny brukarkonto", - "Lost password?": "Gløymd passord?", - "Send reset email": "Send e-post for å nullstille", - "Go back": "Tilbake", - "Password must be atleast 5 characters long": "Passord må vere minst 5 tegn langt", - "Enter your new password": "Skriv inn ditt nye passord", - "Set new password": "Lagre nytt passord", - "Your Account": "Din brukarkonto", - "About Your Organization": "Om din oranisasjon", - "We are mainly": "Vi er hovudsakleg", - "Areas": "Område", - "Invite User": "Inviter brukar", - "New User's Email": "Ny brukar sin e-post", - "New User's Name": "Ny brukar sitt namn", - "Create New User & Send Enrollment Email": "Opprett ny brukar og send e-post for innmelding", - "Users in organization": "Brukarar i organisasjonen", - "Return to list": "Gå tilbake til lista", - "There is no rundown active in this studio.": "Fann ingen aktive køyreplanar for dette studioet.", - "This studio doesn't exist.": "Dette studioet eksisterer ikkje.", - "There are no active rundowns.": "Fann ingen aktive køyreplanar.", - "Evaluation": "Evaluering", - "Please take a minute to fill in this form.": "Ver venleg og fyll ut dette skjemaet.", - "Be aware that while filling out the form keyboard and streamdeck commands will not be executed!": "OBS! Du kan ikkje utføra Sofie-kommandoar medan du skriv evalueringa!", - "Did you have any problems with the broadcast?": "Hadde du nokre problem under sendinga?", - "Please explain the problems you experienced (what happened and when, what should have happened, what could have triggered the problems, etcetera...)": "Ver venleg og forklar kva problem du hadde (kva hende og når hende det, kva skulle skjedd, kva kan ha utløyst problema o.s.b.)", - "Your name": "Namnet ditt", - "Save message": "Lagre melding", - "Save message and Deactivate Rundown": "Send evalueringa og deaktiver køyreplanen", - "No problems": "Ingen problem", - "Something went wrong, but it didn't affect the output": "Noko gjekk gale, men det virka ikkje inn på sendinga", - "Something went wrong, and it affected the output": "Noko gjekk gale, og det virka inn på sendinga", - "Are you sure?": "Er du sikker?", - "Trimming this clip has timed out. It's possible that the story is currently locked for writing in {{nrcsName}} and will eventually be updated. Make sure that the story is not being edited by other users.": "Endring av inn-/utpunkt for dette klippet tek lang tid. Det er mogleg manuset i er låst i {{nrcsName}} og at inn-/utpunkt endrast om litt. Forsikre deg om at manuset ikkje vert redigert av andre brukarar.", - "Trimming this clip has failed due to an error: {{error}}.": "Endring av inn-/utpunkt for dette klippet feila: {{error}}.", - "Trimmed succesfully.": "Endring av inn-/utpunkt var vellukka.", - "Trimming this clip is taking longer than expected. It's possible that the story is locked for writing in {{nrcsName}}.": "Endring av inn-/utpunkt for dette klippet tek meir tid enn forventa. Det er mogleg manuset er låst for redigering i {{nrcsName}}.", - "Trim \"{{name}}\"": "Trim \"{{name}}\"", - "OK": "OK", - "Cancel": "Avbryt", - "Remove in-trimming": "Nullstill innpunkt", - "In": "Inn", - "Remove all trimming": "Nullstill inn- og utpunkt", - "Duration": "Lengde", - "Remove out-trimming": "Nullstill utpunkt", - "Out": "Ut", - "Next": "Neste", - "Test test": "Test test", - "Until next take": "Til neste Take", - "Until next segment": "Til neste segment", - "Until end of segment": "Til slutten av segment", - "Until next rundown": "Til neste køyreplan", - "Until end of showstyle": "Til slutten av showstyle", - "Script is empty": "Manuset er tomt", - "Clip:": "Klipp:", - "Home": "Heim", - "Rundowns": "Køyreplanar", - "Test Tools": "Testverktøy", - "Status": "Status", - "Settings": "Innstillingar", - "Account": "Konto", - "Logout": "Logg ut", - "My name is {{name}}": "Mitt namn er {{name}}", - "Operating Mode": "Styringsmodus", - "Switching operating mode to {{mode}}": "Endrer styringsmodus til {{mode}}", - "Prompter": "Prompter", - "End of script": "Slutt på manus", - "Could not get system status. Please consult system administrator.": "Kan ikkje innhente status for systemet. Kontakt systemadministrator.", - "There are no rundowns ingested into Sofie.": "Det er ikkje send køyreplanar til Sofie.", - "Click on a rundown to control your studio": "Klikk på ein køyreplan for å kontrollere studioet ditt", - "Rundown": "Køyreplan", - "Problems": "Problem", - "Show Style": "Showstyle", - "On Air Start Time": "Sendestart", - "Expected End Time": "Venta sendeslutt", - "Last updated": "Sist oppdatert", - "View Layout": "Vis layout", - "Today": "I dag", - "Yesterday": "I går", - "Tomorrow": "I morgon", - "Last": "Førre", - "Getting Started": "Kom i gong", - "Start with giving this browser configuration permissions by adding this to the URL: ": "Først må du gå i konfigurasjonsmodus ved å leggje dette til i url-en: ", - "Start Here!": "Start her!", - "Then, run the migrations script:": "Køyr deretter migreringsprosedyra:", - "Run Migrations to get set up": "Køyr migreringsprosedyrar for å setje opp", - "Migrations": "Migrering", - "Documentation is available at": "Dokumentasjon er tilgjengelig på", - "Use {{nrcsName}} order": "Nytt rekkefølgje frå {{nrcsName}}", - "Reset Sort Order": "Tilbakestill rekkefølgje", - "Enable configuration mode by adding ?configure=1 to the address bar.": "Aktiver konfigurasjonsmodus ved å legge til ?configure=1 på slutten av nettadressa.", - "You need to run migrations to set the system up for operation.": "Du må køyre migrering for å klargjere systemet for bruk.", - "Sofie Automation": "Sofie", - "version": "versjon", - "System Status": "Systemstatus", - "System has issues which need to be resolved": "Systemet har problemer som må løysast", - "Status Messages:": "Statusmeldingar:", - "{{showStyleVariant}} – {{showStyleBase}}": "{{showStyleVariant}} – {{showStyleBase}}", - "Drag to reorder or move out of playlist": "Dra for å endre rekkefølgje eller flytta ut av speleliste", - "This rundown is currently active": "Denne køyreplanen er allereie aktiv", - "Not set": "Ikkje angjeve", - "This rundown will loop indefinitely": "Denne køyreplanen vil gå i ein uendeleg loop", - "({{timecode}})": "({{timecode}})", - "Re-sync rundown data with {{nrcsName}}": "Ikkje synkronisert med MOS/{{nrcsName}}", - "Delete": "Slett", - "Standalone Shelf": "Frittståande skuff", - "Rundown & Shelf": "Køyreplan & skuff", - "Default": "Standard", - "Delete rundown?": "Slette køyreplanen?", - "Are you sure you want to delete the \"{{name}}\" rundown?": "Er du viss på at du vil slette køyreplanen \"{{name}}\"?", - "Please note: This action is irreversible!": "Merk: Denne handlinga kan du ikkje angre!", - "Re-Sync rundown?": "Synkroniser køyreplanen med ENPS på ny?", - "Re-Sync": "Synkroniser", - "Are you sure you want to re-sync the \"{{name}}\" rundown?": "Er du viss på at du vil synkronisere køyreplanen \"{{name}}\" med ENPS?", - "Start time is close": "Oppgitt sendestart er kvart augeblink", - "Yes": "Ja", - "No": "Nei", - "You are in rehearsal mode, the broadcast starts in less than 1 minute. Do you want to reset the rundown and go into On-Air mode?": "Du er i testmodus og sendinga startar om mindre enn eitt minutt. Vil du laste inn køyreplanen på nytt og gjere klar til sending?", - "Hold": "Hold", - "Could not find a Piece that can be disabled.": "Kunne ikkje finne eit element som kan skippes.", - "Failed to execute take": "Kunne ikkje gjennomføre Take", - "The rundown you are trying to execute a take on is inactive, would you like to activate this rundown?": "Du prøve å gjere ein Take i ein inaktiv køyreplan. Vil du aktivere denne køyreplanen?", - "Activate (Rehearsal)": "Aktiver (testmodus)", - "Activate (On-Air)": "Aktiver (gå ON AIR)", - "Failed to activate": "Kunne ikkje aktivere", - "Something went wrong, please contact the system administrator if the problem persists.": "Noko gikk gale, kontakt systemadministrator om problemet held fram.", - "Another Rundown is Already Active!": "Ein annan køyreplan er allereie aktiv!", - "The rundown \"{{rundownName}}\" will need to be deactivated in order to activate this one.\n\nAre you sure you want to activate this one anyway?": "Køyreplanen \"{{rundownName}}\" må deaktiveres for å aktivere denne køyreplanen.\n\nEr du sikker på at du ønsker å aktivere?", - "Activate Anyway (Rehearsal)": "Aktiver uansett (testmodus)", - "Activate Anyway (On-Air)": "Aktiver uansett (gå ON AIR)", - "Do you want to activate this Rundown?": "Vil du aktivere denne køyreplanen?", - "The planned end time has passed, are you sure you want to activate this Rundown?": "Det planlagte sluttidspunktet er passert, er du sikker på at du vil aktivere denne køyreplanen?", - "Are you sure you want to activate Rehearsal Mode?": "Er du sikker på at du vil gå i testmodus?", - "Are you sure you want to deactivate this Rundown?\n(This will clear the outputs)": "Er du sikker på at du vil deaktivere denne køyreplanen?\n(Dette vil nullstille alle utgangar.)", - "The rundown can not be reset while it is active": "Ein aktivert køyreplan kan ikkje tilbakestillast", - "A snapshot of the current Running Order has been created for troubleshooting.": "Eit snapshot av den gjeldande køyreplanen har verte oppretta.", - "Prepare Studio and Activate (Rehearsal)": "Førebu studio og aktiver testmodus", - "Deactivate": "Deaktiver", - "Take": "Take", - "Reset Rundown": "Tilbakestill køyreplanen", - "Reload {{nrcsName}} Data": "Last inn {{nrcsName}}-data på nytt", - "Store Snapshot": "Lagre snapshot", - "No actions available": "Ingen køyreplanval tilgjengelege i påsynmodus", - "Add ?studio=1 to the URL to enter studio mode": "Leggje til ?admin=1 på slutten av nettadressa for å starte studiomodus", - "Exit": "Lukk", - "Error": "Feil", - "This rundown is now active. Are you sure you want to exit this screen?": "Denne køyreplanen er aktiv. Er du sikker på at du vil avslutte?", - "Invalid AdLib": "Ugyldig adlib", - "Cannot play this AdLib because it is marked as Invalid": "Kan ikkje spele av adlib fordi den er markert som ugyldig", - "Cannot play this AdLib because it is marked as Floated": "Kan ikkje spele av adlib fordi den er markert som på vent (float)", - "Not queueable": "Kan ikkje setjast i kø", - "Cannot play this adlib because source layer is not queueable": "Kan ikkje spele av adlib fordi den ikkje kan setjast i kø på kjeldelaget", - "There are no Playout Gateways connected and attached to this studio. Please contact the system administrator to start the Playout Gateway.": "Dette studioet har ingen tilkopla playout-gatewayar. Kontakt systemadministrator for å starte den.", - "Playout Gateway \"{{playoutDeviceName}}\" is now restarting.": "Playout-gateway \"{{playoutDeviceName}}\" startar om att.", - "Could not restart Playout Gateway \"{{playoutDeviceName}}\".": "Playout-gateway \"{{playoutDeviceName}}\" kunne ikkje startas om att.", - "Restart Playout": "Start Playout-gateway på ny", - "Restart CasparCG Server": "Start CasparCG på nytt", - "Do you want to restart CasparCG Server \"{{device}}\"?": "Er du sikker på at du vil starta CasparCG Server \"{{device}}\" på nytt?", - "CasparCG on device \"{{deviceName}}\" restarting...": "CasparCG på \"{{deviceName}}\" startar på nytt...", - "Failed to restart CasparCG on device: \"{{deviceName}}\": {{errorMessage}}": "Omstart av CasparCG på \"{{deviceName}}\" feila: {{errorMessage}}", - "Cancel currently pressed hotkey": "Avbryt den trykte tasten", - "Change to fullscreen mode": "Fullskjermmodus", - "Show Hotkeys": "Vis hurtigtastar", - "Take a Snapshot": "Lagre eit snapshot", - "Restart {{device}}": "Start {{device}} på ny", - "Rundown not found": "Køyreplan ikkje funnen", - "Close": "Lukk", - "Rundown for piece \"{{pieceLabel}}\" could not be found.": "Kan ikkje finne øyreplan for \"{{pieceLabel}}\".", - "This rundown has been unpublished from Sofie.": "Denne køyreplanen er ikkje lenger tilgjengeleg i Sofie.", - "Error: The studio of this Rundown was not found.": "Feil: Kan ikkje finne studioet for denne køyreplanen.", - "This playlist is empty": "Denne spelelista er tom", - "Error: The ShowStyle of this Rundown was not found.": "Feil: Kan ikkje finne showstyle for denne køyreplanen.", - "Unknown error": "Ukjend feil", - "Rundown {{rundownName}} in Playlist {{playlistName}} is missing in the data from {{nrcsName}}. You can either leave it in Sofie and mark it as Unsynced or remove the rundown from Sofie. What do you want to do?": "Køyreplanen {{rundownName}} i lista {{playlistName}} manglar i data frå {{nrcsName}}. Du kan anten markere den som ikkje synkronisert og behalde den i Sofie, eller du kan fjerne køyreplanen ifrå Sofie. Kva vil du gjere?", - "(Unknown rundown)": "(Ukjend køyreplan)", - "(Unknown playlist)": "(Ukjend køyreplanliste)", - "Leave Unsynced": "Behald ikkje-synkronisert køyreplan", - "Remove": "Fjern", - "Remove rundown": "Fjern køyreplan", - "Do you really want to remove just the rundown \"{{rundownName}}\" in the playlist {{playlistName}} from Sofie? This cannot be undone!": "Er du sikker på at du vil slette køyreplanen {{rundownName}} i lista {{playlistName}} frå Sofie? Denne handlinga kan du ikkje angre!", - "Loop Start": "Start for loop", - "Loop End": "Slutt for loop", - "(in: {{time}})": "(om: {{time}})", - "({{time}} ago)": "(for {{time}} sidan)", - "Planned Start": "Planlagt start", - "Planned Duration": "Planlagt varigheit", - "Planned End": "Planlagt slutt", - "The rundown \"{{rundownName}}\" is not published or activated in {{nrcsName}}! No data updates will currently come through.": "Køyreplanen \"{{rundownName}}\" er ikkje synkronisert med MOS/{{nrcsName}}! Kontroller at den er satt til MOS Active i ENPS.", - "Re-sync": "Synkroniser med MOS", - "Re-sync Rundown": "Synkroniser køyreplanen med ENPS på nytt", - "Are you sure you want to re-sync the Rundown?\n(If the currently playing Part has been changed, this can affect the output)": "Er du sikker på at du vil gjenopprette synkronisering mot ENPS for denne køyreplanen?\n(Dette kan virke inn på pågåande sending)", - "Restart": "Restart", - "Fixing this problem requires a restart to the host device. Are you sure you want to restart {{device}}?\n(This might affect output)": "Feilretting krever ein omstart av {{device}}. Er du sikker på at du ønsker å starta einingen på nytt?(Dette kan ha innverknad på gjennomføringa av ein igangverande sending)", - "Device \"{{deviceName}}\" restarting...": "\"{{deviceName}}\" starter på ny...", - "Failed to restart device: \"{{deviceName}}\": {{errorMessage}}": "Kunne ikkje starta \"{{deviceName}}\" om att: {{errorMessage}}", - "There is an unknown problem with the part.": "Det er eit ukjend problem med denne delen.", - "Show issue": "Vis problem", - "There is an unspecified problem with the source.": "Det er eit ikkje-spesifisert problem med kjelden.", - "External message queue has unsent messages.": "Ekstern meldingskø har meldingar som ikkje er sendt.", - "The system configuration has been changed since importing this rundown. It might not run correctly": "Systemoppsettet har verte endra etter at denne køyreplanen vart importert. Køyreplanen kan verte spelt av med feil", - "Unable to check the system configuration for changes": "Kan ikkje kontrollere endringar i systemoppsettet", - "The Studio configuration is missing some required fields:": "Studiooppsettet manglar obligatoriske felt:", - "The Show Style configuration \"{{name}}\" could not be validated": "Showstyleoppsettet \"{{name}}\" kunne ikkje validerast", - "The ShowStyle \"{{name}}\" configuration is missing some required fields:": "Showstyleoppsettet \"{{name}}\" manglar obligatoriske felt:", - "Unable to validate the system configuration": "Systemoppsettet kunne ikkje validerast", - "Device {{deviceName}} is disconnected": "{{deviceName}} er fråkopla", - "Warnings": "Åtvaringar", - "Just now": "No", - "Less than a minute ago": "Under eitt minutt sidan", - "Less than five minutes ago": "Under fem minutt sidan", - "Around 10 minutes ago": "Cirka 10 minutt sidan", - "More than 10 minutes ago": "Over 10 minutt sidan", - "More than 30 minutes ago": "Over 30 minutt sidan", - "More than 2 hours ago": "Over 2 timer sidan", - "More than 5 hours ago": "Over 5 timar sidan", - "More than a day ago": "Over ein dag sidan", - "{{nrcsName}} Connection": "{{nrcsName}}-tilkopling", - "Last update": "Nyeste oppdatering", - "Off-line devices": "Fråkoplete einingar", - "Devices with issues": "Einingar med problem", - "All connections working correctly": "Alle tilkoplingar er OK", - "Play-out": "Avspelning", - "All devices working correctly": "Alle eininger fungerer som dei skal", - "Auto": "Auto", - "Expected End": "Venta slutt", - "Next Loop at": "Neste loop starter", - "Diff": "Skilnad", - "Started": "Starta", - "Expected Start": "Venta slutt", - "{{currentRundownName}} - {{rundownPlaylistName}} (Looping)": "{{currentRundownName}} - {{rundownPlaylistName}} (Looper)", - "{{currentRundownName}} - {{rundownPlaylistName}}": "{{currentRundownName}} - {{rundownPlaylistName}}", - "{{rundownPlaylistName}} (Looping)": "{{rundownPlaylistName}} (Looper)", - "Floated AdLib": "Adlib satt på vent", - "Switchboard": "Omkoplingssentral", - "This is not in it's normal setting": "Denne innstillinga er vorte endra frå standardverdien", - "Off": "Av", - "On Air At": "On Air klokka", - "On Air In": "On Air om", - "Unsynced": "Ikkje synkronisert med MOS", - "Sources": "Kjelder", - "On Air": "On Air", - "Loops to top": "Looper til toppen", - "Show End": "Sendeslutt", - "BREAK": "PAUSE", - "Break In": "Pause om", - "part": "punkt", - "Set segment as Next": "Set tittel som neste: Startar på neste Take", - "Queue segment": "Cue tittel: Startar når aktiv tittel er ferdig", - "Clear queued segment": "Fjern cuet tittel", - "Set this part as Next": "Set dette punktet som neste: Startar på neste Take", - "Set Next Here": "Sett Neste her", - "Play from Here": "Spel av frå her", - "Zoom Out": "Zoom ut", - "Show All": "Vis Alle", - "Zoom In": "Zoom In", - "Parts Duration": "Varigheit for del", - "Unknown": "Ukjend", - "Good": "Bra", - "Minor Warning": "Mindre åtvaring (avvik)", - "Warning": "Åtvaring", - "Bad": "Feil", - "Fatal": "Kritisk", - "Connected": "Tilkopla", - "Disconnected": "Fråkopla", - "MOS Gateway": "MOS-gateway", - "Spreadsheet Gateway": "Spreadsheet-gateway", - "Play-out Gateway": "Playout-gateway", - "Media Manager": "Media Manager", - "Unknown Device": "Ukjend eining", - "Delete this Studio?": "Slett dette studioet?", - "Are you sure you want to delete the studio \"{{studioId}}\"?": "Er du sikker på at du vil slette studioet \"{{studioId}}\"?", - "Delete this Show Style?": "Slett denne showstylen?", - "Are you sure you want to delete the show style \"{{showStyleId}}\"?": "Er du sikker på at du vil slette showstylen \"{{showStyleId}}\"?", - "Delete this Blueprint?": "Slett dette blueprintet?", - "Are you sure you want to delete the blueprint \"{{blueprintId}}\"?": "Er du sikker på at du vil slette blueprintet \"{{blueprintId}}\"?", - "Remove this Device?": "Fjern denne eininga?", - "Are you sure you want to remove the device \"{{deviceName}}\" and all of it's sub-devices?": "Er du sikker på at du vil fjerne eninga \"{{deviceName}}\" og alle undereiningane?", - "Studios": "Studio", - "Unnamed Studio": "Studio utan namn", - "Show Styles": "Showstyle", - "Unnamed Show Style": "Showstyle utan namn", - "Source Layers": "Kjeldelag", - "Output Channels": "Utgangskanalar", - "Blueprints": "Blueprint", - "Unnamed blueprint": "Blueprint utan namn", - "Type": "Type", - "Version": "Versjon", - "Devices": "Einingar", - "Tools": "Verktøy", - "Core System settings": "Systeminnstillingar for Core", - "Upgrade Database": "Oppgrader databasen", - "Manage Snapshots": "Behandle snapshots", - "System Settings": "Systeminstillinger", - "Update Blueprints?": "Oppdater blueprints?", - "Update": "Oppdater", - "Are you sure you want to update the blueprints from the file \"{{fileName}}\"?": "Er du sikker på at du vil oppdatere blueprints frå fila \"{{fileName}}\"?", - "Blueprints updated successfully.": "Blueprints blei oppdatert.", - "Replace Blueprints?": "Erstatte blueprints?", - "Replace": "Erstatt", - "Are you sure you want to replace the blueprints with the file \"{{fileName}}\"?": "Er du sikker på at du vil erstatte blueprints frå fila \"{{fileName}}\"?", - "Failed to update blueprints: {{errorMessage}}": "Oppdatering av blueprints feila: {{errorMessage}}", - "Assigned Show Styles:": "Tilordna showstyles:", - "This Blueprint is not being used by any Show Style": "Dette blueprintet er ikkje i bruk av nokon showstyles", - "Assigned Studios:": "Tilordna studio:", - "This Blueprint is not compatible with any Studio": "Dette blueprintet er ikkje kompatibel med noko studio", - "Unassign": "Fjern tilordning", - "Assign": "Tilordne", - "Blueprint ID": "Blueprint-id", - "Blueprint Name": "Blueprintnamn", - "No name set": "Namn ikkje definert", - "Blueprint Type": "Blueprinttype", - "Upload a new blueprint": "Last opp eit nytt blueprint", - "Last modified": "Sist endra", - "Blueprint Id": "Blueprint-id", - "Blueprint Version": "Blueprintversjon", - "Disable version check": "Deaktiver versjonsjekk", - "Upload Blueprints": "Last opp blueprints", - "OAuth credentials succesfully uploaded.": "Opplasting av OAuth credentials var vellukka.", - "Failed to upload OAuth credentials: {{errorMessage}}": "Opplasting av OAuth credentials feila: {{errorMessage}}", - "OAuth credentials successfuly reset": "OAuth credentials nullstilt.", - "Failed to reset OAuth credentials: {{errorMessage}}": "Nullstilling av OAuth credentials feila: {{errorMessage}}", - "Reset Authentication": "Passord for autentisering", - "Application credentials": "Brukarnamn/passord (Application Credentials)", - "Access token": "Tilgongskode (Access Token)", - "Click on the link below and accept the permissions request.": "Klikk på lenka under og godta permissions-førespurnaden", - "Waiting for gateway to generate URL...": "Ventar på at gateway genererar URL...", - "Only Match Global AdLibs": "Vis kun globale adliber", - "Name": "Namn", - "Display Style": "Stil for vising", - "Show thumbnails next to list items": "Vis miniatyrbilete ved sida av listeelement", - "Button width scale factor": "Breiddeskala for knapp", - "Button height scale factor": "Høgdeskala for knapp", - "Only Display AdLibs from Current Segment": "Vis berre adliber frå gjeldande tittel", - "Include Global AdLibs": "Inkluder globale adliber", - "Filter Disabled": "Filter deaktivert", - "Include Clear Source Layer in Ad-Libs": "Ta med \"Tøm kjeldelag\" i adliber", - "Source Layer Types": "Kjeldelagstypar", - "Filter disabled": "Filter deaktivert", - "Label contains": "Etikett inneheld", - "Tags must contain": "Tagger må innehalde", - "Hide Panel from view": "Ikkje vis dette panelet", - "Show panel as a timeline": "Vis panel som ei tidslinje", - "Enable search toolbar": "Aktiver søkeverktøy", - "Overflow horizontally": "Horisontal overflyt", - "Display Take buttons": "Vis Take-knapp", - "Queue all adlibs": "Cue alle adliber", - "Toggle AdLibs on single mouse click": "Veksle mellom adliber med enkelt museklikk", - "Hide duplicated AdLibs": "Skjul dupliserte adliber", - "Picks the first instance of an adLib per rundown, identified by uniqueness Id": "Velger den første førekomsten av ein adlib i kvar køyreplan, identifisert av unik id", - "URL": "Adresse (url)", - "Display Rank": "Rangering for visning", - "Role": "Rolle", - "Adlib Rank": "Adlib-rang", - "Place label below panel": "Plasser etikett under panel", - "Disabled": "Deaktivert", - "Show segment name": "Vis tittelen sitt namn", - "Show part title": "Vis delen sin tittel", - "Hide for dynamically inserted parts": "Skjul for dynamisk innsatte delar", - "Planned Start Text": "Tekst for planlagt start", - "Text to show above show start time": "Tekst som blir vist over klokkeslett for sendestart", - "Hide Diff": "Skjul skilnad", - "Hide Planned Start": "Skjul planlagt start", - "Planned End text": "Tekst for planlagt slutt", - "Text to show above show end time": "Tekst som blir vist over klokkeslett for sendeslutt", - "Hide Planned End Label": "Skjul etikett for planlagt slutt", - "Hide Diff Label": "Skjul etikett for skilnad", - "Hide Countdown": "Skjul nedteljing", - "Hide End Time": "Skjul sendeslutt", - "Hide Label": "Skjul etikett", - "Text": "Tekst", - "Show Rundown Name": "Vis køyreplannamn", - "Segment": "Tittel", - "Part": "Del", - "X": "X", - "Y": "Y", - "Width": "Breidde", - "Height": "Høgde", - "Scale": "Skala", - "Custom Classes": "Tilpassa klasser", - "Device ID": "Eining-id", - "Device Type": "Type eining", - "Remove this item?": "Fjern dette elementet?", - "Are you sure you want to remove {{type}} \"{{deviceId}}\"?": "Er du sikker på at du vil fjerne eininga {{type}} \"{{deviceId}}\"?", - "Attached Subdevices": "Tilkopla undereiningar", - "Expected End text": "Tekst for venta slutt", - "Text to show above countdown to end of show": "Tekst som blir vist over nedteljing til venta slutt", - "Hide Expected End timing when a break is next": "Gøym nedteljing til venta slutt når neste punkt er ei pause", - "While there are still breaks coming up in the show, hide the Expected End timers": "Gøym nedteljing til venta slutt medan det framleis er pauser att i sendinga", - "Show next break timing": "Vis tid for neste pause", - "Whether to show countdown to next break": "Om nedteljing til neste pause skal visast", - "Last rundown is not break": "Siste køyreplan er inga pause", - "Don't treat the end of the last rundown in a playlist as a break": "Ikkje behandle slutten av den siste køyreplanen i ei speleliste som ei pause", - "Next Break text": "Tekst for neste pause", - "Text to show above countdown to next break": "Tekst som blir vist over nedteljing til neste pause", - "Expose as user selectable layout": "Gjer tilgjengeleg som brukarvalgt layout", - "Shelf Layout": "Layouter for skuffen", - "Mini Shelf Layout": "Layouter for miniskuff", - "Rundown Header Layout": "Layout for køyreplanen sin topptekst", - "Hide Rundown Divider": "Skjul køyreplanskilje", - "Hide rundown divider between rundowns in a playlist": "Skjul skilje mellom køyreplanar i ei speleliste", - "Show Breaks as Segments": "Vis pauser som titlar", - "Segment countdown requires source layer": "Nedteljing for tittel krev kjeldelag", - "One of these source layers must have a piece for the countdown to segment on-air to be show": "Eit av desse kjeldelaga må ha eit element for at nedteljinga til tittelen er OnAir visas", - "Fixed duration in Segment header": "Låst lengde i tittelheader", - "The segment duration in the segment header always displays the planned duration instead of acting as a counter": "Tittelen si lengde i tittelheaderen vil alltid vise den planlagde lengda i staden for å telje ned", - "Select visible Source Layers": "Vel synlege kjeldelag", - "Select visible Output Groups": "Vel synleg gruppe for utgang", - "Expose layout as a standalone page": "Gjer layout tilgjengeleg som ei sjølvstendig side", - "Open shelf by default": "Åpne skuff som standard", - "Default shelf height": "Standard høyde for skuff", - "Show Buckets": "Vis bøtter", - "Disable Context Menu": "Skruv av kontekstmeny", - "This action has an invalid combination of filters": "Denne handlinga har ein ugydlig kombinasjon av filtre", - "Use Trigger Mode": "Type utløysar", - "Force": "Tving", - "Rehearsal": "Testmodus", - "Undo": "Angre", - "Segments: {{delta}}": "Segment: {{delta}}", - "Parts: {{delta}}": "Delar: {{delta}}", - "Open": "Opne", - "Toggle": "Veklse", - "On": "På", - "Activate Rundown": "Aktiver køyreplan", - "Ad-Lib": "Adlib", - "Deactivate Rundown": "Deaktiver køyreplan", - "Disable next Piece": "Skip neste element", - "Move Next": "Skip neste", - "Reload NRCS Data": "Last inn MOS-data på nytt", - "Resync with NRCS": "Synkroniser med ENPS", - "Shelf": "Skuff", - "Rewind Segments to start": "Sett alle segment attende til start", - "Go to On Air line": "Gå til OnAir-posisjon", - "Show entire On Air Segment": "Vis heile tittelen som er OnAir", - "Force (deactivate others)": "Tving (deaktiver andre)", - "Move Segments": "Skip segment", - "Move Parts": "Skip del", - "State": "Tilstand", - "Action": "Handling", - "Ad-Lib Action": "Adlib-handling", - "Clear Source Layer": "Tøm kjeldelag", - "Sticky Piece": "Element er sticky", - "Global AdLibs": "Globale adliber", - "Label": "Etikett", - "Limit": "Grense", - "Output Layer": "Utgangslag", - "Pick": "Plukk", - "Pick last": "Plukk siste", - "Source Layer": "Kjeldelag", - "Source Layer Type": "Kjeldelagstypar", - "Tag": "Tag", - "Not Global": "Ikkje globale", - "Only Global": "Berre globale", - "OnAir": "OnAir", - "Now active rundown": "Aktiv køyreplan nett no", - "View": "Visning", - "Executes within the currently open Rundown, requires a Client-side trigger.": "Blir utførte innanfor den valde køyreplanen, men treng ein utløysar frå klienten.", - "Select Action": "Vel handling", - "No Ad-Lib matches in the current state of Rundown: \"{{rundownPlaylistName}}\"": "Ingen treff på adliber i noverande tilstand for køyeplanen: \"{{rundownPlaylistName}}\"", - "No matching Rundowns available to be used for preview": "Ingen passande køyreplanar tilgjengelege for førehandvisning", - "Multilingual description, editing will overwrite": "Endring vil overskrive fleirspråkleg skildring", - "Optional description of the action": "Valfri skildring av handlinga", - "Triggered Actions uploaded successfully.": "Opplasting av handlingsutløysarar var vellukka.", - "Triggered Actions failed to upload: {{errorMessage}}": "Opplasting av handlingsutløysarar feila: {{errorMessage}}", - "Append or Replace": "Legg til eller erstatt", - "Do you want to append these to existing Action Triggers, or do you want to replace them?": "Vil du legge desse til dei noverande handlingsutløysarane, eller vil du erstatta dei?", - "Append": "Legg til", - "Action Triggers": "Handlingsutløysarar", - "Find Trigger...": "Finn utløysar...", - "No matching Action Trigger.": "Fekk ikkje treff blant handlingsutløysar.", - "No Action Triggers set up.": "Ingen handlingsutløysarar er satt opp.", - "System-wide": "Systemvid", - "Upload stored Action Triggers": "Last opp lagra handlingsutløysarar", - "Download Action Triggers": "Last ned handlingsutløysarar", - "On release": "På slipp (\"Key up\")", - "Empty": "Tom", - "Hotkey": "Hurtigtast", - "Trigger Type": "Type utløysar", - "Failed to update config: {{errorMessage}}": "Oppdatering av konfigurasjon feila: {{errorMessage}}", - "Export": "Eksporter", - "Import": "Import", - "true": "true", - "false": "false", - "{{count}} rows": "{{count}} rader", - "Value": "Verdi", - "Create": "Opprett", - "Add config item": "Legg til konfigurasjonselement", - "Add": "Legg til", - "Item": "Element", - "Delete this item?": "Slett dette elementet?", - "Are you sure you want to delete this config item \"{{configId}}\"?": "Er du sikker på at du vil slette dette konfigurasjonselementet \"{{configId}}\"?", - "Blueprint Configuration": "Blueprintkonfigurasjon", - "More settings specific to this studio can be found here": "Meir spesifikke innstillingar for dette studioet finn du her", - "There was an error: {{error}}": "Det skjedde ein feil: {{error}}", - "Package Manager status": "Status for pakkebehandlar", - "Reload statuses": "Last inn status om att", - "Updated": "Oppdatert", - "Package Manager": "Pakkebehandlar", - "Statistics": "Statistikk", - "Times": "Tider", - "Connected Workers": "Tilkopla arbeidarar", - "Work-in-progress": "Pågåande jobbar", - "WorkForce": "Arbeidarstyrke", - "Kill (debug)": "Kill (debug)", - "Connected App Containers": "Tilkopla app-kontainere", - "No status loaded": "Ingen status lasta", - "Peripheral Device is outdated": "Tilkopla eining er utdatert", - "The config UI is now driven by manifests fed by the device. This device needs updating to provide the configManifest to be configurable": "Brukergrensesnitt for konfigurasjon drivast no av manifest mata frå einingane. Denne einga må oppdaterast for å gjere configManifest konfigurerbart", - "Are you sure you want to restart this device?": "Er du sikker på at du vil starte denne eininga på nytt?", - "Restart this Device?": "Start denne eininga på nytt?", - "Check the console for troubleshooting data from device \"{{deviceName}}\"!": "Sjekk konsollen for feilsøkingsdata frå eninga \"{{deviceName}}\"!", - "There was an error when troubleshooting the device: \"{{deviceName}}\": {{errorMessage}}": "Det hende ein feil under feilsøking av eininga \"{{deviceName}}\": {{errorMessage}}", - "Generic Properties": "Generelle eigenskapar", - "Device Name": "Einingsnamn", - "Restart Device": "Start eining på nytt", - "Troubleshoot": "Feilsøk", - "Reset Database Version": "Nullstill databaseversjon", - "Are you sure you want to reset the database version?\nOnly do this if you plan on running the migration right after.": "Er du sikker på at du vil nullstille databaseversjonen?\nBerre gjer dette om du har tenkt å køyre ei migrering med ein gong.", - "Version for {{name}}: From {{fromVersion}} to {{toVersion}}": "Versjon for {{name}}: Frå {{fromVersion}} til {{toVersion}}", - "Re-check": "Sjekk om att", - "Reset Version to": "Nullstill versjon til", - "Reset All Versions": "Nullstill alle versjonar", - "Migrate database": "Migrer database", - "All steps": "Alle steg", - "The migration consists of several phases, you will get more options after you've this migration": "Migreringa har fleire fasar, du vil få fleire val etter at du har køyrd denne migreringa", - "The migration can be completed automatically.": "Migreringa kan gjerast ferdig automatisk.", - "Run automatic migration procedure": "Køyr automatisk migreringsprosedyre", - "The migration procedure needs some help from you in order to complete, see below:": "Migreringsprosedyra treng litt hjelp frå deg for å gjere seg ferdig. Sjå under:", - "Double-check Values": "Dobbeltsjekk verdiar", - "Are you sure the values you have entered are correct?": "Er du sikker på at verdiane du har oppgitt er korrekte?", - "Run Migration Procedure": "Køyr migreringsprosedyre", - "Warnings During Migration": "Åtvaringar under migrering", - "Please check the database related to the warnings above. If neccessary, you can": "Ver vennleg og sjekk databasen tilknytta åtvaringane over. Om det er naudsynt kan du", - "Force Migration": "Tving migrering", - "Are you sure you want to force the migration? This will bypass the migration checks, so be sure to verify that the values in the settings are correct!": "Er du sikker på at du vil tvinge migreringa? Dette gjer at du hoppar over migreringskontrollane, så ver sikker på at verdiane oppgitt i innstillingar er korrekte!", - "Force Migration (unsafe)": "Tving migrering (utrygt)", - "The migration was completed successfully!": "Migreringa var vellukka!", - "All is well, go get a": "Alt er greitt, gå og finn deg ein", - "New Layout": "Ny layout", - "Button": "Knapp", - "New Filter": "Nytt filter", - "Delete layout?": "Slett layout?", - "Are you sure you want to delete the shelf layout \"{{name}}\"?": "Er du sikker på at du vil slette layouten \"{{name}}\"?", - "Action Buttons": "Handlingsknappar", - "Icon": "Ikon", - "Icon color": "Ikonfarge", - "Filters": "Filtre", - "There are no filters set up yet": "Det er ikkje satt opp noko filter enno", - "Default Layout": "Standardlayout", - "Add {{filtersTitle}}": "Legg til {{filtersTitle}}", - "Add filter": "Legg til filter", - "Add button": "Legg til knapp", - "Upload Layout?": "Last opp layout?", - "Upload": "Last opp", - "Are you sure you want to upload the shelf layout from the file \"{{fileName}}\"?": "Er du sikker på at du vil laste opp layout for skuff frå fila \"{{fileName}}\"?", - "Shelf layout uploaded successfully.": "Opplasting av layout for skuff var vellukka.", - "Failed to upload shelf layout: {{errorMessage}}": "Opplasting av layout feila: {{errorMessage}}", - "Show Style Base Name": "Showstylenamn", - "Blueprint": "Blueprint", - "Blueprint not set": "Blueprint ikkje valt", - "Compatible Studios:": "Kompatible studio:", - "This Show Style is not compatible with any Studio": "Denne showstylen er ikkje kompatibelt med noko studio", - "Camera": "Kamera", - "Graphics": "Grafikk", - "Live Speak": "STK", - "Lower Third": "Super", - "Studio Microphone": "Studiomikrofon", - "Remote Source": "RM", - "Generic Script": "Generisk manus", - "Split Screen": "Splitt", - "Clips": "Klipp", - "Metadata": "Metadata", - "Camera Movement": "Kamerarørsle", - "Unknown Layer": "Ukjend lag", - "Audio Mixing": "Lydmiksing", - "Transition": "Effekt", - "Lights": "Lys", - "Local": "Lokal", - "New Source": "Ny kjelde", - "Are you sure you want to delete source layer \"{{sourceLayerId}}\"?": "Er du sikker på at du vil slette kjeldelaget \"{{sourceLayerId}}\"?", - "Source Name": "Kjeldenamn", - "Source Abbreviation": "Kjeldeforkorting", - "Internal ID": "Intern-id", - "Source Type": "Kjeldetype", - "Is a Live Remote Input": "Er ein RM", - "Is a Guest Input": "Er ein gjesteinngang", - "Is hidden": "Er skjult", - "Pieces on this layer can be cleared": "Element på dette laget kan tømmas", - "Pieces on this layer are sticky": "Element på dette laget er sticky", - "Only Pieces present in rundown are sticky": "Kun element til stades i køyreplanen er sticky", - "Allow disabling of Pieces": "Tillat deaktivering av element", - "AdLibs on this layer can be queued": "Adliber på dette laget kan cues", - "Exclusivity group": "Ekslusivitetgruppe", - "Add some source layers (e.g. Graphics) for your data to appear in rundowns": "Legg til kjeldelag (til dømes Grafikk) for å vise dine data i køyreplanar", - "No source layers set": "Ingen kjeldelag definert", - "Delete this output?": "Slett denne utgangen?", - "Are you sure you want to delete source layer \"{{outputId}}\"?": "Er du sikker på at du vil slette kjeldelaget \"{{outputId}}\"?", - "New Output": "Ny utgang", - "Channel Name": "Kanalnavn", - "Is PGM Output": "Er programutgang", - "Is collapsed by default": "Er minimert som standard", - "Is flattened": "Er slått saman", - "Output channels are required for your studio to work": "Utgangskanalar er naudsynte for at studioet ditt skal fungere", - "Output channels": "Utgangskanalar", - "No output channels set": "Ingen utgangskanal definert", - "No PGM output": "Ingen programutgang", - "Key": "Key", - "Custom Hotkey Labels": "Eigendefinerte etikettar for hurtigtastar", - "Remove this Variant?": "Fjern denne varianten?", - "Are you sure you want to remove the variant \"{{showStyleVariantId}}\"?": "Er du sikker på at du vil fjerne denne showstylevarianten \"{{showStyleVariantId}}\"?", - "Unnamed variant": "Variant utan namn", - "Variant Name": "Variantnamn", - "Variants": "Variantar", - "Restore from this Snapshot file?": "Tilbakestill frå denne snapshotfila?", - "Are you sure you want to restore the system from the snapshot file \"{{fileName}}\"?": "Er du sikker på at du vil tilbakestille systemet frå denne snapshotfila \"{{fileName}}\"?", - "Successfully restored snapshot": "Tilbakestilling frå snapshot var vellukka", - "Snapshot restore failed: {{errorMessage}}": "Tilbakestilling frå snapshot feila: {{errorMessage}}", - "Full System Snapshot": "Fullt systemsnapshot", - "A Full System Snapshot contains all system settings (studios, showstyles, blueprints, devices, etc.)": "Eit fullt systemsnapshot inneheld alle systeminnstillingar (studio, showstyles, blueprints, einingar o.s.b.)", - "Take a Full System Snapshot": "Lagre eit fullt systemsnapshot", - "Studio Snapshot": "Studiosnapshot", - "A Studio Snapshot contains all system settings related to that studio": "Eit studiosnapshot inneheld alle systeminnstillingar knytt til eit studio", - "Take a Snapshot for studio \"{{studioName}}\" only": "Lagre eit studiosnapshot utelukkande for \"{{studioName}}\"", - "Restore from Snapshot File": "Tilbakestill frå snapshotfil", - "Upload Snapshot": "Last opp snapshot", - "Restore from Stored Snapshots": "Tilbakestill frå lagra snapshots", - "Restore": "Tilbakestill", - "Show \"Remove snapshots\"-buttons": "Vis \"Fjern snapshots\"-knappar", - "Remove this device?": "Fjern denne eininga?", - "Are you sure you want to remove device \"{{deviceId}}\"?": "Er du sikker på at du vil fjerne eininga \"{{deviceId}}\"?", - "Devices are needed to control your studio hardware": "Einingar er naudsynte for å kontrollere utstyr i studioet ditt", - "Attached Devices": "Tilkopla eingingar", - "No devices connected": "Ingen einingar tilkopla", - "Playout gateway not connected": "Playout-gateway ikkje tilkopla", - "Remove this mapping?": "Fjern denne mappinga?", - "Are you sure you want to remove mapping for layer \"{{mappingId}}\"?": "Er du sikker på at du fil fjerne mappinga for laget \"{{mappingId}}\"?", - "This layer is now rerouted by an active Route Set: {{routeSets}}": "Dette laget vert omkopla av ei aktiv omkoplingsgruppe: {{routeSets}}", - "Layer ID": "Lag-id", - "ID of the timeline-layer to map to some output": "Lag-id for tidslinjelaget som skal mappast til ein utgang", - "Layer Name": "Lagnamn", - "Human-readable name of the layer": "Lesarvenleg lagnamn", - "The type of device to use for the output": "Einingtype som skal nyttast for utgangen", - "ID of the device (corresponds to the device ID in the peripheralDevice settings)": "Eining-id (korresponderer med enhets-id under enhetsinnstillinger)", - "Lookahead Mode": "Lookahead-modus", - "Lookahead Target Objects (Default = 1)": "Lookahead målobjekter (standard = 1)", - "Lookahead Maximum Search Distance (Default = {{limit}})": "Lookahead maksimum søkelengde (standard = {{limit}})", - "Layer Mappings": "Lagmapping", - "Add a playout device to the studio in order to edit the layer mappings": "For å kunne redigere lagmappingar, må du leggje til ein playout-eining til studio", - "Remove this Exclusivity Group?": "Fjern frå denne eksklusivitetgruppa?", - "Are you sure you want to remove exclusivity group \"{{eGroupName}}\"?\nRoute Sets assigned to this group will be reset to no group.": "Er du sikker på at du vil fjerne eksklusivitetsgruppa \"{{eGroupName}}\"?\nOmkoplingar satt til denne gruppa vil bli resatt til inga gruppe.", - "Remove this Route from this Route Set?": "Fjern denne omkoplinga frå denne omkoplingsgruppa?", - "Are you sure you want to remove the Route from \"{{sourceLayerId}}\" to \"{{newLayerId}}\"?": "Er du sikker på at du vil fjerne omkoplinga frå \"{{sourceLayerId}}\" til \"{{newLayerId}}\"?", - "Remove this Route Set?": "Fjern denne omkoplingsgruppa?", - "Are you sure you want to remove the Route Set \"{{routeId}}\"?": "Er du sikker på at du vil fjerne omkoplingsgruppa \"{{routeId}}\"?", - "Routes": "Omkoplingar", - "There are no routes set up yet": "Det er ikkje satt opp omkoplingar enno", - "Original Layer": "Opprinneleg lag", - "None": "Ingen", - "New Layer": "Nytt lag", - "Source Layer not found": "Kjeldelag ikkje funnen", - "There are no exclusivity groups set up.": "Ingen eksklusivitetsgrupper er satt opp.", - "Exclusivity Group ID": "Eksklusivitetgruppe-id", - "Exclusivity Group Name": "Eksklusivitetgruppenamn", - "Display name of the Exclusivity Group": "Eksklusivitetsgruppa sitt namn som visast i oversikten", - "Active": "Aktiv", - "Not Active": "Inaktiv", - "Not defined": "Ikkje definert", - "There are no Route Sets set up.": "Det er ikkje satt opp omkoplingar enno.", - "Route Set ID": "Omkoplingsgruppe-id", - "Is this Route Set currently active": "Er denne omkoplingsgruppa aktiv no", - "Default State": "Standardtilstand", - "The default state of this Route Set": "Standardtilstand for denne omkoplingsgruppa", - "Route Set Name": "Omkoplingsgruppa sitt namn", - "Display name of the Route Set": "Omkoplingsgruppa sitt namn som visast i oversikten", - "If set, only one Route Set will be active per exclusivity group": "Berre ei omkoplingsgruppe vere aktiv per eksklusivitetsgruppe når dette er kryssa av for", - "Behavior": "Oppførsel", - "The way this Route Set should behave towards the user": "Måten denne omkoplingsgruppa skal oppføre seg overfor brukaren", - "Route Sets": "Omkoplingsgrupper", - "Add a playout device to the studio in order to configure the route sets": "For å kunne redigere omkoplingsgrupper, må du leggje til ein playout-eining til studio", - "Controls for exposed Route Sets will be displayed to the producer within the Rundown View in the Switchboard.": "Kontroller for eksponerte omkoplingsgrupper vil verte synt for producer i køyreplansvisninga i omkoplingspanelet.", - "Exclusivity Groups": "Ekslusivitetgrupper", - "Remove this Package Container?": "Fjern denne pakkecontaineren?", - "Are you sure you want to remove the Package Container \"{{containerId}}\"?": "Er du sikker på at du vil fjerne pakkecontaineren \"{{containerId}}\"?", - "There are no Package Containers set up.": "Det er ikkje satt opp pakkekontainere enno.", - "Package Container ID": "Pakkekontainer-id", - "Display name/label of the Package Container": "Vis namn/merkelapp for pakkekontaineren", - "Playout devices which uses this package container": "Playout-einingar som nyttar denne pakkekontaineren", - "Select playout devices": "Vel playout-eining", - "Select which playout devices are using this package container": "Vel kva for nokre playout-einingar som skal nytte denne pakkekontaineren", - "Accessors": "Aksessorer", - "Remove this Package Container Accessor?": "Fjern denne pakkekontainer-aksessoren?", - "Are you sure you want to remove the Package Container Accessor \"{{accessorId}}\"?": "Er du sikker på at du vil fjerne pakkekontainer-aksessoren \"{{accessorId}}\"?", - "There are no Accessors set up.": "Ingen aksessorer er satt opp.", - "Accessor ID": "Aksessor-id", - "Display name of the Package Container": "Pakkekontaineren sitt namn som visast i oversikten", - "Accessor Type": "Aksessortype", - "Folder path": "Mappesti", - "File path to the folder of the local folder": "Sti til lokal mappe", - "Resource Id": "Ressurs-id", - "(Optional) This could be the name of the computer on which the local folder is on": "(Valfri) Dette kan vere namnet til datamaskinen som den lokale mappa er på", - "Base URL": "Base-url", - "Base url to the resource (example: http://myserver/folder)": "Base-url for ressursen (døme: http://minserver/mappe)", - "Network Id": "Nettverk-id", - "(Optional) A name/identifier of the local network where the share is located, leave empty if globally accessible": "(Valfri) Eit namn/ein identifikator for det lokale nettverket der den delte mappa er lokalisert, la vere tom om den er globalt tilgjengeleg", - "Folder path to shared folder": "Sti til delt mappe", - "UserName": "Brukernamn", - "Username for athuentication": "Brukarnamn for autentisering", - "Password for authentication": "Passord for autentisering", - "(Optional) A name/identifier of the local network where the share is located": "(Valfri) Eit namn/ein identifikator for det lokale nettverket der den delte mappa er lokalisert", - "Quantel gateway URL": "Quantel Gateway-adresse (url)", - "URL to the Quantel Gateway": "Start Quantel-gateway om att", - "ISA URLs": "ISA-adresse (url)", - "URLs to the ISAs, in order of importance (comma separated)": "Adresser (url-er) for ISA-ene (kommaseparert i prioritert rekkefølgje)", - "Zone ID": "Sone-id", - "Zone ID (default value: \"default\")": "Sone-id (standardverdi: \"default\")", - "Server ID": "Server-id", - "Server ID. For sources, this should generally be omitted (or set to 0) so clip-searches are zone-wide. If set, clip-searches are limited to that server.": "Server-id (Må droppast for kjelder, sidan klippsøk skjer i heile sona.)", - "Quantel transformer URL": "Quantel Transformer-adresse (url)", - "URL to the Quantel HTTP transformer": "Adresse til Quantel HTTP transformer", - "Quantel FileFlow URL": "Quantel GatewayFileFlow-adresse (url)", - "URL to the Quantel FileFlow Manager": "Adresse til Quantel FileFlow Manager", - "Quantel FileFlow Profile name": "Quantel FileFlow profilnavn", - "Profile name to be used by FileFlow when exporting the clips": "Profilnamn som blir nytta av FileFlow når klippa vert eksportert", - "Allow Read access": "Tillat lesing", - "Allow Write access": "Tillat skriving/lagring", - "Studio Settings": "Studioinnstillingar", - "Package Containers to use for previews": "Pakkekontainere som skal nyttast til førehandsvisingar", - "Click to show available Package Containers": "Klikk for å vise tilgjengelege pakkekntainere", - "Package Containers to use for thumbnails": "Pakkekontainere som skal nyttast til miniatyrbilete", - "Package Containers": "Pakkekontainere", - "Studio Baseline needs update: ": "Studio baseline treng oppdatering: ", - "Baseline needs reload, this studio may not work until reloaded": "Baseline må lastast om att, dette studioet vil kanskje ikkje fungere før baseline er lasta om att", - "Reload Baseline": "Last inn baseline om att", - "Studio Name": "Studionamn", - "Select Compatible Show Styles": "Vel kompatible showstyles", - "Show style not set": "Showstyle ikkje satt", - "Click to show available Show Styles": "Klikk for å vise tilgjengelege showstyles", - "Frame Rate": "Framerate", - "Enable \"Play from Anywhere\"": "Slå på \"Play from Anywhere\"", - "Media Preview URL": "Førehandsvisningsadresse (url)", - "Sofie Host URL": "Sofie vertadresse (url)", - "Slack Webhook URLs": "Slack Webhook-adresser (url)", - "Supported Media Formats": "Støtta medieformat", - "Supported Audio Formats": "Støtta lydformat", - "Force the Multi-gateway-mode": "Tving multigateway-modus", - "Multi-gateway-mode delay time": "Delaytid for multigateway-modus", - "Remove indexes": "Fjern indexer", - "This will remove {{indexCount}} old indexes, do you want to continue?": "Dette vil fjerne {{indexCount}} gamle indexer. Vil du fortsette?", - "{{indexCount}} indexes was removed.": "{{indexCount}} indexer vart fjerna.", - "Installation name": "Installasjonsnamn", - "This name will be shown in the title bar of the window": "Dette namnet vert vist i tittellinja for vindauget", - "Logging level": "Loggenivå", - "This affects how much is logged to the console on the server": "Dette påverkar kor mykje som blir logga til serverkonsollen", - "System-wide Notification Message": "Lokal systemmelding", - "Message": "Melding", - "Enabled": "Aktivert", - "Edit Support Panel": "Rediger supportpanel", - "HTML that will be shown in the Support Panel": "HTML-kode som vert vist i supportpanelet", - "Application Performance Monitoring": "Overvaking av yting for applikasjonar (AMP)", - "APM Enabled": "AMP aktivert", - "APM Transaction Sample Rate": "Prøvefrekvens for AMP-transaksjonar", - "How many of the transactions to monitor. Set to -1 to log nothing (max performance), 0.5 to log 50% of the transactions, 1 to log all transactions": "Tal på transaksjonar som overvakast. Set verdien til -1 for å ikkje logge noko (maks yting), til 0.5 for å logge halvparten av transaksjonane eller til 1 for å logge alle transaksjonane", - "Note: Core needs to be restarted to apply these settings": "Merknad: Core må startast om att for å ta i bruk desse innstillingane", - "Enable": "Aktivert", - "Cron jobs": "Cron-jobbar", - "Enable CasparCG restart job": "Aktiver CasparCG restartjobbar", - "Cleanup": "Opprydding", - "Cleanup old database indexes": "Rydd opp i gamle databaseindexer", - "Cleanup old data": "Rydd opp i gamle data", - "Disable CasparCG restart job": "Deaktiver CasparCG restartjobbar", - "Remove old data from database": "Fjern gamle data frå databasen", - "There are {{count}} documents that can be removed, do you want to continue?": "Det er {{count}} dokument som kan fjernast. Vil du fortsette?", - "Documents to be removed:": "Dokument som vert fjerna:", - "Retry": "Prøv igjen", - "Remove old data": "Fjern gamle data", - "The old data was removed.": "Gamle data vart fjerna.", - "Last {{layerName}}": "Siste {{layerName}}", - "Clear {{layerName}}": "Tøm {{layerName}}", - "Search...": "Søk...", - "Are you sure you want to deactivate this Rundown\n(This will clear the outputs)": "Er du sikker på at du vil deaktivere denne køyreplanen?\n(Dette vil nullstille alle utgangar.)", - "Successfully stored snapshot": "Tilbakestilling frå snapshot var vellukka", - "End Words": "Stikkord", - "Global AdLib": "Globale adliber", - "AdLib does not provide any options": "Adlib har ingen val", - "Execute": "Utfør", - "Save to Bucket": "Lagre til bøtte", - "Reveal in Shelf": "Vis i skuff", - "Edit in Nora": "Rediger i Nora", - "Current Part": "Noverande del", - "Next Part": "Neste del", - "Part Count Down": "Nedteljing for del", - "Part Count Up": "Opptelling for del", - "Until end of rundown": "Til slutten av køyreplanen", - "New Bucket": "Ny bøtte", - "Are you sure you want to delete this AdLib?": "Er du sikker på at du vil slette denne adliben?", - "Are you sure you want to delete this Bucket?": "Er du sikker på at du vil slette denne bøtta?", - "Are you sure you want to empty (remove all adlibs inside) this Bucket?": "Er du sikker på at du vil tømme denne bøtta (fjerner alle adliber)?", - "Current Segment": "Noverande tittel", - "Next Segment": "Neste tittel", - "Segment Count Down": "Nedteljing for tittel", - "Segment Count Up": "Oppteljing for tittel", - "Start this AdLib": "Start denne adliben", - "Queue this AdLib": "Cue denne adliben", - "Inspect this AdLib": "Inspiser denne adliben", - "Rename this AdLib": "Gi denne adliben nytt namn", - "Delete this AdLib": "Slett denne adliben", - "Empty this Bucket": "Tøm denne bøtta", - "Rename this Bucket": "Gi bøtta nytt namn", - "Delete this Bucket": "Slett denne bøtta", - "Create new Bucket": "Opprett ny bøtte", - "AdLib": "Adlib", - "Shortcuts": "Hurtigtastar", - "Show Style Variant": "Showstylevariant", - "Local Time": "Lokal tid", - "System": "System", - "Media": "Media", - "Packages": "Pakker", - "Messages": "Meldingar", - "User Log": "Brukarlogg", - "Evaluations": "Evalueringar", - "Timestamp": "Tidsstempel", - "User Name": "Brukernamn", - "Answers": "Svar", - "Message Queue": "Kø for meldingar", - "Queued Messages": "Meldingar i kø", - "Sent Messages": "Sendte meldingar", - "File Copy": "Kopier fil", - "File Delete": "Slett fil", - "Check file size": "Sjekk filstorleik", - "Scan File": "Scan fil", - "Generate Thumbnail": "Generer miniatyrbilete", - "Generate Preview": "Generer førehandsvisning", - "Unknown action: {{action}}": "Ukjent handling", - "Done": "Utført", - "Failed": "Mislukka", - "Working, Media Available": "Arbeider, media er tilgjengeleg", - "Working": "Arbeider", - "Pending": "Venter", - "Blocked": "Blokkert", - "Canceled": "Avbrote", - "Idle": "Inaktiv", - "Skipped": "Hoppa over", - "Step progress: {{progress}}": "Framdrift: {{progress}}", - "Processing": "Prosesserer", - "Unknown: {{status}}": "Ukjend: {{status}}", - "Collapse": "Minimer", - "Details": "Detaljar", - "Abort": "Avbryt", - "Prioritize": "Prioriter", - "Media Transfer Status": "Status for medieoverføringar", - "Abort All": "Avbryt alle", - "Restart All": "Start alle på ny", - "Unknown Package \"{{packageId}}\"": "Ukjend pakke \"{{packageId}}\"", - "Package Status": "Pakkestatus", - "Package container status": "Status for pakkekontainer", - "Id": "Id", - "Work status": "Jobbstatus", - "Restart All jobs": "Start alle jobbar om att", - "Created": "Oppretta", - "Ready": "Klar", - "The progress of steps required for playout": "Framdrift for steg som er naudsynte for avspeling", - "The progress of all steps": "Framdrift for alle steg", - "This step is required for playout": "Dette steget er naudsynt for avspeling", - "Work description": "Jobbskildring", - "Work status reason": "Årsak for jobbstatus", - "Technical reason: {{reason}}": "Teknisk årsak: {{reason}}", - "Previous work status reasons": "Tidlegare årsakar for jobbsatus", - "Priority": "Prioritet", - "Not Connected": "Ikkje tilkopla", - "Do you want to restart CasparCG Server?": "Er du sikker på at du vil starte CasparCG om att?", - "Restart Quantel Gateway": "Start Quantel-gateway om att", - "Do you want to restart Quantel Gateway?": "Er du sikker på at du vil starte Quantel-gateway om att?", - "Quantel Gateway restarting...": "Quantel-gateway startar om att...", - "Failed to restart Quantel Gateway: {{errorMessage}}": "Kunne ikkje starta Quantel-gateway om att: {{errorMessage}}", - "Format HyperDeck disks": "Formater Hyperdeck-diskar", - "Do you want to format the HyperDeck disks? This is a destructive action and cannot be undone.": "Ynskjer du å formatere Hyperdeck-diskar? Dette kan ikkje gjerast om.", - "Formatting HyperDeck disks on device \"{{deviceName}}\"...": "Formaterer Hyperdeck-diskar på eining \"{{deviceName}}\"...", - "Failed to format HyperDecks on device: \"{{deviceName}}\": {{errorMessage}}": "Kunne ikkje formatere Hyperdecks på eining: \"{{deviceName}}\": {{errorMessage}}", - "Last seen": "Sist sett", - "Connect some devices to the playout gateway": "Kople til ein eller fleire einingar til playout-gatewayen", - "Format disks": "Formater diskar", - "Are you sure you want to delete this device: \"{{deviceId}}\"?": "Er du sikker på at du vil fjerne eininga \"{{deviceId}}\"?", - "Sofie Automation Server Core: {{name}}": "Sofie:", - "Restart this system?": "Start dette Sofie-systemet om att?", - "Are you sure you want to restart this Sofie Automation Server Core: {{name}}?": "Er du sikker på at du vil starte Sofie Core: {{name}} om att?", - "Could not generate restart token!": "Kunne ikkje generere Restart Token!", - "Could not generate restart core: {{err}}": "Kunne ikkje generere Restart Core: {{err}}", - "Sofie Automation Server Core will restart in {{time}}s...": "Sofie Core starter om att om {{time}}s...", - "Execution times": "Køyretider", - "User ID": "Brukar-id", - "Client IP": "Klient-ip", - "Method": "Metode", - "Parameters": "Parametrar", - "GUI": "Brukergrensesnitt", - "User Activity Log": "Aktivitetslogg", - "in {{days}} days, {{hours}} h {{minutes}} min {{seconds}} s": "om {{days}} dagar, {{hours}} h {{minutes}} min {{seconds}} s", - "in {{hours}} h {{minutes}} min {{seconds}} s": "om {{hours}} t {{minutes}} min {{seconds}} s", - "in {{minutes}} min {{seconds}} s": "om {{minutes}} min {{seconds}} s", - "in {{seconds}} s": "om {{seconds}} s", - "{{days}} days, {{hours}} h {{minutes}} min {{seconds}} s ago": "for {{days}} dagar, {{hours}} t {{minutes}} min {{seconds}} s sidan", - "{{hours}} h {{minutes}} min {{seconds}} s ago": "for {{hours}} t {{minutes}} min {{seconds}} s sidan", - "{{minutes}} min {{seconds}} s ago": "for {{minutes}} min {{seconds}} s sidan", - "{{seconds}} s ago": "for {{seconds}} s sidan", - "Next scheduled show": "Neste planlagde sending", - "Help & Support": "Hjelp og brukarstøtte", - "Disable hints by adding this to the URL:": "Deaktiver hint ved å legge dette til på url-en:", - "Enable hints by adding this to the URL:": "Aktiver hint ved å legge dette til på url-en:", - "More documentation available at:": "Meir dokumentasjon er tilgjengeleg på:", - "Timeline": "Tidslinje", - "Mappings": "Lagmapping", - "User Log Player": "Brukarloggspelar", - "Play from here": "Spel av frå her", - "Exectute Single": "Utfør einsleg handling", - "Next Action": "Neste handling", - "Run in": "Køyr i", - "Stop": "Stopp", - "Clip \"{{fileName}}\" can't be played because it doesn't exist on the playout system": "Klippet \"{{fileName}}\" kan ikkje spelast av fordi det ikkje finnast på utspelingssystemet", - "{{sourceLayer}} is not yet ready on the playout system": "{{sourceLayer}} er enno ikkje klar til å spelast ut fra avviklingsserver", - "{{sourceLayer}} is transferring to the playout system": "{{sourceLayer}} overførast til avviklingsserver", - "{{sourceLayer}} is transferring to the playout system and cannot be played yet": "{{sourceLayer}} overførast til avviklingsserver og kan ikkje spelast av enno", - "{{sourceLayer}} doesn't have both audio & video": "{{sourceLayer}} har ikkje lyd og/eller bilete", - "{{sourceLayer}} has the wrong format: {{format}}": "{{sourceLayer}}-formatet er ikkje støtta: {{format}}", - "{{sourceLayer}} has {{audioStreams}} audio streams": "{{sourceLayer}} har {{audioStreams}} lydstraumar", - "Clip starts with {{frames}} {{type}} frames": "Klippet startar med {{frames}} {{type}} ruter", - "This clip ends with {{type}} frames after {{count}} seconds": "Klippet sluttar med {{type}} ruter etter {{count}} sekund", - "{{frames}} {{type}} frames detected within the clip": "{{frames}} {{type}} rute oppdaga inne i klippet", - "{{frames}} {{type}} frames detected in the clip": "{{frames}} {{type}} rute oppdaga inne i klippet", - "black": "svart(e)", - "freeze": "fryst(e)", - "{{sourceLayer}} is missing a file path": "{{sourceLayer}} kan ikkje spelast av fordi filnamnet manglar", - "Clip doesn't have audio & video": "Klippet har ikkje lyd og/eller bilete", - "Clip starts with {{frames}} {{type}} frame": "Klippet startar med {{frames}} {{type}} frame", - "This clip ends with {{type}} frames after {{count}} second": "Klippet sluttar med {{frames}} {{type}} frame", - "{{frames}} {{type}} frame detected within the clip": "{{frames}} {{type}} frame oppdaga inne i klippet", - "{{frames}} {{type}} frame detected in clip": "{{frames}} {{type}} frame oppdaga i klippet", - "{{sourceLayer}} is being ingested": "{{sourceLayer}} vert prosessert", - "Source is missing": "Kjelde manglar", - "Segment no longer exists in {{nrcs}}": "Segmentet eksisterer ikkje lenger i {{nrcs}}", - "Segment was hidden in {{nrcs}}": "Tittelen eksisterer ikkje lenger i {{nrcs}}", - "The following parts no longer exist in {{nrcs}}: {{partNames}}": "Dei følgande delane eksisterer ikkje lenger i {{nrcs}}: {{partNames}}", - "Toggle Shelf": "Skuff", - "Undo Hold": "Angre hold", - "Disable the next element": "Skip neste super", - "Undo Disable the next element": "Unskip neste super", - "Move Next forwards": "Skip neste", - "Move Next to the following segment": "Skip til neste segment", - "Move Next backwards": "Unskip neste", - "Move Next to the previous segment": "Unskip neste segment", - "Rewind segments to start": "Sett segmenta tilbake til start", - "{{count}} rows°°°°°°_°°°°°°plural": "{{count}} rader°°°°°°", - "This layer is now rerouted by an active Route Set: {{routeSets}}°°°°°°_°°°°°°plural": "Dette laget vert omkopla av fleire aktive omkoplingsgrupper: {{routeSets}}°°°°°°", - "There are {{count}} documents that can be removed, do you want to continue?°°°°°°_°°°°°°plural": "Det er {{count}} dokument i {{collections}} som kan fjernast. Vil du fortsette?°°°°°°", - "Clip starts with {{frames}} {{type}} frame°°°°°°_°°°°°°plural": "Klipp startar med {{frames}} {{type}} frame°°°°°°", - "This clip ends with {{type}} frames after {{count}} second°°°°°°_°°°°°°plural": "Klipp sluttar {{frames}} {{type}} frame°°°°°°", - "{{frames}} {{type}} frame detected within the clip°°°°°°_°°°°°°plural": "{{frames}} {{type}} frame oppdaga inne i klippet°°°°°°", - "{{frames}} {{type}} frame detected in clip°°°°°°_°°°°°°plural": "{{frames}} {{type}} frame oppdaga i klippet°°°°°°" + "Account Page": "Brukarkontoside", + "Name:": "Namn:", + "Email:": "E-post:", + "Old Password": "Gammalt passord", + "New Password": "Nytt passord", + "Save Changes": "Lagre endringer", + "Edit Account": "Endre brukarkonto", + "Organization": "Organisasjon", + "User roles in organization": "Brukarroller i organisasjon", + "Studio": "Studio", + "Configurator": "Configurator", + "Developer": "Developer", + "Admin": "Admin", + "Remove Self": "Fjern denne brukarkontoen", + "Email Address": "E-postadresse", + "Password": "Passord", + "Sign in": "Logg inn", + "Create New Account": "Opprett ny brukarkonto", + "Lost password?": "Gløymd passord?", + "Send reset email": "Send e-post for å nullstille", + "Go back": "Tilbake", + "Password must be atleast 5 characters long": "Passord må vere minst 5 tegn langt", + "Enter your new password": "Skriv inn ditt nye passord", + "Set new password": "Lagre nytt passord", + "Your Account": "Din brukarkonto", + "About Your Organization": "Om din oranisasjon", + "We are mainly": "Vi er hovudsakleg", + "Areas": "Område", + "Invite User": "Inviter brukar", + "New User's Email": "Ny brukar sin e-post", + "New User's Name": "Ny brukar sitt namn", + "Create New User & Send Enrollment Email": "Opprett ny brukar og send e-post for innmelding", + "Users in organization": "Brukarar i organisasjonen", + "Return to list": "Gå tilbake til lista", + "There is no rundown active in this studio.": "Fann ingen aktive køyreplanar for dette studioet.", + "This studio doesn't exist.": "Dette studioet eksisterer ikkje.", + "There are no active rundowns.": "Fann ingen aktive køyreplanar.", + "Evaluation": "Evaluering", + "Please take a minute to fill in this form.": "Ver venleg og fyll ut dette skjemaet.", + "Be aware that while filling out the form keyboard and streamdeck commands will not be executed!": "OBS! Du kan ikkje utføra Sofie-kommandoar medan du skriv evalueringa!", + "Did you have any problems with the broadcast?": "Hadde du nokre problem under sendinga?", + "Please explain the problems you experienced (what happened and when, what should have happened, what could have triggered the problems, etcetera...)": "Ver venleg og forklar kva problem du hadde (kva hende og når hende det, kva skulle skjedd, kva kan ha utløyst problema o.s.b.)", + "Your name": "Namnet ditt", + "Save message": "Lagre melding", + "Save message and Deactivate Rundown": "Send evalueringa og deaktiver køyreplanen", + "No problems": "Ingen problem", + "Something went wrong, but it didn't affect the output": "Noko gjekk gale, men det virka ikkje inn på sendinga", + "Something went wrong, and it affected the output": "Noko gjekk gale, og det virka inn på sendinga", + "Are you sure?": "Er du sikker?", + "Trimming this clip has timed out. It's possible that the story is currently locked for writing in {{nrcsName}} and will eventually be updated. Make sure that the story is not being edited by other users.": "Endring av inn-/utpunkt for dette klippet tek lang tid. Det er mogleg manuset i er låst i {{nrcsName}} og at inn-/utpunkt endrast om litt. Forsikre deg om at manuset ikkje vert redigert av andre brukarar.", + "Trimming this clip has failed due to an error: {{error}}.": "Endring av inn-/utpunkt for dette klippet feila: {{error}}.", + "Trimmed succesfully.": "Endring av inn-/utpunkt var vellukka.", + "Trimming this clip is taking longer than expected. It's possible that the story is locked for writing in {{nrcsName}}.": "Endring av inn-/utpunkt for dette klippet tek meir tid enn forventa. Det er mogleg manuset er låst for redigering i {{nrcsName}}.", + "Trim \"{{name}}\"": "Trim \"{{name}}\"", + "OK": "OK", + "Cancel": "Avbryt", + "Remove in-trimming": "Nullstill innpunkt", + "In": "Inn", + "Remove all trimming": "Nullstill inn- og utpunkt", + "Duration": "Lengde", + "Remove out-trimming": "Nullstill utpunkt", + "Out": "Ut", + "Next": "Neste", + "Test test": "Test test", + "Until next take": "Til neste Take", + "Until next segment": "Til neste segment", + "Until end of segment": "Til slutten av segment", + "Until next rundown": "Til neste køyreplan", + "Until end of showstyle": "Til slutten av showstyle", + "Script is empty": "Manuset er tomt", + "Clip:": "Klipp:", + "Home": "Heim", + "Rundowns": "Køyreplanar", + "Test Tools": "Testverktøy", + "Status": "Status", + "Settings": "Innstillingar", + "Account": "Konto", + "Logout": "Logg ut", + "My name is {{name}}": "Mitt namn er {{name}}", + "Operating Mode": "Styringsmodus", + "Switching operating mode to {{mode}}": "Endrer styringsmodus til {{mode}}", + "Prompter": "Prompter", + "End of script": "Slutt på manus", + "Could not get system status. Please consult system administrator.": "Kan ikkje innhente status for systemet. Kontakt systemadministrator.", + "There are no rundowns ingested into Sofie.": "Det er ikkje send køyreplanar til Sofie.", + "Click on a rundown to control your studio": "Klikk på ein køyreplan for å kontrollere studioet ditt", + "Rundown": "Køyreplan", + "Problems": "Problem", + "Show Style": "Showstyle", + "On Air Start Time": "Sendestart", + "Expected End Time": "Venta sendeslutt", + "Last updated": "Sist oppdatert", + "View Layout": "Vis layout", + "Today": "I dag", + "Yesterday": "I går", + "Tomorrow": "I morgon", + "Last": "Førre", + "Getting Started": "Kom i gong", + "Start with giving this browser configuration permissions by adding this to the URL: ": "Først må du gå i konfigurasjonsmodus ved å leggje dette til i url-en: ", + "Start Here!": "Start her!", + "Then, run the migrations script:": "Køyr deretter migreringsprosedyra:", + "Run Migrations to get set up": "Køyr migreringsprosedyrar for å setje opp", + "Migrations": "Migrering", + "Documentation is available at": "Dokumentasjon er tilgjengelig på", + "Use {{nrcsName}} order": "Nytt rekkefølgje frå {{nrcsName}}", + "Reset Sort Order": "Tilbakestill rekkefølgje", + "Enable configuration mode by adding ?configure=1 to the address bar.": "Aktiver konfigurasjonsmodus ved å legge til ?configure=1 på slutten av nettadressa.", + "You need to run migrations to set the system up for operation.": "Du må køyre migrering for å klargjere systemet for bruk.", + "Sofie Automation": "Sofie", + "version": "versjon", + "System Status": "Systemstatus", + "System has issues which need to be resolved": "Systemet har problemer som må løysast", + "Status Messages:": "Statusmeldingar:", + "{{showStyleVariant}} – {{showStyleBase}}": "{{showStyleVariant}} – {{showStyleBase}}", + "Drag to reorder or move out of playlist": "Dra for å endre rekkefølgje eller flytta ut av speleliste", + "This rundown is currently active": "Denne køyreplanen er allereie aktiv", + "Not set": "Ikkje angjeve", + "This rundown will loop indefinitely": "Denne køyreplanen vil gå i ein uendeleg loop", + "({{timecode}})": "({{timecode}})", + "Re-sync rundown data with {{nrcsName}}": "Ikkje synkronisert med MOS/{{nrcsName}}", + "Delete": "Slett", + "Standalone Shelf": "Frittståande skuff", + "Rundown & Shelf": "Køyreplan & skuff", + "Default": "Standard", + "Delete rundown?": "Slette køyreplanen?", + "Are you sure you want to delete the \"{{name}}\" rundown?": "Er du viss på at du vil slette køyreplanen \"{{name}}\"?", + "Please note: This action is irreversible!": "Merk: Denne handlinga kan du ikkje angre!", + "Re-Sync rundown?": "Synkroniser køyreplanen med ENPS på ny?", + "Re-Sync": "Synkroniser", + "Are you sure you want to re-sync the \"{{name}}\" rundown?": "Er du viss på at du vil synkronisere køyreplanen \"{{name}}\" med ENPS?", + "Start time is close": "Oppgitt sendestart er kvart augeblink", + "Yes": "Ja", + "No": "Nei", + "You are in rehearsal mode, the broadcast starts in less than 1 minute. Do you want to reset the rundown and go into On-Air mode?": "Du er i testmodus og sendinga startar om mindre enn eitt minutt. Vil du laste inn køyreplanen på nytt og gjere klar til sending?", + "Hold": "Hold", + "Could not find a Piece that can be disabled.": "Kunne ikkje finne eit element som kan skippes.", + "Failed to execute take": "Kunne ikkje gjennomføre Take", + "The rundown you are trying to execute a take on is inactive, would you like to activate this rundown?": "Du prøve å gjere ein Take i ein inaktiv køyreplan. Vil du aktivere denne køyreplanen?", + "Activate (Rehearsal)": "Aktiver (testmodus)", + "Activate (On-Air)": "Aktiver (gå ON AIR)", + "Failed to activate": "Kunne ikkje aktivere", + "Something went wrong, please contact the system administrator if the problem persists.": "Noko gikk gale, kontakt systemadministrator om problemet held fram.", + "Another Rundown is Already Active!": "Ein annan køyreplan er allereie aktiv!", + "The rundown \"{{rundownName}}\" will need to be deactivated in order to activate this one.\n\nAre you sure you want to activate this one anyway?": "Køyreplanen \"{{rundownName}}\" må deaktiveres for å aktivere denne køyreplanen.\n\nEr du sikker på at du ønsker å aktivere?", + "Activate Anyway (Rehearsal)": "Aktiver uansett (testmodus)", + "Activate Anyway (On-Air)": "Aktiver uansett (gå ON AIR)", + "Do you want to activate this Rundown?": "Vil du aktivere denne køyreplanen?", + "The planned end time has passed, are you sure you want to activate this Rundown?": "Det planlagte sluttidspunktet er passert, er du sikker på at du vil aktivere denne køyreplanen?", + "Are you sure you want to activate Rehearsal Mode?": "Er du sikker på at du vil gå i testmodus?", + "Are you sure you want to deactivate this Rundown?\n(This will clear the outputs)": "Er du sikker på at du vil deaktivere denne køyreplanen?\n(Dette vil nullstille alle utgangar.)", + "The rundown can not be reset while it is active": "Ein aktivert køyreplan kan ikkje tilbakestillast", + "A snapshot of the current Running Order has been created for troubleshooting.": "Eit snapshot av den gjeldande køyreplanen har verte oppretta.", + "Prepare Studio and Activate (Rehearsal)": "Førebu studio og aktiver testmodus", + "Deactivate": "Deaktiver", + "Take": "Take", + "Reset Rundown": "Tilbakestill køyreplanen", + "Reload {{nrcsName}} Data": "Last inn {{nrcsName}}-data på nytt", + "Store Snapshot": "Lagre snapshot", + "No actions available": "Ingen køyreplanval tilgjengelege i påsynmodus", + "Add ?studio=1 to the URL to enter studio mode": "Leggje til ?admin=1 på slutten av nettadressa for å starte studiomodus", + "Exit": "Lukk", + "Error": "Feil", + "This rundown is now active. Are you sure you want to exit this screen?": "Denne køyreplanen er aktiv. Er du sikker på at du vil avslutte?", + "Invalid AdLib": "Ugyldig adlib", + "Cannot play this AdLib because it is marked as Invalid": "Kan ikkje spele av adlib fordi den er markert som ugyldig", + "Cannot play this AdLib because it is marked as Floated": "Kan ikkje spele av adlib fordi den er markert som på vent (float)", + "Not queueable": "Kan ikkje setjast i kø", + "Cannot play this adlib because source layer is not queueable": "Kan ikkje spele av adlib fordi den ikkje kan setjast i kø på kjeldelaget", + "There are no Playout Gateways connected and attached to this studio. Please contact the system administrator to start the Playout Gateway.": "Dette studioet har ingen tilkopla playout-gatewayar. Kontakt systemadministrator for å starte den.", + "Playout Gateway \"{{playoutDeviceName}}\" is now restarting.": "Playout-gateway \"{{playoutDeviceName}}\" startar om att.", + "Could not restart Playout Gateway \"{{playoutDeviceName}}\".": "Playout-gateway \"{{playoutDeviceName}}\" kunne ikkje startas om att.", + "Restart Playout": "Start Playout-gateway på ny", + "Restart CasparCG Server": "Start CasparCG på nytt", + "Do you want to restart CasparCG Server \"{{device}}\"?": "Er du sikker på at du vil starta CasparCG Server \"{{device}}\" på nytt?", + "CasparCG on device \"{{deviceName}}\" restarting...": "CasparCG på \"{{deviceName}}\" startar på nytt...", + "Failed to restart CasparCG on device: \"{{deviceName}}\": {{errorMessage}}": "Omstart av CasparCG på \"{{deviceName}}\" feila: {{errorMessage}}", + "Cancel currently pressed hotkey": "Avbryt den trykte tasten", + "Change to fullscreen mode": "Fullskjermmodus", + "Show Hotkeys": "Vis hurtigtastar", + "Take a Snapshot": "Lagre eit snapshot", + "Restart {{device}}": "Start {{device}} på ny", + "Rundown not found": "Køyreplan ikkje funnen", + "Close": "Lukk", + "Rundown for piece \"{{pieceLabel}}\" could not be found.": "Kan ikkje finne øyreplan for \"{{pieceLabel}}\".", + "This rundown has been unpublished from Sofie.": "Denne køyreplanen er ikkje lenger tilgjengeleg i Sofie.", + "Error: The studio of this Rundown was not found.": "Feil: Kan ikkje finne studioet for denne køyreplanen.", + "This playlist is empty": "Denne spelelista er tom", + "Error: The ShowStyle of this Rundown was not found.": "Feil: Kan ikkje finne showstyle for denne køyreplanen.", + "Unknown error": "Ukjend feil", + "Rundown {{rundownName}} in Playlist {{playlistName}} is missing in the data from {{nrcsName}}. You can either leave it in Sofie and mark it as Unsynced or remove the rundown from Sofie. What do you want to do?": "Køyreplanen {{rundownName}} i lista {{playlistName}} manglar i data frå {{nrcsName}}. Du kan anten markere den som ikkje synkronisert og behalde den i Sofie, eller du kan fjerne køyreplanen ifrå Sofie. Kva vil du gjere?", + "(Unknown rundown)": "(Ukjend køyreplan)", + "(Unknown playlist)": "(Ukjend køyreplanliste)", + "Leave Unsynced": "Behald ikkje-synkronisert køyreplan", + "Remove": "Fjern", + "Remove rundown": "Fjern køyreplan", + "Do you really want to remove just the rundown \"{{rundownName}}\" in the playlist {{playlistName}} from Sofie? This cannot be undone!": "Er du sikker på at du vil slette køyreplanen {{rundownName}} i lista {{playlistName}} frå Sofie? Denne handlinga kan du ikkje angre!", + "Loop Start": "Start for loop", + "Loop End": "Slutt for loop", + "(in: {{time}})": "(om: {{time}})", + "({{time}} ago)": "(for {{time}} sidan)", + "Planned Start": "Planlagt start", + "Planned Duration": "Planlagt varigheit", + "Planned End": "Planlagt slutt", + "The rundown \"{{rundownName}}\" is not published or activated in {{nrcsName}}! No data updates will currently come through.": "Køyreplanen \"{{rundownName}}\" er ikkje synkronisert med MOS/{{nrcsName}}! Kontroller at den er satt til MOS Active i ENPS.", + "Re-sync": "Synkroniser med MOS", + "Re-sync Rundown": "Synkroniser køyreplanen med ENPS på nytt", + "Are you sure you want to re-sync the Rundown?\n(If the currently playing Part has been changed, this can affect the output)": "Er du sikker på at du vil gjenopprette synkronisering mot ENPS for denne køyreplanen?\n(Dette kan virke inn på pågåande sending)", + "Restart": "Restart", + "Fixing this problem requires a restart to the host device. Are you sure you want to restart {{device}}?\n(This might affect output)": "Feilretting krever ein omstart av {{device}}. Er du sikker på at du ønsker å starta einingen på nytt?(Dette kan ha innverknad på gjennomføringa av ein igangverande sending)", + "Device \"{{deviceName}}\" restarting...": "\"{{deviceName}}\" starter på ny...", + "Failed to restart device: \"{{deviceName}}\": {{errorMessage}}": "Kunne ikkje starta \"{{deviceName}}\" om att: {{errorMessage}}", + "There is an unknown problem with the part.": "Det er eit ukjend problem med denne delen.", + "Show issue": "Vis problem", + "There is an unspecified problem with the source.": "Det er eit ikkje-spesifisert problem med kjelden.", + "External message queue has unsent messages.": "Ekstern meldingskø har meldingar som ikkje er sendt.", + "The system configuration has been changed since importing this rundown. It might not run correctly": "Systemoppsettet har verte endra etter at denne køyreplanen vart importert. Køyreplanen kan verte spelt av med feil", + "Unable to check the system configuration for changes": "Kan ikkje kontrollere endringar i systemoppsettet", + "The Studio configuration is missing some required fields:": "Studiooppsettet manglar obligatoriske felt:", + "The Show Style configuration \"{{name}}\" could not be validated": "Showstyleoppsettet \"{{name}}\" kunne ikkje validerast", + "The ShowStyle \"{{name}}\" configuration is missing some required fields:": "Showstyleoppsettet \"{{name}}\" manglar obligatoriske felt:", + "Unable to validate the system configuration": "Systemoppsettet kunne ikkje validerast", + "Device {{deviceName}} is disconnected": "{{deviceName}} er fråkopla", + "Warnings": "Åtvaringar", + "Just now": "No", + "Less than a minute ago": "Under eitt minutt sidan", + "Less than five minutes ago": "Under fem minutt sidan", + "Around 10 minutes ago": "Cirka 10 minutt sidan", + "More than 10 minutes ago": "Over 10 minutt sidan", + "More than 30 minutes ago": "Over 30 minutt sidan", + "More than 2 hours ago": "Over 2 timer sidan", + "More than 5 hours ago": "Over 5 timar sidan", + "More than a day ago": "Over ein dag sidan", + "{{nrcsName}} Connection": "{{nrcsName}}-tilkopling", + "Last update": "Nyeste oppdatering", + "Off-line devices": "Fråkoplete einingar", + "Devices with issues": "Einingar med problem", + "All connections working correctly": "Alle tilkoplingar er OK", + "Play-out": "Avspelning", + "All devices working correctly": "Alle eininger fungerer som dei skal", + "Auto": "Auto", + "Expected End": "Venta slutt", + "Next Loop at": "Neste loop starter", + "Diff": "Skilnad", + "Started": "Starta", + "Expected Start": "Venta slutt", + "{{currentRundownName}} - {{rundownPlaylistName}} (Looping)": "{{currentRundownName}} - {{rundownPlaylistName}} (Looper)", + "{{currentRundownName}} - {{rundownPlaylistName}}": "{{currentRundownName}} - {{rundownPlaylistName}}", + "{{rundownPlaylistName}} (Looping)": "{{rundownPlaylistName}} (Looper)", + "Floated AdLib": "Adlib satt på vent", + "Switchboard": "Omkoplingssentral", + "This is not in it's normal setting": "Denne innstillinga er vorte endra frå standardverdien", + "Off": "Av", + "On Air At": "On Air klokka", + "On Air In": "On Air om", + "Unsynced": "Ikkje synkronisert med MOS", + "Sources": "Kjelder", + "On Air": "On Air", + "Loops to top": "Looper til toppen", + "Show End": "Sendeslutt", + "BREAK": "PAUSE", + "Break In": "Pause om", + "part": "punkt", + "Set segment as Next": "Set tittel som neste: Startar på neste Take", + "Queue segment": "Cue tittel: Startar når aktiv tittel er ferdig", + "Clear queued segment": "Fjern cuet tittel", + "Set this part as Next": "Set dette punktet som neste: Startar på neste Take", + "Set Next Here": "Sett Neste her", + "Play from Here": "Spel av frå her", + "Zoom Out": "Zoom ut", + "Show All": "Vis Alle", + "Zoom In": "Zoom In", + "Parts Duration": "Varigheit for del", + "Unknown": "Ukjend", + "Good": "Bra", + "Minor Warning": "Mindre åtvaring (avvik)", + "Warning": "Åtvaring", + "Bad": "Feil", + "Fatal": "Kritisk", + "Connected": "Tilkopla", + "Disconnected": "Fråkopla", + "MOS Gateway": "MOS-gateway", + "Spreadsheet Gateway": "Spreadsheet-gateway", + "Play-out Gateway": "Playout-gateway", + "Media Manager": "Media Manager", + "Unknown Device": "Ukjend eining", + "Delete this Studio?": "Slett dette studioet?", + "Are you sure you want to delete the studio \"{{studioId}}\"?": "Er du sikker på at du vil slette studioet \"{{studioId}}\"?", + "Delete this Show Style?": "Slett denne showstylen?", + "Are you sure you want to delete the show style \"{{showStyleId}}\"?": "Er du sikker på at du vil slette showstylen \"{{showStyleId}}\"?", + "Delete this Blueprint?": "Slett dette blueprintet?", + "Are you sure you want to delete the blueprint \"{{blueprintId}}\"?": "Er du sikker på at du vil slette blueprintet \"{{blueprintId}}\"?", + "Remove this Device?": "Fjern denne eininga?", + "Are you sure you want to remove the device \"{{deviceName}}\" and all of it's sub-devices?": "Er du sikker på at du vil fjerne eninga \"{{deviceName}}\" og alle undereiningane?", + "Studios": "Studio", + "Unnamed Studio": "Studio utan namn", + "Show Styles": "Showstyle", + "Unnamed Show Style": "Showstyle utan namn", + "Source Layers": "Kjeldelag", + "Output Channels": "Utgangskanalar", + "Blueprints": "Blueprint", + "Unnamed blueprint": "Blueprint utan namn", + "Type": "Type", + "Version": "Versjon", + "Devices": "Einingar", + "Tools": "Verktøy", + "Core System settings": "Systeminnstillingar for Core", + "Upgrade Database": "Oppgrader databasen", + "Manage Snapshots": "Behandle snapshots", + "System Settings": "Systeminstillinger", + "Update Blueprints?": "Oppdater blueprints?", + "Update": "Oppdater", + "Are you sure you want to update the blueprints from the file \"{{fileName}}\"?": "Er du sikker på at du vil oppdatere blueprints frå fila \"{{fileName}}\"?", + "Blueprints updated successfully.": "Blueprints blei oppdatert.", + "Replace Blueprints?": "Erstatte blueprints?", + "Replace": "Erstatt", + "Are you sure you want to replace the blueprints with the file \"{{fileName}}\"?": "Er du sikker på at du vil erstatte blueprints frå fila \"{{fileName}}\"?", + "Failed to update blueprints: {{errorMessage}}": "Oppdatering av blueprints feila: {{errorMessage}}", + "Assigned Show Styles:": "Tilordna showstyles:", + "This Blueprint is not being used by any Show Style": "Dette blueprintet er ikkje i bruk av nokon showstyles", + "Assigned Studios:": "Tilordna studio:", + "This Blueprint is not compatible with any Studio": "Dette blueprintet er ikkje kompatibel med noko studio", + "Unassign": "Fjern tilordning", + "Assign": "Tilordne", + "Blueprint ID": "Blueprint-id", + "Blueprint Name": "Blueprintnamn", + "No name set": "Namn ikkje definert", + "Blueprint Type": "Blueprinttype", + "Upload a new blueprint": "Last opp eit nytt blueprint", + "Last modified": "Sist endra", + "Blueprint Id": "Blueprint-id", + "Blueprint Version": "Blueprintversjon", + "Disable version check": "Deaktiver versjonsjekk", + "Upload Blueprints": "Last opp blueprints", + "OAuth credentials succesfully uploaded.": "Opplasting av OAuth credentials var vellukka.", + "Failed to upload OAuth credentials: {{errorMessage}}": "Opplasting av OAuth credentials feila: {{errorMessage}}", + "OAuth credentials successfuly reset": "OAuth credentials nullstilt.", + "Failed to reset OAuth credentials: {{errorMessage}}": "Nullstilling av OAuth credentials feila: {{errorMessage}}", + "Reset Authentication": "Passord for autentisering", + "Application credentials": "Brukarnamn/passord (Application Credentials)", + "Access token": "Tilgongskode (Access Token)", + "Click on the link below and accept the permissions request.": "Klikk på lenka under og godta permissions-førespurnaden", + "Waiting for gateway to generate URL...": "Ventar på at gateway genererar URL...", + "Only Match Global AdLibs": "Vis kun globale adliber", + "Name": "Namn", + "Display Style": "Stil for vising", + "Show thumbnails next to list items": "Vis miniatyrbilete ved sida av listeelement", + "Button width scale factor": "Breiddeskala for knapp", + "Button height scale factor": "Høgdeskala for knapp", + "Only Display AdLibs from Current Segment": "Vis berre adliber frå gjeldande tittel", + "Include Global AdLibs": "Inkluder globale adliber", + "Filter Disabled": "Filter deaktivert", + "Include Clear Source Layer in Ad-Libs": "Ta med \"Tøm kjeldelag\" i adliber", + "Source Layer Types": "Kjeldelagstypar", + "Filter disabled": "Filter deaktivert", + "Label contains": "Etikett inneheld", + "Tags must contain": "Tagger må innehalde", + "Hide Panel from view": "Ikkje vis dette panelet", + "Show panel as a timeline": "Vis panel som ei tidslinje", + "Enable search toolbar": "Aktiver søkeverktøy", + "Overflow horizontally": "Horisontal overflyt", + "Display Take buttons": "Vis Take-knapp", + "Queue all adlibs": "Cue alle adliber", + "Toggle AdLibs on single mouse click": "Veksle mellom adliber med enkelt museklikk", + "Hide duplicated AdLibs": "Skjul dupliserte adliber", + "Picks the first instance of an adLib per rundown, identified by uniqueness Id": "Velger den første førekomsten av ein adlib i kvar køyreplan, identifisert av unik id", + "URL": "Adresse (url)", + "Display Rank": "Rangering for visning", + "Role": "Rolle", + "Adlib Rank": "Adlib-rang", + "Place label below panel": "Plasser etikett under panel", + "Disabled": "Deaktivert", + "Show segment name": "Vis tittelen sitt namn", + "Show part title": "Vis delen sin tittel", + "Hide for dynamically inserted parts": "Skjul for dynamisk innsatte delar", + "Planned Start Text": "Tekst for planlagt start", + "Text to show above show start time": "Tekst som blir vist over klokkeslett for sendestart", + "Hide Diff": "Skjul skilnad", + "Hide Planned Start": "Skjul planlagt start", + "Planned End text": "Tekst for planlagt slutt", + "Text to show above show end time": "Tekst som blir vist over klokkeslett for sendeslutt", + "Hide Planned End Label": "Skjul etikett for planlagt slutt", + "Hide Diff Label": "Skjul etikett for skilnad", + "Hide Countdown": "Skjul nedteljing", + "Hide End Time": "Skjul sendeslutt", + "Hide Label": "Skjul etikett", + "Text": "Tekst", + "Show Rundown Name": "Vis køyreplannamn", + "Segment": "Tittel", + "Part": "Del", + "X": "X", + "Y": "Y", + "Width": "Breidde", + "Height": "Høgde", + "Scale": "Skala", + "Custom Classes": "Tilpassa klasser", + "Device ID": "Eining-id", + "Device Type": "Type eining", + "Remove this item?": "Fjern dette elementet?", + "Are you sure you want to remove {{type}} \"{{deviceId}}\"?": "Er du sikker på at du vil fjerne eininga {{type}} \"{{deviceId}}\"?", + "Attached Subdevices": "Tilkopla undereiningar", + "Expected End text": "Tekst for venta slutt", + "Text to show above countdown to end of show": "Tekst som blir vist over nedteljing til venta slutt", + "Hide Expected End timing when a break is next": "Gøym nedteljing til venta slutt når neste punkt er ei pause", + "While there are still breaks coming up in the show, hide the Expected End timers": "Gøym nedteljing til venta slutt medan det framleis er pauser att i sendinga", + "Show next break timing": "Vis tid for neste pause", + "Whether to show countdown to next break": "Om nedteljing til neste pause skal visast", + "Last rundown is not break": "Siste køyreplan er inga pause", + "Don't treat the end of the last rundown in a playlist as a break": "Ikkje behandle slutten av den siste køyreplanen i ei speleliste som ei pause", + "Next Break text": "Tekst for neste pause", + "Text to show above countdown to next break": "Tekst som blir vist over nedteljing til neste pause", + "Expose as user selectable layout": "Gjer tilgjengeleg som brukarvalgt layout", + "Shelf Layout": "Layouter for skuffen", + "Mini Shelf Layout": "Layouter for miniskuff", + "Rundown Header Layout": "Layout for køyreplanen sin topptekst", + "Hide Rundown Divider": "Skjul køyreplanskilje", + "Hide rundown divider between rundowns in a playlist": "Skjul skilje mellom køyreplanar i ei speleliste", + "Show Breaks as Segments": "Vis pauser som titlar", + "Segment countdown requires source layer": "Nedteljing for tittel krev kjeldelag", + "One of these source layers must have a piece for the countdown to segment on-air to be show": "Eit av desse kjeldelaga må ha eit element for at nedteljinga til tittelen er OnAir visas", + "Fixed duration in Segment header": "Låst lengde i tittelheader", + "The segment duration in the segment header always displays the planned duration instead of acting as a counter": "Tittelen si lengde i tittelheaderen vil alltid vise den planlagde lengda i staden for å telje ned", + "Select visible Source Layers": "Vel synlege kjeldelag", + "Select visible Output Groups": "Vel synleg gruppe for utgang", + "Expose layout as a standalone page": "Gjer layout tilgjengeleg som ei sjølvstendig side", + "Open shelf by default": "Åpne skuff som standard", + "Default shelf height": "Standard høyde for skuff", + "Show Buckets": "Vis bøtter", + "Disable Context Menu": "Skruv av kontekstmeny", + "This action has an invalid combination of filters": "Denne handlinga har ein ugydlig kombinasjon av filtre", + "Use Trigger Mode": "Type utløysar", + "Force": "Tving", + "Rehearsal": "Testmodus", + "Undo": "Angre", + "Segments: {{delta}}": "Segment: {{delta}}", + "Parts: {{delta}}": "Delar: {{delta}}", + "Open": "Opne", + "Toggle": "Veklse", + "On": "På", + "Activate Rundown": "Aktiver køyreplan", + "Ad-Lib": "Adlib", + "Deactivate Rundown": "Deaktiver køyreplan", + "Disable next Piece": "Skip neste element", + "Move Next": "Skip neste", + "Reload NRCS Data": "Last inn MOS-data på nytt", + "Resync with NRCS": "Synkroniser med ENPS", + "Shelf": "Skuff", + "Rewind Segments to start": "Sett alle segment attende til start", + "Go to On Air line": "Gå til OnAir-posisjon", + "Show entire On Air Segment": "Vis heile tittelen som er OnAir", + "Force (deactivate others)": "Tving (deaktiver andre)", + "Move Segments": "Skip segment", + "Move Parts": "Skip del", + "State": "Tilstand", + "Action": "Handling", + "Ad-Lib Action": "Adlib-handling", + "Clear Source Layer": "Tøm kjeldelag", + "Sticky Piece": "Element er sticky", + "Global AdLibs": "Globale adliber", + "Label": "Etikett", + "Limit": "Grense", + "Output Layer": "Utgangslag", + "Pick": "Plukk", + "Pick last": "Plukk siste", + "Source Layer": "Kjeldelag", + "Source Layer Type": "Kjeldelagstypar", + "Tag": "Tag", + "Not Global": "Ikkje globale", + "Only Global": "Berre globale", + "OnAir": "OnAir", + "Now active rundown": "Aktiv køyreplan nett no", + "View": "Visning", + "Executes within the currently open Rundown, requires a Client-side trigger.": "Blir utførte innanfor den valde køyreplanen, men treng ein utløysar frå klienten.", + "Select Action": "Vel handling", + "No Ad-Lib matches in the current state of Rundown: \"{{rundownPlaylistName}}\"": "Ingen treff på adliber i noverande tilstand for køyeplanen: \"{{rundownPlaylistName}}\"", + "No matching Rundowns available to be used for preview": "Ingen passande køyreplanar tilgjengelege for førehandvisning", + "Multilingual description, editing will overwrite": "Endring vil overskrive fleirspråkleg skildring", + "Optional description of the action": "Valfri skildring av handlinga", + "Triggered Actions uploaded successfully.": "Opplasting av handlingsutløysarar var vellukka.", + "Triggered Actions failed to upload: {{errorMessage}}": "Opplasting av handlingsutløysarar feila: {{errorMessage}}", + "Append or Replace": "Legg til eller erstatt", + "Do you want to append these to existing Action Triggers, or do you want to replace them?": "Vil du legge desse til dei noverande handlingsutløysarane, eller vil du erstatta dei?", + "Append": "Legg til", + "Action Triggers": "Handlingsutløysarar", + "Find Trigger...": "Finn utløysar...", + "No matching Action Trigger.": "Fekk ikkje treff blant handlingsutløysar.", + "No Action Triggers set up.": "Ingen handlingsutløysarar er satt opp.", + "System-wide": "Systemvid", + "Upload stored Action Triggers": "Last opp lagra handlingsutløysarar", + "Download Action Triggers": "Last ned handlingsutløysarar", + "On release": "På slipp (\"Key up\")", + "Empty": "Tom", + "Hotkey": "Hurtigtast", + "Trigger Type": "Type utløysar", + "Failed to update config: {{errorMessage}}": "Oppdatering av konfigurasjon feila: {{errorMessage}}", + "Export": "Eksporter", + "Import": "Import", + "true": "true", + "false": "false", + "{{count}} rows": "{{count}} rader", + "Value": "Verdi", + "Create": "Opprett", + "Add config item": "Legg til konfigurasjonselement", + "Add": "Legg til", + "Item": "Element", + "Delete this item?": "Slett dette elementet?", + "Are you sure you want to delete this config item \"{{configId}}\"?": "Er du sikker på at du vil slette dette konfigurasjonselementet \"{{configId}}\"?", + "Blueprint Configuration": "Blueprintkonfigurasjon", + "More settings specific to this studio can be found here": "Meir spesifikke innstillingar for dette studioet finn du her", + "There was an error: {{error}}": "Det skjedde ein feil: {{error}}", + "Package Manager status": "Status for pakkebehandlar", + "Reload statuses": "Last inn status om att", + "Updated": "Oppdatert", + "Package Manager": "Pakkebehandlar", + "Statistics": "Statistikk", + "Times": "Tider", + "Connected Workers": "Tilkopla arbeidarar", + "Work-in-progress": "Pågåande jobbar", + "WorkForce": "Arbeidarstyrke", + "Kill (debug)": "Kill (debug)", + "Connected App Containers": "Tilkopla app-kontainere", + "No status loaded": "Ingen status lasta", + "Peripheral Device is outdated": "Tilkopla eining er utdatert", + "The config UI is now driven by manifests fed by the device. This device needs updating to provide the configManifest to be configurable": "Brukergrensesnitt for konfigurasjon drivast no av manifest mata frå einingane. Denne einga må oppdaterast for å gjere configManifest konfigurerbart", + "Are you sure you want to restart this device?": "Er du sikker på at du vil starte denne eininga på nytt?", + "Restart this Device?": "Start denne eininga på nytt?", + "Check the console for troubleshooting data from device \"{{deviceName}}\"!": "Sjekk konsollen for feilsøkingsdata frå eninga \"{{deviceName}}\"!", + "There was an error when troubleshooting the device: \"{{deviceName}}\": {{errorMessage}}": "Det hende ein feil under feilsøking av eininga \"{{deviceName}}\": {{errorMessage}}", + "Generic Properties": "Generelle eigenskapar", + "Device Name": "Einingsnamn", + "Restart Device": "Start eining på nytt", + "Troubleshoot": "Feilsøk", + "Reset Database Version": "Nullstill databaseversjon", + "Are you sure you want to reset the database version?\nOnly do this if you plan on running the migration right after.": "Er du sikker på at du vil nullstille databaseversjonen?\nBerre gjer dette om du har tenkt å køyre ei migrering med ein gong.", + "Version for {{name}}: From {{fromVersion}} to {{toVersion}}": "Versjon for {{name}}: Frå {{fromVersion}} til {{toVersion}}", + "Re-check": "Sjekk om att", + "Reset Version to": "Nullstill versjon til", + "Reset All Versions": "Nullstill alle versjonar", + "Migrate database": "Migrer database", + "All steps": "Alle steg", + "The migration consists of several phases, you will get more options after you've this migration": "Migreringa har fleire fasar, du vil få fleire val etter at du har køyrd denne migreringa", + "The migration can be completed automatically.": "Migreringa kan gjerast ferdig automatisk.", + "Run automatic migration procedure": "Køyr automatisk migreringsprosedyre", + "The migration procedure needs some help from you in order to complete, see below:": "Migreringsprosedyra treng litt hjelp frå deg for å gjere seg ferdig. Sjå under:", + "Double-check Values": "Dobbeltsjekk verdiar", + "Are you sure the values you have entered are correct?": "Er du sikker på at verdiane du har oppgitt er korrekte?", + "Run Migration Procedure": "Køyr migreringsprosedyre", + "Warnings During Migration": "Åtvaringar under migrering", + "Please check the database related to the warnings above. If neccessary, you can": "Ver vennleg og sjekk databasen tilknytta åtvaringane over. Om det er naudsynt kan du", + "Force Migration": "Tving migrering", + "Are you sure you want to force the migration? This will bypass the migration checks, so be sure to verify that the values in the settings are correct!": "Er du sikker på at du vil tvinge migreringa? Dette gjer at du hoppar over migreringskontrollane, så ver sikker på at verdiane oppgitt i innstillingar er korrekte!", + "Force Migration (unsafe)": "Tving migrering (utrygt)", + "The migration was completed successfully!": "Migreringa var vellukka!", + "All is well, go get a": "Alt er greitt, gå og finn deg ein", + "New Layout": "Ny layout", + "Button": "Knapp", + "New Filter": "Nytt filter", + "Delete layout?": "Slett layout?", + "Are you sure you want to delete the shelf layout \"{{name}}\"?": "Er du sikker på at du vil slette layouten \"{{name}}\"?", + "Action Buttons": "Handlingsknappar", + "Icon": "Ikon", + "Icon color": "Ikonfarge", + "Filters": "Filtre", + "There are no filters set up yet": "Det er ikkje satt opp noko filter enno", + "Default Layout": "Standardlayout", + "Add {{filtersTitle}}": "Legg til {{filtersTitle}}", + "Add filter": "Legg til filter", + "Add button": "Legg til knapp", + "Upload Layout?": "Last opp layout?", + "Upload": "Last opp", + "Are you sure you want to upload the shelf layout from the file \"{{fileName}}\"?": "Er du sikker på at du vil laste opp layout for skuff frå fila \"{{fileName}}\"?", + "Shelf layout uploaded successfully.": "Opplasting av layout for skuff var vellukka.", + "Failed to upload shelf layout: {{errorMessage}}": "Opplasting av layout feila: {{errorMessage}}", + "Show Style Base Name": "Showstylenamn", + "Blueprint": "Blueprint", + "Blueprint not set": "Blueprint ikkje valt", + "Compatible Studios:": "Kompatible studio:", + "This Show Style is not compatible with any Studio": "Denne showstylen er ikkje kompatibelt med noko studio", + "Camera": "Kamera", + "Graphics": "Grafikk", + "Live Speak": "STK", + "Lower Third": "Super", + "Studio Microphone": "Studiomikrofon", + "Remote Source": "RM", + "Generic Script": "Generisk manus", + "Split Screen": "Splitt", + "Clips": "Klipp", + "Metadata": "Metadata", + "Camera Movement": "Kamerarørsle", + "Unknown Layer": "Ukjend lag", + "Audio Mixing": "Lydmiksing", + "Transition": "Effekt", + "Lights": "Lys", + "Local": "Lokal", + "New Source": "Ny kjelde", + "Are you sure you want to delete source layer \"{{sourceLayerId}}\"?": "Er du sikker på at du vil slette kjeldelaget \"{{sourceLayerId}}\"?", + "Source Name": "Kjeldenamn", + "Source Abbreviation": "Kjeldeforkorting", + "Internal ID": "Intern-id", + "Source Type": "Kjeldetype", + "Is a Live Remote Input": "Er ein RM", + "Is a Guest Input": "Er ein gjesteinngang", + "Is hidden": "Er skjult", + "Pieces on this layer can be cleared": "Element på dette laget kan tømmas", + "Pieces on this layer are sticky": "Element på dette laget er sticky", + "Only Pieces present in rundown are sticky": "Kun element til stades i køyreplanen er sticky", + "Allow disabling of Pieces": "Tillat deaktivering av element", + "AdLibs on this layer can be queued": "Adliber på dette laget kan cues", + "Exclusivity group": "Ekslusivitetgruppe", + "Add some source layers (e.g. Graphics) for your data to appear in rundowns": "Legg til kjeldelag (til dømes Grafikk) for å vise dine data i køyreplanar", + "No source layers set": "Ingen kjeldelag definert", + "Delete this output?": "Slett denne utgangen?", + "Are you sure you want to delete source layer \"{{outputId}}\"?": "Er du sikker på at du vil slette kjeldelaget \"{{outputId}}\"?", + "New Output": "Ny utgang", + "Channel Name": "Kanalnavn", + "Is PGM Output": "Er programutgang", + "Is collapsed by default": "Er minimert som standard", + "Is flattened": "Er slått saman", + "Output channels are required for your studio to work": "Utgangskanalar er naudsynte for at studioet ditt skal fungere", + "Output channels": "Utgangskanalar", + "No output channels set": "Ingen utgangskanal definert", + "No PGM output": "Ingen programutgang", + "Key": "Key", + "Custom Hotkey Labels": "Eigendefinerte etikettar for hurtigtastar", + "Remove this Variant?": "Fjern denne varianten?", + "Are you sure you want to remove the variant \"{{showStyleVariantId}}\"?": "Er du sikker på at du vil fjerne denne showstylevarianten \"{{showStyleVariantId}}\"?", + "Unnamed variant": "Variant utan namn", + "Variant Name": "Variantnamn", + "Variants": "Variantar", + "Restore from this Snapshot file?": "Tilbakestill frå denne snapshotfila?", + "Are you sure you want to restore the system from the snapshot file \"{{fileName}}\"?": "Er du sikker på at du vil tilbakestille systemet frå denne snapshotfila \"{{fileName}}\"?", + "Successfully restored snapshot": "Tilbakestilling frå snapshot var vellukka", + "Snapshot restore failed: {{errorMessage}}": "Tilbakestilling frå snapshot feila: {{errorMessage}}", + "Full System Snapshot": "Fullt systemsnapshot", + "A Full System Snapshot contains all system settings (studios, showstyles, blueprints, devices, etc.)": "Eit fullt systemsnapshot inneheld alle systeminnstillingar (studio, showstyles, blueprints, einingar o.s.b.)", + "Take a Full System Snapshot": "Lagre eit fullt systemsnapshot", + "Studio Snapshot": "Studiosnapshot", + "A Studio Snapshot contains all system settings related to that studio": "Eit studiosnapshot inneheld alle systeminnstillingar knytt til eit studio", + "Take a Snapshot for studio \"{{studioName}}\" only": "Lagre eit studiosnapshot utelukkande for \"{{studioName}}\"", + "Restore from Snapshot File": "Tilbakestill frå snapshotfil", + "Upload Snapshot": "Last opp snapshot", + "Restore from Stored Snapshots": "Tilbakestill frå lagra snapshots", + "Restore": "Tilbakestill", + "Show \"Remove snapshots\"-buttons": "Vis \"Fjern snapshots\"-knappar", + "Remove this device?": "Fjern denne eininga?", + "Are you sure you want to remove device \"{{deviceId}}\"?": "Er du sikker på at du vil fjerne eininga \"{{deviceId}}\"?", + "Devices are needed to control your studio hardware": "Einingar er naudsynte for å kontrollere utstyr i studioet ditt", + "Attached Devices": "Tilkopla eingingar", + "No devices connected": "Ingen einingar tilkopla", + "Playout gateway not connected": "Playout-gateway ikkje tilkopla", + "Remove this mapping?": "Fjern denne mappinga?", + "Are you sure you want to remove mapping for layer \"{{mappingId}}\"?": "Er du sikker på at du fil fjerne mappinga for laget \"{{mappingId}}\"?", + "This layer is now rerouted by an active Route Set: {{routeSets}}": "Dette laget vert omkopla av ei aktiv omkoplingsgruppe: {{routeSets}}", + "Layer ID": "Lag-id", + "ID of the timeline-layer to map to some output": "Lag-id for tidslinjelaget som skal mappast til ein utgang", + "Layer Name": "Lagnamn", + "Human-readable name of the layer": "Lesarvenleg lagnamn", + "The type of device to use for the output": "Einingtype som skal nyttast for utgangen", + "ID of the device (corresponds to the device ID in the peripheralDevice settings)": "Eining-id (korresponderer med enhets-id under enhetsinnstillinger)", + "Lookahead Mode": "Lookahead-modus", + "Lookahead Target Objects (Default = 1)": "Lookahead målobjekter (standard = 1)", + "Lookahead Maximum Search Distance (Default = {{limit}})": "Lookahead maksimum søkelengde (standard = {{limit}})", + "Layer Mappings": "Lagmapping", + "Add a playout device to the studio in order to edit the layer mappings": "For å kunne redigere lagmappingar, må du leggje til ein playout-eining til studio", + "Remove this Exclusivity Group?": "Fjern frå denne eksklusivitetgruppa?", + "Are you sure you want to remove exclusivity group \"{{eGroupName}}\"?\nRoute Sets assigned to this group will be reset to no group.": "Er du sikker på at du vil fjerne eksklusivitetsgruppa \"{{eGroupName}}\"?\nOmkoplingar satt til denne gruppa vil bli resatt til inga gruppe.", + "Remove this Route from this Route Set?": "Fjern denne omkoplinga frå denne omkoplingsgruppa?", + "Are you sure you want to remove the Route from \"{{sourceLayerId}}\" to \"{{newLayerId}}\"?": "Er du sikker på at du vil fjerne omkoplinga frå \"{{sourceLayerId}}\" til \"{{newLayerId}}\"?", + "Remove this Route Set?": "Fjern denne omkoplingsgruppa?", + "Are you sure you want to remove the Route Set \"{{routeId}}\"?": "Er du sikker på at du vil fjerne omkoplingsgruppa \"{{routeId}}\"?", + "Routes": "Omkoplingar", + "There are no routes set up yet": "Det er ikkje satt opp omkoplingar enno", + "Original Layer": "Opprinneleg lag", + "None": "Ingen", + "New Layer": "Nytt lag", + "Source Layer not found": "Kjeldelag ikkje funnen", + "There are no exclusivity groups set up.": "Ingen eksklusivitetsgrupper er satt opp.", + "Exclusivity Group ID": "Eksklusivitetgruppe-id", + "Exclusivity Group Name": "Eksklusivitetgruppenamn", + "Display name of the Exclusivity Group": "Eksklusivitetsgruppa sitt namn som visast i oversikten", + "Active": "Aktiv", + "Not Active": "Inaktiv", + "Not defined": "Ikkje definert", + "There are no Route Sets set up.": "Det er ikkje satt opp omkoplingar enno.", + "Route Set ID": "Omkoplingsgruppe-id", + "Is this Route Set currently active": "Er denne omkoplingsgruppa aktiv no", + "Default State": "Standardtilstand", + "The default state of this Route Set": "Standardtilstand for denne omkoplingsgruppa", + "Route Set Name": "Omkoplingsgruppa sitt namn", + "Display name of the Route Set": "Omkoplingsgruppa sitt namn som visast i oversikten", + "If set, only one Route Set will be active per exclusivity group": "Berre ei omkoplingsgruppe vere aktiv per eksklusivitetsgruppe når dette er kryssa av for", + "Behavior": "Oppførsel", + "The way this Route Set should behave towards the user": "Måten denne omkoplingsgruppa skal oppføre seg overfor brukaren", + "Route Sets": "Omkoplingsgrupper", + "Add a playout device to the studio in order to configure the route sets": "For å kunne redigere omkoplingsgrupper, må du leggje til ein playout-eining til studio", + "Controls for exposed Route Sets will be displayed to the producer within the Rundown View in the Switchboard.": "Kontroller for eksponerte omkoplingsgrupper vil verte synt for producer i køyreplansvisninga i omkoplingspanelet.", + "Exclusivity Groups": "Ekslusivitetgrupper", + "Remove this Package Container?": "Fjern denne pakkecontaineren?", + "Are you sure you want to remove the Package Container \"{{containerId}}\"?": "Er du sikker på at du vil fjerne pakkecontaineren \"{{containerId}}\"?", + "There are no Package Containers set up.": "Det er ikkje satt opp pakkekontainere enno.", + "Package Container ID": "Pakkekontainer-id", + "Display name/label of the Package Container": "Vis namn/merkelapp for pakkekontaineren", + "Playout devices which uses this package container": "Playout-einingar som nyttar denne pakkekontaineren", + "Select playout devices": "Vel playout-eining", + "Select which playout devices are using this package container": "Vel kva for nokre playout-einingar som skal nytte denne pakkekontaineren", + "Accessors": "Aksessorer", + "Remove this Package Container Accessor?": "Fjern denne pakkekontainer-aksessoren?", + "Are you sure you want to remove the Package Container Accessor \"{{accessorId}}\"?": "Er du sikker på at du vil fjerne pakkekontainer-aksessoren \"{{accessorId}}\"?", + "There are no Accessors set up.": "Ingen aksessorer er satt opp.", + "Accessor ID": "Aksessor-id", + "Display name of the Package Container": "Pakkekontaineren sitt namn som visast i oversikten", + "Accessor Type": "Aksessortype", + "Folder path": "Mappesti", + "File path to the folder of the local folder": "Sti til lokal mappe", + "Resource Id": "Ressurs-id", + "(Optional) This could be the name of the computer on which the local folder is on": "(Valfri) Dette kan vere namnet til datamaskinen som den lokale mappa er på", + "Base URL": "Base-url", + "Base url to the resource (example: http://myserver/folder)": "Base-url for ressursen (døme: http://minserver/mappe)", + "Network Id": "Nettverk-id", + "(Optional) A name/identifier of the local network where the share is located, leave empty if globally accessible": "(Valfri) Eit namn/ein identifikator for det lokale nettverket der den delte mappa er lokalisert, la vere tom om den er globalt tilgjengeleg", + "Folder path to shared folder": "Sti til delt mappe", + "UserName": "Brukernamn", + "Username for athuentication": "Brukarnamn for autentisering", + "Password for authentication": "Passord for autentisering", + "(Optional) A name/identifier of the local network where the share is located": "(Valfri) Eit namn/ein identifikator for det lokale nettverket der den delte mappa er lokalisert", + "Quantel gateway URL": "Quantel Gateway-adresse (url)", + "URL to the Quantel Gateway": "Start Quantel-gateway om att", + "ISA URLs": "ISA-adresse (url)", + "URLs to the ISAs, in order of importance (comma separated)": "Adresser (url-er) for ISA-ene (kommaseparert i prioritert rekkefølgje)", + "Zone ID": "Sone-id", + "Zone ID (default value: \"default\")": "Sone-id (standardverdi: \"default\")", + "Server ID": "Server-id", + "Server ID. For sources, this should generally be omitted (or set to 0) so clip-searches are zone-wide. If set, clip-searches are limited to that server.": "Server-id (Må droppast for kjelder, sidan klippsøk skjer i heile sona.)", + "Quantel transformer URL": "Quantel Transformer-adresse (url)", + "URL to the Quantel HTTP transformer": "Adresse til Quantel HTTP transformer", + "Quantel FileFlow URL": "Quantel GatewayFileFlow-adresse (url)", + "URL to the Quantel FileFlow Manager": "Adresse til Quantel FileFlow Manager", + "Quantel FileFlow Profile name": "Quantel FileFlow profilnavn", + "Profile name to be used by FileFlow when exporting the clips": "Profilnamn som blir nytta av FileFlow når klippa vert eksportert", + "Allow Read access": "Tillat lesing", + "Allow Write access": "Tillat skriving/lagring", + "Studio Settings": "Studioinnstillingar", + "Package Containers to use for previews": "Pakkekontainere som skal nyttast til førehandsvisingar", + "Click to show available Package Containers": "Klikk for å vise tilgjengelege pakkekntainere", + "Package Containers to use for thumbnails": "Pakkekontainere som skal nyttast til miniatyrbilete", + "Package Containers": "Pakkekontainere", + "Studio Baseline needs update: ": "Studio baseline treng oppdatering: ", + "Baseline needs reload, this studio may not work until reloaded": "Baseline må lastast om att, dette studioet vil kanskje ikkje fungere før baseline er lasta om att", + "Reload Baseline": "Last inn baseline om att", + "Studio Name": "Studionamn", + "Select Compatible Show Styles": "Vel kompatible showstyles", + "Show style not set": "Showstyle ikkje satt", + "Click to show available Show Styles": "Klikk for å vise tilgjengelege showstyles", + "Frame Rate": "Framerate", + "Enable \"Play from Anywhere\"": "Slå på \"Play from Anywhere\"", + "Media Preview URL": "Førehandsvisningsadresse (url)", + "Sofie Host URL": "Sofie vertadresse (url)", + "Slack Webhook URLs": "Slack Webhook-adresser (url)", + "Supported Media Formats": "Støtta medieformat", + "Supported Audio Formats": "Støtta lydformat", + "Force the Multi-gateway-mode": "Tving multigateway-modus", + "Multi-gateway-mode delay time": "Delaytid for multigateway-modus", + "Remove indexes": "Fjern indexer", + "This will remove {{indexCount}} old indexes, do you want to continue?": "Dette vil fjerne {{indexCount}} gamle indexer. Vil du fortsette?", + "{{indexCount}} indexes was removed.": "{{indexCount}} indexer vart fjerna.", + "Installation name": "Installasjonsnamn", + "This name will be shown in the title bar of the window": "Dette namnet vert vist i tittellinja for vindauget", + "Logging level": "Loggenivå", + "This affects how much is logged to the console on the server": "Dette påverkar kor mykje som blir logga til serverkonsollen", + "System-wide Notification Message": "Lokal systemmelding", + "Message": "Melding", + "Enabled": "Aktivert", + "Edit Support Panel": "Rediger supportpanel", + "HTML that will be shown in the Support Panel": "HTML-kode som vert vist i supportpanelet", + "Application Performance Monitoring": "Overvaking av yting for applikasjonar (AMP)", + "APM Enabled": "AMP aktivert", + "APM Transaction Sample Rate": "Prøvefrekvens for AMP-transaksjonar", + "How many of the transactions to monitor. Set to -1 to log nothing (max performance), 0.5 to log 50% of the transactions, 1 to log all transactions": "Tal på transaksjonar som overvakast. Set verdien til -1 for å ikkje logge noko (maks yting), til 0.5 for å logge halvparten av transaksjonane eller til 1 for å logge alle transaksjonane", + "Note: Core needs to be restarted to apply these settings": "Merknad: Core må startast om att for å ta i bruk desse innstillingane", + "Enable": "Aktivert", + "Cron jobs": "Cron-jobbar", + "Enable CasparCG restart job": "Aktiver CasparCG restartjobbar", + "Cleanup": "Opprydding", + "Cleanup old database indexes": "Rydd opp i gamle databaseindexer", + "Cleanup old data": "Rydd opp i gamle data", + "Disable CasparCG restart job": "Deaktiver CasparCG restartjobbar", + "Remove old data from database": "Fjern gamle data frå databasen", + "There are {{count}} documents that can be removed, do you want to continue?": "Det er {{count}} dokument som kan fjernast. Vil du fortsette?", + "Documents to be removed:": "Dokument som vert fjerna:", + "Retry": "Prøv igjen", + "Remove old data": "Fjern gamle data", + "The old data was removed.": "Gamle data vart fjerna.", + "Last {{layerName}}": "Siste {{layerName}}", + "Clear {{layerName}}": "Tøm {{layerName}}", + "Search...": "Søk...", + "Are you sure you want to deactivate this Rundown\n(This will clear the outputs)": "Er du sikker på at du vil deaktivere denne køyreplanen?\n(Dette vil nullstille alle utgangar.)", + "Successfully stored snapshot": "Tilbakestilling frå snapshot var vellukka", + "End Words": "Stikkord", + "Global AdLib": "Globale adliber", + "AdLib does not provide any options": "Adlib har ingen val", + "Execute": "Utfør", + "Save to Bucket": "Lagre til bøtte", + "Reveal in Shelf": "Vis i skuff", + "Edit in Nora": "Rediger i Nora", + "Current Part": "Noverande del", + "Next Part": "Neste del", + "Part Count Down": "Nedteljing for del", + "Part Count Up": "Opptelling for del", + "Until end of rundown": "Til slutten av køyreplanen", + "New Bucket": "Ny bøtte", + "Are you sure you want to delete this AdLib?": "Er du sikker på at du vil slette denne adliben?", + "Are you sure you want to delete this Bucket?": "Er du sikker på at du vil slette denne bøtta?", + "Are you sure you want to empty (remove all adlibs inside) this Bucket?": "Er du sikker på at du vil tømme denne bøtta (fjerner alle adliber)?", + "Current Segment": "Noverande tittel", + "Next Segment": "Neste tittel", + "Segment Count Down": "Nedteljing for tittel", + "Segment Count Up": "Oppteljing for tittel", + "Start this AdLib": "Start denne adliben", + "Queue this AdLib": "Cue denne adliben", + "Inspect this AdLib": "Inspiser denne adliben", + "Rename this AdLib": "Gi denne adliben nytt namn", + "Delete this AdLib": "Slett denne adliben", + "Empty this Bucket": "Tøm denne bøtta", + "Rename this Bucket": "Gi bøtta nytt namn", + "Delete this Bucket": "Slett denne bøtta", + "Create new Bucket": "Opprett ny bøtte", + "AdLib": "Adlib", + "Shortcuts": "Hurtigtastar", + "Show Style Variant": "Showstylevariant", + "Local Time": "Lokal tid", + "System": "System", + "Media": "Media", + "Packages": "Pakker", + "Messages": "Meldingar", + "User Log": "Brukarlogg", + "Evaluations": "Evalueringar", + "Timestamp": "Tidsstempel", + "User Name": "Brukernamn", + "Answers": "Svar", + "Message Queue": "Kø for meldingar", + "Queued Messages": "Meldingar i kø", + "Sent Messages": "Sendte meldingar", + "File Copy": "Kopier fil", + "File Delete": "Slett fil", + "Check file size": "Sjekk filstorleik", + "Scan File": "Scan fil", + "Generate Thumbnail": "Generer miniatyrbilete", + "Generate Preview": "Generer førehandsvisning", + "Unknown action: {{action}}": "Ukjent handling", + "Done": "Utført", + "Failed": "Mislukka", + "Working, Media Available": "Arbeider, media er tilgjengeleg", + "Working": "Arbeider", + "Pending": "Venter", + "Blocked": "Blokkert", + "Canceled": "Avbrote", + "Idle": "Inaktiv", + "Skipped": "Hoppa over", + "Step progress: {{progress}}": "Framdrift: {{progress}}", + "Processing": "Prosesserer", + "Unknown: {{status}}": "Ukjend: {{status}}", + "Collapse": "Minimer", + "Details": "Detaljar", + "Abort": "Avbryt", + "Prioritize": "Prioriter", + "Media Transfer Status": "Status for medieoverføringar", + "Abort All": "Avbryt alle", + "Restart All": "Start alle på ny", + "Unknown Package \"{{packageId}}\"": "Ukjend pakke \"{{packageId}}\"", + "Package Status": "Pakkestatus", + "Package container status": "Status for pakkekontainer", + "Id": "Id", + "Work status": "Jobbstatus", + "Restart All jobs": "Start alle jobbar om att", + "Created": "Oppretta", + "Ready": "Klar", + "The progress of steps required for playout": "Framdrift for steg som er naudsynte for avspeling", + "The progress of all steps": "Framdrift for alle steg", + "This step is required for playout": "Dette steget er naudsynt for avspeling", + "Work description": "Jobbskildring", + "Work status reason": "Årsak for jobbstatus", + "Technical reason: {{reason}}": "Teknisk årsak: {{reason}}", + "Previous work status reasons": "Tidlegare årsakar for jobbsatus", + "Priority": "Prioritet", + "Not Connected": "Ikkje tilkopla", + "Do you want to restart CasparCG Server?": "Er du sikker på at du vil starte CasparCG om att?", + "Restart Quantel Gateway": "Start Quantel-gateway om att", + "Do you want to restart Quantel Gateway?": "Er du sikker på at du vil starte Quantel-gateway om att?", + "Quantel Gateway restarting...": "Quantel-gateway startar om att...", + "Failed to restart Quantel Gateway: {{errorMessage}}": "Kunne ikkje starta Quantel-gateway om att: {{errorMessage}}", + "Format HyperDeck disks": "Formater Hyperdeck-diskar", + "Do you want to format the HyperDeck disks? This is a destructive action and cannot be undone.": "Ynskjer du å formatere Hyperdeck-diskar? Dette kan ikkje gjerast om.", + "Formatting HyperDeck disks on device \"{{deviceName}}\"...": "Formaterer Hyperdeck-diskar på eining \"{{deviceName}}\"...", + "Failed to format HyperDecks on device: \"{{deviceName}}\": {{errorMessage}}": "Kunne ikkje formatere Hyperdecks på eining: \"{{deviceName}}\": {{errorMessage}}", + "Last seen": "Sist sett", + "Connect some devices to the playout gateway": "Kople til ein eller fleire einingar til playout-gatewayen", + "Format disks": "Formater diskar", + "Are you sure you want to delete this device: \"{{deviceId}}\"?": "Er du sikker på at du vil fjerne eininga \"{{deviceId}}\"?", + "Sofie Automation Server Core: {{name}}": "Sofie:", + "Restart this system?": "Start dette Sofie-systemet om att?", + "Are you sure you want to restart this Sofie Automation Server Core: {{name}}?": "Er du sikker på at du vil starte Sofie Core: {{name}} om att?", + "Could not generate restart token!": "Kunne ikkje generere Restart Token!", + "Could not generate restart core: {{err}}": "Kunne ikkje generere Restart Core: {{err}}", + "Sofie Automation Server Core will restart in {{time}}s...": "Sofie Core starter om att om {{time}}s...", + "Execution times": "Køyretider", + "User ID": "Brukar-id", + "Client IP": "Klient-ip", + "Method": "Metode", + "Parameters": "Parametrar", + "GUI": "Brukergrensesnitt", + "User Activity Log": "Aktivitetslogg", + "in {{days}} days, {{hours}} h {{minutes}} min {{seconds}} s": "om {{days}} dagar, {{hours}} h {{minutes}} min {{seconds}} s", + "in {{hours}} h {{minutes}} min {{seconds}} s": "om {{hours}} t {{minutes}} min {{seconds}} s", + "in {{minutes}} min {{seconds}} s": "om {{minutes}} min {{seconds}} s", + "in {{seconds}} s": "om {{seconds}} s", + "{{days}} days, {{hours}} h {{minutes}} min {{seconds}} s ago": "for {{days}} dagar, {{hours}} t {{minutes}} min {{seconds}} s sidan", + "{{hours}} h {{minutes}} min {{seconds}} s ago": "for {{hours}} t {{minutes}} min {{seconds}} s sidan", + "{{minutes}} min {{seconds}} s ago": "for {{minutes}} min {{seconds}} s sidan", + "{{seconds}} s ago": "for {{seconds}} s sidan", + "Next scheduled show": "Neste planlagde sending", + "Help & Support": "Hjelp og brukarstøtte", + "Disable hints by adding this to the URL:": "Deaktiver hint ved å legge dette til på url-en:", + "Enable hints by adding this to the URL:": "Aktiver hint ved å legge dette til på url-en:", + "More documentation available at:": "Meir dokumentasjon er tilgjengeleg på:", + "Timeline": "Tidslinje", + "Mappings": "Lagmapping", + "User Log Player": "Brukarloggspelar", + "Play from here": "Spel av frå her", + "Exectute Single": "Utfør einsleg handling", + "Next Action": "Neste handling", + "Run in": "Køyr i", + "Stop": "Stopp", + "Clip \"{{fileName}}\" can't be played because it doesn't exist on the playout system": "Klippet \"{{fileName}}\" kan ikkje spelast av fordi det ikkje finnast på utspelingssystemet", + "{{sourceLayer}} is not yet ready on the playout system": "{{sourceLayer}} er enno ikkje klar til å spelast ut fra avviklingsserver", + "{{sourceLayer}} is transferring to the playout system": "{{sourceLayer}} overførast til avviklingsserver", + "{{sourceLayer}} is transferring to the playout system and cannot be played yet": "{{sourceLayer}} overførast til avviklingsserver og kan ikkje spelast av enno", + "{{sourceLayer}} doesn't have both audio & video": "{{sourceLayer}} har ikkje lyd og/eller bilete", + "{{sourceLayer}} has the wrong format: {{format}}": "{{sourceLayer}}-formatet er ikkje støtta: {{format}}", + "{{sourceLayer}} has {{audioStreams}} audio streams": "{{sourceLayer}} har {{audioStreams}} lydstraumar", + "Clip starts with {{frames}} {{type}} frames": "Klippet startar med {{frames}} {{type}} ruter", + "This clip ends with {{type}} frames after {{count}} seconds": "Klippet sluttar med {{type}} ruter etter {{count}} sekund", + "{{frames}} {{type}} frames detected within the clip": "{{frames}} {{type}} rute oppdaga inne i klippet", + "{{frames}} {{type}} frames detected in the clip": "{{frames}} {{type}} rute oppdaga inne i klippet", + "black": "svart(e)", + "freeze": "fryst(e)", + "{{sourceLayer}} is missing a file path": "{{sourceLayer}} kan ikkje spelast av fordi filnamnet manglar", + "Clip doesn't have audio & video": "Klippet har ikkje lyd og/eller bilete", + "Clip starts with {{frames}} {{type}} frame": "Klippet startar med {{frames}} {{type}} frame", + "This clip ends with {{type}} frames after {{count}} second": "Klippet sluttar med {{frames}} {{type}} frame", + "{{frames}} {{type}} frame detected within the clip": "{{frames}} {{type}} frame oppdaga inne i klippet", + "{{frames}} {{type}} frame detected in clip": "{{frames}} {{type}} frame oppdaga i klippet", + "{{sourceLayer}} is being ingested": "{{sourceLayer}} vert prosessert", + "Source is missing": "Kjelde manglar", + "Segment no longer exists in {{nrcs}}": "Segmentet eksisterer ikkje lenger i {{nrcs}}", + "Segment was hidden in {{nrcs}}": "Tittelen eksisterer ikkje lenger i {{nrcs}}", + "The following parts no longer exist in {{nrcs}}: {{partNames}}": "Dei følgande delane eksisterer ikkje lenger i {{nrcs}}: {{partNames}}", + "Toggle Shelf": "Skuff", + "Undo Hold": "Angre hold", + "Disable the next element": "Skip neste super", + "Undo Disable the next element": "Unskip neste super", + "Move Next forwards": "Skip neste", + "Move Next to the following segment": "Skip til neste segment", + "Move Next backwards": "Unskip neste", + "Move Next to the previous segment": "Unskip neste segment", + "Rewind segments to start": "Sett segmenta tilbake til start", + "{{count}} rows°°°°°°_°°°°°°plural": "{{count}} rader°°°°°°", + "This layer is now rerouted by an active Route Set: {{routeSets}}°°°°°°_°°°°°°plural": "Dette laget vert omkopla av fleire aktive omkoplingsgrupper: {{routeSets}}°°°°°°", + "There are {{count}} documents that can be removed, do you want to continue?°°°°°°_°°°°°°plural": "Det er {{count}} dokument i {{collections}} som kan fjernast. Vil du fortsette?°°°°°°", + "Clip starts with {{frames}} {{type}} frame°°°°°°_°°°°°°plural": "Klipp startar med {{frames}} {{type}} frame°°°°°°", + "This clip ends with {{type}} frames after {{count}} second°°°°°°_°°°°°°plural": "Klipp sluttar {{frames}} {{type}} frame°°°°°°", + "{{frames}} {{type}} frame detected within the clip°°°°°°_°°°°°°plural": "{{frames}} {{type}} frame oppdaga inne i klippet°°°°°°", + "{{frames}} {{type}} frame detected in clip°°°°°°_°°°°°°plural": "{{frames}} {{type}} frame oppdaga i klippet°°°°°°" } diff --git a/packages/webui/public/locales/sv/translations.json b/packages/webui/public/locales/sv/translations.json index abffc22030..8f51159410 100644 --- a/packages/webui/public/locales/sv/translations.json +++ b/packages/webui/public/locales/sv/translations.json @@ -1,23 +1,23 @@ { - "Return to list": "Återgå till listan", - "Home": "Hem", - "Rundowns": "Körscheman", - "Nyman's Playground": "Tester", - "Status": "Status", - "ID": "ID", - "Created": "Skapad", - "Air Status": "Sändningsstatus", - "On Air": "On Air", - "Unknown": "Okänd", - "Good": "Bra", - "Minor Warning": "Liten varning", - "Warning": "Varning", - "Bad": "Dålig", - "Connected": "Ansluten", - "Disconnected": "Oansluten", - "Unknown Device": "Okänd enhet", - "Type": "Typ", - "Last seen": "Senast sedd", - "System Status": "Systemstatus", - "Name": "Namn" -} \ No newline at end of file + "Return to list": "Återgå till listan", + "Home": "Hem", + "Rundowns": "Körscheman", + "Nyman's Playground": "Tester", + "Status": "Status", + "ID": "ID", + "Created": "Skapad", + "Air Status": "Sändningsstatus", + "On Air": "On Air", + "Unknown": "Okänd", + "Good": "Bra", + "Minor Warning": "Liten varning", + "Warning": "Varning", + "Bad": "Dålig", + "Connected": "Ansluten", + "Disconnected": "Oansluten", + "Unknown Device": "Okänd enhet", + "Type": "Typ", + "Last seen": "Senast sedd", + "System Status": "Systemstatus", + "Name": "Namn" +} diff --git a/packages/webui/public/origo-ui/images/batch-icon-complete-dark.png b/packages/webui/public/origo-ui/images/batch-icon-complete-dark.png deleted file mode 100644 index 5a11a1a593..0000000000 Binary files a/packages/webui/public/origo-ui/images/batch-icon-complete-dark.png and /dev/null differ diff --git a/packages/webui/public/origo-ui/images/batch-icon-complete-light.png b/packages/webui/public/origo-ui/images/batch-icon-complete-light.png deleted file mode 100644 index a1c33c0cdc..0000000000 Binary files a/packages/webui/public/origo-ui/images/batch-icon-complete-light.png and /dev/null differ diff --git a/packages/webui/public/origo-ui/images/batch-icon-dark.png b/packages/webui/public/origo-ui/images/batch-icon-dark.png deleted file mode 100644 index 232935c547..0000000000 Binary files a/packages/webui/public/origo-ui/images/batch-icon-dark.png and /dev/null differ diff --git a/packages/webui/public/origo-ui/images/batch-icon-light.png b/packages/webui/public/origo-ui/images/batch-icon-light.png deleted file mode 100644 index de2aa556a4..0000000000 Binary files a/packages/webui/public/origo-ui/images/batch-icon-light.png and /dev/null differ diff --git a/packages/webui/public/origo-ui/images/loading-spinner.svg b/packages/webui/public/origo-ui/images/loading-spinner.svg deleted file mode 100644 index 0fefc9694f..0000000000 --- a/packages/webui/public/origo-ui/images/loading-spinner.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/webui/public/origo-ui/images/thumb-scrubber-active.png b/packages/webui/public/origo-ui/images/thumb-scrubber-active.png deleted file mode 100644 index e09e184e43..0000000000 Binary files a/packages/webui/public/origo-ui/images/thumb-scrubber-active.png and /dev/null differ diff --git a/packages/webui/public/origo-ui/images/thumb-scrubber.png b/packages/webui/public/origo-ui/images/thumb-scrubber.png deleted file mode 100644 index 624966cc4a..0000000000 Binary files a/packages/webui/public/origo-ui/images/thumb-scrubber.png and /dev/null differ diff --git a/packages/webui/public/origo-ui/images/tooltip-pointer-dark.png b/packages/webui/public/origo-ui/images/tooltip-pointer-dark.png deleted file mode 100644 index 144b152606..0000000000 Binary files a/packages/webui/public/origo-ui/images/tooltip-pointer-dark.png and /dev/null differ diff --git a/packages/webui/public/origo-ui/images/tooltip-pointer.png b/packages/webui/public/origo-ui/images/tooltip-pointer.png deleted file mode 100644 index 7c20a544cf..0000000000 Binary files a/packages/webui/public/origo-ui/images/tooltip-pointer.png and /dev/null differ diff --git a/packages/webui/public/sw.js b/packages/webui/public/sw.js index b5dd6e06db..e5b2b992f7 100644 --- a/packages/webui/public/sw.js +++ b/packages/webui/public/sw.js @@ -1,5 +1,5 @@ this.addEventListener('fetch', function (event) { - // it can be empty if you just want to get rid of that error + // it can be empty if you just want to get rid of that error }) console.log('Sofie Service Worker initialized.') diff --git a/packages/webui/src/__mocks__/_setupMocks.ts b/packages/webui/src/__mocks__/_setupMocks.ts index d2645535bd..12720fb207 100644 --- a/packages/webui/src/__mocks__/_setupMocks.ts +++ b/packages/webui/src/__mocks__/_setupMocks.ts @@ -1,4 +1,5 @@ -import { resetRandomId } from './random' +/* eslint-disable @typescript-eslint/no-require-imports */ +import { resetRandomId } from './random.js' // This file is run before all tests start. diff --git a/packages/webui/src/__mocks__/defaultCollectionObjects.ts b/packages/webui/src/__mocks__/defaultCollectionObjects.ts index 7f0e55989c..6a2a90adee 100644 --- a/packages/webui/src/__mocks__/defaultCollectionObjects.ts +++ b/packages/webui/src/__mocks__/defaultCollectionObjects.ts @@ -1,5 +1,5 @@ import { DBStudio } from '@sofie-automation/corelib/dist/dataModel/Studio' -import { clone, protectString, unprotectString } from '../client/lib/tempLib' +import { clone, protectString, unprotectString } from '../client/lib/tempLib.js' import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment' diff --git a/packages/webui/src/__mocks__/helpers/database.ts b/packages/webui/src/__mocks__/helpers/database.ts index e5d1b62274..490458e113 100644 --- a/packages/webui/src/__mocks__/helpers/database.ts +++ b/packages/webui/src/__mocks__/helpers/database.ts @@ -1,4 +1,4 @@ -import * as _ from 'underscore' +import _ from 'underscore' import { DBStudio } from '@sofie-automation/corelib/dist/dataModel/Studio' import { PieceLifespan, @@ -10,7 +10,7 @@ import { import { DBShowStyleBase } from '@sofie-automation/corelib/dist/dataModel/ShowStyleBase' import { DBShowStyleVariant } from '@sofie-automation/corelib/dist/dataModel/ShowStyleVariant' import { ICoreSystem, SYSTEM_ID } from '@sofie-automation/meteor-lib/dist/collections/CoreSystem' -import { literal, protectString, getRandomId, Complete, normalizeArray } from '../../client/lib/tempLib' +import { literal, protectString, getRandomId, Complete, normalizeArray } from '../../client/lib/tempLib.js' import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown' import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment' import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part' @@ -18,14 +18,15 @@ import { EmptyPieceTimelineObjectsBlob, Piece } from '@sofie-automation/corelib/ import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist' import { RundownBaselineAdLibItem } from '@sofie-automation/corelib/dist/dataModel/RundownBaselineAdLibPiece' import { AdLibPiece } from '@sofie-automation/corelib/dist/dataModel/AdLibPiece' -import { restartRandomId } from '../random' -import { MongoMock } from '../mongo' -import { defaultRundownPlaylist, defaultStudio } from '../defaultCollectionObjects' +import { restartRandomId } from '../random.js' +import { MongoMock } from '../mongo.js' +import { defaultRundownPlaylist, defaultStudio } from '../defaultCollectionObjects.js' import { applyAndValidateOverrides, wrapDefaultObject, } from '@sofie-automation/corelib/dist/settings/objectWithOverrides' import { UIShowStyleBase } from '@sofie-automation/meteor-lib/dist/api/showStyles' +import { UIStudio } from '@sofie-automation/meteor-lib/dist/api/studios' import { BlueprintId, OrganizationId, @@ -46,7 +47,7 @@ import { ShowStyleBases, ShowStyleVariants, Studios, -} from '../../client/collections' +} from '../../client/collections/index.js' export enum LAYER_IDS { SOURCE_CAM0 = 'cam0', @@ -561,3 +562,13 @@ export function convertToUIShowStyleBase(showStyleBase: DBShowStyleBase): UIShow outputLayers: applyAndValidateOverrides(showStyleBase.outputLayersWithOverrides).obj, }) } +export function convertToUIStudio(studio: DBStudio): UIStudio { + return literal>({ + _id: studio._id, + settings: applyAndValidateOverrides(studio.settingsWithOverrides).obj, + name: studio.name, + routeSets: applyAndValidateOverrides(studio.routeSetsWithOverrides).obj, + routeSetExclusivityGroups: applyAndValidateOverrides(studio.routeSetExclusivityGroupsWithOverrides).obj, + mappings: {}, + }) +} diff --git a/packages/webui/src/__mocks__/helpers/jest.ts b/packages/webui/src/__mocks__/helpers/jest.ts index e8baceae20..ebdbadc3e6 100644 --- a/packages/webui/src/__mocks__/helpers/jest.ts +++ b/packages/webui/src/__mocks__/helpers/jest.ts @@ -1,5 +1,3 @@ -/* eslint-disable jest/no-export, jest/valid-title, jest/expect-expect, jest/no-focused-tests */ - const orgSetTimeout = setTimeout const DateOrg = Date export async function runAllTimers(): Promise { @@ -43,7 +41,6 @@ export async function waitUntil(expectFcn: () => void | Promise, maxWaitTi const iterateInterval = maxWaitTime < 100 ? 10 : 100 const startTime = Date.now() - // eslint-disable-next-line no-constant-condition while (true) { await waitTime(iterateInterval) try { diff --git a/packages/webui/src/__mocks__/meteor.ts b/packages/webui/src/__mocks__/meteor.ts index 170ed3d5dd..dc01452fdb 100644 --- a/packages/webui/src/__mocks__/meteor.ts +++ b/packages/webui/src/__mocks__/meteor.ts @@ -1,4 +1,5 @@ -import * as _ from 'underscore' +/* eslint-disable @typescript-eslint/no-unsafe-function-type, @typescript-eslint/only-throw-error */ +import _ from 'underscore' import type { DDP } from 'meteor/ddp' let controllableDefer = false @@ -97,7 +98,10 @@ export namespace MeteorMock { } export class Error { private _stack?: string - constructor(public error: number, public reason?: string) { + constructor( + public error: number, + public reason?: string + ) { const e = new $.Error('') let stack: string = e.stack || '' diff --git a/packages/webui/src/__mocks__/mongo.ts b/packages/webui/src/__mocks__/mongo.ts index 7a0d8566cb..423303c55b 100644 --- a/packages/webui/src/__mocks__/mongo.ts +++ b/packages/webui/src/__mocks__/mongo.ts @@ -1,8 +1,8 @@ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -import * as _ from 'underscore' -import { literal, ProtectedString, unprotectString, protectString, getRandomString } from '../client/lib/tempLib' -import { RandomMock } from './random' -import { MeteorMock } from './meteor' +import _ from 'underscore' +import { literal, ProtectedString, unprotectString, protectString, getRandomString } from '../client/lib/tempLib.js' +import { RandomMock } from './random.js' +import { MeteorMock } from './meteor.js' import { Meteor } from 'meteor/meteor' import type { AnyBulkWriteOperation } from 'mongodb' import { @@ -14,7 +14,7 @@ import { UpdateOptions, UpsertOptions, WrappedMongoCollection, -} from '../client/collections/lib' +} from '../client/collections/lib.js' import { mongoWhere, mongoFindOptions, @@ -24,7 +24,7 @@ import { } from '@sofie-automation/corelib/dist/mongo' import { Mongo } from 'meteor/mongo' import { sleep } from '@sofie-automation/shared-lib/dist/lib/lib' -const clone = require('fast-clone') +import clone from 'fast-clone' export namespace MongoMock { interface ObserverEntry { @@ -182,6 +182,7 @@ export namespace MongoMock { if (!d._id) d._id = protectString(RandomMock.id()) if (this.documents[unprotectString(d._id)]) { + // eslint-disable-next-line @typescript-eslint/only-throw-error throw new MeteorMock.Error(500, `Duplicate key '${d._id}'`) } diff --git a/packages/webui/src/__mocks__/tracker.ts b/packages/webui/src/__mocks__/tracker.ts index 47ebb8cfcd..ce9024b427 100644 --- a/packages/webui/src/__mocks__/tracker.ts +++ b/packages/webui/src/__mocks__/tracker.ts @@ -116,7 +116,7 @@ export namespace TrackerMock { TrackerMock.currentComputation.onInvalidate(clb) } - export function afterFlush(_clb: Function): void { + export function afterFlush(_clb: () => void): void { throw new Error(`Tracker.afterFlush() is not implemented in the mock Tracker`) } } diff --git a/packages/webui/src/client/__tests__/jest-setup.cjs b/packages/webui/src/client/__tests__/jest-setup.cjs index 8856ce9d6a..629e018a27 100644 --- a/packages/webui/src/client/__tests__/jest-setup.cjs +++ b/packages/webui/src/client/__tests__/jest-setup.cjs @@ -1,4 +1,3 @@ -/* eslint-disable node/no-unpublished-require */ require('@testing-library/jest-dom') // used by code creating XML with the DOM API to return an XML string diff --git a/packages/webui/src/client/collections/index.ts b/packages/webui/src/client/collections/index.ts index 0a8e5dd5bd..ebfcf64197 100644 --- a/packages/webui/src/client/collections/index.ts +++ b/packages/webui/src/client/collections/index.ts @@ -14,13 +14,11 @@ import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collect import { ExpectedPackageWorkStatus } from '@sofie-automation/corelib/dist/dataModel/ExpectedPackageWorkStatuses' import { ExternalMessageQueueObj } from '@sofie-automation/corelib/dist/dataModel/ExternalMessageQueue' import { PackageContainerStatusDB } from '@sofie-automation/corelib/dist/dataModel/PackageContainerStatus' -import { MediaWorkFlow } from '@sofie-automation/shared-lib/dist/core/model/MediaWorkFlows' -import { MediaWorkFlowStep } from '@sofie-automation/shared-lib/dist/core/model/MediaWorkFlowSteps' -import { Bucket } from '@sofie-automation/meteor-lib/dist/collections/Buckets' +import { Bucket } from '@sofie-automation/corelib/dist/dataModel/Bucket' import { ICoreSystem, SYSTEM_ID } from '@sofie-automation/meteor-lib/dist/collections/CoreSystem' import { Evaluation } from '@sofie-automation/meteor-lib/dist/collections/Evaluations' import { ExpectedPackageDB } from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages' -import { createSyncMongoCollection, createSyncReadOnlyMongoCollection } from './lib' +import { createSyncMongoCollection, createSyncReadOnlyMongoCollection } from './lib.js' import { PeripheralDevice } from '@sofie-automation/corelib/dist/dataModel/PeripheralDevice' import { RundownLayoutBase } from '@sofie-automation/meteor-lib/dist/collections/RundownLayouts' import { DBShowStyleBase } from '@sofie-automation/corelib/dist/dataModel/ShowStyleBase' @@ -71,12 +69,6 @@ export const ExternalMessageQueue = createSyncReadOnlyMongoCollection(CollectionName.MediaWorkFlows) - -export const MediaWorkFlowSteps = createSyncReadOnlyMongoCollection( - CollectionName.MediaWorkFlowSteps -) - export const Notifications = createSyncReadOnlyMongoCollection(CollectionName.Notifications) export const PackageContainerStatuses = createSyncReadOnlyMongoCollection( diff --git a/packages/webui/src/client/collections/lib.ts b/packages/webui/src/client/collections/lib.ts index 40409c8064..7cc7737d6d 100644 --- a/packages/webui/src/client/collections/lib.ts +++ b/packages/webui/src/client/collections/lib.ts @@ -1,6 +1,6 @@ import { Meteor } from 'meteor/meteor' import { Mongo } from 'meteor/mongo' -import { ProtectedString, protectString } from '../lib/tempLib' +import { ProtectedString, protectString } from '../lib/tempLib.js' import { stringifyError } from '@sofie-automation/shared-lib/dist/lib/stringifyError' import type { Collection as RawCollection, Db as RawDb } from 'mongodb' import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' @@ -19,6 +19,8 @@ import { UpdateOptions, UpsertOptions, } from '@sofie-automation/meteor-lib/dist/collections/lib' +import { CustomCollectionName as CustomCorelibCollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections' +import { CorelibPubSubCustomCollections } from '@sofie-automation/corelib/dist/pubsub' export * from '@sofie-automation/meteor-lib/dist/collections/lib' @@ -114,7 +116,7 @@ export function createSyncReadOnlyMongoCollection(name: K): MongoReadOnlyCollection { const collection = new Mongo.Collection(name) const wrapped = new WrappedMongoReadOnlyCollection(collection, name) @@ -125,8 +127,20 @@ export function createSyncCustomPublicationMongoCollection< return wrapped } +export function createSyncCorelibCustomPublicationMongoCollection< + K extends CustomCorelibCollectionName & keyof CorelibPubSubCustomCollections, +>(name: K): MongoReadOnlyCollection { + const collection = new Mongo.Collection(name) + const wrapped = new WrappedMongoReadOnlyCollection(collection, name) + + if (PublicationCollections.has(name)) throw new Meteor.Error(`Cannot re-register collection "${name}"`) + PublicationCollections.set(name, wrapped) + + return wrapped +} + export function createSyncPeripheralDeviceCustomPublicationMongoCollection< - K extends PeripheralDevicePubSubCollectionsNames & keyof PeripheralDevicePubSubCollections + K extends PeripheralDevicePubSubCollectionsNames & keyof PeripheralDevicePubSubCollections, >(name: K): MongoReadOnlyCollection { const collection = new Mongo.Collection(name) const wrapped = new WrappedMongoReadOnlyCollection(collection, name) diff --git a/packages/webui/src/client/collections/rundownPlaylistUtil.ts b/packages/webui/src/client/collections/rundownPlaylistUtil.ts index f433ba9ef5..2618f3b5b0 100644 --- a/packages/webui/src/client/collections/rundownPlaylistUtil.ts +++ b/packages/webui/src/client/collections/rundownPlaylistUtil.ts @@ -4,8 +4,8 @@ import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/Rund import { normalizeArrayToMap } from '@sofie-automation/corelib/dist/lib' import { sortRundownIDsInPlaylist } from '@sofie-automation/corelib/dist/playout/playlist' import _ from 'underscore' -import { Rundowns } from './index' -import { FindOptions } from './lib' +import { Rundowns } from './index.js' +import { FindOptions } from './lib.js' import { MongoQuery } from '@sofie-automation/corelib/dist/mongo' /** diff --git a/packages/webui/src/client/lib/Components/Base64ImageInput.tsx b/packages/webui/src/client/lib/Components/Base64ImageInput.tsx index e8f44d50d9..a613b56e37 100644 --- a/packages/webui/src/client/lib/Components/Base64ImageInput.tsx +++ b/packages/webui/src/client/lib/Components/Base64ImageInput.tsx @@ -1,5 +1,5 @@ -import React, { useCallback, useState } from 'react' -import { UploadButton } from '../uploadButton' +import { useCallback } from 'react' +import { UploadButton } from '../uploadButton.js' import { faUpload } from '@fortawesome/free-solid-svg-icons' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { useTranslation } from 'react-i18next' @@ -19,37 +19,27 @@ export function Base64ImageInputControl({ }: Readonly): JSX.Element { const { t } = useTranslation() - const [uploadFileKey, setUploadFileKey] = useState(() => Date.now()) - const handleSelectFile = useCallback( - (event: React.ChangeEvent) => { - // Clear the field - setUploadFileKey(Date.now()) - - const file = event.target.files?.[0] - if (!file) return - - const reader = new FileReader() - reader.onload = (readEvent) => { - // On file upload + (fileContent: string) => { + if (typeof fileContent !== 'string' || !fileContent) return - const uploadResult = readEvent.target?.result - if (typeof uploadResult !== 'string' || !uploadResult) return - - handleUpdate(uploadResult.toString()) - } - reader.readAsDataURL(file) + handleUpdate(fileContent) }, [handleUpdate] ) + const handleUploadError = useCallback((error: Error) => { + // Handle upload error + console.error('Error uploading file:', error) + }, []) + return (
diff --git a/packages/webui/src/client/lib/Components/BlueprintAssetIcon.tsx b/packages/webui/src/client/lib/Components/BlueprintAssetIcon.tsx new file mode 100644 index 0000000000..6d18d80b09 --- /dev/null +++ b/packages/webui/src/client/lib/Components/BlueprintAssetIcon.tsx @@ -0,0 +1,62 @@ +import { useEffect, useMemo, useState } from 'react' +import { createPrivateApiPath } from '../../url.js' + +const GLOBAL_BLUEPRINT_ASSET_CACHE: Record = {} + +export function BlueprintAssetIcon({ src, className }: { src: string; className?: string }): JSX.Element | null { + const url = useMemo(() => { + if (src.startsWith('data:')) return new URL(src) + return new URL(createPrivateApiPath('/blueprints/assets/' + src), location.href) + }, [src]) + const [svgAsset, setSvgAsset] = useState(GLOBAL_BLUEPRINT_ASSET_CACHE[url.href] ?? null) + + useEffect(() => { + if (svgAsset) return + if (url.origin !== window.origin && url.origin !== null) { + console.error(`Invalid origin for BlueprintAssetIcon: ${url}`) + return + } + + const abort = new AbortController() + + fetch(url, { + redirect: 'follow', + referrerPolicy: 'origin', + signal: abort.signal, + }) + .then((res) => { + if (res.status !== 200) throw new Error(`Invalid response code: ${url} ${res.status} ${res.statusText}`) + if (!res.headers.get('content-type')?.startsWith('image/svg')) + throw new Error(`Asset is not an SVG image: ${url}`) + + return res.text() + }) + .then((body) => { + GLOBAL_BLUEPRINT_ASSET_CACHE[url.href] = body + if (abort.signal.aborted) return + setSvgAsset(body) + }) + .catch((err) => { + console.error(err) + setSvgAsset(null) + }) + + return () => { + abort.abort() + } + }, [url, svgAsset]) + + const dangerouslySetInnerHTML = useMemo(() => { + if (!svgAsset) return undefined + + return { + __html: svgAsset, + } + }, [svgAsset]) + + if (svgAsset === null) { + return null + } + + return
+} diff --git a/packages/webui/src/client/lib/Components/Checkbox.tsx b/packages/webui/src/client/lib/Components/Checkbox.tsx index 6932ef5e6d..29e9aba98d 100644 --- a/packages/webui/src/client/lib/Components/Checkbox.tsx +++ b/packages/webui/src/client/lib/Components/Checkbox.tsx @@ -1,7 +1,5 @@ -import { faCheckSquare, faSquare } from '@fortawesome/free-solid-svg-icons' -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import React, { useCallback } from 'react' -import ClassNames from 'classnames' +import Form from 'react-bootstrap/Form' interface ICheckboxControlProps { classNames?: string @@ -26,21 +24,13 @@ export function CheckboxControl({ ) return ( - - - - - - - - - + ) } diff --git a/packages/webui/src/client/lib/Components/CounterComponents.tsx b/packages/webui/src/client/lib/Components/CounterComponents.tsx new file mode 100644 index 0000000000..504969259d --- /dev/null +++ b/packages/webui/src/client/lib/Components/CounterComponents.tsx @@ -0,0 +1,40 @@ +import Moment from 'react-moment' +import { RundownUtils } from '../rundown.js' + +interface OverUnderProps { + value: number +} + +export const OverUnderClockComponent = (props: OverUnderProps): JSX.Element => { + return ( +
+ + {RundownUtils.formatDiffToTimecode(props.value, true, false, true, true, true, undefined, true, true)} + +
+ ) +} + +export const PlannedEndComponent = (props: OverUnderProps): JSX.Element => { + return ( + + + + ) +} + +export const TimeToPlannedEndComponent = (props: OverUnderProps): JSX.Element => { + return ( + + {RundownUtils.formatDiffToTimecode(props.value, true, false, true, true, true, undefined, true, true)} + + ) +} + +export const TimeSincePlannedEndComponent = (props: OverUnderProps): JSX.Element => { + return ( + + {RundownUtils.formatDiffToTimecode(props.value, true, false, true, true, true, undefined, true, true)} + + ) +} diff --git a/packages/webui/src/client/lib/Components/DropdownInput.tsx b/packages/webui/src/client/lib/Components/DropdownInput.tsx index a35294aca1..36dbfdccd3 100644 --- a/packages/webui/src/client/lib/Components/DropdownInput.tsx +++ b/packages/webui/src/client/lib/Components/DropdownInput.tsx @@ -1,5 +1,6 @@ import React, { useCallback, useMemo } from 'react' import ClassNames from 'classnames' +import Form from 'react-bootstrap/esm/Form' export interface DropdownInputOption { value: TValue @@ -126,8 +127,8 @@ export function DropdownInputControl({ return (
- +
) } diff --git a/packages/webui/src/client/lib/Components/FloatInput.tsx b/packages/webui/src/client/lib/Components/FloatInput.tsx index 3ec5a24572..dc9c8f31c0 100644 --- a/packages/webui/src/client/lib/Components/FloatInput.tsx +++ b/packages/webui/src/client/lib/Components/FloatInput.tsx @@ -1,5 +1,6 @@ import React, { useCallback, useState } from 'react' import ClassNames from 'classnames' +import Form from 'react-bootstrap/Form' interface IFloatInputControlProps { classNames?: string @@ -79,7 +80,7 @@ export function FloatInputControl({ if (showValue === undefined || isNaN(Number(showValue))) showValue = '' return ( - { label: string @@ -60,12 +65,12 @@ export function LabelAndOverrides({ } else if (defaultValue === true) { displayValue = 'true' } else if (!defaultValue) { - displayValue = '""' + displayValue = '' } else if (Array.isArray(defaultValue) || typeof defaultValue === 'object') { displayValue = JSON.stringify(defaultValue) || '' } else { // Display it as a string - displayValue = `"${defaultValue}"` + displayValue = `${defaultValue}` } } @@ -75,12 +80,20 @@ export function LabelAndOverrides({