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.
Files changed (136) hide show
  1. {webatem-2.3.2 → webatem-2.4.0}/PKG-INFO +5 -4
  2. {webatem-2.3.2 → webatem-2.4.0}/README.md +4 -3
  3. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/js/atem_control.js +50 -2
  4. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/vendor/webatem.css +1 -1
  5. {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_settings_transition.html +14 -5
  6. {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_settings_usk.html +8 -2
  7. webatem-2.4.0/atem_control/templates/control/_transition_style.html +26 -0
  8. {webatem-2.3.2 → webatem-2.4.0}/pyproject.toml +1 -1
  9. {webatem-2.3.2 → webatem-2.4.0}/webatem.egg-info/PKG-INFO +5 -4
  10. webatem-2.3.2/atem_control/templates/control/_transition_style.html +0 -19
  11. {webatem-2.3.2 → webatem-2.4.0}/LICENSE +0 -0
  12. {webatem-2.3.2 → webatem-2.4.0}/atem_control/__init__.py +0 -0
  13. {webatem-2.3.2 → webatem-2.4.0}/atem_control/activity.py +0 -0
  14. {webatem-2.3.2 → webatem-2.4.0}/atem_control/apps.py +0 -0
  15. {webatem-2.3.2 → webatem-2.4.0}/atem_control/control/__init__.py +0 -0
  16. {webatem-2.3.2 → webatem-2.4.0}/atem_control/control/activity.py +0 -0
  17. {webatem-2.3.2 → webatem-2.4.0}/atem_control/control/commands.py +0 -0
  18. {webatem-2.3.2 → webatem-2.4.0}/atem_control/control/consumer.py +0 -0
  19. {webatem-2.3.2 → webatem-2.4.0}/atem_control/control/device_api.py +0 -0
  20. {webatem-2.3.2 → webatem-2.4.0}/atem_control/control/logging.py +0 -0
  21. {webatem-2.3.2 → webatem-2.4.0}/atem_control/control/views.py +0 -0
  22. {webatem-2.3.2 → webatem-2.4.0}/atem_control/discovery.py +0 -0
  23. {webatem-2.3.2 → webatem-2.4.0}/atem_control/hooks.py +0 -0
  24. {webatem-2.3.2 → webatem-2.4.0}/atem_control/hyperdeck/__init__.py +0 -0
  25. {webatem-2.3.2 → webatem-2.4.0}/atem_control/hyperdeck/connection.py +0 -0
  26. {webatem-2.3.2 → webatem-2.4.0}/atem_control/hyperdeck/views.py +0 -0
  27. {webatem-2.3.2 → webatem-2.4.0}/atem_control/ip_upload_lock.py +0 -0
  28. {webatem-2.3.2 → webatem-2.4.0}/atem_control/media_pool/__init__.py +0 -0
  29. {webatem-2.3.2 → webatem-2.4.0}/atem_control/media_pool/broadcast.py +0 -0
  30. {webatem-2.3.2 → webatem-2.4.0}/atem_control/media_pool/still_cache.py +0 -0
  31. {webatem-2.3.2 → webatem-2.4.0}/atem_control/media_pool/views.py +0 -0
  32. {webatem-2.3.2 → webatem-2.4.0}/atem_control/media_pool/watcher.py +0 -0
  33. {webatem-2.3.2 → webatem-2.4.0}/atem_control/migrations/0001_initial.py +0 -0
  34. {webatem-2.3.2 → webatem-2.4.0}/atem_control/migrations/0002_legacy_log.py +0 -0
  35. {webatem-2.3.2 → webatem-2.4.0}/atem_control/migrations/__init__.py +0 -0
  36. {webatem-2.3.2 → webatem-2.4.0}/atem_control/models.py +0 -0
  37. {webatem-2.3.2 → webatem-2.4.0}/atem_control/netutil.py +0 -0
  38. {webatem-2.3.2 → webatem-2.4.0}/atem_control/profile/__init__.py +0 -0
  39. {webatem-2.3.2 → webatem-2.4.0}/atem_control/profile/dialog.py +0 -0
  40. {webatem-2.3.2 → webatem-2.4.0}/atem_control/profile/export.py +0 -0
  41. {webatem-2.3.2 → webatem-2.4.0}/atem_control/profile/views.py +0 -0
  42. {webatem-2.3.2 → webatem-2.4.0}/atem_control/routing.py +0 -0
  43. {webatem-2.3.2 → webatem-2.4.0}/atem_control/sightings.py +0 -0
  44. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/apple-touch-icon.png +0 -0
  45. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/brand.css +0 -0
  46. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/favicon-32.png +0 -0
  47. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/favicon.ico +0 -0
  48. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/Archivo-400-latin-ext.woff2 +0 -0
  49. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/Archivo-400-latin.woff2 +0 -0
  50. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/Archivo-500-latin-ext.woff2 +0 -0
  51. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/Archivo-500-latin.woff2 +0 -0
  52. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/Archivo-600-latin-ext.woff2 +0 -0
  53. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/Archivo-600-latin.woff2 +0 -0
  54. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/Archivo-800-latin-ext.woff2 +0 -0
  55. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/Archivo-800-latin.woff2 +0 -0
  56. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/IBMPlexMono-400-latin-ext.woff2 +0 -0
  57. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/IBMPlexMono-400-latin.woff2 +0 -0
  58. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/IBMPlexMono-500-latin-ext.woff2 +0 -0
  59. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/IBMPlexMono-500-latin.woff2 +0 -0
  60. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/IBMPlexMono-600-latin-ext.woff2 +0 -0
  61. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/IBMPlexMono-600-latin.woff2 +0 -0
  62. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/OFL-Archivo.txt +0 -0
  63. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/fonts/OFL-IBMPlexMono.txt +0 -0
  64. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/icon-192.png +0 -0
  65. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/icon-512.png +0 -0
  66. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/icon-maskable-512.png +0 -0
  67. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/manifest.webmanifest +0 -0
  68. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/mark.svg +0 -0
  69. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/tray/linux-24.png +0 -0
  70. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/tray/mac-22.png +0 -0
  71. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/tray/mac-44.png +0 -0
  72. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/tray/win-16.png +0 -0
  73. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/brand/tray/win-32.png +0 -0
  74. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/css/atem_connect.css +0 -0
  75. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/css/atem_control.css +0 -0
  76. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/icon.png +0 -0
  77. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/js/atem_connect.js +0 -0
  78. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/js/atem_control_page.js +0 -0
  79. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/js/atem_discovery.js +0 -0
  80. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/js/atem_hyperdeck.js +0 -0
  81. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/js/atem_profile.js +0 -0
  82. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/js/atem_realtime_slider.js +0 -0
  83. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/js/custom-scrollbar.js +0 -0
  84. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/js/recent_label.js +0 -0
  85. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/js/wa-select.js +0 -0
  86. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/vendor/README.md +0 -0
  87. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/vendor/alpine.min.js +0 -0
  88. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/vendor/alpinejs-collapse-3.14.3.min.js +0 -0
  89. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/vendor/bootstrap-icons/bootstrap-icons.min.css +0 -0
  90. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
  91. {webatem-2.3.2 → webatem-2.4.0}/atem_control/static/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
  92. {webatem-2.3.2 → webatem-2.4.0}/atem_control/storage.py +0 -0
  93. {webatem-2.3.2 → webatem-2.4.0}/atem_control/tally.py +0 -0
  94. {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/connect.html +0 -0
  95. {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_atem_info.html +0 -0
  96. {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_fade_to_black.html +0 -0
  97. {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_fairlight.html +0 -0
  98. {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_header.html +0 -0
  99. {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_hyperdeck_panel.html +0 -0
  100. {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_macros.html +0 -0
  101. {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_media_pool.html +0 -0
  102. {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_profile_modal.html +0 -0
  103. {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_settings_dsk.html +0 -0
  104. {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_slider.html +0 -0
  105. {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_transition_controls.html +0 -0
  106. {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_usk_fly.html +0 -0
  107. {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_usk_keyframe.html +0 -0
  108. {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_usk_mask.html +0 -0
  109. {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control/_usk_slider.html +0 -0
  110. {webatem-2.3.2 → webatem-2.4.0}/atem_control/templates/control.html +0 -0
  111. {webatem-2.3.2 → webatem-2.4.0}/atem_control/templatetags/__init__.py +0 -0
  112. {webatem-2.3.2 → webatem-2.4.0}/atem_control/templatetags/static_v.py +0 -0
  113. {webatem-2.3.2 → webatem-2.4.0}/atem_control/uploader.py +0 -0
  114. {webatem-2.3.2 → webatem-2.4.0}/atem_control/urls.py +0 -0
  115. {webatem-2.3.2 → webatem-2.4.0}/setup.cfg +0 -0
  116. {webatem-2.3.2 → webatem-2.4.0}/webatem/__init__.py +0 -0
  117. {webatem-2.3.2 → webatem-2.4.0}/webatem/__main__.py +0 -0
  118. {webatem-2.3.2 → webatem-2.4.0}/webatem/applog.py +0 -0
  119. {webatem-2.3.2 → webatem-2.4.0}/webatem/asgi.py +0 -0
  120. {webatem-2.3.2 → webatem-2.4.0}/webatem/context.py +0 -0
  121. {webatem-2.3.2 → webatem-2.4.0}/webatem/launcher.py +0 -0
  122. {webatem-2.3.2 → webatem-2.4.0}/webatem/server.py +0 -0
  123. {webatem-2.3.2 → webatem-2.4.0}/webatem/settings.py +0 -0
  124. {webatem-2.3.2 → webatem-2.4.0}/webatem/templates/base.html +0 -0
  125. {webatem-2.3.2 → webatem-2.4.0}/webatem/templates/brand/_mark.svg +0 -0
  126. {webatem-2.3.2 → webatem-2.4.0}/webatem/templates/launcher.html +0 -0
  127. {webatem-2.3.2 → webatem-2.4.0}/webatem/uninstall.py +0 -0
  128. {webatem-2.3.2 → webatem-2.4.0}/webatem/updates.py +0 -0
  129. {webatem-2.3.2 → webatem-2.4.0}/webatem/urls.py +0 -0
  130. {webatem-2.3.2 → webatem-2.4.0}/webatem/views.py +0 -0
  131. {webatem-2.3.2 → webatem-2.4.0}/webatem/websocket.py +0 -0
  132. {webatem-2.3.2 → webatem-2.4.0}/webatem.egg-info/SOURCES.txt +0 -0
  133. {webatem-2.3.2 → webatem-2.4.0}/webatem.egg-info/dependency_links.txt +0 -0
  134. {webatem-2.3.2 → webatem-2.4.0}/webatem.egg-info/entry_points.txt +0 -0
  135. {webatem-2.3.2 → webatem-2.4.0}/webatem.egg-info/requires.txt +0 -0
  136. {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.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, and features a switcher does
137
- not have simply do not appear. But should is not the same as does, and
138
- nobody has checked.
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, and features a switcher does
107
- not have simply do not appear. But should is not the same as does, and
108
- nobody has checked.
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;