webatem 2.3.2__tar.gz → 2.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {webatem-2.3.2 → webatem-2.4.0}/PKG-INFO +5 -4
- {webatem-2.3.2 → webatem-2.4.0}/README.md +4 -3
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/js/atem_control.js +50 -2
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/vendor/webatem.css +1 -1
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_settings_transition.html +14 -5
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_settings_usk.html +8 -2
- webatem-2.4.0/atem_control/templates/control/_transition_style.html +26 -0
- {webatem-2.3.2 → webatem-2.4.0}/pyproject.toml +1 -1
- {webatem-2.3.2 → webatem-2.4.0}/webatem.egg-info/PKG-INFO +5 -4
- webatem-2.3.2/atem_control/templates/control/_transition_style.html +0 -19
- {webatem-2.3.2 → webatem-2.4.0}/LICENSE +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/__init__.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/activity.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/apps.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/control/__init__.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/control/activity.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/control/commands.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/control/consumer.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/control/device_api.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/control/logging.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/control/views.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/discovery.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/hooks.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/hyperdeck/__init__.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/hyperdeck/connection.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/hyperdeck/views.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/ip_upload_lock.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/media_pool/__init__.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/media_pool/broadcast.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/media_pool/still_cache.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/media_pool/views.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/media_pool/watcher.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/migrations/0001_initial.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/migrations/0002_legacy_log.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/migrations/__init__.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/models.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/netutil.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/profile/__init__.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/profile/dialog.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/profile/export.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/profile/views.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/routing.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/sightings.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/apple-touch-icon.png +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/brand.css +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/favicon-32.png +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/favicon.ico +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/Archivo-400-latin-ext.woff2 +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/Archivo-400-latin.woff2 +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/Archivo-500-latin-ext.woff2 +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/Archivo-500-latin.woff2 +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/Archivo-600-latin-ext.woff2 +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/Archivo-600-latin.woff2 +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/Archivo-800-latin-ext.woff2 +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/Archivo-800-latin.woff2 +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/IBMPlexMono-400-latin-ext.woff2 +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/IBMPlexMono-400-latin.woff2 +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/IBMPlexMono-500-latin-ext.woff2 +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/IBMPlexMono-500-latin.woff2 +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/IBMPlexMono-600-latin-ext.woff2 +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/IBMPlexMono-600-latin.woff2 +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/OFL-Archivo.txt +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/OFL-IBMPlexMono.txt +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/icon-192.png +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/icon-512.png +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/icon-maskable-512.png +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/manifest.webmanifest +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/mark.svg +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/tray/linux-24.png +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/tray/mac-22.png +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/tray/mac-44.png +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/tray/win-16.png +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/tray/win-32.png +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/css/atem_connect.css +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/css/atem_control.css +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/icon.png +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/js/atem_connect.js +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/js/atem_control_page.js +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/js/atem_discovery.js +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/js/atem_hyperdeck.js +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/js/atem_profile.js +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/js/atem_realtime_slider.js +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/js/custom-scrollbar.js +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/js/recent_label.js +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/js/wa-select.js +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/vendor/README.md +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/vendor/alpine.min.js +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/vendor/alpinejs-collapse-3.14.3.min.js +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/vendor/bootstrap-icons/bootstrap-icons.min.css +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/storage.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/tally.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/connect.html +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_atem_info.html +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_fade_to_black.html +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_fairlight.html +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_header.html +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_hyperdeck_panel.html +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_macros.html +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_media_pool.html +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_profile_modal.html +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_settings_dsk.html +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_slider.html +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_transition_controls.html +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_usk_fly.html +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_usk_keyframe.html +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_usk_mask.html +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_usk_slider.html +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control.html +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/templatetags/__init__.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/templatetags/static_v.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/uploader.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/atem_control/urls.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/setup.cfg +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/webatem/__init__.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/webatem/__main__.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/webatem/applog.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/webatem/asgi.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/webatem/context.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/webatem/launcher.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/webatem/server.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/webatem/settings.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/webatem/templates/base.html +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/webatem/templates/brand/_mark.svg +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/webatem/templates/launcher.html +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/webatem/uninstall.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/webatem/updates.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/webatem/urls.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/webatem/views.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/webatem/websocket.py +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/webatem.egg-info/SOURCES.txt +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/webatem.egg-info/dependency_links.txt +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/webatem.egg-info/entry_points.txt +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/webatem.egg-info/requires.txt +0 -0
- {webatem-2.3.2 → webatem-2.4.0}/webatem.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: webatem
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.4.0
|
|
4
4
|
Summary: Browser-based control for Blackmagic ATEM switchers: run it, open the browser, your switchers are there
|
|
5
5
|
Author: Lucas Romanenko
|
|
6
6
|
License: MIT
|
|
@@ -133,9 +133,10 @@ with mine".
|
|
|
133
133
|
|
|
134
134
|
It should work more widely than that. The protocol is the same across the
|
|
135
135
|
range, the control surface is built from what each switcher reports about
|
|
136
|
-
itself rather than from a hardcoded model list
|
|
137
|
-
not have
|
|
138
|
-
|
|
136
|
+
itself rather than from a hardcoded model list: features a switcher does
|
|
137
|
+
not have do not appear, or appear greyed where the switcher reports it has
|
|
138
|
+
none of something (a DVE, a stinger). But should is not the same as does,
|
|
139
|
+
and nobody has checked.
|
|
139
140
|
|
|
140
141
|
So if you have a Mini, a Mini Pro, a Television Studio, a 2 M/E or 4 M/E, or
|
|
141
142
|
anything else with an ATEM badge on it, **trying this and telling me what
|
|
@@ -103,9 +103,10 @@ with mine".
|
|
|
103
103
|
|
|
104
104
|
It should work more widely than that. The protocol is the same across the
|
|
105
105
|
range, the control surface is built from what each switcher reports about
|
|
106
|
-
itself rather than from a hardcoded model list
|
|
107
|
-
not have
|
|
108
|
-
|
|
106
|
+
itself rather than from a hardcoded model list: features a switcher does
|
|
107
|
+
not have do not appear, or appear greyed where the switcher reports it has
|
|
108
|
+
none of something (a DVE, a stinger). But should is not the same as does,
|
|
109
|
+
and nobody has checked.
|
|
109
110
|
|
|
110
111
|
So if you have a Mini, a Mini Pro, a Television Studio, a 2 M/E or 4 M/E, or
|
|
111
112
|
anything else with an ATEM badge on it, **trying this and telling me what
|
|
@@ -2814,7 +2814,15 @@
|
|
|
2814
2814
|
colorGenerators: 0,
|
|
2815
2815
|
multiviewWindows: 0,
|
|
2816
2816
|
fairlightStrips: 0,
|
|
2817
|
-
macros: 0
|
|
2817
|
+
macros: 0,
|
|
2818
|
+
// The DVE / stinger / SuperSource block counts from the
|
|
2819
|
+
// switcher's _top (bmdwire's topology_block_counts). null
|
|
2820
|
+
// means unknown and greys nothing; only a reported 0 greys
|
|
2821
|
+
// what depends on the block (lacksBlock). A bmdwire without
|
|
2822
|
+
// these keys leaves them undefined, which is unknown too.
|
|
2823
|
+
dves: null,
|
|
2824
|
+
stingers: null,
|
|
2825
|
+
superSources: null
|
|
2818
2826
|
},
|
|
2819
2827
|
// Must exist in the initial state so the merge in updateState
|
|
2820
2828
|
// (which only copies keys that are already defined) picks it
|
|
@@ -2954,8 +2962,48 @@
|
|
|
2954
2962
|
"DVE": 3
|
|
2955
2963
|
};
|
|
2956
2964
|
const typeValue = typeof keyType === "string" ? typeMap[keyType] : keyType;
|
|
2965
|
+
if (typeValue === 3 && this.lacksBlock("dves")) return;
|
|
2957
2966
|
this.send("set_usk_type", { key_index: uskIndex, key_type: typeValue });
|
|
2958
2967
|
},
|
|
2968
|
+
// What the switcher says it lacks. True only when its _top reported
|
|
2969
|
+
// 0 blocks of ``kind`` ('dves' | 'stingers' | 'superSources'); an
|
|
2970
|
+
// unknown count (null, or undefined from an older bmdwire) is never
|
|
2971
|
+
// "lacks", so a switcher that hasn't said keeps every control.
|
|
2972
|
+
lacksBlock(kind) {
|
|
2973
|
+
return this.state.topology?.[kind] === 0;
|
|
2974
|
+
},
|
|
2975
|
+
// Why a control is greyed, for its tooltip; null (no title) when it
|
|
2976
|
+
// isn't.
|
|
2977
|
+
lacksBlockTitle(kind) {
|
|
2978
|
+
if (!this.lacksBlock(kind)) return null;
|
|
2979
|
+
return {
|
|
2980
|
+
dves: "This switcher has no DVE",
|
|
2981
|
+
stingers: "This switcher has no stinger",
|
|
2982
|
+
superSources: "This switcher has no SuperSource"
|
|
2983
|
+
}[kind] ?? null;
|
|
2984
|
+
},
|
|
2985
|
+
// The block a transition style needs: DVE (3) and Stinger (4).
|
|
2986
|
+
transitionStyleBlock(style) {
|
|
2987
|
+
return { 3: "dves", 4: "stingers" }[style] ?? null;
|
|
2988
|
+
},
|
|
2989
|
+
transitionStyleMissing(style) {
|
|
2990
|
+
const kind = this.transitionStyleBlock(style);
|
|
2991
|
+
return kind !== null && this.lacksBlock(kind);
|
|
2992
|
+
},
|
|
2993
|
+
transitionStyleTitle(style) {
|
|
2994
|
+
const kind = this.transitionStyleBlock(style);
|
|
2995
|
+
return kind === null ? null : this.lacksBlockTitle(kind);
|
|
2996
|
+
},
|
|
2997
|
+
setTransitionStyle(style) {
|
|
2998
|
+
if (this.transitionStyleMissing(style)) return;
|
|
2999
|
+
this.send("set_transition_style", { style });
|
|
3000
|
+
},
|
|
3001
|
+
// The greying classes, the same pair the settings-dependent controls
|
|
3002
|
+
// use. A switcher SET to a style it says it lacks still shows it
|
|
3003
|
+
// selected (the style class is kept), only greyed.
|
|
3004
|
+
greyedClass(missing) {
|
|
3005
|
+
return missing ? " opacity-50 pointer-events-none" : "";
|
|
3006
|
+
},
|
|
2959
3007
|
// Source-picker filter for dropdowns. ``ctx`` selects the
|
|
2960
3008
|
// filter rule:
|
|
2961
3009
|
// 'aux' — destinations valid for an aux output
|
|
@@ -3803,7 +3851,7 @@
|
|
|
3803
3851
|
},
|
|
3804
3852
|
getTransitionStyleButtonClass(styleIndex) {
|
|
3805
3853
|
const isActive = this.state.mes[this.activeMe].transition.style === styleIndex;
|
|
3806
|
-
return isActive ? "btn btn-sm btn-warning shadow-lg" : "btn btn-sm btn-outline hover:border-[oklch(var(--wa))]";
|
|
3854
|
+
return (isActive ? "btn btn-sm btn-warning shadow-lg" : "btn btn-sm btn-outline hover:border-[oklch(var(--wa))]") + this.greyedClass(this.transitionStyleMissing(styleIndex));
|
|
3807
3855
|
},
|
|
3808
3856
|
getTransitionSelectionButtonClass(keyType, keyIndex = null) {
|
|
3809
3857
|
const selection = this.state.mes[this.activeMe].transition.selection;
|