דילוג לתוכן
  • חוקי הפורום
  • פופולרי
  • לא נפתר
  • משתמשים
  • חיפוש גוגל בפורום
  • צור קשר
עיצובים
  • בהיר
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • כהה
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • ברירת מחדל (ללא עיצוב (ברירת מחדל))
  • ללא עיצוב (ברירת מחדל)
כיווץ
מתמחים טופ
ש

שליו

@שליו
הפסקת מעקב מעקב
אודות
פוסטים
333
נושאים
24
שיתופים
0
קבוצות
0
עוקבים
6
עוקב אחרי
18

פוסטים

פוסטים אחרונים הגבוה ביותר שנוי במחלוקת

  • להורדה | הרצת אפליקציות אנדרואיד על WIN בלי אמולטור - חדש
    ש שליו

    @5566brs
    לא הצלחתי להריץ שום האפליקציה
    ולא נוצרים קבצי לוג למרות שיש הודעה שנוצרו

    עזרה הדדית - אמולטורים

  • להורדה | תוכנת עימוד ספרים אוטומטי.... כולל אפשרות בקשות מגמיני לעיצוב!
    ש שליו

    @יוסי-מחשבים כתב:

    רק בשינוי סיומת

    נו, ו?

    עזרה הדדית - מחשבים וטכנולוגיה

  • להורדה | תוכנת עימוד ספרים אוטומטי.... כולל אפשרות בקשות מגמיני לעיצוב!
    ש שליו

    @הידען
    כל הכבוד!
    למה אתה לא מעלה את הקובץ ישיר לכאן?

    עזרה הדדית - מחשבים וטכנולוגיה

  • שיתוף | הורדה הכי פשוטה מיוטיוב ללא תוכנה! מותאם לכל סינון
    ש שליו

    @אברהם-גלסר
    גם לי יש את השגיאה הזו [אני בנטפרי]

    עזרה הדדית - מחשבים וטכנולוגיה

  • בקשה | בניית פרויקטים לכלל הציבור
    ש שליו

    @החברונר-הנודד
    אני בטוח שלא התכוונת שיפילו עליך את כל החלומות...
    החבר'ה בטוחים שזה בלחיצת כפתור.

    אני בניתי תוכנה שנראית פשוטה עם AI כבר שנה שאני על הפיתוח ויש לי עוד מה להוסיף, לבנות תוכנות כאלו היום בAI זה מורכב, וודאי אם הכל חינמי

    כללי - עזרה הדדית

  • בקשה | בניית פרויקטים לכלל הציבור
    ש שליו

    @mfmf
    לא שאלת אותו כמה זה ישים
    אני שאלתי את קלוד, השיחה בספויילר

    לא פשוט בכלל. זה פרויקט ברמת קושי גבוהה מאוד, ובפועל כמה פרויקטים קשים שמחוברים יחד. הנה פירוק לפי שלושת הרכיבים:

    1. מנוע הרצה שקוף

    • WSA (Windows Subsystem for Android) הופסק על ידי מיקרוסופט, והתמיכה בו נגמרה ב-2025, כך שאי אפשר לבנות עליו מוצר חדש.
    • QEMU מצומצם אפשרי, אבל צריך להרכיב בעצמך תמונת Android (למשל מבוססת AOSP או Android-x86/BlissOS), לטפל בהאצת חומרה (WHPX או Hyper-V), בגרפיקה, במסך מגע ובאודיו.
    • החלק של "פותח את חלון האפליקציה ללא ממשק אימולטור" הוא הקשה ביותר. צריך לשלב את חלון האנדרואיד כחלון נפרד של וינדוס, בדומה למה ש-WSA עשה, ואין לזה פתרון מוכן בקוד פתוח. אפשר לקרב את זה בעזרת scrcpy או שרת תצוגה משלך, אבל זה לא "שקוף" באמת.

    2. רכיב לכידה באנדרואיד

    • ל-Wi-Fi זה יחסית קל: האימולטור כבר מנתב רשת, ואפשר להשתמש ברשת של המארח ישירות.
    • לבלוטות' זה בעיה אמיתית. אפליקציה באנדרואיד מדברת עם ה-Bluetooth stack (HAL ו-HCI), ולכן צריך לממש Bluetooth HAL מותאם בתוך התמונה, או לעקוף את ה-API ברמת המערכת (לדוגמה Xposed/LSPosed או שינוי ב-framework של AOSP). זה דורש בניית AOSP בעצמך, ומי שלא עבד על זה יתקשה.
    • לכידה ברמת האפליקציה (hooking) שבירה: כל אפליקציה משתמשת ב-API קצת אחרת (GATT, Classic, BLE), ואפליקציות עם הגנות נגד root או hooking יזהו את זה.

    3. גשר בווינדוס

    • זה החלק הכי פשוט. ב-C# יש API טוב ל-BLE (Windows.Devices.Bluetooth) ול-GATT. Bluetooth Classic (RFCOMM) נתמך חלקית.
    • הקושי הוא נאמנות מלאה: לתרגם בקשות GATT של אנדרואיד לווינדוס עם התנהגות זהה (חיבור, התראות, MTU, זמני תגובה) דורש הרבה בדיקות מול מכשירים אמיתיים.

    הערכה כללית

    • הוכחת היתכנות (אפליקציה אחת, BLE בלבד): חודשים ספורים לאדם מנוסה.
    • מוצר יציב שעובד עם אפליקציות שונות: שנה ומעלה של עבודה, והרבה תחזוקה.
    • הסיכון הגדול הוא ביציבות ובתאימות, לא ביכולת להראות שזה עובד בדמו.

    חלופות שכדאי לבדוק לפני

    • אם מדובר באפליקציה ספציפית, לבדוק אם אפשר לדבר עם ההתקן ישירות מווינדוס: ניתוח הפרוטוקול (למשל באמצעות לכידת HCI snoop log) וכתיבת לקוח משלך. לרוב זה הרבה יותר קצר מכל המערכת הזו.
    • אם ה-Wi-Fi הוא החלק העיקרי, אימולטור רגיל עם רשת גשר כבר יספיק.
    • Bluetooth passthrough של USB דרך QEMU/VM: מעביר דונגל בלוטות' פיזי ישירות למכונה הווירטואלית, וחוסך את כל שלב הלכידה והגשר. זה פחות "אלגנטי", אבל עובד היום.

    מה האפליקציה שאתה רוצה להריץ ולאיזה התקן היא מתחברת? בזה תלוי איזה מסלול הגיוני.

    כל APK

    אם המטרה היא כל APK שהוא, התשובה משתנה: זה כבר לא פרויקט קשה, אלא כמעט בלתי אפשרי כמוצר שעובד באמת.

    הסיבה היא שהפשרה שאפשר לעשות באפליקציה אחת (לנתח את הפרוטוקול ולכתוב לה לקוח) נעלמת. נשארת רק הגישה הכללית של לכידה וגשר, ושם כל אפליקציה מוסיפה בעיות משלה:

    • כיסוי API מלא: צריך לתמוך בכל מה שאפליקציות עושות מול הבלוטות': BLE, Classic, A2DP, HID, SPP, וגם Wi-Fi Direct ו-Wi-Fi Aware. כל אחד מהם הוא מימוש נפרד, וחלקם אין להם מקבילה נוחה בווינדוס.
    • הגבלות של ווינדוס עצמו: ה-API של ווינדוס לבלוטות' לא חושף הכל. אין גישה ישירה ברמת HCI מתוך אפליקציה רגילה, ולכן יש התנהגויות של אנדרואיד שפשוט אי אפשר לשחזר מעליו.
    • אפליקציות עם הגנות: משחקים, בנקאות ואפליקציות עם Play Integrity או זיהוי אימולטור יסרבו לרוץ או יזהו את ההתערבות.
    • חוויית משתמש: מסך מגע, חיישנים, מצלמה, התראות והרשאות צריכים כולם להתנהג כמו מכשיר אמיתי.

    האם זה אפשרי בכלל? מי שניסה את הכיוון הזה כבר הוא מיקרוסופט עם WSA, והיא נכשלה בהרחבה לכל אפליקציה וזנחה אותו. גם BlueStacks ודומיו, עם צוותים גדולים, לא תומכים בבלוטות' באופן כללי.

    מה כן אפשר לבנות במקום:

    1. Passthrough של דונגל USB: פותר את הבלוטות' לכל אפליקציה בלי לכתוב קוד לכידה, כי אנדרואיד מדבר ישירות עם חומרה אמיתית. זו הדרך הריאלית היחידה לכיסוי רחב.
    2. אימולטור קיים עם רשת גשר: מכסה את ה-Wi-Fi לרוב האפליקציות.
    3. שילוב של השניים: אימולטור מוכן (למשל BlissOS על VM) עם דונגל מועבר, ועליו שכבת חלון נוחה. זה פחות אלגנטי ממה שתיארת, אבל זה מה שעובד.

    אם בכל זאת רוצים ללכת על הגישה הכללית, כדאי להגדיר מראש רשימה סגורה של סוגי אפליקציות ותכונות שתומכים בהן, ולא להבטיח "כל APK".

    האם הדגש הוא על שימוש אישי או על מוצר שתפיץ לאחרים? זה משנה הרבה את ההחלטה.

    כללי - עזרה הדדית

  • בקשה | בניית פרויקטים לכלל הציבור
    ש שליו

    @ידיד-המפתיע כתב:

    מצטרף לבקשה ושיהיה תוכנה ניידת בלי התקנת אימולוטרים.

    לא שייך!

    כללי - עזרה הדדית

  • בעיה | דיסק אונקי שלא מקבל קבצים
    ש שליו

    @וואס-דו-זאגסט
    פעם הוא עבד?
    קנית אותו באליאקספרס?

    עזרה הדדית - מחשבים וטכנולוגיה

  • המלצה | משתמשי קלוד, מצטערים על המכסה השעתית שמתבזבזת בלילה? זה הפתרון
    ש שליו

    @מנסה-לעבוד-את-ה כתב:

    יש ל מישהו מושג למה הספוילר לא עובד לי להכניס את הפרומט? זה מוגבל לאורך מסויים?

    תעשה רווח של עוד שורה ריקה לפני הספויילר

    עזרה הדדית - בינה מלאכותית

  • להורדה | תוכנת עימוד ספרים אוטומטי.... כולל אפשרות בקשות מגמיני לעיצוב!
    ש שליו

    @הידען כתב:

    @שליו ומי אמר שזה לא ענין של שניות!!! לבקש לשנות את זה!!

    קצת נשמע לי מוזר להחליף את תוכנות העימוד בקובץ HTML
    אגב, שכחתי לכתוב שחסר תמיכה בהערות שוליים, וכן תוכן עניינים אוטומטי
    אני לא בא לרפות את ידיך אבל שתבין שצריך המון המון השקעה.

    עזרה הדדית - מחשבים וטכנולוגיה

  • להורדה | תוכנת עימוד ספרים אוטומטי.... כולל אפשרות בקשות מגמיני לעיצוב!
    ש שליו

    @הידען
    זה חמוד מאד!
    אבל רחוק מלהיות בשל,
    בשביל להתחיל לעמד ספר תורני צריך גודל עמוד [B5], שני טורים שווים, מילה ראשונה מודגשת וחלון תחתיה, ושורה אחרונה ממורכזת.

    עזרה הדדית - מחשבים וטכנולוגיה

  • שיתוף | שימוש בקלוד קוד ללא עלות - האתר!
    ש שליו

    @אברהם-גלסר
    שלחתי בקשה
    תודה רבה לך

    עזרה הדדית - בינה מלאכותית

  • בקשה | פודקאסטים בנטפרי???
    ש שליו

    @המלך-גורג
    יש גם את זה

    קידום אתרים

  • שיתוף | הורדה הכי פשוטה מיוטיוב ללא תוכנה! מותאם לכל סינון
    ש שליו

    @אברהם-גלסר
    למה השם יוצא משובש?

    עזרה הדדית - מחשבים וטכנולוגיה

  • באג | למכשיר המהולל Q8 לא מתחשק לחייג...
    ש שליו

    @ברווז-הסגול-החדש
    יש לך אחריות?

    כללי - עזרה הדדית

  • להורדה | תוסף לכרום לזיהוי קל של סרטונים פתוחים בערוץ יוטיוב
    ש שליו

    עדכון גרסה 1.0.3

    חדש:
    נוספה בדיקה גם על אתרים שמוטמע בהם סרטוני יוטיוב

    יש מגבלה טכנית באתרים בהם מוטמע הסרטון שבגלילה הנקודה הירוקה "רודפת" אחרי הסרטון, מי שזה מפריע לו יוכל להפסיק את הבדיקה בפאנל הניהול

    וכן נוסף פאנל ניהול לתוסף

    התקנה דרך https://extsync.com/ של @אברהם-גלסר כולל תמיכה בעדכונים אוטומטיים
    קישור ישיר להתקנה - https://extsync.com/install/TeBFjXhtX11aVcX1Gg9EEvTdYnV9nJroxyg3n5LbXdU

    משם ניתן להוריד גם את הזיפ

    קוד לTampermonkey בספויילר

    // ==UserScript==
    // @name         נקודה ירוקה לנטפרי - יוטיוב
    // @namespace    netfree-youtube-dot
    // @version      1.1
    // @description  מציג נקודה ירוקה על כל סרטון בעמוד ערוץ יוטיוב שמאושר (מחזיר 200) בנטפרי
    // @author       you
    // @match        *://*/*
    // @grant        GM_xmlhttpRequest
    // @grant        GM_getValue
    // @grant        GM_setValue
    // @grant        GM_registerMenuCommand
    // @connect      www.youtube.com
    // @run-at       document-idle
    // ==/UserScript==
    
    (function () {
      "use strict";
    
      const DEBUG = true;
      const CONCURRENCY = 5;
      const cache = new Map(); // videoId -> true/false/'pending'
      const queue = [];
      let running = 0;
      const processedVideoIds = new Set();
    
      const stats = { rawLinks: 0, found: 0, checking: 0, approved: 0, blocked: 0 };
    
      function log(...args) {
        if (DEBUG) console.log("[NF]", ...args);
      }
    
      // --- הגדרות (נשמרות דרך Tampermonkey, נגישות מתפריט התוסף) ---
      const settings = {
        enableOtherSites: GM_getValue("enableOtherSites", true),
        showDebugPanel: GM_getValue("showDebugPanel", true),
      };
    
      GM_registerMenuCommand(
        (settings.enableOtherSites ? "✅" : "⬜") + " הצג גם באתרים חוץ מיוטיוב (לחץ לשינוי, ידרוש רענון)",
        () => {
          GM_setValue("enableOtherSites", !settings.enableOtherSites);
          location.reload();
        }
      );
      GM_registerMenuCommand(
        (settings.showDebugPanel ? "✅" : "⬜") + " הצג פאנל מידע צף (לחץ לשינוי, ידרוש רענון)",
        () => {
          GM_setValue("showDebugPanel", !settings.showDebugPanel);
          location.reload();
        }
      );
    
      // --- פאנל דיבוג צף על הדף ---
      let panelEl = null;
      function createPanel() {
        panelEl = document.createElement("div");
        panelEl.id = "nf-debug-panel";
        panelEl.style.cssText = [
          "position:fixed",
          "bottom:16px",
          "left:16px",
          "z-index:2147483647",
          "background:#111",
          "color:#fff",
          "font-family:sans-serif",
          "font-size:12px",
          "line-height:1.6",
          "padding:10px 14px",
          "border-radius:8px",
          "box-shadow:0 2px 8px rgba(0,0,0,0.4)",
          "direction:rtl",
          "min-width:210px",
          "opacity:0.92",
        ].join(";");
        panelEl.innerHTML = `
          <div style="display:flex; justify-content:space-between; align-items:center; gap:8px; margin-bottom:4px;">
            <div style="font-weight:bold;">🟢 נטפרי-דוט פעיל (Tampermonkey)</div>
            <button id="nf-panel-close" style="background:none; border:none; color:#fff; font-size:14px; cursor:pointer; line-height:1; padding:0 2px;">✕</button>
          </div>
          <div id="nf-panel-body">התחלת סריקה...</div>
        `;
        document.body.appendChild(panelEl);
        panelEl.querySelector("#nf-panel-close").addEventListener("click", () => {
          panelEl.remove();
          panelEl = null;
        });
        log("פאנל דיבוג נוצר על הדף");
      }
    
      function updatePanel() {
        if (!panelEl) return;
        const body = panelEl.querySelector("#nf-panel-body");
        if (body) {
          body.innerHTML = `
            קישורים גולמיים: ${stats.rawLinks}<br/>
            סרטונים ייחודיים: ${stats.found}<br/>
            בבדיקה: ${stats.checking}<br/>
            מאושרים (200): ${stats.approved}<br/>
            חסומים/שגיאה: ${stats.blocked}
          `;
        }
      }
    
      function ensurePanel() {
        if (panelEl || !settings.showDebugPanel) return;
        createPanel();
        updatePanel();
      }
    
      // --- חיפוש עמוק שחודר גם ל-Shadow DOM ---
      function deepQueryAll(selector, root) {
        const results = [];
        const walk = (node) => {
          if (node.querySelectorAll) {
            node.querySelectorAll(selector).forEach((el) => results.push(el));
            node.querySelectorAll("*").forEach((el) => {
              if (el.shadowRoot) walk(el.shadowRoot);
            });
          }
        };
        walk(root || document);
        return results;
      }
    
      function getVideoId(href) {
        try {
          const url = new URL(href, location.href);
          if (url.pathname === "/watch") return url.searchParams.get("v");
          const shortsMatch = url.pathname.match(/\/shorts\/([^/?]+)/);
          if (shortsMatch) return shortsMatch[1];
        } catch (e) {
          /* ignore */
        }
        return null;
      }
    
      function addBadge(container) {
        if (!container || container.querySelector(".nf-green-dot")) return;
        const style = getComputedStyle(container);
        if (style.position === "static") {
          container.style.position = "relative";
        }
        const dot = document.createElement("div");
        dot.className = "nf-green-dot";
        dot.title = "מאושר בנטפרי";
        // סגנון inline מפורש - כי אלמנטים בתוך Shadow DOM לא בהכרח
        // נחשפים לגיליון סגנונות חיצוני
        dot.style.cssText = [
          "position:absolute",
          "top:6px",
          "left:6px",
          "width:14px",
          "height:14px",
          "background-color:#22c55e",
          "border:2px solid #ffffff",
          "border-radius:50%",
          "box-shadow:0 0 3px rgba(0,0,0,0.6)",
          "z-index:999",
          "pointer-events:none",
          "display:block",
        ].join(";");
        container.appendChild(dot);
      }
    
      // --- באדג' צף (position:fixed) מעל iframe מוטמע - כי אי אפשר להיכנס
      // לתוך ה-DOM של ה-iframe עצמו (מקור אחר) ---
      const iframeBadges = new Map(); // iframe element -> dot element
    
      function ensureIframeBadge(iframe) {
        if (iframeBadges.has(iframe)) return;
        const dot = document.createElement("div");
        dot.className = "nf-green-dot nf-iframe-dot";
        dot.title = "מאושר בנטפרי";
        dot.style.cssText = [
          "position:fixed",
          "width:14px",
          "height:14px",
          "background-color:#22c55e",
          "border:2px solid #ffffff",
          "border-radius:50%",
          "box-shadow:0 0 3px rgba(0,0,0,0.6)",
          "z-index:2147483647",
          "pointer-events:none",
          "display:none",
        ].join(";");
        document.body.appendChild(dot);
        iframeBadges.set(iframe, dot);
        ensureRafLoop();
      }
    
      function repositionIframeBadges() {
        iframeBadges.forEach((dot, iframe) => {
          if (!iframe.isConnected) {
            dot.remove();
            iframeBadges.delete(iframe);
            return;
          }
          const rect = iframe.getBoundingClientRect();
          if (rect.width === 0 || rect.height === 0) {
            dot.style.display = "none";
            return;
          }
          dot.style.display = "block";
          dot.style.top = rect.top + 6 + "px";
          dot.style.left = rect.left + 6 + "px";
        });
      }
    
      // לולאת requestAnimationFrame שרצה רק כל עוד יש לפחות נקודה אחת
      // מעל iframe - תואמת לקצב הריענון של המסך, בלי לרוץ סתם על אתרים
      // שאין בהם וידאו מוטמע.
      let rafRunning = false;
      function rafLoop() {
        repositionIframeBadges();
        if (iframeBadges.size > 0) {
          requestAnimationFrame(rafLoop);
        } else {
          rafRunning = false;
        }
      }
      function ensureRafLoop() {
        if (!rafRunning) {
          rafRunning = true;
          requestAnimationFrame(rafLoop);
        }
      }
    
      // --- בדיקת הרשת עצמה, דרך GM_xmlhttpRequest (מחוץ להקשר/CSP של הדף) ---
      function checkVideo(videoId) {
        return new Promise((resolve) => {
          const url = `https://www.youtube.com/watch?v=${encodeURIComponent(videoId)}`;
          GM_xmlhttpRequest({
            method: "GET",
            url,
            onload: (res) => {
              log(videoId, "->", res.status);
              resolve(res.status === 200);
            },
            onerror: (err) => {
              log(videoId, "-> ERROR", err);
              resolve(false);
            },
            ontimeout: () => {
              log(videoId, "-> TIMEOUT");
              resolve(false);
            },
          });
        });
      }
    
      function processQueue() {
        while (running < CONCURRENCY && queue.length) {
          const task = queue.shift();
          running++;
          task().finally(() => {
            running--;
            processQueue();
          });
        }
      }
    
      function enqueueCheck(videoId, applyBadge) {
        if (cache.has(videoId)) {
          const result = cache.get(videoId);
          if (result === true) applyBadge();
          return;
        }
        cache.set(videoId, "pending");
        stats.checking++;
        updatePanel();
        queue.push(async () => {
          const ok = await checkVideo(videoId);
          cache.set(videoId, ok);
          stats.checking--;
          if (ok) {
            stats.approved++;
            applyBadge();
          } else {
            stats.blocked++;
          }
          updatePanel();
        });
        processQueue();
      }
    
      // דירוג "כמה טוב" קישור בתור מקום להצמדת הנקודה - עדיפות לתמונה ממוזערת
      function scoreLink(link) {
        let score = 0;
        if (link.id === "thumbnail") score += 10;
        if (link.querySelector("img, yt-image")) score += 5;
        if (link.closest("ytd-thumbnail")) score += 5;
        return score;
      }
    
      const isYouTubeSite =
        location.hostname === "www.youtube.com" || location.hostname === "youtube.com";
    
      function scan() {
        if (isYouTubeSite) {
          const links = deepQueryAll('a[href*="/watch?v="], a[href*="/shorts/"]');
          stats.rawLinks = links.length;
    
          const byVideo = new Map();
          links.forEach((link) => {
            const videoId = getVideoId(link.href);
            if (!videoId) return;
            const existing = byVideo.get(videoId);
            if (!existing || scoreLink(link) > scoreLink(existing)) {
              byVideo.set(videoId, link);
            }
          });
    
          byVideo.forEach((link, videoId) => {
            if (!processedVideoIds.has(videoId)) {
              processedVideoIds.add(videoId);
              stats.found++;
            }
            // תמיד קוראים ל-enqueueCheck: אם כבר אושר בעבר, זה רק יצמיד
            // מחדש את הנקודה ללינק הנוכחי (למקרה שיוטיוב בנתה מחדש את ה-DOM)
            enqueueCheck(videoId, () => addBadge(link));
          });
        }
    
        if (isYouTubeSite || settings.enableOtherSites) {
          scanIframes();
        }
        updatePanel();
      }
    
      // --- זיהוי סרטוני יוטיוב מוטמעים (iframe) בכל אתר אחר ---
      function getEmbedVideoId(src) {
        try {
          const url = new URL(src, location.href);
          const host = url.hostname.replace(/^www\./, "");
          if (host !== "youtube.com" && host !== "youtube-nocookie.com") return null;
          const m = url.pathname.match(/\/embed\/([^/?]+)/);
          if (m) return m[1];
          if (url.pathname === "/watch") return url.searchParams.get("v");
        } catch (e) {
          /* ignore */
        }
        return null;
      }
    
      function scanIframes() {
        const iframes = document.querySelectorAll("iframe[src]");
        iframes.forEach((iframe) => {
          if (iframe.dataset.nfIframeChecked) return;
          const videoId = getEmbedVideoId(iframe.src);
          if (!videoId) return;
          iframe.dataset.nfIframeChecked = "1";
          if (!processedVideoIds.has(videoId)) {
            processedVideoIds.add(videoId);
            stats.found++;
          }
          ensurePanel();
          ensureIframeBadge(iframe);
          enqueueCheck(videoId, () => {
            iframeBadges.get(iframe) && (iframeBadges.get(iframe).style.display = "block");
            repositionIframeBadges();
          });
        });
      }
    
      let scanTimeout = null;
      function scheduleScan() {
        if (scanTimeout) return;
        scanTimeout = setTimeout(() => {
          scanTimeout = null;
          scan();
        }, 400);
      }
    
      const observer = new MutationObserver(() => scheduleScan());
    
      function init() {
        if (!document.body) {
          setTimeout(init, 100);
          return;
        }
        // אם הכיבוי חל על אתרים חיצוניים ואנחנו לא ביוטיוב - לא עושים כלום בכלל
        if (!isYouTubeSite && !settings.enableOtherSites) {
          log("מושבת באתר הזה לפי ההגדרות (הצג רק ביוטיוב)");
          return;
        }
        if (isYouTubeSite && settings.showDebugPanel) {
          createPanel();
          updatePanel();
        }
        scan();
        observer.observe(document.documentElement, { childList: true, subtree: true });
        // רשת ביטחון: MutationObserver לא תופס שינויים בתוך Shadow DOM קיים,
        // וגם iframes חדשים (למשל וידאו שנטען בגלילה) עשויים להתווסף בכל רגע
        setInterval(scan, 2000);
      }
    
      log("סקריפט Tampermonkey נטען, מתחיל");
      init();
    
      document.addEventListener("yt-navigate-finish", () => {
        log("ניווט חדש ביוטיוב, סורק שוב");
        scheduleScan();
      });
    })();
    

    נטפרי

  • להורדה | תוסף לכרום לזיהוי קל של סרטונים פתוחים בערוץ יוטיוב
    ש שליו

    @אברהם-גלסר
    תודה
    עדכנתי בפוסט הראשון

    נטפרי

  • להורדה | תוסף לכרום לזיהוי קל של סרטונים פתוחים בערוץ יוטיוב
    ש שליו

    @צול-גאה @fhryurygfgdf
    אני יבדוק היתכנות אחרי ת"ב, בע"ה

    נטפרי

  • להורדה | תוסף לכרום לזיהוי קל של סרטונים פתוחים בערוץ יוטיוב
    ש שליו

    @fhryurygfgdf
    מבדיקה בקוד זה עובד רק על ערוץ יוטיוב רשמי

    נטפרי
  • התחברות

  • אין לך חשבון עדיין? הרשמה

  • התחברו או הירשמו כדי לחפש.
  • פוסט ראשון
    פוסט אחרון
0
  • חוקי הפורום
  • פופולרי
  • לא נפתר
  • משתמשים
  • חיפוש גוגל בפורום
  • צור קשר