It looks like this is a web page, not a feed. I looked for a feed associated with this page, but couldn't find one. Please enter the address of your feed to validate.

Source: http://jedok.com

  1.  
  2.  
  3. <!DOCTYPE html>
  4. <html lang="en">
  5. <head>
  6. <meta charset="utf-8" />
  7. <meta name="viewport" content="width=device-width, initial-scale=1" />
  8. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  9.  
  10.  
  11. <title>File Converter (Online &amp; Free) | jedok.com</title>
  12. <meta name="description" content="Convert any file online in seconds with jedok - free, secure file converter. Upload any file and save as you want without installing any software.">
  13. <link rel="canonical" href="https://jedok.com/" />
  14. <meta property="og:title" content="File Converter (Online &amp; Free) - jedok.com">
  15. <meta property="og:description" content="Convert any file online in seconds with jedok - free, secure file converter. Upload any file and save as you want without installing any software.">
  16. <meta property="og:url" content="https://jedok.com/">
  17. <meta property="og:type" content="website">
  18. <meta property="og:image" content="https://jedok.com/jedok-og-image.jpg" />
  19. <meta property="og:image:width" content="1200" />
  20. <meta property="og:image:height" content="630" />
  21. <meta property="og:image:type" content="image/jpeg" />
  22. <meta name="twitter:card" content="summary_large_image">
  23.  
  24. <script type="application/ld&#x2B;json">
  25. {
  26. "@context":"https://schema.org",
  27. "@type":"SoftwareApplication",
  28. "name":"File Converter (Online &amp; Free) - jedok.com",
  29. "applicationCategory":"UtilitiesApplication",
  30. "operatingSystem":"Web",
  31. "description":"Convert any file online in seconds with jedok - free, secure file converter. Upload any file and save as you want without installing any software.",
  32. "offers": {"@type":"Offer","price":"0","priceCurrency":"USD"},
  33. "url":"https://jedok.com/"
  34. }
  35. </script>
  36. <script type="application/ld&#x2B;json">
  37. {
  38. "@context":"https://schema.org",
  39. "@type":"WebSite",
  40. "name":"JeDok",
  41. "url":"https://jedok.com/",
  42. "potentialAction":{"@type":"SearchAction","target":"https://jedok.com/formats/{format}","query-input":"required name=format"}
  43. }
  44. </script>
  45.  
  46.  
  47. <!-- ✅ Performance: Preconnect to CDNs -->
  48. <link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin>
  49. <link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin>
  50. <link rel="preconnect" href="https://code.jquery.com" crossorigin>
  51. <link rel="preconnect" href="https://www.googletagmanager.com" crossorigin>
  52.  
  53. <!-- ✅ CSS -->
  54. <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" defer crossorigin>
  55. <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css" defer crossorigin>
  56. <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons/font/bootstrap-icons.css" defer crossorigin>
  57.  
  58. <!-- ✅ Favicons -->
  59. <link rel="icon" type="image/png" sizes="32x32" href="/favicon.png">
  60. <link rel="icon" type="image/png" sizes="64x64" href="/favicon.png">
  61. <link rel="apple-touch-icon" href="/favicon.png">
  62.  
  63. <!-- ✅ Google Analytics -->
  64. <script async src="https://www.googletagmanager.com/gtag/js?id=G-K6FQF5LSG9" type="da44066bd6e0101f0eab17e9-text/javascript"></script>
  65. <script type="da44066bd6e0101f0eab17e9-text/javascript">
  66. window.dataLayer = window.dataLayer || [];
  67. function gtag(){dataLayer.push(arguments);}
  68. gtag('js', new Date());
  69. gtag('config', 'G-K6FQF5LSG9', { anonymize_ip: true });
  70. </script>
  71.  
  72. <!-- ✅ App Config -->
  73. <script type="da44066bd6e0101f0eab17e9-text/javascript">
  74. window.APP_CONFIG = Object.freeze({
  75.  apiBaseUrl: "https://api.jedok.com/api",
  76.  appBaseUrl: "https://jedok.com"
  77. });
  78. </script>
  79.  
  80. <!-- Your site styles -->
  81. <script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="da44066bd6e0101f0eab17e9-|49"></script><link rel="preload" href="/css/site.css?v=85IF2Oi2NMeLED_gSW3dFrZjKfMm5lOm5QjDu-HU9c4" as="style" onload="this.onload=null;this.rel='stylesheet'">
  82. <noscript b-2u57mvn44z><link rel="stylesheet" href="/css/site.css?v=85IF2Oi2NMeLED_gSW3dFrZjKfMm5lOm5QjDu-HU9c4"></noscript>
  83.  
  84. <!-- Tiny critical inline CSS -->
  85. <style>
  86. /* Base + top bar */
  87. body {
  88. font-family: "Open Sans",Arial,sans-serif;
  89. font-size: .875rem;
  90. color: #333;
  91. margin-bottom: 5px
  92. }
  93.  
  94. .top-bar {
  95. background: #333;
  96. color: #fff;
  97. font-size: 14px;
  98. padding: 5px 0
  99. }
  100.  
  101. .navbar-brand {
  102. font-weight: 700;
  103. font-size: 24px
  104. }
  105. </style>
  106.  
  107. <!-- jQuery: must load before inline scripts -->
  108. <script src="https://code.jquery.com/jquery-3.6.4.min.js" crossorigin type="da44066bd6e0101f0eab17e9-text/javascript"></script>
  109.  
  110. <link rel="preconnect" href="https://pagead2.googlesyndication.com" crossorigin>
  111. <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-0313867933438659" crossorigin="anonymous" type="da44066bd6e0101f0eab17e9-text/javascript"></script>
  112.  
  113. </head>
  114.  
  115. <body>
  116. <!-- Top Bar -->
  117. <div b-2u57mvn44z class="top-bar text-center">
  118. <span b-2u57mvn44z>
  119. <a b-2u57mvn44z rel="nofollow" href="https://fileproinfo.com/free-online-viewer" class="text-white" target="_blank" title="Free online file viewer">Online File Viewer</a> |
  120. <a b-2u57mvn44z class="text-white" href="/contact">[Contact for this Slot]</a>
  121. </span>
  122. </div>
  123.  
  124. <!-- Navbar -->
  125. <nav b-2u57mvn44z class="navbar navbar-expand-lg navbar-light bg-light shadow-sm">
  126. <div b-2u57mvn44z class="container">
  127. <a b-2u57mvn44z class="navbar-brand text-danger" href="/"><img b-2u57mvn44z src="/jedok-logo.png" width="130" alt="jedok" /></a>
  128.  
  129. <button b-2u57mvn44z class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav"
  130. aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
  131. <span b-2u57mvn44z class="navbar-toggler-icon"></span>
  132. </button>
  133.  
  134. <div b-2u57mvn44z class="collapse navbar-collapse" id="navbarNav">
  135. <ul b-2u57mvn44z class="navbar-nav ms-auto align-items-lg-center">
  136. <li b-2u57mvn44z class="nav-item"><a b-2u57mvn44z class="nav-link" href="/">Home</a></li>
  137.  
  138. <!-- Mega menu -->
  139. <li b-2u57mvn44z class="nav-item dropdown megamenu position-static">
  140. <a b-2u57mvn44z class="nav-link dropdown-toggle" href="#" data-bs-toggle="dropdown" data-bs-auto-close="outside" aria-expanded="false">
  141. Convert
  142. </a>
  143.  
  144. <!-- Full-width on desktop, stacked on mobile -->
  145. <div b-2u57mvn44z class="dropdown-menu w-100 mt-0 border-0 shadow">
  146. <div b-2u57mvn44z class="container py-3">
  147. <div b-2u57mvn44z class="row gy-4">
  148.  
  149. <!-- Col 1 (11 items) -->
  150. <div b-2u57mvn44z class="col-12 col-md-6 col-lg-3">
  151. <ul b-2u57mvn44z class="list-unstyled mb-0">
  152. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/3d-file-converter"><i b-2u57mvn44z class="bi bi-box"></i><span b-2u57mvn44z>3D Converter</span></a></li>
  153. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/archive-file-converter"><i b-2u57mvn44z class="bi bi-file-earmark-zip"></i><span b-2u57mvn44z>Archive Converter</span></a></li>
  154. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/audio-file-converter"><i b-2u57mvn44z class="bi bi-music-note"></i><span b-2u57mvn44z>Audio Converter</span></a></li>
  155. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/backup-file-converter"><i b-2u57mvn44z class="bi bi-cloud-arrow-up"></i><span b-2u57mvn44z>Backups Converter</span></a></li>
  156. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/cad-file-converter"><i b-2u57mvn44z class="bi bi-dice-3"></i><span b-2u57mvn44z>CAD Converter</span></a></li>
  157. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/camera-raw-file-converter"><i b-2u57mvn44z class="bi bi-camera"></i><span b-2u57mvn44z>Camera Raw File Converter</span></a></li>
  158. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/common-file-converter"><i b-2u57mvn44z class="bi bi-collection"></i><span b-2u57mvn44z>Common Files Converter</span></a></li>
  159. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/compression-file-converter"><i b-2u57mvn44z class="bi bi-arrows-collapse"></i><span b-2u57mvn44z>Compression Converter</span></a></li>
  160. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/data-file-converter"><i b-2u57mvn44z class="bi bi-file-binary"></i><span b-2u57mvn44z>Data File Converter</span></a></li>
  161. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/database-file-converter"><i b-2u57mvn44z class="bi bi-database"></i><span b-2u57mvn44z>Database Converter</span></a></li>
  162. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/developer-file-converter"><i b-2u57mvn44z class="bi bi-code-slash"></i><span b-2u57mvn44z>Developer Files Converter</span></a></li>
  163. </ul>
  164. </div>
  165.  
  166. <!-- Col 2 (11 items) -->
  167. <div b-2u57mvn44z class="col-12 col-md-6 col-lg-3">
  168. <ul b-2u57mvn44z class="list-unstyled mb-0">
  169. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/diagram-file-converter"><i b-2u57mvn44z class="bi bi-diagram-3"></i><span b-2u57mvn44z>Diagram Converter</span></a></li>
  170. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/disk-image-file-converter"><i b-2u57mvn44z class="bi bi-device-hdd"></i><span b-2u57mvn44z>Disk Image Converter</span></a></li>
  171. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/document-file-converter"><i b-2u57mvn44z class="bi bi-file-earmark-text"></i><span b-2u57mvn44z>Document Converter</span></a></li>
  172. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/ebook-file-converter"><i b-2u57mvn44z class="bi bi-book"></i><span b-2u57mvn44z>eBook Converter</span></a></li>
  173. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/email-file-converter"><i b-2u57mvn44z class="bi bi-envelope"></i><span b-2u57mvn44z>Email Converter</span></a></li>
  174. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/excel-file-converter"><i b-2u57mvn44z class="bi bi-file-earmark-excel"></i><span b-2u57mvn44z>Excel Converter</span></a></li>
  175. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/executable-file-converter"><i b-2u57mvn44z class="bi bi-terminal"></i><span b-2u57mvn44z>Executable File Converter</span></a></li>
  176. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/font-file-converter"><i b-2u57mvn44z class="bi bi-type"></i><span b-2u57mvn44z>Font Converter</span></a></li>
  177. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/game-file-converter"><i b-2u57mvn44z class="bi bi-controller"></i><span b-2u57mvn44z>Game Files Converter</span></a></li>
  178. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/gis-file-converter"><i b-2u57mvn44z class="bi bi-geo-alt"></i><span b-2u57mvn44z>GIS Converter</span></a></li>
  179. </ul>
  180. </div>
  181.  
  182. <!-- Col 3 (11 items) -->
  183. <div b-2u57mvn44z class="col-12 col-md-6 col-lg-3">
  184. <ul b-2u57mvn44z class="list-unstyled mb-0">
  185. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/image-file-converter"><i b-2u57mvn44z class="bi bi-file-earmark-image"></i><span b-2u57mvn44z>Image Converter</span></a></li>
  186. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/misc-file-converter"><i b-2u57mvn44z class="bi bi-three-dots"></i><span b-2u57mvn44z>Misc Converter</span></a></li>
  187. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/note-file-converter"><i b-2u57mvn44z class="bi bi-journal-text"></i><span b-2u57mvn44z>One Note Converter</span></a></li>
  188. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/outlook-file-converter"><i b-2u57mvn44z class="bi bi-envelope-open"></i><span b-2u57mvn44z>Outlook Converter</span></a></li>
  189. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/page-description-language-file-converter"><i b-2u57mvn44z class="bi bi-code-slash"></i><span b-2u57mvn44z>Page Description Language</span></a></li>
  190. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/page-layout-file-converter"><i b-2u57mvn44z class="bi bi-layout-text-window"></i><span b-2u57mvn44z>Page Layout Converter</span></a></li>
  191. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/pdf-file-converter"><i b-2u57mvn44z class="bi bi-file-earmark-pdf"></i><span b-2u57mvn44z>PDF Converter</span></a></li>
  192. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/plugin-file-converter"><i b-2u57mvn44z class="bi bi-plug"></i><span b-2u57mvn44z>Plugin Converter</span></a></li>
  193. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/presentation-file-converter"><i b-2u57mvn44z class="bi bi-file-earmark-ppt"></i><span b-2u57mvn44z>Presentation Converter</span></a></li>
  194. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/project-file-converter"><i b-2u57mvn44z class="bi bi-kanban"></i><span b-2u57mvn44z>Project Converter</span></a></li>
  195. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/project-management-file-converter"><i b-2u57mvn44z class="bi bi-kanban-fill"></i><span b-2u57mvn44z>Project Management Converter</span></a></li>
  196. </ul>
  197. </div>
  198.  
  199. <!-- Col 4 (10 items) -->
  200. <div b-2u57mvn44z class="col-12 col-md-6 col-lg-3 d-none d-lg-block">
  201. <ul b-2u57mvn44z class="list-unstyled mb-0">
  202. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/publisher-file-converter"><i b-2u57mvn44z class="bi bi-journal-richtext"></i><span b-2u57mvn44z>Publisher Files Converter</span></a></li>
  203. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/raster-image-file-converter"><i b-2u57mvn44z class="bi bi-image"></i><span b-2u57mvn44z>Raster Image Converter</span></a></li>
  204. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/settings-file-converter"><i b-2u57mvn44z class="bi bi-gear"></i><span b-2u57mvn44z>Settings File Converter</span></a></li>
  205. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/spreadsheet-file-converter"><i b-2u57mvn44z class="bi bi-table"></i><span b-2u57mvn44z>Spreadsheet Converter</span></a></li>
  206. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/system-file-converter"><i b-2u57mvn44z class="bi bi-cpu"></i><span b-2u57mvn44z>System Files Converter</span></a></li>
  207. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/text-file-converter"><i b-2u57mvn44z class="bi bi-text-paragraph"></i><span b-2u57mvn44z>Text File Converter</span></a></li>
  208. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/vector-image-file-converter"><i b-2u57mvn44z class="bi bi-bezier"></i><span b-2u57mvn44z>Vector Image Converter</span></a></li>
  209. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/video-file-converter"><i b-2u57mvn44z class="bi bi-camera-video"></i><span b-2u57mvn44z>Video Converter</span></a></li>
  210. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/web-file-converter"><i b-2u57mvn44z class="bi bi-globe"></i><span b-2u57mvn44z>Web Files Converter</span></a></li>
  211. <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/word-processing-file-converter"><i b-2u57mvn44z class="bi bi-file-earmark-richtext"></i><span b-2u57mvn44z>Word Processing Converter</span></a></li>
  212. </ul>
  213. </div>
  214.  
  215. </div>
  216. </div>
  217. </div>
  218. </li>
  219.  
  220. <li b-2u57mvn44z class="nav-item"><a b-2u57mvn44z class="nav-link" href="/formats">Formats</a></li>
  221. <li b-2u57mvn44z class="nav-item"><a b-2u57mvn44z class="nav-link" href="/blog/">Blog</a></li>
  222. <li b-2u57mvn44z class="nav-item"><a b-2u57mvn44z class="nav-link" href="https://docpose.cloud/api-docs" target="_blank">API</a></li>
  223. <li b-2u57mvn44z class="nav-item"><a b-2u57mvn44z class="nav-link" href="/help">Help</a></li>
  224.  
  225. <li b-2u57mvn44z class="nav-item">
  226. <a b-2u57mvn44z class="nav-link" href="/download">
  227. My Files
  228. <span b-2u57mvn44z class="ui-badge text-red"><strong b-2u57mvn44z id="jobsCountLabel">0</strong></span>
  229. </a>
  230. </li>
  231.  
  232. <li b-2u57mvn44z class="nav-item auth-buttons ms-lg-3 mt-3 mt-lg-0">
  233. <a b-2u57mvn44z href="/login" class="btn btn-outline-secondary me-2">Login</a>
  234. <a b-2u57mvn44z href="/signup" class="btn btn-primary">Sign Up</a>
  235. </li>
  236. </ul>
  237. </div>
  238. </div>
  239. </nav>
  240.  
  241. <div b-2u57mvn44z class="container">
  242. <main b-2u57mvn44z role="main" class="pb-3">
  243. <!-- fallback if a view doesn’t use the layout or ViewBag is empty -->
  244.  
  245.  
  246. <!-- Include SignalR Library -->
  247. <script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/7.0.5/signalr.min.js" type="da44066bd6e0101f0eab17e9-text/javascript"></script>
  248.  
  249. <!-- Drop effect overlay -->
  250. <div id="dropOverlay" class="drag-over">
  251. <div class="drop-content">
  252. <svg width="80" height="80" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  253. <line x1="12" y1="5" x2="12" y2="19"></line>
  254. <line x1="5" y1="12" x2="19" y2="12"></line>
  255. </svg>
  256. <p>Drop files here</p>
  257. </div>
  258. </div>
  259. <div class="container mt-5">
  260. <h1 class="text-center text-red">
  261. File Converter
  262. </h1>
  263. <h2 class="text-center">Welcome to the most advanced free online file converter </h2>
  264. <p class="text-center">Convert any file online in seconds with jedok - free, secure file converter. Upload any file and save as you want without installing any software.</p>
  265. <form id="convertForm">
  266. <!-- Drag-and-Drop Zone -->
  267. <div id="dropZone">
  268. <button type="button" class="file-upload-btn" onclick="if (!window.__cfRLUnblockHandlers) return false; document.getElementById('fileInput').click()" data-cf-modified-da44066bd6e0101f0eab17e9-="">Select Files</button>
  269. <input type="file" id="fileInput" multiple />
  270. <div class="file-source-caption"><span class="security-icon" data-placement="left" title="All your data is always protected and under your control. Learn more about technical and organizational security measures we take on the Security page."></span><span>Drop max 5 files here. 25 MB maximum file size or <a style="color:white;" href="/signup">Sign Up</a> (free).</span></div>
  271. </div>
  272. <div class="text-center mt-2"><span class="text-green">All your data is always protected and under your control. Learn more about technical and organizational security measures we take on the <a href="/security">Security</a> page.</span> </div>
  273. <div class="text-center mt-2">Powered by <a href="https://docpose.cloud" target="_blank">Docpose.Cloud</a> API's, 200+ <a href="/formats">formats</a> supported.</div>
  274.  
  275. <!-- fallback if a view doesn’t use the layout or ViewBag is empty -->
  276. <div class="adb d-md-block">
  277.  
  278. <!-- jedoktop responsive -->
  279. <ins class="adsbygoogle"
  280. style="display:block"
  281. data-ad-client="ca-pub-0313867933438659"
  282. data-ad-slot="1439225974"
  283. data-ad-format="auto"
  284. data-full-width-responsive="true"></ins>
  285. <script type="da44066bd6e0101f0eab17e9-text/javascript">
  286. (adsbygoogle = window.adsbygoogle || []).push({});
  287. </script>
  288.  
  289. </div>
  290.  
  291.  
  292. <!-- File list -->
  293. <div id="file-list-container" class="mt-3 container">
  294. <ul id="file-list" class="list-group"></ul>
  295. </div>
  296.  
  297. <!-- Convert button -->
  298. <div class="mt-3 container text-center d-none" id="butonsDiv">
  299. <div class="file-source-caption" id="myFilesMessage">Files will be stored for 24 hours. Go to <a class="text-red" href="/download/">My Files</a> to delete them manually.</div>
  300. <button id="convertButton" type="submit" style="padding: 12px 24px!important; font-size: 25px!important;" class="btn btn-success w-50 mt-3">Convert</button>
  301. <!-- Clear All button (Initially Hidden) -->
  302. <button id="clearAllButton" type="button" style="padding: 12px 24px!important; font-size: 25px!important;" class="btn btn-info w-50 mt-3 d-none" onclick="if (!window.__cfRLUnblockHandlers) return false; resetForm()" data-cf-modified-da44066bd6e0101f0eab17e9-="">Clear All</button>
  303. </div>
  304. </form>
  305.  
  306. <!-- Status message -->
  307. <p id="message" class="text-center mt-3"></p>
  308.  
  309.  
  310. </div>
  311.  
  312. <section class="container text-center my-5">
  313. <div class="steps text-center mt-5">
  314. <h2>How to convert</h2>
  315. <div class="row">
  316. <div class="col-lg-4">
  317. <div class="card text-bg-light">
  318. <div class="step-label badge bg-info text-dark fs-6">STEP 1</div>
  319. <div class="card-body">
  320. <h3>Upload your file(s)</h3>
  321. <p>Select files from your Computer, mobile, tablet, or by dragging it on the page.</p>
  322. </div>
  323. </div>
  324. </div>
  325. <div class="col-lg-4">
  326. <div class="card text-bg-light">
  327. <div class="step-label badge bg-warning text-dark fs-6">STEP 2</div>
  328. <div class="card-body">
  329. <h3>Choose "to format"</h3>
  330. <p>Choose format (e.g pdf, docx, mp4, mp3, pptx, dot, png) you need as a result (<a href="/formats" title="list of all supported formats">supported formats</a>)</p>
  331. </div>
  332. </div>
  333. </div>
  334. <div class="col-lg-4">
  335. <div class="card text-bg-light">
  336. <div class="step-label badge bg-success text-dark fs-6">STEP 3</div>
  337. <div class="card-body">
  338. <h3>Download your file/s</h3>
  339. <p>Let the file convert and you can download your converted file right afterwards</p>
  340. </div>
  341. </div>
  342. </div>
  343. </div>
  344. </div>
  345. </section>
  346. <section class="container text-center my-5">
  347. <div class="row">
  348. <div class="col-md-4 mb-4">
  349. <div class="p-3">
  350. <p class="mb-3">
  351. <svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 40 40">
  352. <path fill="red" d="M28,10v5h-5l2.279-2.279C23.752,11.609,21.925,11,20,11c-4.962,0-9,4.038-9,9h-1c0-5.514,4.486-10,10-10
  353. c2.191,0,4.271,0.711,5.993,2.007L28,10z"></path>
  354. <path d="M20,2C10.075,2,2,10.075,2,20c0,9.925,8.075,18,18,18c9.925,0,18-8.075,18-18C38,10.075,29.925,2,20,2z
  355. M20,37c-9.374,0-17-7.626-17-17S10.626,3,20,3s17,7.626,17,17S29.374,37,20,37z M29,20h1c0,5.514-4.486,10-10,10
  356. c-2.193,0-4.272-0.711-5.993-2.007L12,30v-5h5l-2.279,2.279C16.248,28.391,18.075,29,20,29C24.963,29,29,24.963,29,20z"></path>
  357. </svg>
  358. </p>
  359. <h5>200+ formats supported</h5>
  360. <p>We support more than 10000+ different conversions between more than 200+ different <a href="/formats">file formats</a>. More than any other converter.</p>
  361. </div>
  362. </div>
  363. <div class="col-md-4 mb-4">
  364. <div class="p-3">
  365. <p class="mb-3">
  366. <svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 40 40">
  367. <path fill="red" d="M13.35,29.4c-0.111,0-0.222-0.037-0.312-0.109c-0.154-0.123-0.222-0.326-0.172-0.518l1.825-6.968
  368. l-4.535-4.284c-0.139-0.131-0.191-0.33-0.134-0.512c0.057-0.183,0.212-0.316,0.401-0.346l6.218-0.963l2.908-6.019
  369. c0.167-0.345,0.733-0.345,0.9,0l2.908,6.019l6.218,0.963c0.189,0.029,0.345,0.163,0.401,0.346c0.057,0.182,0.005,0.381-0.134,0.512
  370. l-4.535,4.284l1.825,6.968c0.051,0.191-0.017,0.395-0.171,0.518c-0.155,0.124-0.369,0.144-0.543,0.053L20,26.009l-6.419,3.335
  371. C13.508,29.382,13.429,29.4,13.35,29.4z M20,24.945c0.079,0,0.158,0.019,0.23,0.057l5.65,2.936l-1.614-6.165
  372. c-0.047-0.177,0.007-0.365,0.14-0.49l4.008-3.786l-5.468-0.847c-0.163-0.025-0.303-0.128-0.374-0.276L20,11.049l-2.572,5.323
  373. c-0.071,0.148-0.211,0.251-0.374,0.276l-5.469,0.847l4.008,3.786c0.133,0.125,0.187,0.313,0.141,0.49l-1.615,6.165l5.65-2.936
  374. C19.842,24.964,19.921,24.945,20,24.945z"></path>
  375. <path d="M20,38c-9.925,0-18-8.075-18-18c0-9.925,8.075-18,18-18c9.925,0,18,8.075,18,18C38,29.925,29.925,38,20,38z
  376. M20,3C10.626,3,3,10.626,3,20s7.626,17,17,17s17-7.626,17-17S29.374,3,20,3z"></path>
  377. </svg>
  378. </p>
  379. <h5>Fast and easy</h5>
  380. <p>Simply drag and drop your files, select the desired output format, and click 'Convert' — most file conversions are completed in under 2 minutes.</p>
  381. </div>
  382. </div>
  383. <div class="col-md-4 mb-4">
  384. <div class="p-3">
  385. <p class="mb-3">
  386. <svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 40 40">
  387. <path fill="red" d="M24.781,24.46L20,19.678V34h-1V19.678l-4.782,4.782l-0.637-0.637l5.918-5.918l5.918,5.918L24.781,24.46z"></path>
  388. <path d="M33.812,32H26v-1h7.812C36.673,31,39,28.771,39,26.031s-2.327-4.969-5.188-4.969
  389. c-0.181,0-0.395-0.093-0.482-0.25c-0.089-0.158-0.133-0.346-0.038-0.5c0.554-0.91,0.834-1.877,0.834-2.875
  390. c0-3.17-2.691-5.75-5.999-5.75c-0.902,0-1.797,0.209-2.661,0.623c-0.237,0.113-0.524,0.023-0.652-0.207
  391. C23.053,8.955,19.652,7,15.937,7c-5.548,0-10.062,4.332-10.062,9.656c0,0.761,0.104,1.549,0.311,2.344
  392. c0.035,0.133,0.013,0.275-0.061,0.392c-0.073,0.117-0.192,0.198-0.327,0.224C3.018,20.157,1,22.526,1,25.25C1,28.421,3.692,31,7,31
  393. h6v1H7c-3.86,0-7-3.028-7-6.75c0-3.032,2.116-5.689,5.1-6.498c-0.149-0.708-0.225-1.412-0.225-2.096C4.875,10.78,9.837,6,15.937,6
  394. c3.92,0,7.525,1.989,9.517,5.222c0.87-0.355,1.767-0.534,2.672-0.534c3.859,0,6.999,3.028,6.999,6.75
  395. c0,0.924-0.201,1.823-0.599,2.681C37.642,20.485,40,22.998,40,26.031C40,29.322,37.224,32,33.812,32z"></path>
  396. </svg>
  397. </p>
  398. <h5>In the cloud</h5>
  399. <p>Cloud-based conversion means all processing happens online — keeping your device fast and free from heavy resource usage.</p>
  400. </div>
  401. </div>
  402. <div class="col-md-4 mb-4">
  403. <div class="p-3">
  404. <p class="mb-3">
  405. <svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 40 40">
  406. <path fill="red" d="M20,26.002c-3.309,0-6-2.692-6-6.002s2.691-6.002,6-6.002S26,16.69,26,20S23.309,26.002,20,26.002z
  407. M20,14.998c-2.757,0-5,2.244-5,5.002c0,2.758,2.243,5.002,5,5.002s5-2.244,5-5.002C25,17.242,22.757,14.998,20,14.998z"></path>
  408. <path d="M20,38c-0.851,0-1.73-0.074-2.766-0.232l-0.35-0.054l-0.883-4.639c-0.853-0.261-1.665-0.596-2.42-0.997
  409. L9.68,34.731l-0.285-0.209c-1.499-1.098-2.813-2.41-3.905-3.903l-0.208-0.284l2.648-3.9c-0.411-0.773-0.749-1.591-1.007-2.438
  410. l-4.636-0.884l-0.053-0.349C2.074,21.721,2,20.843,2,20c0-0.834,0.074-1.711,0.232-2.758l0.053-0.35l4.636-0.884
  411. c0.26-0.852,0.598-1.669,1.006-2.437l-2.65-3.899l0.208-0.285c1.093-1.493,2.405-2.806,3.9-3.902L9.67,5.277l3.898,2.65
  412. c0.765-0.407,1.581-0.743,2.433-1.003l0.884-4.637l0.349-0.054c2.063-0.316,3.506-0.314,5.522,0l0.348,0.054l0.884,4.633
  413. c0.855,0.261,1.678,0.6,2.449,1.012l3.898-2.651l0.284,0.208c1.488,1.088,2.801,2.402,3.902,3.905l0.209,0.285l-2.652,3.901
  414. c0.409,0.77,0.744,1.584,1.001,2.431l4.634,0.883l0.054,0.349C37.926,18.281,38,19.156,38,20c0,0.849-0.074,1.727-0.234,2.762
  415. l-0.054,0.349l-4.634,0.883c-0.258,0.851-0.595,1.667-1.003,2.434l2.649,3.9l-0.208,0.284c-1.094,1.496-2.409,2.811-3.909,3.907
  416. l-0.284,0.209l-3.897-2.653c-0.771,0.41-1.588,0.746-2.436,1.004l-0.884,4.635l-0.348,0.055C21.756,37.924,20.854,38,20,38z
  417. M17.734,36.83c1.669,0.23,2.898,0.228,4.522,0.001l0.866-4.546l0.299-0.083c0.979-0.273,1.917-0.66,2.787-1.148l0.271-0.152
  418. l3.819,2.6c1.207-0.921,2.281-1.994,3.2-3.198l-2.598-3.823l0.152-0.27c0.487-0.864,0.874-1.802,1.148-2.785l0.083-0.299
  419. l4.544-0.865C36.945,21.427,37,20.701,37,20c0-0.696-0.055-1.421-0.17-2.256l-4.543-0.866l-0.083-0.299
  420. c-0.273-0.979-0.658-1.915-1.146-2.783l-0.152-0.27l2.599-3.823c-0.924-1.209-1.996-2.283-3.193-3.197l-3.821,2.6L26.22,8.954
  421. c-0.869-0.491-1.812-0.881-2.8-1.158l-0.299-0.083l-0.866-4.543c-1.638-0.229-2.86-0.231-4.52,0.001l-0.866,4.545l-0.298,0.084
  422. c-0.987,0.278-1.925,0.665-2.786,1.149l-0.27,0.152l-3.82-2.598C8.492,7.423,7.42,8.495,6.502,9.696l2.598,3.822l-0.152,0.27
  423. c-0.487,0.866-0.875,1.804-1.152,2.79l-0.084,0.297L3.17,17.741C3.055,18.585,3,19.31,3,20c0,0.696,0.055,1.423,0.172,2.263
  424. l4.543,0.866l0.083,0.299c0.274,0.979,0.662,1.917,1.153,2.79l0.151,0.27l-2.596,3.823c0.917,1.201,1.991,2.273,3.197,3.194
  425. l3.824-2.601l0.27,0.152c0.849,0.479,1.782,0.863,2.773,1.144l0.297,0.084L17.734,36.83z"></path>
  426. </svg>
  427. </p>
  428. <h5>Custom settings</h5>
  429. <p>Many of our file converters include advanced customization options. For instance, when converting videos, you can adjust resolution, aspect ratio, codec, bitrate, and even apply rotation or flip transformations — all to meet your exact needs.</p>
  430. </div>
  431. </div>
  432. <div class="col-md-4 mb-4">
  433. <div class="p-3">
  434. <p class="mb-3">
  435. <svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 40 40">
  436. <path fill="red" d="M16.9,25.699c-0.128,0-0.256-0.049-0.354-0.146l-6.2-6.199c-0.195-0.195-0.195-0.512,0-0.707
  437. s0.512-0.195,0.707,0l5.847,5.846l12.047-12.046c0.195-0.195,0.512-0.195,0.707,0s0.195,0.512,0,0.707l-12.4,12.399
  438. C17.156,25.65,17.028,25.699,16.9,25.699z"></path>
  439. <path d="M20,38.1c-0.048,0-0.097-0.007-0.144-0.021C19.209,37.885,4,33.194,4,22.1V3.5C4,3.224,4.224,3,4.5,3h31
  440. C35.776,3,36,3.224,36,3.5v18.6c0,11.095-15.209,15.785-15.856,15.979C20.097,38.093,20.048,38.1,20,38.1z M5,4v18.1
  441. c0,9.812,13.451,14.472,15,14.976c1.549-0.504,15-5.172,15-14.976V4H5z"></path>
  442. </svg>
  443. </p>
  444. <h5>Security guaranteed</h5>
  445. <p>Your uploaded files are automatically deleted right after processing, while converted files are securely removed within 24 hours. We guarantee 100% privacy — no one but you can access your data. Learn more about our file <a href="/security" target="_blank">security</a> and <a href="/privacy" target="_blank">privacy policy</a>.</p>
  446. </div>
  447. </div>
  448. <div class="col-md-4 mb-4">
  449. <div class="p-3">
  450. <p class="mb-3">
  451. <svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 40 40">
  452. <path fill="red" d="M35.5,38h-11c-1.379,0-2.5-1.121-2.5-2.5v-19c0-1.378,1.121-2.5,2.5-2.5h11c1.379,0,2.5,1.122,2.5,2.5v19
  453. C38,36.879,36.879,38,35.5,38z M24.5,15c-0.827,0-1.5,0.673-1.5,1.5v19c0,0.827,0.673,1.5,1.5,1.5h11c0.827,0,1.5-0.673,1.5-1.5v-19
  454. c0-0.827-0.673-1.5-1.5-1.5H24.5z"></path>
  455. <path d="M31.5,35h-3c-0.276,0-0.5-0.224-0.5-0.5s0.224-0.5,0.5-0.5h3c0.276,0,0.5,0.224,0.5,0.5S31.776,35,31.5,35z"></path>
  456. <path d="M33,4.5V12h-1V5H3v18h17v1H3v2h17v1h-6.497c-0.144,0.893-0.688,2.883-2.741,5H20v1H9.5
  457. c-0.209,0-0.396-0.13-0.469-0.326c-0.073-0.196-0.016-0.417,0.144-0.554c2.457-2.105,3.129-4.188,3.312-5.12H2.5
  458. C2.224,27,2,26.776,2,26.5v-22C2,4.224,2.224,4,2.5,4h30C32.776,4,33,4.224,33,4.5z"></path>
  459. </svg>
  460. </p>
  461. <h5>All devices supported</h5>
  462. <p>Our browser-based file conversion works seamlessly across all devices and operating systems — no software installation required.</p>
  463. </div>
  464. </div>
  465. </div>
  466. </section>
  467.  
  468. <script defer type="da44066bd6e0101f0eab17e9-text/javascript">
  469. const maxFilesAllowed = 3;
  470. const maxFileSizeMB = 25;
  471. let selectedFiles = [];
  472. const convertButton = document.getElementById("convertButton");
  473.  
  474. function showWarningMessage(message) {
  475. const el = document.getElementById('message');
  476. if (!el) { console.warn('#message not found'); return; }
  477. el.innerHTML = message;
  478. el.classList.remove('d-none');       // unhide if it was hidden
  479. el.classList.add('alert', 'alert-danger'); // style as Bootstrap alert
  480. }
  481.  
  482. // Function to reset warning message
  483. function resetWarningMessage() {
  484. const msgElement = document.getElementById("message");
  485. msgElement.textContent = "";
  486. msgElement.classList.remove("text-danger");
  487. }
  488.  
  489. // File input change event
  490. document.getElementById("fileInput").addEventListener("change", (e) => {
  491.  
  492. let newFiles = Array.from(e.target.files).filter(file => file.size <= maxFileSizeMB * 1024 * 1024);
  493.  
  494. if (selectedFiles.length + newFiles.length > maxFilesAllowed) {
  495. showWarningMessage(`You can only upload a maximum of ${maxFilesAllowed} files.`);
  496. return;
  497. }
  498.  
  499. document.getElementById("butonsDiv").classList.remove("d-none");
  500. //resetWarningMessage();
  501. selectedFiles = selectedFiles.concat(newFiles);
  502. updateFileList();
  503. });
  504.  
  505. // Drag-and-drop event listeners
  506. let dropOverlay = $("#dropOverlay");
  507.  
  508. // Show overlay when dragging
  509. $(document).on("dragenter dragover", function (e) {
  510. e.preventDefault();
  511. e.stopPropagation();
  512. dropOverlay.show();
  513. });
  514.  
  515. // Hide overlay when leaving
  516. $(document).on("dragleave", function (e) {
  517. if (e.relatedTarget === null) {
  518. dropOverlay.hide();
  519. }
  520. });
  521.  
  522. // Handle file drop
  523. $(document).on("drop", function (e) {
  524. e.preventDefault();
  525. dropOverlay.hide();
  526.  
  527. let newFiles = Array.from(e.originalEvent.dataTransfer.files).filter(file => file.size <= maxFileSizeMB * 1024 * 1024);
  528.  
  529. if (selectedFiles.length + newFiles.length > maxFilesAllowed) {
  530. showWarningMessage(`You can only upload a maximum of ${maxFilesAllowed} files.`);
  531. return;
  532. }
  533. document.getElementById("butonsDiv").classList.remove("d-none"); // Hide Convert button
  534. //resetWarningMessage();
  535. selectedFiles = selectedFiles.concat(newFiles);
  536. updateFileList();
  537. });
  538.  
  539. document.getElementById("convertForm").addEventListener("submit", async function (e) {
  540. e.preventDefault();
  541.  
  542. if(document.getElementById("message").innerHTML.includes("file conversion limit"))
  543. {
  544. alert(document.getElementById("message").textContent);
  545. return;
  546. }
  547.  
  548. if (selectedFiles.length === 0) return;
  549.  
  550. var now = new Date();
  551. var batchId = now.getHours() * 100 + now.getMinutes(); // Combine hour and minute
  552. //console.log("batchId: " + batchId);
  553.  
  554. convertButton.textContent = "Converting...";
  555. convertButton.disabled = true;
  556.  
  557. selectedFiles.forEach(async (file, index) => {
  558. const badgeStatus = document.getElementById(`badgeStatus-${index}`);
  559. const progressBar = document.getElementById(`progressBar-${index}`);
  560.  
  561. if(badgeStatus.textContent === "Ready"){
  562.  
  563. const outputFormat = document.getElementById(`outputFormat-${index}`).value;
  564. if (!outputFormat) {
  565. document.getElementById("message").textContent = `Please select an output format for ${file.name}`;
  566. document.getElementById("message").classList.add("text-danger");
  567. return;
  568. }
  569.  
  570. const formData = new FormData();
  571. formData.append("file", file);
  572. formData.append("outputFormat", outputFormat);
  573. formData.append("batchId", batchId);
  574.  
  575. const fileItem = document.querySelector(`#file-list li:nth-child(${index + 1})`);
  576.  
  577. badgeStatus.textContent = "Uploading";
  578. progressBar.style.width = "10%";
  579.  
  580. try {
  581. const data = await postFormDataWithProgress("/Conversion/ConvertFile", formData, (pct) => {
  582.  progressBar.style.width = pct + "%";
  583. });
  584.  
  585. // try {
  586. // const response = await fetch("/Conversion/ConvertFile", {
  587. // method: "POST",
  588. // body: formData,
  589. // });
  590. // progressBar.style.width = "40%";
  591. // badgeStatus.textContent = "Converting";
  592. // if (!response.ok) throw new Error(`Failed to convert file: ${file.name}`);
  593.  
  594. // const data = await response.json();
  595. // const jobId = data.jobId;
  596. // fileItem.setAttribute("data-job-id", jobId);
  597. // }
  598. // catch (error) {
  599. // //console.error(error);
  600. // }
  601. // Upload finished; backend accepted the job
  602. progressBar.style.width = "40%";
  603. badgeStatus.textContent = "Converting";
  604.  
  605. // Expect JSON like { jobId: 12345 }
  606. const jobId = data.jobId ?? data.JobId ?? data.id;
  607. if (!jobId) throw new Error("No jobId returned.");
  608. fileItem.setAttribute("data-job-id", jobId);
  609. //convertButton.textContent = "Convert";
  610. convertButton.disabled = true;
  611. }
  612. catch (err) {
  613. progressBar.style.width = "100%";
  614. progressBar.classList.add("bg-danger");
  615. badgeStatus.classList.add("text-error");
  616. //retryButton.classList.remove("d-none"); // Show retry button
  617. badgeStatus.textContent = "Upload failed";
  618. convertButton.disabled = false;
  619. console.error(err);
  620.  }
  621.  }
  622. });
  623. });
  624.  
  625. // 1) POST with real-time UPLOAD progress (10% → 40%)
  626. function postFormDataWithProgress(url, formData, onProgress) {
  627.  return new Promise((resolve, reject) => {
  628. const xhr = new XMLHttpRequest();
  629. xhr.open("POST", url);
  630.  
  631. // Upload progress
  632. xhr.upload.onprogress = (e) => {
  633.  if (!e.lengthComputable) return;
  634.  const uploaded = e.loaded / e.total;           // 0..1
  635.  const pct = Math.min(40, Math.max(10, 10 + Math.round(uploaded * 30))); // map to 10..40
  636.  onProgress?.(pct);
  637. };
  638.  
  639. xhr.onload = () => {
  640.  if (xhr.status >= 200 && xhr.status < 300) {
  641. try { resolve(JSON.parse(xhr.responseText)); }
  642. catch { resolve(xhr.responseText); }
  643.  } else {
  644. reject(new Error(`HTTP ${xhr.status}: ${xhr.statusText}`));
  645.  }
  646. };
  647.  
  648. xhr.onerror = () => reject(new Error("Network error"));
  649. xhr.send(formData);
  650.  });
  651. }
  652.  
  653. function checkAllJobsFinished() {
  654.  
  655. const allJobs = document.querySelectorAll("#file-list .file-item");
  656. let allProcessed = true;
  657.  
  658. allJobs.forEach(job => {
  659. const statusMessage = job.querySelector(".ui-badge").textContent;
  660. if (!statusMessage.includes("Completed") && !statusMessage.includes("Failed")) {
  661. allProcessed = false;
  662. }
  663. });
  664.  
  665. if (allProcessed) {
  666. document.getElementById("convertButton").classList.add("d-none"); // Hide Convert button
  667. document.getElementById("clearAllButton").classList.remove("d-none"); // Show Clear All button
  668. fetchConversionsCount();
  669. }
  670. }
  671.  
  672. // Function to update file list
  673. function updateFileList() {
  674. const fileList = document.getElementById("file-list");
  675. fileList.innerHTML = "";
  676.  
  677. selectedFiles.forEach((file, index) => {
  678. const fileItem = document.createElement("li");
  679. fileItem.className = "file-item list-group-item d-flex flex-column flex-md-row align-items-center";
  680.  
  681. fileItem.innerHTML = `
  682. <div class="d-flex align-items-center w-100 mb-2 mb-md-0">
  683. <img src="/file-icon.png" alt="icon" class="file-icon me-2">
  684. <span class="file-name-inner" title="${file.name}">${truncateFileName(file.name)}</span>
  685. <small class="text-muted ms-2 file-size">${formatFileSize(file.size)}</small>
  686. </div>
  687. <div class="output-format-container w-50 w-md-25 px-2">
  688. <select class="form-control output-format w-100" id="outputFormat-${index}">
  689. <option value="">Loading formats...</option>
  690. </select>
  691. </div>
  692. <div class="w-100 w-md-50 px-2 text-center">
  693. <div class="progress w-70 my-2">
  694. <div class="progress-bar progress-bar-striped progress-bar-animated" id="progressBar-${index}" role="progressbar" style="width: 0%;" aria-valuemin="0" aria-valuemax="100"></div>
  695. </div>
  696. <div class="ui-badge text-green" id="badgeStatus-${index}">Ready</div>
  697. </div>
  698. <div class="d-flex flex-wrap justify-content-center gap-2 mt-2 mt-md-0">
  699. <button type="button" class="btn btn-outline-danger btn-sm btn-remove" onclick="removeFile(${index})"><i class="bi bi-x-lg"></i>
  700. </button>
  701. <a class="btn btn-primary btn-sm file-download d-none" href="#" target="_blank">Download</a>
  702. <button type="button" class="btn btn-warning btn-sm retry-job d-none" onclick="retryJob(${index})">Retry</button>
  703. </div>
  704. `;
  705. fileList.appendChild(fileItem);
  706. fetchConversionFormats(file, index);
  707. });
  708.  
  709. convertButton.disabled = selectedFiles.length === 0 || selectedFiles.length > maxFilesAllowed;
  710. }
  711.  
  712. function resetForm() {
  713. location.reload(); // Reload the page to reset the form
  714. }
  715.  
  716. // Remove file function
  717. function removeFile(index) {
  718. selectedFiles.splice(index, 1);
  719. updateFileList();
  720. }
  721.  
  722. // Retry Job Functionality
  723. async function retryJob(index) {
  724. const fileItem = document.querySelector(`#file-list li:nth-child(${index + 1})`);
  725. const jobId = fileItem.getAttribute("data-job-id");
  726. const progressBar = fileItem.querySelector(".progress-bar");
  727. const message = fileItem.querySelector(".ui-badge");
  728. const retryButton = fileItem.querySelector(".retry-job");
  729.  
  730. if (!jobId) {
  731. //console.error("No job ID found for retry.");
  732. return;
  733. }
  734.  
  735. retryButton.disabled = true;
  736. message.textContent = "Retrying conversion...";
  737.  
  738. try {
  739. const response = await fetch(window.APP_CONFIG?.apiBaseUrl + `/admin/jobs/${jobId}/retry`, { method: "POST" });
  740.  
  741. if (!response.ok) throw new Error("Failed to retry the job.");
  742.  
  743. message.textContent = "Retry initiated...";
  744. progressBar.style.width = "50%";
  745. retryButton.classList.add("d-none");
  746. } catch (error) {
  747. //console.error(error);
  748. message.textContent = "Retry failed.";
  749. retryButton.disabled = false;
  750. }
  751. }
  752.  
  753. // SignalR Connection
  754. const connection = new signalR.HubConnectionBuilder()
  755. .withUrl((window.APP_CONFIG?.apiBaseUrl + "/").replace("/api/","") + "/jobHub")
  756. .build();
  757.  
  758. connection.start().then().catch(err => console.error("Error connecting to SignalR:", err));
  759.  
  760. connection.on("JobStatusUpdate", (jobId, status, outputFilePath) => {
  761.  
  762. //console.log(`Received OUTSIDE update for Job ${jobId}: Status = ${status}, OutputFilePath = ${outputFilePath}`);
  763.  
  764. // Select the correct file item based on jobId
  765. const fileItem = document.querySelector(`#file-list li[data-job-id='${jobId}']`);
  766.  
  767. if (!fileItem) {
  768. //console.error(`No file item found for Job ${jobId}`);
  769. return;
  770. }
  771.  
  772. const progressBar = fileItem.querySelector(".progress-bar");
  773. const message = fileItem.querySelector(".ui-badge");
  774. const downloadButton = fileItem.querySelector(".file-download");
  775. const retryButton = fileItem.querySelector(".retry-job");
  776. const outputFormatSelect = fileItem.querySelector(".output-format");
  777.  
  778. outputFormatSelect.classList.add("disabled");
  779. message.textContent = status;
  780.  
  781. if (status === "Completed") {
  782.  
  783. progressBar.style.width = "100%";
  784. downloadButton.href = (window.APP_CONFIG?.apiBaseUrl + "/").replace("/api/","") + "" + outputFilePath;
  785. downloadButton.classList.remove("d-none");
  786. const removeButton = fileItem.querySelector(".btn-remove");
  787. removeButton.classList.add("d-none");
  788.  
  789. } else if (status === "Failed") {
  790.  
  791. progressBar.style.width = "100%";
  792. progressBar.classList.add("bg-danger");
  793. message.classList.add("text-error");
  794. retryButton.classList.remove("d-none"); // Show retry button
  795.  
  796. } else {
  797.  
  798. progressBar.style.width = "60%";
  799. }
  800. checkAllJobsFinished();
  801. });
  802.  
  803. function truncateFileName(name) {
  804. if (name.length <= 24) return name;
  805.  
  806. const extensionIndex = name.lastIndexOf(".");
  807. const extension = extensionIndex !== -1 ? name.substring(extensionIndex) : "";
  808. const nameWithoutExtension = extensionIndex !== -1 ? name.substring(0, extensionIndex) : name;
  809.  
  810. const firstPart = nameWithoutExtension.substring(0, 12);
  811. const lastPart = nameWithoutExtension.substring(nameWithoutExtension.length - 8);
  812.  
  813. return `${firstPart}...${lastPart}${extension}`;
  814. }
  815.  
  816. function formatFileSize(size) {
  817. if (size < 1024) return size + " B";
  818. else if (size < 1024 * 1024) return (size / 1024).toFixed(2) + " KB";
  819. else if (size < 1024 * 1024 * 1024) return (size / (1024 * 1024)).toFixed(2) + " MB";
  820. else return (size / (1024 * 1024 * 1024)).toFixed(2) + " GB";
  821. }
  822.  
  823. async function fetchConversionFormats(file, index) {
  824.  
  825. const fileExt = file.name.toLowerCase();
  826. const outputFormatSelect = document.getElementById(`outputFormat-${index}`);
  827.  
  828. // Clear the dropdown
  829. outputFormatSelect.innerHTML = '<option value="">Output format</option>';
  830.  
  831. const apiUrl = window.APP_CONFIG?.apiBaseUrl + `/conversion/formats/${encodeURIComponent(fileExt)}`;
  832.  
  833. try {
  834.  
  835. // Call the API to get possible conversions
  836. const response = await fetch(apiUrl);
  837.  
  838. if (!response.ok) {
  839. outputFormatSelect.innerHTML = '<option value="">Failed to fetch formats</option>';
  840. throw new Error(`Failed to fetch conversion formats. Status: ${response.status}`);
  841. }
  842.  
  843. const data = await response.json();
  844.  
  845. if (data.possibleConversions.length === 0) {
  846. outputFormatSelect.innerHTML = '<option value="">No more supported</option>';
  847. // console.log("data.possibleConversions.length: "+data.possibleConversions.length);
  848.  
  849. // var option = document.createElement("option");
  850. // option.value = "TXT";
  851. // option.textContent = "txt".toUpperCase(); // Display in uppercase
  852. // outputFormatSelect.appendChild(option);
  853.  
  854. // option = document.createElement("option");
  855. // option.value = "PDF";
  856. // option.textContent = "pdf".toUpperCase(); // Display in uppercase
  857. // outputFormatSelect.appendChild(option);
  858. }
  859.  
  860. // Sort the possible conversions alphabetically
  861. data.possibleConversions.sort((a, b) => a.localeCompare(b));
  862.  
  863. // Populate the dropdown with sorted conversions
  864. data.possibleConversions.forEach(format => {
  865. const options = document.createElement("option");
  866. options.value = format;
  867. options.textContent = format.toUpperCase(); // Display in uppercase
  868. outputFormatSelect.appendChild(options);
  869. });
  870. } catch (error) {
  871. //console.error("Error fetching formats:", error);
  872. outputFormatSelect.innerHTML = '<option value="">Error loading formats</option>';
  873. }
  874. }
  875.  
  876. </script>
  877. </main>
  878. </div>
  879.  
  880. <footer b-2u57mvn44z class="bg-dark text-light py-4">
  881. <div b-2u57mvn44z class="container">
  882. <div b-2u57mvn44z class="row">
  883. <!-- Left Column -->
  884. <div b-2u57mvn44z class="col-md-3">
  885. <h6 b-2u57mvn44z class="fw-bold">About</h6>
  886. <ul b-2u57mvn44z class="list-unstyled">
  887. <li b-2u57mvn44z><a b-2u57mvn44z href="/about" class="text-light text-decoration-none">About</a></li>
  888. <li b-2u57mvn44z><a b-2u57mvn44z href="/blog" class="text-light text-decoration-none">Blog</a></li>
  889. <li b-2u57mvn44z><a b-2u57mvn44z href="/security" class="text-light text-decoration-none">Security</a></li>
  890. <li b-2u57mvn44z><a b-2u57mvn44z href="/formats" class="text-light text-decoration-none">Formats</a></li>
  891. <li b-2u57mvn44z><a b-2u57mvn44z href="/help" class="text-light text-decoration-none">Help</a></li>
  892. <li b-2u57mvn44z><a b-2u57mvn44z href="/help" class="text-light text-decoration-none">Contact</a></li>
  893. </ul>
  894. </div>
  895. <!-- Middle Column -->
  896. <div b-2u57mvn44z class="col-md-3">
  897. <h6 b-2u57mvn44z class="fw-bold">Converters</h6>
  898. <ul b-2u57mvn44z class="list-unstyled">
  899. <li b-2u57mvn44z><a b-2u57mvn44z href="/video-file-converter" class="text-light text-decoration-none">Video Converter</a></li>
  900. <li b-2u57mvn44z><a b-2u57mvn44z href="/audio-file-converter" class="text-light text-decoration-none">Audio Converter</a></li>
  901. <li b-2u57mvn44z><a b-2u57mvn44z href="/document-file-converter" class="text-light text-decoration-none">Document Converter</a></li>
  902. <li b-2u57mvn44z><a b-2u57mvn44z href="/image-file-converter" class="text-light text-decoration-none">Image Converter</a></li>
  903. <li b-2u57mvn44z><a b-2u57mvn44z href="/youtube-file-converter" class="text-light text-decoration-none">YouTube Converter</a></li>
  904. </ul>
  905. </div>
  906. <!-- Right Column -->
  907. <div b-2u57mvn44z class="col-md-3">
  908. <h6 b-2u57mvn44z class="fw-bold">Increase Daily Limits</h6>
  909. <ul b-2u57mvn44z class="list-unstyled">
  910. <li b-2u57mvn44z><a b-2u57mvn44z href="/signup" class="text-light text-decoration-none">Go Ad Free</a></li>
  911. <li b-2u57mvn44z><a b-2u57mvn44z href="/signup" class="text-light text-decoration-none">Free Register</a></li>
  912. <li b-2u57mvn44z><a b-2u57mvn44z href="/login" class="text-light text-decoration-none">Login</a></li>
  913. </ul>
  914. </div>
  915. <!-- Right Column -->
  916. <div b-2u57mvn44z class="col-md-3">
  917. <h6 b-2u57mvn44z class="fw-bold">Developers API</h6>
  918. <ul b-2u57mvn44z class="list-unstyled">
  919. <li b-2u57mvn44z><a b-2u57mvn44z href="https://docpose.cloud/api-docs" target="_blank" class="text-light text-decoration-none">API Docs</a></li>
  920. </ul>
  921. </div>
  922. </div>
  923. <hr b-2u57mvn44z class="bg-secondary">
  924. <div b-2u57mvn44z class="row text-center">
  925. <div b-2u57mvn44z class="col-md-12">
  926. <p b-2u57mvn44z class="mb-0">© 2025 JeDok.com Ltd. All rights reserved. | <a b-2u57mvn44z href="/terms" class="text-light text-decoration-none">Terms of Use</a> | <a b-2u57mvn44z href="/privacy" class="text-light text-decoration-none">Privacy Policy</a></p>
  927. </div>
  928. </div>
  929. </div>
  930. </footer>
  931.  
  932. <!-- Rest can be deferred -->
  933. <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js" defer crossorigin type="da44066bd6e0101f0eab17e9-text/javascript"></script>
  934. <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11" defer type="da44066bd6e0101f0eab17e9-text/javascript"></script>
  935.  
  936. <script defer type="da44066bd6e0101f0eab17e9-text/javascript">
  937. async function fetchConversionsCount() {
  938.  
  939. const jobsCountLabel = document.getElementById("jobsCountLabel");
  940. jobsCountLabel.innerHTML = "";
  941.  
  942. $.ajax({
  943. url: "/Conversion/GetJobsCount",
  944. type: "GET",
  945. dataType: "json",
  946. success: function (jobsCount) {
  947. jobsCountLabel.innerHTML = jobsCount;
  948. if (jobsCount >= 5) {
  949. showWarningMessage('You’ve reached today’s file conversion limit (5). To increase your limit, please <a href="/signup" class="alert-link">sign up</a>, or try again tomorrow.');
  950. }
  951. },
  952. error: function (xhr) {
  953. //console.error("Error fetching jobs count:", xhr);
  954. jobsCountLabel.innerHTML = "0";
  955. }
  956. });
  957. }
  958.  
  959. fetchConversionsCount();
  960. </script>
  961. <script type="da44066bd6e0101f0eab17e9-text/javascript">
  962. function animateContinuousCounter(id, startValue, incrementPerSecond = 60, minDelay = 1000, maxDelay = 4000) {
  963. const el = document.getElementById(id);
  964. let currentValue = startValue;
  965. let lastUpdate = performance.now();
  966. let nextIncrementTime = lastUpdate + getRandomDelay();
  967.  
  968. function format(n) {
  969. return n.toLocaleString(undefined, { maximumFractionDigits: 2 });
  970. }
  971.  
  972. function getRandomDelay() {
  973. return Math.random() * (maxDelay - minDelay) + minDelay; // ms
  974. }
  975.  
  976. function update(currentTime) {
  977. if (currentTime >= nextIncrementTime) {
  978. // Time to increment
  979. currentValue += incrementPerSecond * 2; // Double tick effect
  980. el.textContent = format(currentValue);
  981.  
  982. // Schedule next increment
  983. nextIncrementTime = currentTime + getRandomDelay();
  984. }
  985.  
  986. requestAnimationFrame(update);
  987. }
  988.  
  989. requestAnimationFrame(update);
  990. }
  991. </script>
  992. <script src="https://protagcdn.com/d/jedok.com.js" async type="da44066bd6e0101f0eab17e9-text/javascript"></script>
  993. <!-- Why Register Popup -->
  994. <div b-2u57mvn44z class="modal fade" id="whyRegisterModal" tabindex="-1" aria-labelledby="whyRegisterLabel" aria-hidden="true">
  995. <div b-2u57mvn44z class="modal-dialog modal-lg modal-dialog-centered modal-dialog-scrollable">
  996. <div b-2u57mvn44z class="modal-content rounded-3 shadow">
  997. <div b-2u57mvn44z class="modal-header border-0">
  998. <h2 b-2u57mvn44z class="h4 modal-title mx-auto" id="whyRegisterLabel">Why Register on Jedok?</h2>
  999. <button b-2u57mvn44z type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
  1000. </div>
  1001. <div b-2u57mvn44z class="modal-body">
  1002.  
  1003. <div b-2u57mvn44z class="row g-4">
  1004. <div b-2u57mvn44z class="col-12 col-md-6">
  1005. <h3 b-2u57mvn44z class="h5 text-center mb-3">Free</h3>
  1006. <ul b-2u57mvn44z class="list-unstyled fs-6">
  1007. <li b-2u57mvn44z>✅ <strong b-2u57mvn44z>Free Conversions</strong> – Enjoy <strong b-2u57mvn44z>15 per day</strong>.</li>
  1008. <li b-2u57mvn44z>✅ <strong b-2u57mvn44z>Bigger Files</strong> – Upload up to <strong b-2u57mvn44z>250 MB</strong>.</li>
  1009. <li b-2u57mvn44z>✅ <strong b-2u57mvn44z>Parallel Conversions</strong> – Run up to <strong b-2u57mvn44z>10</strong> at once.</li>
  1010. <li b-2u57mvn44z>✅ Conversion priority <strong b-2u57mvn44z>High</strong></li>
  1011. <li b-2u57mvn44z>✅ <strong b-2u57mvn44z>File Management</strong> – Files kept for <strong b-2u57mvn44z>24 hours</strong> (auto-delete) or delete anytime.</li>
  1012. <li b-2u57mvn44z>✅ <strong b-2u57mvn44z>All Formats Supported</strong> – 200+ formats (docs, images, audio, video, archives, and more).</li>
  1013. <li b-2u57mvn44z>✅ <strong b-2u57mvn44z>Email Verification</strong> – A valid email is required; we’ll send a quick verification link.</li>
  1014. </ul>
  1015. <div b-2u57mvn44z class="text-center">
  1016. <a b-2u57mvn44z class="btn btn-primary btn-sm" href="/signup">Register Now</a>
  1017. </div>
  1018. </div>
  1019.  
  1020. <div b-2u57mvn44z class="col-12 col-md-6">
  1021. <h3 b-2u57mvn44z class="h5 text-center mb-3">
  1022. Subscribed<br b-2u57mvn44z /><small b-2u57mvn44z>(USD $3.99 / month)</small>
  1023. </h3>
  1024. <ul b-2u57mvn44z class="list-unstyled fs-6">
  1025. <li b-2u57mvn44z>✅ <strong b-2u57mvn44z>Free Conversions</strong> – Enjoy <strong b-2u57mvn44z>60 per day</strong>.</li>
  1026. <li b-2u57mvn44z>✅ <strong b-2u57mvn44z>Bigger Files</strong> – Upload up to <strong b-2u57mvn44z>500 MB</strong>.</li>
  1027. <li b-2u57mvn44z>✅ <strong b-2u57mvn44z>Parallel Conversions</strong> – Run up to <strong b-2u57mvn44z>25</strong> at once.</li>
  1028. <li b-2u57mvn44z>✅ Conversion priority <strong b-2u57mvn44z>Highest</strong></li>
  1029. <li b-2u57mvn44z>✅ <strong b-2u57mvn44z>Ad-Free</strong> – 100% ad-free experience.</li>
  1030. <li b-2u57mvn44z>✅ <strong b-2u57mvn44z>File Management</strong> – Files kept for <strong b-2u57mvn44z>24 hours</strong> (auto-delete) or delete anytime.</li>
  1031. <li b-2u57mvn44z>✅ <strong b-2u57mvn44z>All Formats Supported</strong> – 200+ formats.</li>
  1032. </ul>
  1033. <div b-2u57mvn44z class="text-center">
  1034. <a b-2u57mvn44z class="btn btn-primary btn-sm" href="/contact">Contact Us for Subscription</a>
  1035. </div>
  1036. </div>
  1037. </div>
  1038.  
  1039. <p b-2u57mvn44z class="text-center mt-4 mb-0">
  1040. <strong b-2u57mvn44z>Sign up now</strong> to unlock these features and enjoy a faster, more powerful conversion experience!
  1041. </p>
  1042. </div>
  1043. </div>
  1044. </div>
  1045. </div>
  1046. <script type="da44066bd6e0101f0eab17e9-text/javascript">
  1047. document.addEventListener("DOMContentLoaded", function () {
  1048.  const modalEl = document.getElementById('whyRegisterModal');
  1049.  const modal = new bootstrap.Modal(modalEl);
  1050.  const key = "whyRegisterShownCount";
  1051.  
  1052.  // Check how many times shown in this session
  1053.  let shownCount = parseInt(sessionStorage.getItem(key) || "0");
  1054.  
  1055.  if (shownCount < 2) {
  1056. setTimeout(() => {
  1057.  modal.show();
  1058.  shownCount++;
  1059.  sessionStorage.setItem(key, shownCount);
  1060. }, 15000); // 15 seconds
  1061.  }
  1062. });
  1063. </script>
  1064. <script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="da44066bd6e0101f0eab17e9-|49" defer></script><script defer src="https://static.cloudflareinsights.com/beacon.min.js/vcd15cbe7772f49c399c6a5babf22c1241717689176015" integrity="sha512-ZpsOmlRQV6y907TI0dKBHq9Md29nnaEIPlkf84rnaERnq6zvWvPUqr2ft8M1aS28oN72PdrCzSjY4U6VaAw1EQ==" data-cf-beacon='{"version":"2024.11.0","token":"b675e68b422a4d21b07fefa11bd3a716","r":1,"server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
  1065. </body>
  1066. </html>
  1067.  
Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda