• דף הבית
    • אינדקס קישורים
    • פוסטים אחרונים
    • משתמשים
    • חיפוש בהגדרות המתקדמות
    • חיפוש גוגל בפורום
    • ניהול המערכת
    • ניהול המערכת - שרת private
    • הרשמה
    • התחברות

    קובץ להעלאת שלוחות וקבצים למערכת מתוך תקייה במחשב

    מתוזמן נעוץ נעול הועבר עזרה הדדית למשתמשים מתקדמים
    7 פוסטים 3 כותבים 43 צפיות 2 עוקבים
    טוען פוסטים נוספים
    • מהישן לחדש
    • מהחדש לישן
    • הכי הרבה הצבעות
    תגובה
    • תגובה כנושא
    התחברו כדי לפרסם תגובה
    נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
    • א מנותק
      אA
      נערך לאחרונה על ידי אA

      יצרתי קובץ html דרכו אפשר להעלות למערכת תקייה עם תקיות וקבצים הבנויים בצורת עץ תקיות, והשלוחות יווצרו אוטומטית וכן הקבצים יעלו לשלוחות.

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

      הוראות שימוש:

      1. יש לפתוח תקייה חדשה שהיא תהיה השלוחה הראשית, בתוכה יש לפתוח תקיות שכל תקיה היא שלוחה ותוכן ניתן לפתוח עוד תקיות.
        בתקייה הראשית ברירת מחדל נוצרת שלוחת תפריט אלא אם כן הוגדר אחרת, כמו כן כל תקייה ריקה ברירת מחדל היא תקיית השמעת קבצים.
      2. כדי להגדיר שלוחה, יש להכניס קובץ טקסט בשם ext (אין צורך בסיומת), ובתוכו להכניס את ההגדרות הרצויות.
        קבצי שמע עולים כמו שהם כולל השם לשלוחות.
      3. קבצי טקסט, יש להכניס קובץ טקסט לתקייה ושהסיומת תהיה tts, הקובץ יעלה לשלוחה ללא הסיומת הזו (דוגמא קובץ 000.tts, יעלה בתור 000).

      הקוד

      <!DOCTYPE html>
      <html lang="he" dir="rtl">
      <head>
          <meta charset="UTF-8">
          <title>מעלה תיקיות ומבנה שלוחות - ימות המשיח</title>
          <style>
              :root {
                  --primary: #3498db;
                  --success: #2ecc71;
                  --danger: #e74c3c;
                  --bg: #f4f7f6;
                  --dark: #2c3e50;
              }
              body { font-family: 'Segoe UI', Arial, sans-serif; margin: 0; background-color: var(--bg); color: var(--dark); text-align: right; }
              .wrapper { max-width: 900px; margin: 40px auto; padding: 0 20px; position: relative; }
              
              .reset-btn {
                  position: absolute;
                  top: -10px;
                  left: 20px;
                  background: var(--danger);
                  color: white;
                  border: none;
                  padding: 8px 15px;
                  border-radius: 5px;
                  cursor: pointer;
                  font-size: 14px;
                  font-weight: bold;
                  transition: all 0.3s;
                  box-shadow: 0 2px 5px rgba(0,0,0,0.1);
              }
              .reset-btn:hover { opacity: 0.8; transform: translateY(-1px); }
       
              .card { background: white; padding: 30px; border-radius: 15px; box-shadow: 0 10px 25px rgba(0,0,0,0.05); margin-bottom: 25px; border: 1px solid #eee; }
              h2 { margin-top: 0; color: var(--dark); border-bottom: 3px solid var(--primary); display: inline-block; padding-bottom: 10px; }
              
              .grid { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-top: 20px; }
              .input-group { display: flex; flex-direction: column; gap: 8px; }
              label { font-weight: bold; font-size: 14px; }
              input { padding: 12px; border: 2px solid #eee; border-radius: 8px; font-size: 16px; transition: border 0.3s; }
              input:focus { border-color: var(--primary); outline: none; }
              
              .full-width { grid-column: 1 / -1; }
              
              .btn-main { 
                  background: var(--primary); color: white; border: none; padding: 15px; 
                  border-radius: 8px; cursor: pointer; font-size: 18px; font-weight: bold; 
                  margin-top: 10px; width: 100%; transition: all 0.3s; 
                  box-shadow: 0 4px 6px rgba(52, 152, 219, 0.2);
              }
              .btn-main:hover { background: #2980b9; transform: translateY(-1px); }
              .btn-main:disabled { background: #bdc3c7; cursor: not-allowed; transform: none; }
       
              /* אזור התקדמות משודרג */
              .progress-wrapper { margin-top: 25px; display: none; padding: 15px; background: #fafafa; border-radius: 10px; border: 1px solid #eee; }
              .progress-container { 
                  width: 100%; 
                  background: #e0e0e0; 
                  height: 35px; 
                  border-radius: 20px; 
                  overflow: hidden; 
                  position: relative; 
                  box-shadow: inset 0 2px 5px rgba(0,0,0,0.1);
                  border: 1px solid #ccc;
              }
              .progress-bar { 
                  height: 100%; 
                  width: 0%; 
                  background: linear-gradient(45deg, #2ecc71 25%, #27ae60 25%, #27ae60 50%, #2ecc71 50%, #2ecc71 75%, #27ae60 75%, #27ae60);
                  background-size: 40px 40px;
                  animation: move-stripes 2s linear infinite;
                  transition: width 0.4s cubic-bezier(0.17, 0.67, 0.83, 0.67);
                  box-shadow: 0 2px 4px rgba(0,0,0,0.1);
              }
              
              @keyframes move-stripes {
                  from { background-position: 40px 0; }
                  to { background-position: 0 0; }
              }
       
              .progress-text { 
                  position: absolute; 
                  width: 100%; 
                  text-align: center; 
                  top: 0; 
                  line-height: 35px; 
                  color: #fff; 
                  font-weight: 900; 
                  text-shadow: 1px 1px 2px rgba(0,0,0,0.5);
                  font-size: 16px;
              }
       
              .log-header { font-weight: bold; margin-bottom: 12px; display: flex; align-items: center; gap: 10px; color: var(--dark); }
              .log-box { 
                  background: #1e1e1e; color: #d4d4d4; padding: 20px; border-radius: 10px; 
                  font-family: 'Consolas', monospace; height: 300px; overflow-y: auto; 
                  font-size: 13px; line-height: 1.6; border: 4px solid #333;
                  box-shadow: inset 0 5px 15px rgba(0,0,0,0.5);
              }
              .log-info { color: #5dade2; }
              .log-success { color: #58d68d; font-weight: bold; }
              .log-error { color: #ec7063; }
              .log-warn { color: #f4d03f; }
              .log-tts { color: #bb8fce; }
          </style>
      </head>
      <body>
       
      <div class="wrapper">
          <button class="reset-btn" onclick="resetAll()">✕ איפוס תהליך</button>
          
          <div class="card">
              <h2>העלאת מבנה תיקיות לימות המשיח</h2>
              
              <div class="grid">
                  <div class="input-group">
                      <label>טוקן מערכת:</label>
                      <input type="text" id="token" placeholder="הכנס טוקן כאן...">
                  </div>
                  <div class="input-group">
                      <label>שלוחת יעד ראשית:</label>
                      <input type="text" id="targetPath" placeholder="לדוגמה: 1">
                  </div>
                  <div class="input-group full-width">
                      <label>בחר תיקייה מהמחשב:</label>
                      <input type="file" id="folderInput" webkitdirectory>
                  </div>
                  <div class="full-width">
                      <button id="startBtn" class="btn-main" onclick="processUpload()">התחל העלאה למערכת</button>
                  </div>
              </div>
       
              <div class="progress-wrapper" id="progBox">
                  <div class="log-header">🔄 סטטוס התקדמות:</div>
                  <div class="progress-container">
                      <div class="progress-bar" id="progBar"></div>
                      <div class="progress-text" id="progText">0%</div>
                  </div>
              </div>
          </div>
       
          <div class="card">
              <div class="log-header">📜 תיעוד פעולות (Log):</div>
              <div class="log-box" id="logBox">ממתין לתחילת עבודה...</div>
          </div>
      </div>
       
      <script>
          const sleep = ms => new Promise(res => setTimeout(res, ms));
       
          function addLog(msg, type = "info") {
              const logBox = document.getElementById('logBox');
              let className = "log-info";
              if (type === "success") className = "log-success";
              if (type === "error") className = "log-error";
              if (type === "warn") className = "log-warn";
              if (type === "tts") className = "log-tts";
       
              logBox.innerHTML += `<div class="${className}">> ${msg}</div>`;
              logBox.scrollTop = logBox.scrollHeight;
          }
       
          function resetAll() {
              if(!confirm("האם אתה בטוח שברצונך לאפס את כל הנתונים?")) return;
              document.getElementById('token').value = "";
              document.getElementById('targetPath').value = "";
              document.getElementById('folderInput').value = "";
              document.getElementById('logBox').innerHTML = "המערכת אופסה. ממתין לפעולה...";
              document.getElementById('progBox').style.display = "none";
              document.getElementById('progBar').style.width = "0%";
              document.getElementById('progText').innerText = "0%";
              document.getElementById('startBtn').disabled = false;
              addLog("בוצע איפוס נתונים.");
          }
       
          async function processUpload() {
              const token = document.getElementById('token').value;
              const targetPath = document.getElementById('targetPath').value;
              const fileList = document.getElementById('folderInput').files;
              
              if (!token || !fileList.length) {
                  alert("חובה למלא טוקן ולבחור תיקייה");
                  return;
              }
       
              document.getElementById('startBtn').disabled = true;
              document.getElementById('progBox').style.display = 'block';
              const progBar = document.getElementById('progBar');
              const progText = document.getElementById('progText');
              
              document.getElementById('logBox').innerHTML = "";
              addLog("מתחיל בניית מבנה נתונים...", "info");
       
              const folderStructure = {};
              for (let file of fileList) {
                  const parts = file.webkitRelativePath.split('/');
                  parts.shift(); 
                  const fileName = parts.pop();
                  const folderPath = parts.join('/');
                  if (!folderStructure[folderPath]) folderStructure[folderPath] = [];
                  folderStructure[folderPath].push({ name: fileName, file: file });
              }
       
              const sortedPaths = Object.keys(folderStructure).sort((a, b) => {
                  const depthA = a === "" ? 0 : a.split('/').length;
                  const depthB = b === "" ? 0 : b.split('/').length;
                  return depthA - depthB;
              });
       
              for (let i = 0; i < sortedPaths.length; i++) {
                  const folderPath = sortedPaths[i];
                  const currentIvrPath = folderPath ? `${targetPath}/${folderPath}` : targetPath;
                  const folderFiles = folderStructure[folderPath];
                  const isRoot = (folderPath === "");
       
                  addLog(`מעבד שלוחה: ${currentIvrPath}`, "warn");
       
                  const extFileObj = folderFiles.find(f => f.name.toLowerCase().split('.')[0] === 'ext');
                  let extContent = "";
                  if (extFileObj) {
                      extContent = await extFileObj.file.text();
                  } else {
                      extContent = isRoot ? "type=menu" : "type=playfile";
                  }
                  
                  const extBlob = new Blob([extContent], { type: 'text/plain' });
                  await uploadFile(token, `${currentIvrPath}/ext.ini`, extBlob);
                  await sleep(400);
       
                  for (let fObj of folderFiles) {
                      const fileNameLower = fObj.name.toLowerCase();
                      if (fileNameLower.split('.')[0] === 'ext') continue;
       
                      const isAudio = /\.(wav|mp3|ogg|wma)$/i.test(fileNameLower);
                      
                      let destName = "";
                      let blobToSend;
       
                      if (isAudio) {
                          destName = fObj.name.replace(/\.[^/.]+$/, ".wav");
                          blobToSend = fObj.file;
                          addLog(`מעלה שמע: ${destName}`, "info");
                      } else if (fileNameLower.includes('.tts')) {
                          let cleanName = fObj.name.replace(/\.tts/gi, ""); 
                          cleanName = cleanName.replace(/\.[^/.]+$/, ""); 
                          destName = cleanName + ".tts";
                          
                          const text = await fObj.file.text();
                          blobToSend = new Blob([text], { type: 'text/plain' });
                          addLog(`מעלה קובץ TTS: ${destName}`, "tts");
                      } else {
                          destName = fObj.name.replace(/\.[^/.]+$/, "") + ".ini";
                          const text = await fObj.file.text();
                          blobToSend = new Blob([text], { type: 'text/plain' });
                          addLog(`מעלה הגדרות: ${destName}`, "info");
                      }
                      
                      await uploadFile(token, `${currentIvrPath}/${destName}`, blobToSend);
                  }
       
                  const pct = Math.round(((i + 1) / sortedPaths.length) * 100);
                  progBar.style.width = pct + '%';
                  progText.innerText = pct + '%';
              }
       
              addLog("סיום מוצלח! כל הקבצים הועלו.", "success");
              document.getElementById('startBtn').disabled = false;
          }
       
          async function uploadFile(token, fullPath, blob) {
              const fd = new FormData();
              fd.append('token', token);
              fd.append('path', `ivr2:${fullPath}`);
              fd.append('qqfile', blob, fullPath.split('/').pop()); 
              try {
                  const res = await fetch(`https://www.call2all.co.il/ym/api/UploadFile`, {
                      method: 'POST',
                      body: fd
                  });
                  const data = await res.json();
                  if(data.responseStatus !== "OK") addLog(`שגיאה ב-${fullPath}: ${data.message}`, "error");
                  return data;
              } catch (e) {
                  addLog(`כישלון תקשורת ב-${fullPath}`, "error");
              }
          }
      </script>
      </body>
      </html>
      
      H צ 2 תגובות תגובה אחרונה תגובה ציטוט 3
      • H מנותק
        haiims @אA
        נערך לאחרונה על ידי haiims

        @אA אשמח שאם יהיה לך זמן תעשה לנו הקלטת מסך , אם לא אני מאמין שנסתדר בלי .

        א תגובה 1 תגובה אחרונה תגובה ציטוט 0
        • א מנותק
          אA @haiims
          נערך לאחרונה על ידי

          @haiims
          של מה?

          H תגובה 1 תגובה אחרונה תגובה ציטוט 0
          • H מנותק
            haiims @אA
            נערך לאחרונה על ידי haiims

            @אA דוגמא איך עושים את זה בפועל, כבר עשית סרטון כזה וזה היה תענוג בשבילי .
            כזה

            א תגובה 1 תגובה אחרונה תגובה ציטוט 0
            • א מנותק
              אA @haiims
              נערך לאחרונה על ידי

              @haiims
              נו, אז זה באותה צורה

              H תגובה 1 תגובה אחרונה תגובה ציטוט 0
              • H מנותק
                haiims @אA
                נערך לאחרונה על ידי

                @אA חחחח אוקיי ננסה

                תגובה 1 תגובה אחרונה תגובה ציטוט 0
                • צ מנותק
                  צבי ד"צ @אA
                  נערך לאחרונה על ידי

                  @אA לא דווקא השרשור המתאים, אבל אולי צריך לעשות איחוד כל הHTML לאיזה ממשק אחד מסודר עם כפתור לכל קוד?
                  בעיקרון הייתי אומר לך להעלות את הכל לאיזה AI שיעשה את זה, אבל לא יודע אם זה לא מידי הרבה בשבילו, אבל נראה לי זה משהו די פשוט (אם אתה רק עושה כפתור לכל ממשק ואת הקוד שיכניסו רק במסך הראשי)

                  תגובה 1 תגובה אחרונה תגובה ציטוט 0
                  • פוסט ראשון
                    פוסט אחרון