Quellcode durchsuchen

Remarks from Neo and Moshe

Also poc of Neo's video idea
master
The Dod vor 5 Tagen
Ursprung
Commit
e242894550

BIN
static/gfx/gaza-destruction-photo-anas-al-sharif.jpg Datei anzeigen


BIN
static/gfx/hossam-shabat-armchair.jpg Datei anzeigen


+ 26
- 9
static/js/config.js.example Datei anzeigen

@@ -1,18 +1,35 @@
1
-const MAX_DIST = 3500;
2
-const MIN_DIST = 1000;
1
+const MAX_DIST = 1500;
2
+const MIN_DIST = 600;
3 3
 const VID_BLUR_WHEN_CLOSE = 23.0; // float
4
-const TICKER_BLUR_WHEN_FAR = 5.0; // float
4
+const TICKER_BLUR_WHEN_FAR = 17.0; // float
5
+
5 6
 const ITEMS = [
6 7
     {
7
-        "vid": "anas-al-sharif-1.mp4",
8
-        "ticker": "• צה\"ל חיסל מחבל חמאס - ששימש כעיתונאי בכיר ברשת אל-ג'זירה • אנס א-שריף, שעבד עבור הרשת הקטארית - קידם במקביל מתווי ירי רקטות נגד ישראל • לפי הדיווחים ברצועה, חמישה בני אדם נהרגו בתקיפה, בהם עיתונאי נוסף של אל-ג'זירה • ספיר ליפקין וניצן שפירא, חדשות 12, 11/8/25"
8
+        "vid": "hossam-shabat-interview.mp4",
9
+        "ticker": "• חוסל מחבל חמאס שעבד עם \"אל-ג'זירה\" • צה\"ל חשף כי לפי מידע מודיעיני, כתב \"פלשתין אל יום\" ו-\"אל-ג'זירה\" חוסאם שבאת הוא מחבל בגדוד בית חאנון של ארגון הטרור חמאס • שחר קליימן, ישראל היום, 24/3/25"
9 10
     },
10 11
     {
11
-        "vid": "mariam-abu-daqqa.mp4",
12
-        "ticker": "• ייתכן שהמסר של הפגיעה ב\"עיתונאים\", במרכאות, זו ההבנה בישראל כמה נזק עשו אותם אלה שהעבירו את תמונות הרעב והצד האחד של חמאס, והמשיכו את מורשתו של יחיא סינוואר בעיתונות כביכול • אם כבר ישראל מחליטה לחסל את העיתונאים, עדיף מאוחר מאשר אף פעם לא. השפיץ של הזרוע הצבאית של חמאס, אלו אותם עיתונאי נוחבות, לכן טוב עשתה ישראל שחיסלה אותם, לטעמי מאוחר מדי • צבי יחזקאלי, 25/8/24, i24"
12
+        "vid": "interlude.mp4",
13
+        "ticker": ""
13 14
     },
14 15
     {
15
-        "vid": "hossam-shabat-1.mp4",
16
-        "ticker": "• חוסל מחבל חמאס שעבד עם \"אל-ג'זירה\" • צה\"ל חשף כי לפי מידע מודיעיני, כתב \"פלשתין אל יום\" ו-\"אל-ג'זירה\" חוסאם שבאת הוא מחבל בגדוד בית חאנון של ארגון הטרור חמאס • שחר קליימן, ישראל היום, 24/2/25"
16
+        "vid": "anas-al-sharif-reporting-on-hunger.mp4",
17
+        "ticker": "• צה\"ל חיסל מחבל חמאס - ששימש כעיתונאי בכיר ברשת אל-ג'זירה • אנס א-שריף, שעבד עבור הרשת הקטארית - קידם במקביל מתווי ירי רקטות נגד ישראל • ספיר ליפקין וניצן שפירא, חדשות 12, 11/8/25"
18
+    },
19
+    {
20
+        "vid": "interlude.mp4",
21
+        "ticker": ""
22
+    },
23
+    {
24
+        "vid": "nasser-hospital.mp4",
25
+        "ticker": "• ייתכן שהמסר של הפגיעה ב\"עיתונאים\", במרכאות, זו ההבנה בישראל כמה נזק עשו אותם אלה ש ... המשיכו את מורשתו של יחיא סינוואר בעיתונות כביכול • השפיץ של הזרוע הצבאית של חמאס, אלו אותם עיתונאי נוחבות, לכן טוב עשתה ישראל שחיסלה אותם, לטעמי מאוחר מדי • צבי יחזקאלי, 25/8/24, i24"
26
+    },
27
+    {
28
+        "vid": "interlude.mp4",
29
+        "ticker": ""
17 30
     }
18 31
 ];
32
+
33
+const NEO_FAR = 1800;
34
+const NEO_MID = 1200;
35
+const NEO_NEAR = 600;

+ 1
- 1
static/text/mariam-abu-daqqa.txt Datei anzeigen

@@ -1,4 +1,4 @@
1 1
 ייתכן שהמסר של הפגיעה בעיתונאים, במרכאות, זו ההבנה בישראל כמה נזק עשו אותם אלה שהעבירו את תמונות הרעב והצד האחד של חמאס, והמשיכו את מורשתו של יחיא סינוואר בעיתונות כביכול • רק לחשוב כמה נזק תודעתי עשו אותם עיתונאים מחבלים, אפשר לקרוא להם עיתונאי נוחבות, כמה נזק הם עשו לישראל • העיתונאים הללו עיצבו תמונת מצב ותמונה תודעתית, שחלק ממנה אפשר את המלחמה, ולאחר מכן אפשר את הלגיטימציה של חמאס • אם כבר ישראל מחליטה לחסל את העיתונאים, עדיף מאוחר 
2 2
 מאשר אף פעם לא. השפיץ של הזרוע הצבאית של חמאס, אלו אותם עיתונאי נוחבות, לכן טוב עשתה ישראל שחיסלה אותם, לטעמי מאוחר מדי • צבי יחזקאלי, 25/8/24, i24
3 3
 
4
-"ייתכן שהמסר של הפגיעה בעיתונאים, במרכאות, זו ההבנה בישראל כמה נזק עשו אותם אלה שהעבירו את תמונות הרעב והצד האחד של חמאס, והמשיכו את מורשתו של יחיא סינוואר בעיתונות כביכול • רק לחשוב כמה נזק תודעתי עשו אותם עיתונאים מחבלים, אפשר לקרוא להם עיתונאי נוחבות, כמה נזק הם עשו לישראל • העיתונאים הללו עיצבו תמונת מצב ותמונה תודעתית, שחלק ממנה אפשר את המלחמה, ולאחר מכן אפשר את הלגיטימציה של חמאס • אם כבר ישראל מחליטה לחסל את העיתונאים, עדיף מאוחר מאשר אף פעם לא. השפיץ של הזרוע הצבאית של חמאס, אלו אותם עיתונאי נוחבות, לכן טוב עשתה ישראל שחיסלה אותם, לטעמי מאוחר מדי • צבי יחזקאלי, 25/8/24, i24"
4
+"ייתכן שהמסר של הפגיעה בעיתונאים, במרכאות, זו ההבנה בישראל כמה נזק עשו אותם אלה שהעבירו את תמונות הרעב והצד האחד של חמאס, והמשיכו את מורשתו של יחיא סינוואר בעיתונות כביכול • אם כבר ישראל מחליטה לחסל את העיתונאים, עדיף מאוחר מאשר אף פעם לא. השפיץ של הזרוע הצבאית של חמאס, אלו אותם עיתונאי נוחבות, לכן טוב עשתה ישראל שחיסלה אותם, לטעמי מאוחר מדי • צבי יחזקאלי, 25/8/24, i24"

+ 19
- 13
templates/index.html Datei anzeigen

@@ -7,7 +7,7 @@
7 7
   <link href="/static/bootstrap/css/bootstrap.min.css" rel="stylesheet">
8 8
   <link rel="icon" href="/static/gfx/eye-horus.png">
9 9
 </head>
10
-<body data-bs-theme="dark">
10
+<body data-bs-theme="dark" class="overflow-hidden">
11 11
   <div class="container-fluid text-center">
12 12
     <div class="row">
13 13
       <div class="col12">
@@ -18,7 +18,7 @@
18 18
     </div>
19 19
     <div class="row">
20 20
       <div class="col12">
21
-        <div id="the-ticker" class="marquee alert alert-warning h2 fw-bolder w100 opacity-50 text-nowrap" role="alert" style="direction:rtl; position:fixed; left:0; bottom:2rem; z-index:23">
21
+        <div id="the-ticker" class="marquee alert alert-warning fw-bolder w100 opacity-50 text-nowrap" role="alert" style="direction:rtl; font-size:5rem; position:fixed; left:0; bottom:2rem; z-index:23">
22 22
           <h2 id="ticker-text" class="fw-bolder bg-danger text-white my-2 p-4">
23 23
           </h2>
24 24
         </div>
@@ -32,12 +32,17 @@
32 32
   <script>
33 33
   function setTicker(ticker_text) {
34 34
     $(".marquee").marquee("destroy");
35
-    $(".marquee").text(ticker_text);
36
-    $(".marquee").marquee({
37
-      "direction": "right",
38
-      "duplicated": true,
39
-      "speed": 69
40
-    });
35
+    if (ticker_text) {
36
+      $(".marquee").show();
37
+      $(".marquee").text(ticker_text);
38
+      $(".marquee").marquee({
39
+        "direction": "right",
40
+        "duplicated": true,
41
+        "speed": 115
42
+      });
43
+    } else {
44
+      $(".marquee").hide();
45
+    }
41 46
   }
42 47
   window.item_index = 0;
43 48
   function nextItem() {
@@ -63,13 +68,14 @@
63 68
   async function updateDistance() {
64 69
     var dist = await getDistance();
65 70
     var vidblur = 0, tickerblur = TICKER_BLUR_WHEN_FAR;
66
-    if (dist>MIN_DIST && dist<MAX_DIST) {
67
-      vidblur = parseInt(VID_BLUR_WHEN_CLOSE*(MAX_DIST-dist)/(MAX_DIST-MIN_DIST));
68
-      tickerblur = parseInt(TICKER_BLUR_WHEN_FAR*dist/(MAX_DIST-MIN_DIST));
71
+    if (dist && dist<MIN_DIST) {
72
+      dist = MIN_DIST;
69 73
     }
70
-    if (dist<2*MIN_DIST) {
71
-      tickerblur = 0;
74
+    if (dist && dist<MAX_DIST) {
75
+      vidblur = parseInt(VID_BLUR_WHEN_CLOSE*(MAX_DIST-dist)/(MAX_DIST-MIN_DIST));
76
+      tickerblur = parseInt(TICKER_BLUR_WHEN_FAR*(dist-MIN_DIST)/(MAX_DIST-MIN_DIST));
72 77
     }
78
+
73 79
     // console.log(vidblur,tickerblur);
74 80
     // console.log(`${vidblur}, ${tickerblur}`);
75 81
     document.getElementById("the-video").style.filter=`blur(${vidblur}px)`;

+ 109
- 0
templates/neo.html Datei anzeigen

@@ -0,0 +1,109 @@
1
+<!doctype html>
2
+<html lang="en">
3
+<head>
4
+  <meta charset="utf-8">
5
+  <meta name="viewport" content="width=device-width, initial-scale=1">
6
+  <title>Bystander</title>
7
+  <link href="/static/bootstrap/css/bootstrap.min.css" rel="stylesheet">
8
+  <link rel="icon" href="/static/gfx/eye-horus.png">
9
+</head>
10
+<body data-bs-theme="dark">
11
+  <div class="select" style="position:absolute; top:0;right:0; z-index:23">
12
+    <label for="videoSource">Video source: </label><select id="videoSource"></select>
13
+  </div>
14
+  <div class="container-fluid text-center">
15
+    <div class="row" style="background-image:url(/static/gfx/vest-funeral.jpg); backgroud-color:red; background-size:cover">
16
+      <div class="col12" id="the-reporter" style="background-image:url(/static/gfx/anas-al-sharif.jpg); backgroud-color:red; background-size:cover">
17
+        <video class="w-100" id="the-video" autoplay muted playsinline></video>
18
+        </video>
19
+      </div>
20
+    </div>
21
+  </div>
22
+  <script src="/static/js/config.js"></script>
23
+  <script src="/static/js/jquery-3.7.1.min.js"></script>
24
+  <script src="/static/bootstrap/js/bootstrap.bundle.min.js"></script>
25
+  <script>
26
+
27
+  'use strict';
28
+
29
+  var videoElement = document.querySelector('video');
30
+  var videoSelect = document.querySelector('select#videoSource');
31
+
32
+  videoSelect.onchange = getStream;
33
+
34
+  getStream().then(getDevices).then(gotDevices);
35
+
36
+  function getDevices() {
37
+    // AFAICT in Safari this only gets default devices until gUM is called :/
38
+    return navigator.mediaDevices.enumerateDevices();
39
+  }
40
+
41
+  function gotDevices(deviceInfos) {
42
+    window.deviceInfos = deviceInfos; // make available to console
43
+    console.log('Available input and output devices:', deviceInfos);
44
+    for (const deviceInfo of deviceInfos) {
45
+      const option = document.createElement('option');
46
+      option.value = deviceInfo.deviceId;
47
+      if (deviceInfo.kind === 'videoinput') {
48
+        option.text = deviceInfo.label || `Camera ${videoSelect.length + 1}`;
49
+        videoSelect.appendChild(option);
50
+      }
51
+    }
52
+  }
53
+
54
+  function getStream() {
55
+    if (window.stream) {
56
+      window.stream.getTracks().forEach(track => {
57
+        track.stop();
58
+      });
59
+    }
60
+    const videoSource = videoSelect.value;
61
+    const constraints = {
62
+      video: {deviceId: videoSource ? {exact: videoSource} : undefined}
63
+    };
64
+    return navigator.mediaDevices.getUserMedia(constraints).
65
+    then(gotStream).catch(handleError);
66
+  }
67
+
68
+  function gotStream(stream) {
69
+    window.stream = stream; // make stream available to console
70
+    videoSelect.selectedIndex = [...videoSelect.options].
71
+    findIndex(option => option.text === stream.getVideoTracks()[0].label);
72
+    videoElement.srcObject = stream;
73
+  }
74
+
75
+  function handleError(error) {
76
+    console.error('Error: ', error);
77
+  }
78
+
79
+
80
+  </script>
81
+  <script>
82
+  async function getDistance() {
83
+    try {
84
+      let response = await fetch("/d");
85
+      let data = await response.json();
86
+      return data.distance;
87
+    } catch {
88
+      return 0;
89
+    }
90
+  };
91
+  async function updateDistance() {
92
+    var dist = await getDistance();
93
+    if (dist>NEO_FAR) {
94
+      dist = NEO_FAR;
95
+    }
96
+    if (dist>NEO_MID) {
97
+      var vidtransp = 1.0*(dist-NEO_MID)/(NEO_FAR-NEO_MID);
98
+       $("#the-video").css("opacity",vidtransp);
99
+       $("#the-reporter").css("opacity",1);
100
+    } else {
101
+      var reptransp = 1.0*(dist-NEO_NEAR)/(NEO_MID-NEO_NEAR);
102
+      $("#the-video").css("opacity",0);
103
+      $("#the-reporter").css("opacity",reptransp);
104
+    }
105
+  }
106
+  window.update_interval = setInterval(updateDistance, 200);
107
+  </script>
108
+</body>
109
+</html>

Laden…
Abbrechen
Speichern