{"id":4584,"date":"2026-02-14T22:06:04","date_gmt":"2026-02-15T03:06:04","guid":{"rendered":"https:\/\/smartdsp.pro\/?page_id=4584"},"modified":"2026-02-18T18:56:17","modified_gmt":"2026-02-18T23:56:17","slug":"audio-metadata-editor","status":"publish","type":"page","link":"https:\/\/smartdsp.pro\/fr\/audio-metadata-editor\/","title":{"rendered":"\u00c9diteur de m\u00e9tadonn\u00e9es audio"},"content":{"rendered":"<p>[et_pb_section fb_built=&#8221;1&#8243; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; background_color=&#8221;#000000&#8243; background_image=&#8221;https:\/\/smartdsp.pro\/wp-content\/uploads\/2022\/10\/streamer-79.png&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_row _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_code _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;]<!DOCTYPE html><!-- [et_pb_line_break_holder] --><html lang=\"en\"><!-- [et_pb_line_break_holder] --><head><!-- [et_pb_line_break_holder] -->    <meta charset=\"UTF-8\"><!-- [et_pb_line_break_holder] -->    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><!-- [et_pb_line_break_holder] -->    <title>Audio Metadata Viewer\/Editor<\/title><!-- [et_pb_line_break_holder] -->    <\/p>\n<style><!-- [et_pb_line_break_holder] -->        * {<!-- [et_pb_line_break_holder] -->            margin: 0;<!-- [et_pb_line_break_holder] -->            padding: 0;<!-- [et_pb_line_break_holder] -->            box-sizing: border-box;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        :root {<!-- [et_pb_line_break_holder] -->            --bg-primary: #0f0f0f;<!-- [et_pb_line_break_holder] -->            --bg-secondary: #1a1a1a;<!-- [et_pb_line_break_holder] -->            --bg-tertiary: #242424;<!-- [et_pb_line_break_holder] -->            --bg-hover: #2a2a2a;<!-- [et_pb_line_break_holder] -->            --border-color: #333;<!-- [et_pb_line_break_holder] -->            --text-primary: #e4e4e4;<!-- [et_pb_line_break_holder] -->            --text-secondary: #a0a0a0;<!-- [et_pb_line_break_holder] -->            --accent: #f3be29;<!-- [et_pb_line_break_holder] -->            --accent-hover: #f99c06;<!-- [et_pb_line_break_holder] -->            --success: #22c55e;<!-- [et_pb_line_break_holder] -->            --danger: #ef4444;<!-- [et_pb_line_break_holder] -->            --warning: #f59e0b;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        body {<!-- [et_pb_line_break_holder] -->            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;<!-- [et_pb_line_break_holder] -->            background: var(--bg-primary);<!-- [et_pb_line_break_holder] -->            color: var(--text-primary);<!-- [et_pb_line_break_holder] -->            line-height: 1.6;<!-- [et_pb_line_break_holder] -->            padding: 20px;<!-- [et_pb_line_break_holder] -->            min-height: 100vh;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .container {<!-- [et_pb_line_break_holder] -->            max-width: 1600px;<!-- [et_pb_line_break_holder] -->            margin: 0 auto;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] -->      <!-- [et_pb_line_break_holder] -->       .features {<!-- [et_pb_line_break_holder] -->            display: flex;<!-- [et_pb_line_break_holder] -->            justify-content: center;<!-- [et_pb_line_break_holder] -->            gap: 24px;<!-- [et_pb_line_break_holder] -->            flex-wrap: wrap;<!-- [et_pb_line_break_holder] -->            margin-bottom: 40px;<!-- [et_pb_line_break_holder] -->            font-size: 0.875rem;<!-- [et_pb_line_break_holder] -->            color: #10b981;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .feature-item {<!-- [et_pb_line_break_holder] -->            display: flex;<!-- [et_pb_line_break_holder] -->            align-items: center;<!-- [et_pb_line_break_holder] -->            gap: 6px;<!-- [et_pb_line_break_holder] -->            font-size: 1rem;<!-- [et_pb_line_break_holder] -->            font-weight: bold;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .feature-item::before {<!-- [et_pb_line_break_holder] -->            content: \"\u2713\";<!-- [et_pb_line_break_holder] -->            font-weight: bold;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        header {<!-- [et_pb_line_break_holder] -->            text-align: center;<!-- [et_pb_line_break_holder] -->            margin-bottom: 40px;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        h1 {<!-- [et_pb_line_break_holder] -->            font-size: 2.5rem;<!-- [et_pb_line_break_holder] -->            font-weight: 700;<!-- [et_pb_line_break_holder] -->            margin-bottom: 10px;<!-- [et_pb_line_break_holder] -->            background: linear-gradient(135deg, var(--accent), #cd3ba7);<!-- [et_pb_line_break_holder] -->            -webkit-background-clip: text;<!-- [et_pb_line_break_holder] -->            -webkit-text-fill-color: transparent;<!-- [et_pb_line_break_holder] -->            background-clip: text;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .subtitle {<!-- [et_pb_line_break_holder] -->            color: white;<!-- [et_pb_line_break_holder] -->            font-size: 1.2rem;<!-- [et_pb_line_break_holder] -->            font-weight: bold;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        \/* Drop Zone *\/<!-- [et_pb_line_break_holder] -->        .drop-zone {<!-- [et_pb_line_break_holder] -->            background: var(--bg-secondary);<!-- [et_pb_line_break_holder] -->            border: 2px dashed var(--border-color);<!-- [et_pb_line_break_holder] -->            border-radius: 12px;<!-- [et_pb_line_break_holder] -->            padding: 60px 20px;<!-- [et_pb_line_break_holder] -->            text-align: center;<!-- [et_pb_line_break_holder] -->            cursor: pointer;<!-- [et_pb_line_break_holder] -->            transition: all 0.3s ease;<!-- [et_pb_line_break_holder] -->            margin-bottom: 30px;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .drop-zone:hover, .drop-zone.drag-over {<!-- [et_pb_line_break_holder] -->            border-color: var(--accent);<!-- [et_pb_line_break_holder] -->            background: var(--bg-tertiary);<!-- [et_pb_line_break_holder] -->            transform: translateY(-2px);<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .drop-zone-icon {<!-- [et_pb_line_break_holder] -->            font-size: 3rem;<!-- [et_pb_line_break_holder] -->            margin-bottom: 20px;<!-- [et_pb_line_break_holder] -->            opacity: 0.5;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .drop-zone-text {<!-- [et_pb_line_break_holder] -->            font-size: 1.2rem;<!-- [et_pb_line_break_holder] -->            margin-bottom: 10px;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .drop-zone-subtext {<!-- [et_pb_line_break_holder] -->            color: var(--text-secondary);<!-- [et_pb_line_break_holder] -->            font-size: 0.9rem;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        #fileInput {<!-- [et_pb_line_break_holder] -->            display: none;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        \/* Controls *\/<!-- [et_pb_line_break_holder] -->        .controls {<!-- [et_pb_line_break_holder] -->            display: flex;<!-- [et_pb_line_break_holder] -->            gap: 15px;<!-- [et_pb_line_break_holder] -->            margin-bottom: 20px;<!-- [et_pb_line_break_holder] -->            flex-wrap: wrap;<!-- [et_pb_line_break_holder] -->            align-items: center;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .search-box {<!-- [et_pb_line_break_holder] -->            flex: 1;<!-- [et_pb_line_break_holder] -->            min-width: 250px;<!-- [et_pb_line_break_holder] -->            position: relative;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .search-box input {<!-- [et_pb_line_break_holder] -->            width: 100%;<!-- [et_pb_line_break_holder] -->            padding: 12px 40px 12px 15px;<!-- [et_pb_line_break_holder] -->            background: var(--bg-secondary);<!-- [et_pb_line_break_holder] -->            border: 1px solid var(--border-color);<!-- [et_pb_line_break_holder] -->            border-radius: 8px;<!-- [et_pb_line_break_holder] -->            color: var(--text-primary);<!-- [et_pb_line_break_holder] -->            font-size: 0.95rem;<!-- [et_pb_line_break_holder] -->            transition: all 0.2s;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .search-box input:focus {<!-- [et_pb_line_break_holder] -->            outline: none;<!-- [et_pb_line_break_holder] -->            border-color: var(--accent);<!-- [et_pb_line_break_holder] -->            background: var(--bg-tertiary);<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .search-icon {<!-- [et_pb_line_break_holder] -->            position: absolute;<!-- [et_pb_line_break_holder] -->            right: 15px;<!-- [et_pb_line_break_holder] -->            top: 50%;<!-- [et_pb_line_break_holder] -->            transform: translateY(-50%);<!-- [et_pb_line_break_holder] -->            color: var(--text-secondary);<!-- [et_pb_line_break_holder] -->            pointer-events: none;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .btn {<!-- [et_pb_line_break_holder] -->            padding: 12px 24px;<!-- [et_pb_line_break_holder] -->            border: none;<!-- [et_pb_line_break_holder] -->            border-radius: 8px;<!-- [et_pb_line_break_holder] -->            font-size: 0.95rem;<!-- [et_pb_line_break_holder] -->            font-weight: 500;<!-- [et_pb_line_break_holder] -->            cursor: pointer;<!-- [et_pb_line_break_holder] -->            transition: all 0.2s;<!-- [et_pb_line_break_holder] -->            display: inline-flex;<!-- [et_pb_line_break_holder] -->            align-items: center;<!-- [et_pb_line_break_holder] -->            gap: 8px;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .btn-primary {<!-- [et_pb_line_break_holder] -->            background: var(--accent);<!-- [et_pb_line_break_holder] -->            color: #0f0f0f;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .btn-primary:hover {<!-- [et_pb_line_break_holder] -->            background: var(--accent-hover);<!-- [et_pb_line_break_holder] -->            transform: translateY(-1px);<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .btn-success {<!-- [et_pb_line_break_holder] -->            background: var(--success);<!-- [et_pb_line_break_holder] -->            color: white;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .btn-success:hover {<!-- [et_pb_line_break_holder] -->            background: #16a34a;<!-- [et_pb_line_break_holder] -->            transform: translateY(-1px);<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .btn-secondary {<!-- [et_pb_line_break_holder] -->            background: var(--bg-secondary);<!-- [et_pb_line_break_holder] -->            color: var(--text-primary);<!-- [et_pb_line_break_holder] -->            border: 1px solid var(--border-color);<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .btn-secondary:hover {<!-- [et_pb_line_break_holder] -->            background: var(--bg-tertiary);<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .btn:disabled {<!-- [et_pb_line_break_holder] -->            opacity: 0.5;<!-- [et_pb_line_break_holder] -->            cursor: not-allowed;<!-- [et_pb_line_break_holder] -->            transform: none !important;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        \/* Table Container *\/<!-- [et_pb_line_break_holder] -->        .table-container {<!-- [et_pb_line_break_holder] -->            background: var(--bg-secondary);<!-- [et_pb_line_break_holder] -->            border-radius: 12px;<!-- [et_pb_line_break_holder] -->            overflow: hidden;<!-- [et_pb_line_break_holder] -->            border: 1px solid var(--border-color);<!-- [et_pb_line_break_holder] -->            display: none;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .table-container.visible {<!-- [et_pb_line_break_holder] -->            display: block;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .table-wrapper {<!-- [et_pb_line_break_holder] -->            overflow-x: auto;<!-- [et_pb_line_break_holder] -->            overflow-y: auto;<!-- [et_pb_line_break_holder] -->            max-height: 70vh;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        table {<!-- [et_pb_line_break_holder] -->            width: 100%;<!-- [et_pb_line_break_holder] -->            border-collapse: collapse;<!-- [et_pb_line_break_holder] -->            font-size: 0.9rem;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        thead {<!-- [et_pb_line_break_holder] -->            position: sticky;<!-- [et_pb_line_break_holder] -->            top: 0;<!-- [et_pb_line_break_holder] -->            background: var(--bg-tertiary);<!-- [et_pb_line_break_holder] -->            z-index: 10;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        th {<!-- [et_pb_line_break_holder] -->            padding: 15px 12px;<!-- [et_pb_line_break_holder] -->            text-align: left;<!-- [et_pb_line_break_holder] -->            font-weight: 600;<!-- [et_pb_line_break_holder] -->            color: var(--text-secondary);<!-- [et_pb_line_break_holder] -->            border-bottom: 2px solid var(--border-color);<!-- [et_pb_line_break_holder] -->            white-space: nowrap;<!-- [et_pb_line_break_holder] -->            text-transform: uppercase;<!-- [et_pb_line_break_holder] -->            font-size: 0.75rem;<!-- [et_pb_line_break_holder] -->            letter-spacing: 0.05em;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        td {<!-- [et_pb_line_break_holder] -->            padding: 12px;<!-- [et_pb_line_break_holder] -->            border-bottom: 1px solid var(--border-color);<!-- [et_pb_line_break_holder] -->            position: relative;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        tr:hover {<!-- [et_pb_line_break_holder] -->            background: var(--bg-hover);<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .file-name {<!-- [et_pb_line_break_holder] -->            font-weight: 600;<!-- [et_pb_line_break_holder] -->            color: var(--accent);<!-- [et_pb_line_break_holder] -->            max-width: 200px;<!-- [et_pb_line_break_holder] -->            overflow: hidden;<!-- [et_pb_line_break_holder] -->            text-overflow: ellipsis;<!-- [et_pb_line_break_holder] -->            white-space: nowrap;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .editable-cell {<!-- [et_pb_line_break_holder] -->            cursor: text;<!-- [et_pb_line_break_holder] -->            padding: 8px;<!-- [et_pb_line_break_holder] -->            border-radius: 4px;<!-- [et_pb_line_break_holder] -->            min-height: 30px;<!-- [et_pb_line_break_holder] -->            transition: all 0.2s;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .editable-cell:hover {<!-- [et_pb_line_break_holder] -->            background: var(--bg-tertiary);<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .editable-cell:focus {<!-- [et_pb_line_break_holder] -->            outline: 2px solid var(--accent);<!-- [et_pb_line_break_holder] -->            background: var(--bg-primary);<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .editable-cell.modified {<!-- [et_pb_line_break_holder] -->            background: rgba(243, 190, 41, 0.1);<!-- [et_pb_line_break_holder] -->            border-left: 2px solid var(--accent);<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] -->        <!-- [et_pb_line_break_holder] -->        .editable-cell.readonly {<!-- [et_pb_line_break_holder] -->            cursor: not-allowed;<!-- [et_pb_line_break_holder] -->            opacity: 0.6;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        \/* Context Menu *\/<!-- [et_pb_line_break_holder] -->        .context-menu {<!-- [et_pb_line_break_holder] -->            position: fixed;<!-- [et_pb_line_break_holder] -->            background: var(--bg-tertiary);<!-- [et_pb_line_break_holder] -->            border: 1px solid var(--border-color);<!-- [et_pb_line_break_holder] -->            border-radius: 8px;<!-- [et_pb_line_break_holder] -->            padding: 6px;<!-- [et_pb_line_break_holder] -->            min-width: 180px;<!-- [et_pb_line_break_holder] -->            box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5);<!-- [et_pb_line_break_holder] -->            z-index: 1000;<!-- [et_pb_line_break_holder] -->            display: none;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .context-menu.visible {<!-- [et_pb_line_break_holder] -->            display: block;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .context-menu-item {<!-- [et_pb_line_break_holder] -->            padding: 10px 14px;<!-- [et_pb_line_break_holder] -->            cursor: pointer;<!-- [et_pb_line_break_holder] -->            border-radius: 4px;<!-- [et_pb_line_break_holder] -->            transition: all 0.15s;<!-- [et_pb_line_break_holder] -->            display: flex;<!-- [et_pb_line_break_holder] -->            align-items: center;<!-- [et_pb_line_break_holder] -->            gap: 10px;<!-- [et_pb_line_break_holder] -->            font-size: 0.9rem;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .context-menu-item:hover {<!-- [et_pb_line_break_holder] -->            background: var(--bg-hover);<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .context-menu-divider {<!-- [et_pb_line_break_holder] -->            height: 1px;<!-- [et_pb_line_break_holder] -->            background: var(--border-color);<!-- [et_pb_line_break_holder] -->            margin: 6px 0;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        \/* Status Messages *\/<!-- [et_pb_line_break_holder] -->        .status-message {<!-- [et_pb_line_break_holder] -->            position: fixed;<!-- [et_pb_line_break_holder] -->            top: 30px;<!-- [et_pb_line_break_holder] -->            right: 30px;<!-- [et_pb_line_break_holder] -->            padding: 16px 24px;<!-- [et_pb_line_break_holder] -->            border-radius: 8px;<!-- [et_pb_line_break_holder] -->            background: var(--success);<!-- [et_pb_line_break_holder] -->            color: white;<!-- [et_pb_line_break_holder] -->            font-weight: 500;<!-- [et_pb_line_break_holder] -->            box-shadow: 0 10px 40px rgba(0, 0, 0, 0.3);<!-- [et_pb_line_break_holder] -->            z-index: 2000;<!-- [et_pb_line_break_holder] -->            display: none;<!-- [et_pb_line_break_holder] -->            animation: slideIn 0.3s ease;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .status-message.visible {<!-- [et_pb_line_break_holder] -->            display: block;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .status-message.error {<!-- [et_pb_line_break_holder] -->            background: var(--danger);<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .status-message.warning {<!-- [et_pb_line_break_holder] -->            background: var(--warning);<!-- [et_pb_line_break_holder] -->            color: #000;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        @keyframes slideIn {<!-- [et_pb_line_break_holder] -->            from {<!-- [et_pb_line_break_holder] -->                transform: translateX(400px);<!-- [et_pb_line_break_holder] -->                opacity: 0;<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] -->            to {<!-- [et_pb_line_break_holder] -->                transform: translateX(0);<!-- [et_pb_line_break_holder] -->                opacity: 1;<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        \/* File Type Badge *\/<!-- [et_pb_line_break_holder] -->        .file-type-badge {<!-- [et_pb_line_break_holder] -->            display: inline-block;<!-- [et_pb_line_break_holder] -->            padding: 4px 10px;<!-- [et_pb_line_break_holder] -->            border-radius: 4px;<!-- [et_pb_line_break_holder] -->            font-size: 0.75rem;<!-- [et_pb_line_break_holder] -->            font-weight: 600;<!-- [et_pb_line_break_holder] -->            text-transform: uppercase;<!-- [et_pb_line_break_holder] -->            letter-spacing: 0.05em;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .badge-mp3 { background: rgba(236, 72, 153, 0.2); color: #ec4899; }<!-- [et_pb_line_break_holder] -->        .badge-wav { background: rgba(34, 197, 94, 0.2); color: #22c55e; }<!-- [et_pb_line_break_holder] -->        .badge-aiff { background: rgba(59, 130, 246, 0.2); color: #3b82f6; }<!-- [et_pb_line_break_holder] -->        .badge-ogg { background: rgba(245, 158, 11, 0.2); color: #f59e0b; }<!-- [et_pb_line_break_holder] -->        .badge-flac { background: rgba(139, 92, 246, 0.2); color: #8b5cf6; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        \/* Action Icons *\/<!-- [et_pb_line_break_holder] -->        .action-icons {<!-- [et_pb_line_break_holder] -->            display: flex;<!-- [et_pb_line_break_holder] -->            gap: 10px;<!-- [et_pb_line_break_holder] -->            align-items: center;<!-- [et_pb_line_break_holder] -->            justify-content: center;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .action-icon {<!-- [et_pb_line_break_holder] -->            cursor: pointer;<!-- [et_pb_line_break_holder] -->            padding: 6px;<!-- [et_pb_line_break_holder] -->            border-radius: 4px;<!-- [et_pb_line_break_holder] -->            transition: all 0.2s;<!-- [et_pb_line_break_holder] -->            font-size: 1.1rem;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .action-icon:hover {<!-- [et_pb_line_break_holder] -->            background: var(--bg-hover);<!-- [et_pb_line_break_holder] -->            transform: scale(1.1);<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .action-icon.save-icon:hover {<!-- [et_pb_line_break_holder] -->            color: var(--success);<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .action-icon.delete-icon:hover {<!-- [et_pb_line_break_holder] -->            color: var(--danger);<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        \/* Save Modal *\/<!-- [et_pb_line_break_holder] -->        .modal-overlay {<!-- [et_pb_line_break_holder] -->            position: fixed;<!-- [et_pb_line_break_holder] -->            top: 0;<!-- [et_pb_line_break_holder] -->            left: 0;<!-- [et_pb_line_break_holder] -->            right: 0;<!-- [et_pb_line_break_holder] -->            bottom: 0;<!-- [et_pb_line_break_holder] -->            background: rgba(0, 0, 0, 0.95);<!-- [et_pb_line_break_holder] -->            display: none;<!-- [et_pb_line_break_holder] -->            align-items: center;<!-- [et_pb_line_break_holder] -->            justify-content: center;<!-- [et_pb_line_break_holder] -->            z-index: 9999;<!-- [et_pb_line_break_holder] -->            backdrop-filter: blur(4px);<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .modal-overlay.visible {<!-- [et_pb_line_break_holder] -->            display: flex;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .modal {<!-- [et_pb_line_break_holder] -->            background: var(--bg-secondary);<!-- [et_pb_line_break_holder] -->            border: 1px solid var(--border-color);<!-- [et_pb_line_break_holder] -->            border-radius: 12px;<!-- [et_pb_line_break_holder] -->            padding: 30px;<!-- [et_pb_line_break_holder] -->            max-width: 500px;<!-- [et_pb_line_break_holder] -->            width: 90%;<!-- [et_pb_line_break_holder] -->            box-shadow: 0 20px 60px rgba(0, 0, 0, 0.8);<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .modal h3 {<!-- [et_pb_line_break_holder] -->            margin-bottom: 20px;<!-- [et_pb_line_break_holder] -->            font-size: 1.5rem;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .modal-actions {<!-- [et_pb_line_break_holder] -->            display: flex;<!-- [et_pb_line_break_holder] -->            gap: 12px;<!-- [et_pb_line_break_holder] -->            justify-content: flex-end;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        \/* Empty State *\/<!-- [et_pb_line_break_holder] -->        .empty-state {<!-- [et_pb_line_break_holder] -->            text-align: center;<!-- [et_pb_line_break_holder] -->            padding: 80px 20px;<!-- [et_pb_line_break_holder] -->            color: var(--text-secondary);<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .empty-state-icon {<!-- [et_pb_line_break_holder] -->            font-size: 4rem;<!-- [et_pb_line_break_holder] -->            opacity: 0.3;<!-- [et_pb_line_break_holder] -->            margin-bottom: 20px;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        \/* \u2500\u2500 NEW: Technical Metadata Bar \u2500\u2500 *\/<!-- [et_pb_line_break_holder] -->        .tech-info-cell {<!-- [et_pb_line_break_holder] -->            white-space: nowrap;<!-- [et_pb_line_break_holder] -->            font-size: 0.78rem;<!-- [et_pb_line_break_holder] -->            color: var(--text-secondary);<!-- [et_pb_line_break_holder] -->            min-width: 280px;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .tech-pill {<!-- [et_pb_line_break_holder] -->            display: inline-flex;<!-- [et_pb_line_break_holder] -->            align-items: center;<!-- [et_pb_line_break_holder] -->            gap: 4px;<!-- [et_pb_line_break_holder] -->            background: var(--bg-tertiary);<!-- [et_pb_line_break_holder] -->            border: 1px solid var(--border-color);<!-- [et_pb_line_break_holder] -->            border-radius: 4px;<!-- [et_pb_line_break_holder] -->            padding: 2px 7px;<!-- [et_pb_line_break_holder] -->            margin: 2px 3px 2px 0;<!-- [et_pb_line_break_holder] -->            font-size: 0.72rem;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .tech-pill-label {<!-- [et_pb_line_break_holder] -->            color: var(--text-secondary);<!-- [et_pb_line_break_holder] -->            font-weight: 500;<!-- [et_pb_line_break_holder] -->            text-transform: uppercase;<!-- [et_pb_line_break_holder] -->            font-size: 0.65rem;<!-- [et_pb_line_break_holder] -->            letter-spacing: 0.04em;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .tech-pill-value {<!-- [et_pb_line_break_holder] -->            color: var(--text-primary);<!-- [et_pb_line_break_holder] -->            font-weight: 600;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        \/* \u2500\u2500 NEW: Table header bar with fullscreen button \u2500\u2500 *\/<!-- [et_pb_line_break_holder] -->        .table-header-bar {<!-- [et_pb_line_break_holder] -->            display: flex;<!-- [et_pb_line_break_holder] -->            align-items: center;<!-- [et_pb_line_break_holder] -->            justify-content: space-between;<!-- [et_pb_line_break_holder] -->            padding: 9px 14px;<!-- [et_pb_line_break_holder] -->            background: var(--bg-tertiary);<!-- [et_pb_line_break_holder] -->            border-bottom: 1px solid var(--border-color);<!-- [et_pb_line_break_holder] -->            flex-shrink: 0;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .table-header-bar-title {<!-- [et_pb_line_break_holder] -->            font-size: 0.75rem;<!-- [et_pb_line_break_holder] -->            font-weight: 600;<!-- [et_pb_line_break_holder] -->            color: var(--text-secondary);<!-- [et_pb_line_break_holder] -->            text-transform: uppercase;<!-- [et_pb_line_break_holder] -->            letter-spacing: 0.07em;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .btn-fullscreen {<!-- [et_pb_line_break_holder] -->            display: inline-flex;<!-- [et_pb_line_break_holder] -->            align-items: center;<!-- [et_pb_line_break_holder] -->            gap: 6px;<!-- [et_pb_line_break_holder] -->            background: var(--bg-secondary);<!-- [et_pb_line_break_holder] -->            color: var(--text-secondary);<!-- [et_pb_line_break_holder] -->            border: 1px solid var(--border-color);<!-- [et_pb_line_break_holder] -->            border-radius: 6px;<!-- [et_pb_line_break_holder] -->            padding: 5px 13px;<!-- [et_pb_line_break_holder] -->            font-size: 0.78rem;<!-- [et_pb_line_break_holder] -->            font-weight: 500;<!-- [et_pb_line_break_holder] -->            cursor: pointer;<!-- [et_pb_line_break_holder] -->            transition: all 0.2s;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .btn-fullscreen:hover {<!-- [et_pb_line_break_holder] -->            background: var(--bg-hover);<!-- [et_pb_line_break_holder] -->            color: var(--text-primary);<!-- [et_pb_line_break_holder] -->            border-color: var(--accent);<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .btn-fullscreen kbd {<!-- [et_pb_line_break_holder] -->            opacity: 0.45;<!-- [et_pb_line_break_holder] -->            font-size: 0.68rem;<!-- [et_pb_line_break_holder] -->            font-family: inherit;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        \/* \u2500\u2500 NEW: Fullscreen overlay \u2500\u2500 *\/<!-- [et_pb_line_break_holder] -->        .fullscreen-overlay {<!-- [et_pb_line_break_holder] -->            display: none;<!-- [et_pb_line_break_holder] -->            position: fixed;<!-- [et_pb_line_break_holder] -->            inset: 0;<!-- [et_pb_line_break_holder] -->            z-index: 8500;<!-- [et_pb_line_break_holder] -->            background: var(--bg-primary);<!-- [et_pb_line_break_holder] -->            flex-direction: column;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .fullscreen-overlay.active {<!-- [et_pb_line_break_holder] -->            display: flex;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .fullscreen-topbar {<!-- [et_pb_line_break_holder] -->            display: flex;<!-- [et_pb_line_break_holder] -->            align-items: center;<!-- [et_pb_line_break_holder] -->            justify-content: space-between;<!-- [et_pb_line_break_holder] -->            padding: 12px 20px;<!-- [et_pb_line_break_holder] -->            background: var(--bg-tertiary);<!-- [et_pb_line_break_holder] -->            border-bottom: 2px solid var(--border-color);<!-- [et_pb_line_break_holder] -->            flex-shrink: 0;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .fullscreen-topbar h2 {<!-- [et_pb_line_break_holder] -->            font-size: 1rem;<!-- [et_pb_line_break_holder] -->            font-weight: 700;<!-- [et_pb_line_break_holder] -->            background: linear-gradient(135deg, var(--accent), #cd3ba7);<!-- [et_pb_line_break_holder] -->            -webkit-background-clip: text;<!-- [et_pb_line_break_holder] -->            -webkit-text-fill-color: transparent;<!-- [et_pb_line_break_holder] -->            background-clip: text;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .fullscreen-topbar .fs-controls {<!-- [et_pb_line_break_holder] -->            display: flex;<!-- [et_pb_line_break_holder] -->            gap: 14px;<!-- [et_pb_line_break_holder] -->            align-items: center;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .fullscreen-topbar .fs-hint {<!-- [et_pb_line_break_holder] -->            font-size: 0.78rem;<!-- [et_pb_line_break_holder] -->            color: var(--text-secondary);<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .fullscreen-table-wrapper {<!-- [et_pb_line_break_holder] -->            flex: 1;<!-- [et_pb_line_break_holder] -->            overflow: auto;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .fullscreen-table-wrapper table {<!-- [et_pb_line_break_holder] -->            width: 100%;<!-- [et_pb_line_break_holder] -->            border-collapse: collapse;<!-- [et_pb_line_break_holder] -->            font-size: 0.9rem;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        .fullscreen-table-wrapper thead {<!-- [et_pb_line_break_holder] -->            position: sticky;<!-- [et_pb_line_break_holder] -->            top: 0;<!-- [et_pb_line_break_holder] -->            background: var(--bg-tertiary);<!-- [et_pb_line_break_holder] -->            z-index: 10;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] -->    <\/style>\n<p><!-- [et_pb_line_break_holder] --><\/head><!-- [et_pb_line_break_holder] --><body><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"container\"><!-- [et_pb_line_break_holder] -->        <\/p>\n<header><!-- [et_pb_line_break_holder] -->            <\/p>\n<h1>Audio Metadata Editor<\/h1>\n<p><!-- [et_pb_line_break_holder] -->            <pee class=\"subtitle\">Professional metadata viewer and editor for audio files<\/pee><!-- [et_pb_line_break_holder] -->        <\/header>\n<p><!-- [et_pb_line_break_holder] -->        <\/p>\n<div class=\"features\"><!-- [et_pb_line_break_holder] -->            <\/p>\n<div class=\"feature-item\">100% Local Processing<\/div>\n<p><!-- [et_pb_line_break_holder] -->            <\/p>\n<div class=\"feature-item\">Completely Free<\/div>\n<p><!-- [et_pb_line_break_holder] -->            <\/p>\n<div class=\"feature-item\">No Account Required<\/div>\n<p><!-- [et_pb_line_break_holder] -->            <\/p>\n<div class=\"feature-item\">No Ads<\/div>\n<p><!-- [et_pb_line_break_holder] -->        <\/div>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        <\/p>\n<div class=\"drop-zone\" id=\"dropZone\"><!-- [et_pb_line_break_holder] -->            <\/p>\n<div class=\"drop-zone-icon\">\ud83c\udfb5<\/div>\n<p><!-- [et_pb_line_break_holder] -->            <\/p>\n<div class=\"drop-zone-text\">Drag &#038; drop audio files here<\/div>\n<p><!-- [et_pb_line_break_holder] -->            <\/p>\n<div class=\"drop-zone-subtext\">or click to browse \u2022 Reads MP3, WAV, AIFF, OGG, FLAC (Writes MP3\/WAV)<\/div>\n<p><!-- [et_pb_line_break_holder] -->            <input type=\"file\" id=\"fileInput\" multiple accept=\"audio\/*\"><!-- [et_pb_line_break_holder] -->        <\/div>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        <\/p>\n<div class=\"controls\" id=\"controls\" style=\"display: none;\"><!-- [et_pb_line_break_holder] -->            <\/p>\n<div class=\"search-box\"><!-- [et_pb_line_break_holder] -->                <input type=\"text\" id=\"searchInput\" placeholder=\"Search metadata fields...\"><!-- [et_pb_line_break_holder] -->                <span class=\"search-icon\">\ud83d\udd0d<\/span><!-- [et_pb_line_break_holder] -->            <\/div>\n<p><!-- [et_pb_line_break_holder] -->            <button class=\"btn btn-success\" id=\"saveAllBtn\">\ud83d\udcbe Save All<\/button><!-- [et_pb_line_break_holder] -->            <button class=\"btn btn-primary\" id=\"addFilesBtn\">\u2795 Add Files<\/button><!-- [et_pb_line_break_holder] -->            <button class=\"btn btn-secondary\" id=\"resetBtn\">\ud83d\udd04 Reset Session<\/button><!-- [et_pb_line_break_holder] -->        <\/div>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        <\/p>\n<div class=\"table-container\" id=\"tableContainer\"><!-- [et_pb_line_break_holder] -->            <\/p>\n<div class=\"table-header-bar\"><!-- [et_pb_line_break_holder] -->                <span class=\"table-header-bar-title\">\ud83d\udccb Metadata Table<\/span><!-- [et_pb_line_break_holder] -->                <button class=\"btn-fullscreen\" id=\"fullscreenBtn\">\u26f6 Fullscreen <kbd>F<\/kbd><\/button><!-- [et_pb_line_break_holder] -->            <\/div>\n<p><!-- [et_pb_line_break_holder] -->            <\/p>\n<div class=\"table-wrapper\" id=\"tableWrapper\"><!-- [et_pb_line_break_holder] -->                <\/p>\n<table id=\"metadataTable\"><!-- [et_pb_line_break_holder] -->                    <\/p>\n<thead><!-- [et_pb_line_break_holder] -->                        <\/p>\n<tr id=\"tableHeader\"><\/tr>\n<p><!-- [et_pb_line_break_holder] -->                    <\/thead>\n<p><!-- [et_pb_line_break_holder] -->                    <\/p>\n<tbody id=\"tableBody\"><\/tbody>\n<p><!-- [et_pb_line_break_holder] -->                <\/table>\n<p><!-- [et_pb_line_break_holder] -->            <\/div>\n<p><!-- [et_pb_line_break_holder] -->        <\/div>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        <\/p>\n<div class=\"empty-state\" id=\"emptyState\"><!-- [et_pb_line_break_holder] -->            <\/p>\n<div class=\"empty-state-icon\">\ud83d\udcc2<\/div>\n<p><!-- [et_pb_line_break_holder] -->            <\/p>\n<h3>No files loaded<\/h3>\n<p><!-- [et_pb_line_break_holder] -->            <pee>Drop your audio files above to get started<\/pee><!-- [et_pb_line_break_holder] -->        <\/div>\n<p><!-- [et_pb_line_break_holder] -->    <\/div>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    <!-- Fullscreen Overlay --><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"fullscreen-overlay\" id=\"fullscreenOverlay\"><!-- [et_pb_line_break_holder] -->        <\/p>\n<div class=\"fullscreen-topbar\"><!-- [et_pb_line_break_holder] -->            <\/p>\n<h2>\ud83c\udfb5 Audio Metadata Editor \u2014 Fullscreen<\/h2>\n<p><!-- [et_pb_line_break_holder] -->            <\/p>\n<div class=\"fs-controls\"><!-- [et_pb_line_break_holder] -->                <span class=\"fs-hint\">Press <kbd>Esc<\/kbd> to exit<\/span><!-- [et_pb_line_break_holder] -->                <button class=\"btn-fullscreen\" id=\"closeFullscreenBtn\">\u2715 Close<\/button><!-- [et_pb_line_break_holder] -->            <\/div>\n<p><!-- [et_pb_line_break_holder] -->        <\/div>\n<p><!-- [et_pb_line_break_holder] -->        <\/p>\n<div class=\"fullscreen-table-wrapper\" id=\"fullscreenTableWrapper\"><\/div>\n<p><!-- [et_pb_line_break_holder] -->    <\/div>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    <!-- Context Menu --><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"context-menu\" id=\"contextMenu\"><!-- [et_pb_line_break_holder] -->        <\/p>\n<div class=\"context-menu-item\" id=\"clearValueBtn\"><!-- [et_pb_line_break_holder] -->            <span>\ud83d\uddd1\ufe0f<\/span><!-- [et_pb_line_break_holder] -->            <span>Clear Value<\/span><!-- [et_pb_line_break_holder] -->        <\/div>\n<p><!-- [et_pb_line_break_holder] -->        <\/p>\n<div class=\"context-menu-divider\"><\/div>\n<p><!-- [et_pb_line_break_holder] -->        <\/p>\n<div class=\"context-menu-item\" id=\"pasteToAllBtn\"><!-- [et_pb_line_break_holder] -->            <span>\ud83d\udccb<\/span><!-- [et_pb_line_break_holder] -->            <span>Paste to All Files<\/span><!-- [et_pb_line_break_holder] -->        <\/div>\n<p><!-- [et_pb_line_break_holder] -->    <\/div>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    <!-- Save Modal --><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"modal-overlay\" id=\"saveModal\"><!-- [et_pb_line_break_holder] -->        <\/p>\n<div class=\"modal\"><!-- [et_pb_line_break_holder] -->            <\/p>\n<h3>Save File(s)<\/h3>\n<p><!-- [et_pb_line_break_holder] -->            <pee style=\"color: var(--text-secondary); margin-bottom: 25px;\"><!-- [et_pb_line_break_holder] -->                Files will be downloaded with updated metadata.<!\u2013- [et_pb_br_holder] -\u2013><!-- [et_pb_line_break_holder] -->                New filename format: <strong style=\"color: var(--accent);\">filename_me.ext<\/strong><!-- [et_pb_line_break_holder] -->            <\/pee><!-- [et_pb_line_break_holder] -->            <\/p>\n<div class=\"modal-actions\"><!-- [et_pb_line_break_holder] -->                <button class=\"btn btn-secondary\" id=\"cancelSaveBtn\">Cancel<\/button><!-- [et_pb_line_break_holder] -->                <button class=\"btn btn-success\" id=\"confirmSaveBtn\">\ud83d\udcbe Save<\/button><!-- [et_pb_line_break_holder] -->            <\/div>\n<p><!-- [et_pb_line_break_holder] -->        <\/div>\n<p><!-- [et_pb_line_break_holder] -->    <\/div>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"status-message\" id=\"statusMessage\"><\/div>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jsmediatags\/3.9.5\/jsmediatags.min.js\"><\/script><!-- [et_pb_line_break_holder] -->    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/FileSaver.js\/2.0.5\/FileSaver.min.js\"><\/script><!-- [et_pb_line_break_holder] -->    <script><!-- [et_pb_line_break_holder] -->        class AudioMetadataEditor {<!-- [et_pb_line_break_holder] -->            constructor() {<!-- [et_pb_line_break_holder] -->                this.files = [];<!-- [et_pb_line_break_holder] -->                this.metadata = [];<!-- [et_pb_line_break_holder] -->                this.modifiedData = new Map();<!-- [et_pb_line_break_holder] -->                this.contextMenuTarget = null;<!-- [et_pb_line_break_holder] -->                this.allFields = new Set();<!-- [et_pb_line_break_holder] -->                this.pendingSaveType = 'all';<!-- [et_pb_line_break_holder] -->                this.isFullscreen = false;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                this.initializeElements();<!-- [et_pb_line_break_holder] -->                this.attachEventListeners();<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            initializeElements() {<!-- [et_pb_line_break_holder] -->                this.dropZone          = document.getElementById('dropZone');<!-- [et_pb_line_break_holder] -->                this.fileInput         = document.getElementById('fileInput');<!-- [et_pb_line_break_holder] -->                this.controls          = document.getElementById('controls');<!-- [et_pb_line_break_holder] -->                this.tableContainer    = document.getElementById('tableContainer');<!-- [et_pb_line_break_holder] -->                this.tableWrapper      = document.getElementById('tableWrapper');<!-- [et_pb_line_break_holder] -->                this.emptyState        = document.getElementById('emptyState');<!-- [et_pb_line_break_holder] -->                this.tableHeader       = document.getElementById('tableHeader');<!-- [et_pb_line_break_holder] -->                this.tableBody         = document.getElementById('tableBody');<!-- [et_pb_line_break_holder] -->                this.contextMenu       = document.getElementById('contextMenu');<!-- [et_pb_line_break_holder] -->                this.statusMessage     = document.getElementById('statusMessage');<!-- [et_pb_line_break_holder] -->                this.searchInput       = document.getElementById('searchInput');<!-- [et_pb_line_break_holder] -->                this.saveModal         = document.getElementById('saveModal');<!-- [et_pb_line_break_holder] -->                this.fullscreenOverlay = document.getElementById('fullscreenOverlay');<!-- [et_pb_line_break_holder] -->                this.fsTableWrapper    = document.getElementById('fullscreenTableWrapper');<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            attachEventListeners() {<!-- [et_pb_line_break_holder] -->                this.dropZone.addEventListener('click', () => this.fileInput.click());<!-- [et_pb_line_break_holder] -->                this.dropZone.addEventListener('dragover', (e) => { e.preventDefault(); this.dropZone.classList.add('drag-over'); });<!-- [et_pb_line_break_holder] -->                this.dropZone.addEventListener('dragleave', () => this.dropZone.classList.remove('drag-over'));<!-- [et_pb_line_break_holder] -->                this.dropZone.addEventListener('drop', (e) => {<!-- [et_pb_line_break_holder] -->                    e.preventDefault();<!-- [et_pb_line_break_holder] -->                    this.dropZone.classList.remove('drag-over');<!-- [et_pb_line_break_holder] -->                    this.handleFiles(e.dataTransfer.files);<!-- [et_pb_line_break_holder] -->                });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                this.fileInput.addEventListener('change', (e) => this.handleFiles(e.target.files));<!-- [et_pb_line_break_holder] -->                document.getElementById('saveAllBtn').addEventListener('click', () => this.showSaveModal('all'));<!-- [et_pb_line_break_holder] -->                document.getElementById('addFilesBtn').addEventListener('click', () => this.fileInput.click());<!-- [et_pb_line_break_holder] -->                document.getElementById('resetBtn').addEventListener('click', () => this.reset());<!-- [et_pb_line_break_holder] -->                this.searchInput.addEventListener('input', (e) => this.filterFields(e.target.value));<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                document.getElementById('clearValueBtn').addEventListener('click', () => this.clearValue());<!-- [et_pb_line_break_holder] -->                document.getElementById('pasteToAllBtn').addEventListener('click', () => this.pasteToAll());<!-- [et_pb_line_break_holder] -->                document.getElementById('cancelSaveBtn').addEventListener('click', () => this.closeSaveModal());<!-- [et_pb_line_break_holder] -->                document.getElementById('confirmSaveBtn').addEventListener('click', () => this.executeSave());<!-- [et_pb_line_break_holder] -->                this.saveModal.addEventListener('click', (e) => { if (e.target === this.saveModal) this.closeSaveModal(); });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                document.addEventListener('click', (e) => {<!-- [et_pb_line_break_holder] -->                    if (!this.contextMenu.contains(e.target)) this.closeContextMenu();<!-- [et_pb_line_break_holder] -->                });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                \/\/ \u2500\u2500 Fullscreen controls \u2500\u2500<!-- [et_pb_line_break_holder] -->                document.getElementById('fullscreenBtn').addEventListener('click', () => this.enterFullscreen());<!-- [et_pb_line_break_holder] -->                document.getElementById('closeFullscreenBtn').addEventListener('click', () => this.exitFullscreen());<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                \/\/ \u2500\u2500 Keyboard shortcuts: F = fullscreen, Esc = exit \u2500\u2500<!-- [et_pb_line_break_holder] -->                document.addEventListener('keydown', (e) => {<!-- [et_pb_line_break_holder] -->                    if (e.target.classList.contains('editable-cell')) return;<!-- [et_pb_line_break_holder] -->                    if ((e.key === 'f' || e.key === 'F') && !this.isFullscreen && this.tableContainer.classList.contains('visible')) {<!-- [et_pb_line_break_holder] -->                        this.enterFullscreen();<!-- [et_pb_line_break_holder] -->                    }<!-- [et_pb_line_break_holder] -->                    if (e.key === 'Escape' && this.isFullscreen) {<!-- [et_pb_line_break_holder] -->                        this.exitFullscreen();<!-- [et_pb_line_break_holder] -->                    }<!-- [et_pb_line_break_holder] -->                });<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<!-- [et_pb_line_break_holder] -->            \/\/  Default editable field sets per format (BWF MetaEdit style)<!-- [et_pb_line_break_holder] -->            \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<!-- [et_pb_line_break_holder] -->            getDefaultFields(fileType) {<!-- [et_pb_line_break_holder] -->                const common = ['Title', 'Artist', 'Album', 'Year', 'Genre', 'Track', 'Comment', 'Copyright'];<!-- [et_pb_line_break_holder] -->                const byType = {<!-- [et_pb_line_break_holder] -->                    wav:  [...common, 'Creation Date', 'Software', 'Subject', 'ISRC\/Source Code',<!-- [et_pb_line_break_holder] -->                                     'Description', 'Originator', 'Originator Reference',<!-- [et_pb_line_break_holder] -->                                     'Origination Date', 'Origination Time'],<!-- [et_pb_line_break_holder] -->                    mp3:  [...common, 'Album Artist', 'Composer', 'Publisher', 'BPM', 'ISRC\/Source Code'],<!-- [et_pb_line_break_holder] -->                    aiff: [...common, 'Album Artist', 'Composer'],<!-- [et_pb_line_break_holder] -->                    flac: [...common, 'Album Artist', 'Composer', 'ISRC\/Source Code'],<!-- [et_pb_line_break_holder] -->                    ogg:  [...common, 'Album Artist', 'Composer', 'ISRC\/Source Code'],<!-- [et_pb_line_break_holder] -->                    m4a:  [...common, 'Album Artist', 'Composer'],<!-- [et_pb_line_break_holder] -->                };<!-- [et_pb_line_break_holder] -->                return byType[fileType] || common;<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            async handleFiles(fileList) {<!-- [et_pb_line_break_holder] -->                const newFiles = Array.from(fileList).filter(file =><!-- [et_pb_line_break_holder] -->                    file.type.startsWith('audio\/') ||<!-- [et_pb_line_break_holder] -->                    ['.mp3', '.wav', '.aiff', '.aif', '.ogg', '.flac', '.m4a'].some(ext =><!-- [et_pb_line_break_holder] -->                        file.name.toLowerCase().endsWith(ext)<!-- [et_pb_line_break_holder] -->                    )<!-- [et_pb_line_break_holder] -->                );<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                if (newFiles.length === 0) { this.showStatus('No valid audio files selected', 'error'); return; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                this.showStatus(`Loading ${newFiles.length} file(s)...`);<!-- [et_pb_line_break_holder] -->                this.files.push(...newFiles);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                for (const file of newFiles) {<!-- [et_pb_line_break_holder] -->                    const meta = await this.readMetadata(file);<!-- [et_pb_line_break_holder] -->                    this.metadata.push(meta);<!-- [et_pb_line_break_holder] -->                    \/\/ Register all tag keys (includes pre-seeded defaults)<!-- [et_pb_line_break_holder] -->                    Object.keys(meta.tags).forEach(key => this.allFields.add(key));<!-- [et_pb_line_break_holder] -->                }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                this.renderTable();<!-- [et_pb_line_break_holder] -->                this.showControls();<!-- [et_pb_line_break_holder] -->                this.showStatus(`Loaded ${newFiles.length} file(s) successfully!`);<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            async readMetadata(file) {<!-- [et_pb_line_break_holder] -->                const fileType = this.getFileType(file.name);<!-- [et_pb_line_break_holder] -->                const meta = { file, fileName: file.name, fileType, techInfo: {}, tags: {} };<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                if (fileType === 'mp3') {<!-- [et_pb_line_break_holder] -->                    await this.readID3Tags(file, meta);<!-- [et_pb_line_break_holder] -->                    await this.readMP3TechInfo(file, meta);<!-- [et_pb_line_break_holder] -->                } else if (fileType === 'wav') {<!-- [et_pb_line_break_holder] -->                    await this.readWAVMetadata(file, meta);<!-- [et_pb_line_break_holder] -->                } else if (fileType === 'aiff') {<!-- [et_pb_line_break_holder] -->                    await this.readAIFFMetadata(file, meta);<!-- [et_pb_line_break_holder] -->                } else if (fileType === 'flac') {<!-- [et_pb_line_break_holder] -->                    await this.readFLACMetadata(file, meta);<!-- [et_pb_line_break_holder] -->                } else if (fileType === 'ogg') {<!-- [et_pb_line_break_holder] -->                    await this.readOGGMetadata(file, meta);<!-- [et_pb_line_break_holder] -->                }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                \/\/ Pre-seed all format-appropriate editable fields (empty if absent)<!-- [et_pb_line_break_holder] -->                this.getDefaultFields(fileType).forEach(field => {<!-- [et_pb_line_break_holder] -->                    if (!(field in meta.tags)) meta.tags[field] = '';<!-- [et_pb_line_break_holder] -->                });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                meta.techInfo['File Size'] = this.formatFileSize(file.size);<!-- [et_pb_line_break_holder] -->                return meta;<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<!-- [et_pb_line_break_holder] -->            \/\/  Format readers<!-- [et_pb_line_break_holder] -->            \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<!-- [et_pb_line_break_holder] -->            async readID3Tags(file, meta) {<!-- [et_pb_line_break_holder] -->                return new Promise((resolve) => {<!-- [et_pb_line_break_holder] -->                    jsmediatags.read(file, {<!-- [et_pb_line_break_holder] -->                        onSuccess: (tag) => {<!-- [et_pb_line_break_holder] -->                            const t = tag.tags;<!-- [et_pb_line_break_holder] -->                            if (t.title)        meta.tags['Title']        = t.title;<!-- [et_pb_line_break_holder] -->                            if (t.artist)       meta.tags['Artist']       = t.artist;<!-- [et_pb_line_break_holder] -->                            if (t.album)        meta.tags['Album']        = t.album;<!-- [et_pb_line_break_holder] -->                            if (t.year)         meta.tags['Year']         = t.year;<!-- [et_pb_line_break_holder] -->                            if (t.genre)        meta.tags['Genre']        = t.genre;<!-- [et_pb_line_break_holder] -->                            if (t.track)        meta.tags['Track']        = t.track;<!-- [et_pb_line_break_holder] -->                            if (t.comment)      meta.tags['Comment']      = t.comment?.text || t.comment;<!-- [et_pb_line_break_holder] -->                            if (t.album_artist) meta.tags['Album Artist'] = t.album_artist;<!-- [et_pb_line_break_holder] -->                            if (t.composer)     meta.tags['Composer']     = t.composer;<!-- [et_pb_line_break_holder] -->                            if (t.copyright)    meta.tags['Copyright']    = t.copyright;<!-- [et_pb_line_break_holder] -->                            if (t.publisher)    meta.tags['Publisher']    = t.publisher;<!-- [et_pb_line_break_holder] -->                            if (t.bpm)          meta.tags['BPM']          = t.bpm;<!-- [et_pb_line_break_holder] -->                            if (t.ISRC)         meta.tags['ISRC\/Source Code'] = t.ISRC;<!-- [et_pb_line_break_holder] -->                            resolve();<!-- [et_pb_line_break_holder] -->                        },<!-- [et_pb_line_break_holder] -->                        onError: () => resolve()<!-- [et_pb_line_break_holder] -->                    });<!-- [et_pb_line_break_holder] -->                });<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            async readMP3TechInfo(file, meta) {<!-- [et_pb_line_break_holder] -->                meta.techInfo['Format'] = 'MP3';<!-- [et_pb_line_break_holder] -->                const slice = await file.slice(0, Math.min(65536, file.size)).arrayBuffer();<!-- [et_pb_line_break_holder] -->                const bytes = new Uint8Array(slice);<!-- [et_pb_line_break_holder] -->                const view  = new DataView(slice);<!-- [et_pb_line_break_holder] -->                \/\/ Skip ID3 tag if present<!-- [et_pb_line_break_holder] -->                let start = 0;<!-- [et_pb_line_break_holder] -->                if (bytes[0] === 0x49 && bytes[1] === 0x44 && bytes[2] === 0x33) {<!-- [et_pb_line_break_holder] -->                    start = 10 + ((bytes[6] & 0x7F) << 21 | (bytes[7] &#038; 0x7F) << 14 | (bytes[8] &#038; 0x7F) << 7 | (bytes[9] &#038; 0x7F));<!-- [et_pb_line_break_holder] -->                }<!-- [et_pb_line_break_holder] -->                for (let i = start; i < bytes.length - 4; i++) {<!-- [et_pb_line_break_holder] -->                    if (bytes[i] === 0xFF && (bytes[i+1] & 0xE0) === 0xE0) {<!-- [et_pb_line_break_holder] -->                        const b1 = bytes[i+1], b2 = bytes[i+2], b3 = bytes[i+3];<!-- [et_pb_line_break_holder] -->                        const mpegVer = (b1 >> 3) & 0x3;<!-- [et_pb_line_break_holder] -->                        const layerIdx = (b1 >> 1) & 0x3;<!-- [et_pb_line_break_holder] -->                        if (mpegVer === 3 && layerIdx === 1) { \/\/ MPEG1 Layer3<!-- [et_pb_line_break_holder] -->                            const bitrates   = [0,32,40,48,56,64,80,96,112,128,160,192,224,256,320,0];<!-- [et_pb_line_break_holder] -->                            const sampleRates = [44100,48000,32000,0];<!-- [et_pb_line_break_holder] -->                            const br = bitrates[(b2 >> 4) & 0xF];<!-- [et_pb_line_break_holder] -->                            const sr = sampleRates[(b2 >> 2) & 0x3];<!-- [et_pb_line_break_holder] -->                            const ch = (b3 >> 6) & 0x3;<!-- [et_pb_line_break_holder] -->                            if (br > 0 && sr > 0) {<!-- [et_pb_line_break_holder] -->                                meta.techInfo['Bitrate']     = `${br} kbps`;<!-- [et_pb_line_break_holder] -->                                meta.techInfo['Sample Rate'] = `${sr \/ 1000} kHz`;<!-- [et_pb_line_break_holder] -->                                meta.techInfo['Channels']    = ch === 3 ? 'Mono' : 'Stereo';<!-- [et_pb_line_break_holder] -->                                meta.techInfo['Duration']    = this.formatDuration((file.size - start) * 8 \/ (br * 1000));<!-- [et_pb_line_break_holder] -->                            }<!-- [et_pb_line_break_holder] -->                        }<!-- [et_pb_line_break_holder] -->                        break;<!-- [et_pb_line_break_holder] -->                    }<!-- [et_pb_line_break_holder] -->                }<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            async readWAVMetadata(file, meta) {<!-- [et_pb_line_break_holder] -->                const buffer = await file.arrayBuffer();<!-- [et_pb_line_break_holder] -->                const view = new DataView(buffer);<!-- [et_pb_line_break_holder] -->                let offset = 12;<!-- [et_pb_line_break_holder] -->                let dataSize = 0;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                while (offset < buffer.byteLength - 8) {<!-- [et_pb_line_break_holder] -->                    const chunkId   = this.readString(view, offset, 4);<!-- [et_pb_line_break_holder] -->                    const chunkSize = view.getUint32(offset + 4, true);<!-- [et_pb_line_break_holder] -->                    offset += 8;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                    if (chunkId === 'fmt ') {<!-- [et_pb_line_break_holder] -->                        const audioFormat  = view.getUint16(offset, true);<!-- [et_pb_line_break_holder] -->                        const numChannels  = view.getUint16(offset + 2, true);<!-- [et_pb_line_break_holder] -->                        const sampleRate   = view.getUint32(offset + 4, true);<!-- [et_pb_line_break_holder] -->                        const byteRate     = view.getUint32(offset + 8, true);<!-- [et_pb_line_break_holder] -->                        const bitsPerSample = view.getUint16(offset + 14, true);<!-- [et_pb_line_break_holder] -->                        const fmtNames  = {1:'PCM', 3:'IEEE Float', 6:'A-law', 7:'\u00b5-law', 65534:'Extensible'};<!-- [et_pb_line_break_holder] -->                        const chNames   = {1:'Mono', 2:'Stereo', 4:'Quad', 6:'5.1', 8:'7.1'};<!-- [et_pb_line_break_holder] -->                        meta.techInfo['Format']      = fmtNames[audioFormat] || `0x${audioFormat.toString(16)}`;<!-- [et_pb_line_break_holder] -->                        meta.techInfo['Channels']    = chNames[numChannels]  || `${numChannels} ch`;<!-- [et_pb_line_break_holder] -->                        meta.techInfo['Sample Rate'] = `${(sampleRate\/1000).toFixed(sampleRate%1000?3:0)} kHz`;<!-- [et_pb_line_break_holder] -->                        meta.techInfo['Bit Depth']   = `${bitsPerSample}-bit`;<!-- [et_pb_line_break_holder] -->                        meta.techInfo['Bitrate']     = `${Math.round(byteRate * 8 \/ 1000)} kbps`;<!-- [et_pb_line_break_holder] -->                    } else if (chunkId === 'data') {<!-- [et_pb_line_break_holder] -->                        dataSize = chunkSize;<!-- [et_pb_line_break_holder] -->                    } else if (chunkId === 'bext') {<!-- [et_pb_line_break_holder] -->                        meta.tags['Description']          = this.readString(view, offset, 256).replace(\/\\0\/g,'').trim();<!-- [et_pb_line_break_holder] -->                        meta.tags['Originator']           = this.readString(view, offset+256, 32).replace(\/\\0\/g,'').trim();<!-- [et_pb_line_break_holder] -->                        meta.tags['Originator Reference'] = this.readString(view, offset+288, 32).replace(\/\\0\/g,'').trim();<!-- [et_pb_line_break_holder] -->                        meta.tags['Origination Date']     = this.readString(view, offset+320, 10).replace(\/\\0\/g,'').trim();<!-- [et_pb_line_break_holder] -->                        meta.tags['Origination Time']     = this.readString(view, offset+330, 8).replace(\/\\0\/g,'').trim();<!-- [et_pb_line_break_holder] -->                    } else if (chunkId === 'LIST') {<!-- [et_pb_line_break_holder] -->                        const listType = this.readString(view, offset, 4);<!-- [et_pb_line_break_holder] -->                        if (listType === 'INFO') this.parseINFOChunk(view, offset+4, chunkSize-4, meta);<!-- [et_pb_line_break_holder] -->                    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                    offset += chunkSize;<!-- [et_pb_line_break_holder] -->                    if (chunkSize % 2 === 1) offset++;<!-- [et_pb_line_break_holder] -->                }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                \/\/ Duration from data chunk<!-- [et_pb_line_break_holder] -->                if (dataSize > 0 && meta.techInfo['Bitrate']) {<!-- [et_pb_line_break_holder] -->                    const byteRate = parseInt(meta.techInfo['Bitrate']) * 1000 \/ 8;<!-- [et_pb_line_break_holder] -->                    meta.techInfo['Duration'] = this.formatDuration(dataSize \/ byteRate);<!-- [et_pb_line_break_holder] -->                }<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            parseINFOChunk(view, offset, size, meta) {<!-- [et_pb_line_break_holder] -->                const end = offset + size;<!-- [et_pb_line_break_holder] -->                while (offset < end - 8) {<!-- [et_pb_line_break_holder] -->                    const subChunkId   = this.readString(view, offset, 4);<!-- [et_pb_line_break_holder] -->                    const subChunkSize = view.getUint32(offset + 4, true);<!-- [et_pb_line_break_holder] -->                    offset += 8;<!-- [et_pb_line_break_holder] -->                    const value = this.readString(view, offset, subChunkSize).replace(\/\\0\/g,'').trim();<!-- [et_pb_line_break_holder] -->                    const fieldMap = {<!-- [et_pb_line_break_holder] -->                        'INAM':'Title','IART':'Artist','IPRD':'Album','ICMT':'Comment',<!-- [et_pb_line_break_holder] -->                        'ICRD':'Creation Date','IGNR':'Genre','ICOP':'Copyright',<!-- [et_pb_line_break_holder] -->                        'ISFT':'Software','ISBJ':'Subject','ISRC':'ISRC\/Source Code'<!-- [et_pb_line_break_holder] -->                    };<!-- [et_pb_line_break_holder] -->                    if (fieldMap[subChunkId] && value) meta.tags[fieldMap[subChunkId]] = value;<!-- [et_pb_line_break_holder] -->                    offset += subChunkSize;<!-- [et_pb_line_break_holder] -->                    if (subChunkSize % 2 === 1) offset++;<!-- [et_pb_line_break_holder] -->                }<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            async readAIFFMetadata(file, meta) {<!-- [et_pb_line_break_holder] -->                const buffer = await file.arrayBuffer();<!-- [et_pb_line_break_holder] -->                const view   = new DataView(buffer);<!-- [et_pb_line_break_holder] -->                let offset   = 12;<!-- [et_pb_line_break_holder] -->                while (offset < buffer.byteLength - 8) {<!-- [et_pb_line_break_holder] -->                    const chunkId   = this.readString(view, offset, 4);<!-- [et_pb_line_break_holder] -->                    const chunkSize = view.getInt32(offset + 4, false); \/\/ big-endian<!-- [et_pb_line_break_holder] -->                    offset += 8;<!-- [et_pb_line_break_holder] -->                    if (chunkId === 'COMM') {<!-- [et_pb_line_break_holder] -->                        const numCh    = view.getInt16(offset, false);<!-- [et_pb_line_break_holder] -->                        const numFrames = view.getUint32(offset + 2, false);<!-- [et_pb_line_break_holder] -->                        const bitDepth = view.getInt16(offset + 6, false);<!-- [et_pb_line_break_holder] -->                        \/\/ 80-bit extended sample rate<!-- [et_pb_line_break_holder] -->                        const exp = (view.getUint16(offset + 8, false) & 0x7FFF) - 16383;<!-- [et_pb_line_break_holder] -->                        const mant = (view.getUint32(offset + 10, false) \/ Math.pow(2,32) + view.getUint32(offset+14, false) \/ Math.pow(2,64)) * Math.pow(2,32);<!-- [et_pb_line_break_holder] -->                        const sr = mant * Math.pow(2, exp - 31);<!-- [et_pb_line_break_holder] -->                        const chNames = {1:'Mono',2:'Stereo',4:'Quad',6:'5.1'};<!-- [et_pb_line_break_holder] -->                        meta.techInfo['Format']      = 'AIFF PCM';<!-- [et_pb_line_break_holder] -->                        meta.techInfo['Channels']    = chNames[numCh] || `${numCh} ch`;<!-- [et_pb_line_break_holder] -->                        meta.techInfo['Sample Rate'] = `${(sr\/1000).toFixed(sr%1000?3:0)} kHz`;<!-- [et_pb_line_break_holder] -->                        meta.techInfo['Bit Depth']   = `${bitDepth}-bit`;<!-- [et_pb_line_break_holder] -->                        meta.techInfo['Bitrate']     = `${Math.round(sr * numCh * bitDepth \/ 1000)} kbps`;<!-- [et_pb_line_break_holder] -->                        meta.techInfo['Duration']    = this.formatDuration(numFrames \/ sr);<!-- [et_pb_line_break_holder] -->                    } else if (chunkId === 'NAME') {<!-- [et_pb_line_break_holder] -->                        meta.tags['Title']   = this.readString(view, offset, chunkSize).replace(\/\\0\/g,'').trim();<!-- [et_pb_line_break_holder] -->                    } else if (chunkId === 'AUTH') {<!-- [et_pb_line_break_holder] -->                        meta.tags['Artist']  = this.readString(view, offset, chunkSize).replace(\/\\0\/g,'').trim();<!-- [et_pb_line_break_holder] -->                    } else if (chunkId === '(c) ') {<!-- [et_pb_line_break_holder] -->                        meta.tags['Copyright'] = this.readString(view, offset, chunkSize).replace(\/\\0\/g,'').trim();<!-- [et_pb_line_break_holder] -->                    } else if (chunkId === 'ANNO') {<!-- [et_pb_line_break_holder] -->                        meta.tags['Comment'] = this.readString(view, offset, chunkSize).replace(\/\\0\/g,'').trim();<!-- [et_pb_line_break_holder] -->                    }<!-- [et_pb_line_break_holder] -->                    offset += chunkSize + (chunkSize % 2);<!-- [et_pb_line_break_holder] -->                }<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            async readFLACMetadata(file, meta) {<!-- [et_pb_line_break_holder] -->                const buffer = await file.arrayBuffer();<!-- [et_pb_line_break_holder] -->                const bytes  = new Uint8Array(buffer);<!-- [et_pb_line_break_holder] -->                const view   = new DataView(buffer);<!-- [et_pb_line_break_holder] -->                meta.techInfo['Format'] = 'FLAC';<!-- [et_pb_line_break_holder] -->                if (bytes[0]!==0x66||bytes[1]!==0x4C||bytes[2]!==0x61||bytes[3]!==0x43) return;<!-- [et_pb_line_break_holder] -->                let offset = 4;<!-- [et_pb_line_break_holder] -->                while (offset < buffer.byteLength - 4) {<!-- [et_pb_line_break_holder] -->                    const blockByte = bytes[offset];<!-- [et_pb_line_break_holder] -->                    const isLast    = (blockByte & 0x80) !== 0;<!-- [et_pb_line_break_holder] -->                    const blockType = blockByte & 0x7F;<!-- [et_pb_line_break_holder] -->                    const blockLen  = (bytes[offset+1]<<16)|(bytes[offset+2]<<8)|bytes[offset+3];<!-- [et_pb_line_break_holder] -->                    offset += 4;<!-- [et_pb_line_break_holder] -->                    if (blockType === 0) { \/\/ STREAMINFO<!-- [et_pb_line_break_holder] -->                        const sr       = ((bytes[offset]<<12)|(bytes[offset+1]<<4)|(bytes[offset+2]>>4)) & 0xFFFFF;<!-- [et_pb_line_break_holder] -->                        const numCh    = ((bytes[offset+2]>>1)&0x7)+1;<!-- [et_pb_line_break_holder] -->                        const bitDepth = (((bytes[offset+2]&0x1)<<4)|(bytes[offset+3]>>4))+1;<!-- [et_pb_line_break_holder] -->                        const samples  = ((bytes[offset+3]&0xF)*Math.pow(2,32))+(bytes[offset+4]*16777216)+(bytes[offset+5]<<16)+(bytes[offset+6]<<8)+bytes[offset+7];<!-- [et_pb_line_break_holder] -->                        const dur      = samples \/ sr;<!-- [et_pb_line_break_holder] -->                        const chNames  = {1:'Mono',2:'Stereo',4:'Quad',6:'5.1',8:'7.1'};<!-- [et_pb_line_break_holder] -->                        meta.techInfo['Channels']    = chNames[numCh]||`${numCh} ch`;<!-- [et_pb_line_break_holder] -->                        meta.techInfo['Sample Rate'] = `${(sr\/1000).toFixed(sr%1000?3:0)} kHz`;<!-- [et_pb_line_break_holder] -->                        meta.techInfo['Bit Depth']   = `${bitDepth}-bit`;<!-- [et_pb_line_break_holder] -->                        meta.techInfo['Duration']    = this.formatDuration(dur);<!-- [et_pb_line_break_holder] -->                        meta.techInfo['Bitrate']     = `${Math.round(file.size*8\/(dur*1000))} kbps`;<!-- [et_pb_line_break_holder] -->                    } else if (blockType === 4) { \/\/ VORBIS_COMMENT<!-- [et_pb_line_break_holder] -->                        let pos = offset;<!-- [et_pb_line_break_holder] -->                        const vendorLen = view.getUint32(pos, true); pos += 4 + vendorLen;<!-- [et_pb_line_break_holder] -->                        const count     = view.getUint32(pos, true); pos += 4;<!-- [et_pb_line_break_holder] -->                        for (let c = 0; c < count &#038;&#038; pos < bytes.length - 4; c++) {<!-- [et_pb_line_break_holder] -->                            const len = view.getUint32(pos, true); pos += 4;<!-- [et_pb_line_break_holder] -->                            const comment = new TextDecoder().decode(bytes.slice(pos, pos+len)); pos += len;<!-- [et_pb_line_break_holder] -->                            const eq = comment.indexOf('=');<!-- [et_pb_line_break_holder] -->                            if (eq > 0) {<!-- [et_pb_line_break_holder] -->                                const k = comment.substring(0,eq).toUpperCase();<!-- [et_pb_line_break_holder] -->                                const v = comment.substring(eq+1);<!-- [et_pb_line_break_holder] -->                                const km = {TITLE:'Title',ARTIST:'Artist',ALBUM:'Album',DATE:'Year',GENRE:'Genre',TRACKNUMBER:'Track',<!-- [et_pb_line_break_holder] -->                                            COMMENT:'Comment',ALBUMARTIST:'Album Artist',COMPOSER:'Composer',COPYRIGHT:'Copyright',<!-- [et_pb_line_break_holder] -->                                            BPM:'BPM',ISRC:'ISRC\/Source Code'};<!-- [et_pb_line_break_holder] -->                                if (km[k]) meta.tags[km[k]] = v;<!-- [et_pb_line_break_holder] -->                            }<!-- [et_pb_line_break_holder] -->                        }<!-- [et_pb_line_break_holder] -->                    }<!-- [et_pb_line_break_holder] -->                    offset += blockLen;<!-- [et_pb_line_break_holder] -->                    if (isLast) break;<!-- [et_pb_line_break_holder] -->                }<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            async readOGGMetadata(file, meta) {<!-- [et_pb_line_break_holder] -->                const buffer = await file.arrayBuffer();<!-- [et_pb_line_break_holder] -->                const bytes  = new Uint8Array(buffer);<!-- [et_pb_line_break_holder] -->                const view   = new DataView(buffer);<!-- [et_pb_line_break_holder] -->                meta.techInfo['Format'] = 'OGG Vorbis';<!-- [et_pb_line_break_holder] -->                \/\/ Vorbis ID header (0x01 + 'vorbis') \u2192 sample rate, channels<!-- [et_pb_line_break_holder] -->                for (let i = 0; i < Math.min(bytes.length-7, 8192); i++) {<!-- [et_pb_line_break_holder] -->                    if (bytes[i]===0x01&&bytes[i+1]===0x76&&bytes[i+2]===0x6F&&bytes[i+3]===0x72&&bytes[i+4]===0x62&&bytes[i+5]===0x69&&bytes[i+6]===0x73) {<!-- [et_pb_line_break_holder] -->                        const ch = bytes[i+11];<!-- [et_pb_line_break_holder] -->                        const sr = view.getUint32(i+12, true);<!-- [et_pb_line_break_holder] -->                        const nomBR = view.getInt32(i+20, true);<!-- [et_pb_line_break_holder] -->                        meta.techInfo['Channels']    = ch===1?'Mono':'Stereo';<!-- [et_pb_line_break_holder] -->                        meta.techInfo['Sample Rate'] = `${(sr\/1000).toFixed(sr%1000?3:0)} kHz`;<!-- [et_pb_line_break_holder] -->                        if (nomBR > 0) meta.techInfo['Bitrate'] = `${Math.round(nomBR\/1000)} kbps`;<!-- [et_pb_line_break_holder] -->                        break;<!-- [et_pb_line_break_holder] -->                    }<!-- [et_pb_line_break_holder] -->                }<!-- [et_pb_line_break_holder] -->                \/\/ Vorbis comment header (0x03 + 'vorbis')<!-- [et_pb_line_break_holder] -->                for (let i = 0; i < bytes.length - 7; i++) {<!-- [et_pb_line_break_holder] -->                    if (bytes[i]===0x03&&bytes[i+1]===0x76&&bytes[i+2]===0x6F&&bytes[i+3]===0x72&&bytes[i+4]===0x62&&bytes[i+5]===0x69&&bytes[i+6]===0x73) {<!-- [et_pb_line_break_holder] -->                        let pos = i + 7;<!-- [et_pb_line_break_holder] -->                        const vendorLen = view.getUint32(pos, true); pos += 4 + vendorLen;<!-- [et_pb_line_break_holder] -->                        const count     = view.getUint32(pos, true); pos += 4;<!-- [et_pb_line_break_holder] -->                        for (let c = 0; c < count &#038;&#038; pos < bytes.length - 4; c++) {<!-- [et_pb_line_break_holder] -->                            const len = view.getUint32(pos, true); pos += 4;<!-- [et_pb_line_break_holder] -->                            const comment = new TextDecoder().decode(bytes.slice(pos, pos+len)); pos += len;<!-- [et_pb_line_break_holder] -->                            const eq = comment.indexOf('=');<!-- [et_pb_line_break_holder] -->                            if (eq > 0) {<!-- [et_pb_line_break_holder] -->                                const k = comment.substring(0,eq).toUpperCase();<!-- [et_pb_line_break_holder] -->                                const v = comment.substring(eq+1);<!-- [et_pb_line_break_holder] -->                                const km = {TITLE:'Title',ARTIST:'Artist',ALBUM:'Album',DATE:'Year',GENRE:'Genre',TRACKNUMBER:'Track',<!-- [et_pb_line_break_holder] -->                                            COMMENT:'Comment',ALBUMARTIST:'Album Artist',COMPOSER:'Composer',COPYRIGHT:'Copyright',<!-- [et_pb_line_break_holder] -->                                            ISRC:'ISRC\/Source Code'};<!-- [et_pb_line_break_holder] -->                                if (km[k]) meta.tags[km[k]] = v;<!-- [et_pb_line_break_holder] -->                            }<!-- [et_pb_line_break_holder] -->                        }<!-- [et_pb_line_break_holder] -->                        break;<!-- [et_pb_line_break_holder] -->                    }<!-- [et_pb_line_break_holder] -->                }<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<!-- [et_pb_line_break_holder] -->            \/\/  Utility helpers<!-- [et_pb_line_break_holder] -->            \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<!-- [et_pb_line_break_holder] -->            formatDuration(sec) {<!-- [et_pb_line_break_holder] -->                if (!isFinite(sec) || sec < 0) return '\u2014';<!-- [et_pb_line_break_holder] -->                const h = Math.floor(sec\/3600), m = Math.floor((sec%3600)\/60), s = Math.floor(sec%60);<!-- [et_pb_line_break_holder] -->                if (h > 0) return `${h}:${String(m).padStart(2,'0')}:${String(s).padStart(2,'0')}`;<!-- [et_pb_line_break_holder] -->                return `${m}:${String(s).padStart(2,'0')}`;<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            formatFileSize(bytes) {<!-- [et_pb_line_break_holder] -->                if (bytes < 1024) return `${bytes} B`;<!-- [et_pb_line_break_holder] -->                if (bytes < 1048576) return `${(bytes\/1024).toFixed(1)} KB`;<!-- [et_pb_line_break_holder] -->                return `${(bytes\/1048576).toFixed(2)} MB`;<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            readString(view, offset, length) {<!-- [et_pb_line_break_holder] -->                let str = '';<!-- [et_pb_line_break_holder] -->                for (let i = 0; i < length; i++) {<!-- [et_pb_line_break_holder] -->                    const b = view.getUint8(offset + i);<!-- [et_pb_line_break_holder] -->                    if (b === 0 && str.length > 0) continue;<!-- [et_pb_line_break_holder] -->                    if (b !== 0) str += String.fromCharCode(b);<!-- [et_pb_line_break_holder] -->                }<!-- [et_pb_line_break_holder] -->                return str;<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            getFileType(fileName) {<!-- [et_pb_line_break_holder] -->                const ext = fileName.split('.').pop().toLowerCase();<!-- [et_pb_line_break_holder] -->                return {mp3:'mp3',wav:'wav',aiff:'aiff',aif:'aiff',ogg:'ogg',flac:'flac',m4a:'m4a'}[ext] || 'unknown';<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<!-- [et_pb_line_break_holder] -->            \/\/  Render table<!-- [et_pb_line_break_holder] -->            \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<!-- [et_pb_line_break_holder] -->            renderTable() {<!-- [et_pb_line_break_holder] -->                this.tableHeader.innerHTML = '';<!-- [et_pb_line_break_holder] -->                this.tableBody.innerHTML   = '';<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                const sortedFields = Array.from(this.allFields).sort();<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                \/\/ Headers: Actions | File Name | Type | Tech Info | [editable fields\u2026]<!-- [et_pb_line_break_holder] -->                ['Actions','File Name','Type','Technical Info',...sortedFields].forEach((h, i) => {<!-- [et_pb_line_break_holder] -->                    const th = document.createElement('th');<!-- [et_pb_line_break_holder] -->                    th.textContent = h;<!-- [et_pb_line_break_holder] -->                    if (i === 3) th.style.minWidth = '290px';<!-- [et_pb_line_break_holder] -->                    this.tableHeader.appendChild(th);<!-- [et_pb_line_break_holder] -->                });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                this.metadata.forEach((meta, fileIndex) => {<!-- [et_pb_line_break_holder] -->                    const row       = document.createElement('tr');<!-- [et_pb_line_break_holder] -->                    const isEditable = meta.fileType === 'mp3' || meta.fileType === 'wav';<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                    \/\/ \u2500\u2500 Actions \u2500\u2500<!-- [et_pb_line_break_holder] -->                    const actionsCell = document.createElement('td');<!-- [et_pb_line_break_holder] -->                    actionsCell.innerHTML = `<!-- [et_pb_line_break_holder] -->                        <\/p>\n<div class=\"action-icons\"><!-- [et_pb_line_break_holder] -->                            <span class=\"action-icon save-icon\"   data-file-index=\"${fileIndex}\" title=\"Save this file\">\ud83d\udcbe<\/span><!-- [et_pb_line_break_holder] -->                            <span class=\"action-icon delete-icon\" data-file-index=\"${fileIndex}\" title=\"Remove this file\">\u274c<\/span><!-- [et_pb_line_break_holder] -->                        <\/div>\n<p>`;<!-- [et_pb_line_break_holder] -->                    row.appendChild(actionsCell);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                    \/\/ \u2500\u2500 File Name \u2500\u2500<!-- [et_pb_line_break_holder] -->                    const nameCell = document.createElement('td');<!-- [et_pb_line_break_holder] -->                    nameCell.innerHTML = `<\/p>\n<div class=\"file-name\" title=\"${meta.fileName}\">${meta.fileName}<\/div>\n<p>`;<!-- [et_pb_line_break_holder] -->                    row.appendChild(nameCell);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                    \/\/ \u2500\u2500 Type badge \u2500\u2500<!-- [et_pb_line_break_holder] -->                    const typeCell = document.createElement('td');<!-- [et_pb_line_break_holder] -->                    typeCell.innerHTML = `<span class=\"file-type-badge badge-${meta.fileType}\">${meta.fileType}<\/span>`;<!-- [et_pb_line_break_holder] -->                    row.appendChild(typeCell);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                    \/\/ \u2500\u2500 Technical Info (read-only pills) \u2500\u2500<!-- [et_pb_line_break_holder] -->                    const techCell = document.createElement('td');<!-- [et_pb_line_break_holder] -->                    techCell.className = 'tech-info-cell';<!-- [et_pb_line_break_holder] -->                    const ti = meta.techInfo || {};<!-- [et_pb_line_break_holder] -->                    const pillOrder = ['Format','Sample Rate','Bit Depth','Channels','Bitrate','Duration','File Size'];<!-- [et_pb_line_break_holder] -->                    techCell.innerHTML = pillOrder<!-- [et_pb_line_break_holder] -->                        .filter(k => ti[k])<!-- [et_pb_line_break_holder] -->                        .map(k => `<span class=\"tech-pill\"><span class=\"tech-pill-label\">${k}<\/span><span class=\"tech-pill-value\">${ti[k]}<\/span><\/span>`)<!-- [et_pb_line_break_holder] -->                        .join('');<!-- [et_pb_line_break_holder] -->                    row.appendChild(techCell);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                    \/\/ \u2500\u2500 Editable metadata cells \u2500\u2500<!-- [et_pb_line_break_holder] -->                    sortedFields.forEach(field => {<!-- [et_pb_line_break_holder] -->                        const cell  = document.createElement('td');<!-- [et_pb_line_break_holder] -->                        const value = meta.tags[field] !== undefined ? meta.tags[field] : '';<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                        const div = document.createElement('div');<!-- [et_pb_line_break_holder] -->                        div.className       = `editable-cell${!isEditable ? ' readonly' : ''}`;<!-- [et_pb_line_break_holder] -->                        div.contentEditable = isEditable;<!-- [et_pb_line_break_holder] -->                        div.textContent     = value;<!-- [et_pb_line_break_holder] -->                        div.dataset.fileIndex = fileIndex;<!-- [et_pb_line_break_holder] -->                        div.dataset.field     = field;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                        if (isEditable) {<!-- [et_pb_line_break_holder] -->                            div.addEventListener('input',       (e) => this.handleCellEdit(e));<!-- [et_pb_line_break_holder] -->                            div.addEventListener('contextmenu', (e) => this.showContextMenu(e));<!-- [et_pb_line_break_holder] -->                        } else {<!-- [et_pb_line_break_holder] -->                            div.title = 'Read-only \u2014 format does not support in-browser writing.';<!-- [et_pb_line_break_holder] -->                        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                        cell.appendChild(div);<!-- [et_pb_line_break_holder] -->                        row.appendChild(cell);<!-- [et_pb_line_break_holder] -->                    });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                    this.tableBody.appendChild(row);<!-- [et_pb_line_break_holder] -->                });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                document.querySelectorAll('.save-icon').forEach(icon => {<!-- [et_pb_line_break_holder] -->                    icon.addEventListener('click', (e) => this.showSaveModal(parseInt(e.target.dataset.fileIndex)));<!-- [et_pb_line_break_holder] -->                });<!-- [et_pb_line_break_holder] -->                document.querySelectorAll('.delete-icon').forEach(icon => {<!-- [et_pb_line_break_holder] -->                    icon.addEventListener('click', (e) => this.deleteFile(parseInt(e.target.dataset.fileIndex)));<!-- [et_pb_line_break_holder] -->                });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                this.emptyState.style.display   = 'none';<!-- [et_pb_line_break_holder] -->                this.dropZone.style.display     = 'none';<!-- [et_pb_line_break_holder] -->                this.tableContainer.classList.add('visible');<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<!-- [et_pb_line_break_holder] -->            \/\/  Fullscreen<!-- [et_pb_line_break_holder] -->            \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<!-- [et_pb_line_break_holder] -->            enterFullscreen() {<!-- [et_pb_line_break_holder] -->                if (this.isFullscreen) return;<!-- [et_pb_line_break_holder] -->                this.isFullscreen = true;<!-- [et_pb_line_break_holder] -->                this.fsTableWrapper.appendChild(this.tableWrapper);<!-- [et_pb_line_break_holder] -->                this.fullscreenOverlay.classList.add('active');<!-- [et_pb_line_break_holder] -->                document.body.style.overflow = 'hidden';<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            exitFullscreen() {<!-- [et_pb_line_break_holder] -->                if (!this.isFullscreen) return;<!-- [et_pb_line_break_holder] -->                this.isFullscreen = false;<!-- [et_pb_line_break_holder] -->                \/\/ Re-insert tableWrapper back into tableContainer (after the header bar)<!-- [et_pb_line_break_holder] -->                this.tableContainer.appendChild(this.tableWrapper);<!-- [et_pb_line_break_holder] -->                this.fullscreenOverlay.classList.remove('active');<!-- [et_pb_line_break_holder] -->                document.body.style.overflow = '';<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<!-- [et_pb_line_break_holder] -->            \/\/  Cell edit \/ context menu<!-- [et_pb_line_break_holder] -->            \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<!-- [et_pb_line_break_holder] -->            handleCellEdit(e) {<!-- [et_pb_line_break_holder] -->                const cell      = e.target;<!-- [et_pb_line_break_holder] -->                const fileIndex = parseInt(cell.dataset.fileIndex);<!-- [et_pb_line_break_holder] -->                const field     = cell.dataset.field;<!-- [et_pb_line_break_holder] -->                if (!this.modifiedData.has(fileIndex)) this.modifiedData.set(fileIndex, {});<!-- [et_pb_line_break_holder] -->                this.modifiedData.get(fileIndex)[field] = cell.textContent;<!-- [et_pb_line_break_holder] -->                cell.classList.add('modified');<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            showContextMenu(e) {<!-- [et_pb_line_break_holder] -->                e.preventDefault(); e.stopPropagation();<!-- [et_pb_line_break_holder] -->                this.contextMenuTarget = e.target;<!-- [et_pb_line_break_holder] -->                this.contextMenu.style.left = e.clientX + 'px';<!-- [et_pb_line_break_holder] -->                this.contextMenu.style.top  = e.clientY + 'px';<!-- [et_pb_line_break_holder] -->                this.contextMenu.classList.add('visible');<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            closeContextMenu() { this.contextMenu.classList.remove('visible'); }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            clearValue() {<!-- [et_pb_line_break_holder] -->                if (this.contextMenuTarget) {<!-- [et_pb_line_break_holder] -->                    this.contextMenuTarget.textContent = '';<!-- [et_pb_line_break_holder] -->                    this.handleCellEdit({ target: this.contextMenuTarget });<!-- [et_pb_line_break_holder] -->                }<!-- [et_pb_line_break_holder] -->                this.closeContextMenu();<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            pasteToAll() {<!-- [et_pb_line_break_holder] -->                if (!this.contextMenuTarget) return;<!-- [et_pb_line_break_holder] -->                const value = this.contextMenuTarget.textContent;<!-- [et_pb_line_break_holder] -->                const field = this.contextMenuTarget.dataset.field;<!-- [et_pb_line_break_holder] -->                document.querySelectorAll(`[data-field=\"${field}\"]:not(.readonly)`).forEach(cell => {<!-- [et_pb_line_break_holder] -->                    cell.textContent = value;<!-- [et_pb_line_break_holder] -->                    this.handleCellEdit({ target: cell });<!-- [et_pb_line_break_holder] -->                });<!-- [et_pb_line_break_holder] -->                this.showStatus(`Pasted to all editable files for field \"${field}\"`);<!-- [et_pb_line_break_holder] -->                this.closeContextMenu();<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<!-- [et_pb_line_break_holder] -->            \/\/  Save<!-- [et_pb_line_break_holder] -->            \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<!-- [et_pb_line_break_holder] -->            showSaveModal(fileIndexOrAll) { this.pendingSaveType = fileIndexOrAll; this.saveModal.classList.add('visible'); }<!-- [et_pb_line_break_holder] -->            closeSaveModal()              { this.saveModal.classList.remove('visible'); }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            async executeSave() {<!-- [et_pb_line_break_holder] -->                this.closeSaveModal();<!-- [et_pb_line_break_holder] -->                if (this.pendingSaveType === 'all') await this.saveAll();<!-- [et_pb_line_break_holder] -->                else await this.saveSingleFile(this.pendingSaveType);<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            async saveSingleFile(fileIndex) {<!-- [et_pb_line_break_holder] -->                this.showStatus('Compiling metadata...');<!-- [et_pb_line_break_holder] -->                const meta = this.metadata[fileIndex];<!-- [et_pb_line_break_holder] -->                await this.saveFile(meta, this.modifiedData.get(fileIndex) || {});<!-- [et_pb_line_break_holder] -->                document.querySelectorAll(`[data-file-index=\"${fileIndex}\"].modified`).forEach(el => el.classList.remove('modified'));<!-- [et_pb_line_break_holder] -->                this.modifiedData.delete(fileIndex);<!-- [et_pb_line_break_holder] -->                this.showStatus('File exported successfully!');<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            async saveAll() {<!-- [et_pb_line_break_holder] -->                this.showStatus('Compiling files...');<!-- [et_pb_line_break_holder] -->                let savedCount = 0;<!-- [et_pb_line_break_holder] -->                for (const [fileIndex, modifications] of this.modifiedData.entries()) {<!-- [et_pb_line_break_holder] -->                    await this.saveFile(this.metadata[fileIndex], modifications);<!-- [et_pb_line_break_holder] -->                    savedCount++;<!-- [et_pb_line_break_holder] -->                }<!-- [et_pb_line_break_holder] -->                document.querySelectorAll('.modified').forEach(el => el.classList.remove('modified'));<!-- [et_pb_line_break_holder] -->                this.modifiedData.clear();<!-- [et_pb_line_break_holder] -->                this.showStatus(`Successfully exported ${savedCount} file(s)!`);<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            async saveFile(meta, modifications) {<!-- [et_pb_line_break_holder] -->                const updatedTags = { ...meta.tags, ...modifications };<!-- [et_pb_line_break_holder] -->                let modifiedBlob;<!-- [et_pb_line_break_holder] -->                try {<!-- [et_pb_line_break_holder] -->                    if      (meta.fileType === 'mp3') modifiedBlob = await this.writeMP3Metadata(meta.file, updatedTags);<!-- [et_pb_line_break_holder] -->                    else if (meta.fileType === 'wav') modifiedBlob = await this.writeWAVMetadata(meta.file, updatedTags);<!-- [et_pb_line_break_holder] -->                    else {<!-- [et_pb_line_break_holder] -->                        this.showStatus(`Warning: ${meta.fileType.toUpperCase()} read-only. Exporting original.`, 'warning');<!-- [et_pb_line_break_holder] -->                        modifiedBlob = meta.file;<!-- [et_pb_line_break_holder] -->                    }<!-- [et_pb_line_break_holder] -->                } catch (err) {<!-- [et_pb_line_break_holder] -->                    this.showStatus(`Error saving ${meta.fileName}: ${err.message}`, 'error');<!-- [et_pb_line_break_holder] -->                    return;<!-- [et_pb_line_break_holder] -->                }<!-- [et_pb_line_break_holder] -->                const parts = meta.fileName.split('.');<!-- [et_pb_line_break_holder] -->                const ext   = parts.pop();<!-- [et_pb_line_break_holder] -->                saveAs(modifiedBlob, `${parts.join('.')}_me.${ext}`);<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<!-- [et_pb_line_break_holder] -->            \/\/  MP3 \/ ID3v2.4 writer<!-- [et_pb_line_break_holder] -->            \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<!-- [et_pb_line_break_holder] -->            async writeMP3Metadata(file, tags) {<!-- [et_pb_line_break_holder] -->                const buf  = await file.arrayBuffer();<!-- [et_pb_line_break_holder] -->                const view = new DataView(buf);<!-- [et_pb_line_break_holder] -->                let audioStart = 0;<!-- [et_pb_line_break_holder] -->                if (this.readString(view, 0, 3) === 'ID3') {<!-- [et_pb_line_break_holder] -->                    audioStart = 10 + this.readID3Size(view, 6);<!-- [et_pb_line_break_holder] -->                }<!-- [et_pb_line_break_holder] -->                const audioData = new Uint8Array(buf.slice(audioStart));<!-- [et_pb_line_break_holder] -->                const id3Tag    = this.createID3v2Tag(tags);<!-- [et_pb_line_break_holder] -->                const result    = new Uint8Array(id3Tag.length + audioData.length);<!-- [et_pb_line_break_holder] -->                result.set(id3Tag, 0);<!-- [et_pb_line_break_holder] -->                result.set(audioData, id3Tag.length);<!-- [et_pb_line_break_holder] -->                return new Blob([result], { type: 'audio\/mpeg' });<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            createID3v2Tag(tags) {<!-- [et_pb_line_break_holder] -->                const frames = [];<!-- [et_pb_line_break_holder] -->                const mapping = {<!-- [et_pb_line_break_holder] -->                    'Title':'TIT2','Artist':'TPE1','Album':'TALB','Year':'TDRC',<!-- [et_pb_line_break_holder] -->                    'Genre':'TCON','Track':'TRCK','Comment':'COMM','Album Artist':'TPE2',<!-- [et_pb_line_break_holder] -->                    'Composer':'TCOM','Copyright':'TCOP','Publisher':'TPUB','BPM':'TBPM',<!-- [et_pb_line_break_holder] -->                    'ISRC\/Source Code':'TSRC'<!-- [et_pb_line_break_holder] -->                };<!-- [et_pb_line_break_holder] -->                for (const [name, id] of Object.entries(mapping)) {<!-- [et_pb_line_break_holder] -->                    if (tags[name] && tags[name].trim()) {<!-- [et_pb_line_break_holder] -->                        frames.push(id === 'COMM' ? this.createCOMMFrame(tags[name]) : this.createTextFrame(id, tags[name]));<!-- [et_pb_line_break_holder] -->                    }<!-- [et_pb_line_break_holder] -->                }<!-- [et_pb_line_break_holder] -->                let framesSize = 0;<!-- [et_pb_line_break_holder] -->                frames.forEach(f => framesSize += f.length);<!-- [et_pb_line_break_holder] -->                const header = new Uint8Array(10);<!-- [et_pb_line_break_holder] -->                header.set([0x49,0x44,0x33,0x04,0x00,0x00], 0);<!-- [et_pb_line_break_holder] -->                this.writeSyncSafeInt(header, 6, framesSize);<!-- [et_pb_line_break_holder] -->                const tag = new Uint8Array(10 + framesSize);<!-- [et_pb_line_break_holder] -->                tag.set(header, 0);<!-- [et_pb_line_break_holder] -->                let off = 10;<!-- [et_pb_line_break_holder] -->                frames.forEach(f => { tag.set(f, off); off += f.length; });<!-- [et_pb_line_break_holder] -->                return tag;<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            createTextFrame(id, text) {<!-- [et_pb_line_break_holder] -->                const tb   = new TextEncoder().encode(text);<!-- [et_pb_line_break_holder] -->                const size = 1 + tb.length + 1;<!-- [et_pb_line_break_holder] -->                const frame = new Uint8Array(10 + size);<!-- [et_pb_line_break_holder] -->                frame.set([...id].map(c => c.charCodeAt(0)), 0);<!-- [et_pb_line_break_holder] -->                this.writeSyncSafeInt(frame, 4, size);<!-- [et_pb_line_break_holder] -->                frame[8]=0; frame[9]=0; frame[10]=0x03;<!-- [et_pb_line_break_holder] -->                frame.set(tb, 11);<!-- [et_pb_line_break_holder] -->                frame[11+tb.length] = 0;<!-- [et_pb_line_break_holder] -->                return frame;<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            createCOMMFrame(text) {<!-- [et_pb_line_break_holder] -->                const tb   = new TextEncoder().encode(text);<!-- [et_pb_line_break_holder] -->                const size = 1 + 3 + 1 + tb.length + 1;<!-- [et_pb_line_break_holder] -->                const frame = new Uint8Array(10 + size);<!-- [et_pb_line_break_holder] -->                frame.set([0x43,0x4F,0x4D,0x4D], 0);<!-- [et_pb_line_break_holder] -->                this.writeSyncSafeInt(frame, 4, size);<!-- [et_pb_line_break_holder] -->                frame[8]=0; frame[9]=0; frame[10]=0x03;<!-- [et_pb_line_break_holder] -->                frame.set([0x65,0x6E,0x67], 11); frame[14]=0;<!-- [et_pb_line_break_holder] -->                frame.set(tb, 15); frame[15+tb.length]=0;<!-- [et_pb_line_break_holder] -->                return frame;<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<!-- [et_pb_line_break_holder] -->            \/\/  WAV writer (BWF MetaEdit style)<!-- [et_pb_line_break_holder] -->            \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<!-- [et_pb_line_break_holder] -->            async writeWAVMetadata(file, tags) {<!-- [et_pb_line_break_holder] -->                const buf  = await file.arrayBuffer();<!-- [et_pb_line_break_holder] -->                const view = new DataView(buf);<!-- [et_pb_line_break_holder] -->                let chunksToKeep = [];<!-- [et_pb_line_break_holder] -->                let offset = 12;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                while (offset < buf.byteLength - 8) {<!-- [et_pb_line_break_holder] -->                    const chunkId   = this.readString(view, offset, 4);<!-- [et_pb_line_break_holder] -->                    const chunkSize = view.getUint32(offset + 4, true);<!-- [et_pb_line_break_holder] -->                    const padded    = chunkSize + (chunkSize % 2);<!-- [et_pb_line_break_holder] -->                    let keep = true;<!-- [et_pb_line_break_holder] -->                    if (chunkId === 'bext') keep = false;<!-- [et_pb_line_break_holder] -->                    if (chunkId === 'LIST' && this.readString(view, offset+8, 4) === 'INFO') keep = false;<!-- [et_pb_line_break_holder] -->                    if (keep) chunksToKeep.push(new Uint8Array(buf.slice(offset, offset + 8 + padded)));<!-- [et_pb_line_break_holder] -->                    offset += 8 + padded;<!-- [et_pb_line_break_holder] -->                }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                const infoChunk = this.createWAVINFOChunk(tags);<!-- [et_pb_line_break_holder] -->                const bextChunk = this.createWAVBextChunk(tags);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                let totalSize = 4;<!-- [et_pb_line_break_holder] -->                chunksToKeep.forEach(c => totalSize += c.length);<!-- [et_pb_line_break_holder] -->                if (infoChunk) totalSize += infoChunk.length;<!-- [et_pb_line_break_holder] -->                if (bextChunk) totalSize += bextChunk.length;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                const out    = new Uint8Array(8 + totalSize);<!-- [et_pb_line_break_holder] -->                const outView = new DataView(out.buffer);<!-- [et_pb_line_break_holder] -->                out.set([0x52,0x49,0x46,0x46], 0); outView.setUint32(4, totalSize, true);<!-- [et_pb_line_break_holder] -->                out.set([0x57,0x41,0x56,0x45], 8);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                let w = 12;<!-- [et_pb_line_break_holder] -->                if (bextChunk) { out.set(bextChunk, w); w += bextChunk.length; }<!-- [et_pb_line_break_holder] -->                chunksToKeep.forEach(c => { out.set(c, w); w += c.length; });<!-- [et_pb_line_break_holder] -->                if (infoChunk) { out.set(infoChunk, w); }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                return new Blob([out], { type: 'audio\/wav' });<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            createWAVINFOChunk(tags) {<!-- [et_pb_line_break_holder] -->                const mapping = {<!-- [et_pb_line_break_holder] -->                    'Title':'INAM','Artist':'IART','Album':'IPRD','Comment':'ICMT',<!-- [et_pb_line_break_holder] -->                    'Creation Date':'ICRD','Genre':'IGNR','Copyright':'ICOP',<!-- [et_pb_line_break_holder] -->                    'Software':'ISFT','Subject':'ISBJ','ISRC\/Source Code':'ISRC'<!-- [et_pb_line_break_holder] -->                };<!-- [et_pb_line_break_holder] -->                const subs = [];<!-- [et_pb_line_break_holder] -->                for (const [name, id] of Object.entries(mapping)) {<!-- [et_pb_line_break_holder] -->                    if (tags[name] && tags[name].trim()) {<!-- [et_pb_line_break_holder] -->                        const tb  = new TextEncoder().encode(tags[name]);<!-- [et_pb_line_break_holder] -->                        const sz  = tb.length + 1;<!-- [et_pb_line_break_holder] -->                        const pad = sz + (sz % 2);<!-- [et_pb_line_break_holder] -->                        const c   = new Uint8Array(8 + pad);<!-- [et_pb_line_break_holder] -->                        c.set([...id].map(x => x.charCodeAt(0)), 0);<!-- [et_pb_line_break_holder] -->                        new DataView(c.buffer).setUint32(4, sz, true);<!-- [et_pb_line_break_holder] -->                        c.set(tb, 8); c[8+tb.length] = 0;<!-- [et_pb_line_break_holder] -->                        subs.push(c);<!-- [et_pb_line_break_holder] -->                    }<!-- [et_pb_line_break_holder] -->                }<!-- [et_pb_line_break_holder] -->                if (!subs.length) return null;<!-- [et_pb_line_break_holder] -->                let listSz = 4;<!-- [et_pb_line_break_holder] -->                subs.forEach(c => listSz += c.length);<!-- [et_pb_line_break_holder] -->                const list = new Uint8Array(8 + listSz);<!-- [et_pb_line_break_holder] -->                list.set([0x4C,0x49,0x53,0x54], 0);<!-- [et_pb_line_break_holder] -->                new DataView(list.buffer).setUint32(4, listSz, true);<!-- [et_pb_line_break_holder] -->                list.set([0x49,0x4E,0x46,0x4F], 8);<!-- [et_pb_line_break_holder] -->                let off = 12;<!-- [et_pb_line_break_holder] -->                subs.forEach(c => { list.set(c, off); off += c.length; });<!-- [et_pb_line_break_holder] -->                return list;<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            createWAVBextChunk(tags) {<!-- [et_pb_line_break_holder] -->                const bwfFields = ['Description','Originator','Originator Reference','Origination Date','Origination Time'];<!-- [et_pb_line_break_holder] -->                if (!bwfFields.some(f => tags[f] && tags[f].trim())) return null;<!-- [et_pb_line_break_holder] -->                const sz    = 602;<!-- [et_pb_line_break_holder] -->                const chunk = new Uint8Array(8 + sz);<!-- [et_pb_line_break_holder] -->                chunk.set([0x62,0x65,0x78,0x74], 0);<!-- [et_pb_line_break_holder] -->                new DataView(chunk.buffer).setUint32(4, sz, true);<!-- [et_pb_line_break_holder] -->                const write = (str, off, len) => {<!-- [et_pb_line_break_holder] -->                    const b = new TextEncoder().encode(str||'');<!-- [et_pb_line_break_holder] -->                    for (let i=0;i<len;i++) chunk[8+off+i] = i<b.length ? b[i] : 0;<!-- [et_pb_line_break_holder] -->                };<!-- [et_pb_line_break_holder] -->                write(tags['Description'],          0,   256);<!-- [et_pb_line_break_holder] -->                write(tags['Originator'],           256, 32);<!-- [et_pb_line_break_holder] -->                write(tags['Originator Reference'], 288, 32);<!-- [et_pb_line_break_holder] -->                write(tags['Origination Date'],     320, 10);<!-- [et_pb_line_break_holder] -->                write(tags['Origination Time'],     330, 8);<!-- [et_pb_line_break_holder] -->                new DataView(chunk.buffer).setUint16(8+346, 1, true);<!-- [et_pb_line_break_holder] -->                return chunk;<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<!-- [et_pb_line_break_holder] -->            \/\/  Misc<!-- [et_pb_line_break_holder] -->            \/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<!-- [et_pb_line_break_holder] -->            readID3Size(view, offset) {<!-- [et_pb_line_break_holder] -->                return ((view.getUint8(offset)&0x7F)<<21)|((view.getUint8(offset+1)&#038;0x7F)<<14)|<!-- [et_pb_line_break_holder] -->                       ((view.getUint8(offset+2)&0x7F)<<7)|(view.getUint8(offset+3)&#038;0x7F);<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            writeSyncSafeInt(arr, off, val) {<!-- [et_pb_line_break_holder] -->                arr[off]=(val>>21)&0x7F; arr[off+1]=(val>>14)&0x7F;<!-- [et_pb_line_break_holder] -->                arr[off+2]=(val>>7)&0x7F; arr[off+3]=val&0x7F;<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            deleteFile(fileIndex) {<!-- [et_pb_line_break_holder] -->                if (!confirm(`Remove \"${this.metadata[fileIndex].fileName}\" from the list?`)) return;<!-- [et_pb_line_break_holder] -->                this.files.splice(fileIndex, 1);<!-- [et_pb_line_break_holder] -->                this.metadata.splice(fileIndex, 1);<!-- [et_pb_line_break_holder] -->                this.modifiedData.delete(fileIndex);<!-- [et_pb_line_break_holder] -->                this.allFields.clear();<!-- [et_pb_line_break_holder] -->                this.metadata.forEach(m => Object.keys(m.tags).forEach(k => this.allFields.add(k)));<!-- [et_pb_line_break_holder] -->                if (this.metadata.length === 0) this.reset();<!-- [et_pb_line_break_holder] -->                else { this.renderTable(); this.showStatus('File removed from list'); }<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            filterFields(query) {<!-- [et_pb_line_break_holder] -->                const q = query.toLowerCase();<!-- [et_pb_line_break_holder] -->                const headers = this.tableHeader.querySelectorAll('th');<!-- [et_pb_line_break_holder] -->                headers.forEach((th, i) => {<!-- [et_pb_line_break_holder] -->                    if (i < 4) return; \/\/ skip Actions, File Name, Type, Tech Info<!-- [et_pb_line_break_holder] -->                    const show = th.textContent.toLowerCase().includes(q);<!-- [et_pb_line_break_holder] -->                    th.style.display = show ? '' : 'none';<!-- [et_pb_line_break_holder] -->                    this.tableBody.querySelectorAll('tr').forEach(row => {<!-- [et_pb_line_break_holder] -->                        const cell = row.children[i];<!-- [et_pb_line_break_holder] -->                        if (cell) cell.style.display = show ? '' : 'none';<!-- [et_pb_line_break_holder] -->                    });<!-- [et_pb_line_break_holder] -->                });<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            showControls() { this.controls.style.display = 'flex'; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            reset() {<!-- [et_pb_line_break_holder] -->                if (this.files.length > 0 && !confirm('Reset session? All unsaved changes will be lost.')) return;<!-- [et_pb_line_break_holder] -->                if (this.isFullscreen) this.exitFullscreen();<!-- [et_pb_line_break_holder] -->                this.files = []; this.metadata = []; this.modifiedData.clear(); this.allFields.clear();<!-- [et_pb_line_break_holder] -->                this.controls.style.display = 'none';<!-- [et_pb_line_break_holder] -->                this.tableContainer.classList.remove('visible');<!-- [et_pb_line_break_holder] -->                this.dropZone.style.display = 'block';<!-- [et_pb_line_break_holder] -->                this.emptyState.style.display = 'block';<!-- [et_pb_line_break_holder] -->                this.fileInput.value = '';<!-- [et_pb_line_break_holder] -->                this.showStatus('Session reset successfully');<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->            showStatus(message, type = 'success') {<!-- [et_pb_line_break_holder] -->                this.statusMessage.textContent = message;<!-- [et_pb_line_break_holder] -->                this.statusMessage.className = `status-message visible${type==='error'?' error':type==='warning'?' warning':''}`;<!-- [et_pb_line_break_holder] -->                setTimeout(() => this.statusMessage.classList.remove('visible'), 4000);<!-- [et_pb_line_break_holder] -->            }<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        const editor = new AudioMetadataEditor();<!-- [et_pb_line_break_holder] -->    <\/script><!-- [et_pb_line_break_holder] --><\/body><!-- [et_pb_line_break_holder] --><\/html>[\/et_pb_code][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=&#8221;1&#8243; admin_label=&#8221;Hero Section&#8221; _builder_version=&#8221;4.27.5&#8243; background_color=&#8221;#000000&#8243; use_background_color_gradient=&#8221;on&#8221; background_color_gradient_stops=&#8221;#000000 0%|rgba(0,0,0,0) 20%|rgba(0,0,0,0) 80%|#000000 100%&#8221; background_color_gradient_overlays_image=&#8221;on&#8221; background_image=&#8221;https:\/\/smartdsp.pro\/wp-content\/uploads\/2022\/10\/streamer-79.png&#8221; custom_padding=&#8221;9px|||1px||&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_row _builder_version=&#8221;4.27.5&#8243; background_size=&#8221;initial&#8221; background_position=&#8221;top_left&#8221; background_repeat=&#8221;repeat&#8221; module_alignment=&#8221;center&#8221; hover_enabled=&#8221;0&#8243; custom_width_px=&#8221;700px&#8221; global_colors_info=&#8221;{}&#8221; custom_margin=&#8221;4vw||||false|false&#8221; sticky_enabled=&#8221;0&#8243;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.16&#8243; custom_padding=&#8221;|||&#8221; global_colors_info=&#8221;{}&#8221; custom_padding__hover=&#8221;|||&#8221;][et_pb_text _builder_version=&#8221;4.16&#8243; text_font=&#8221;||||||||&#8221; text_font_size=&#8221;18px&#8221; text_line_height=&#8221;2em&#8221; header_font=&#8221;Titillium Web||||||||&#8221; header_font_size=&#8221;66px&#8221; header_line_height=&#8221;1.5em&#8221; header_2_font=&#8221;Titillium Web||||||||&#8221; header_2_font_size=&#8221;66px&#8221; header_2_line_height=&#8221;1.5em&#8221; header_3_font=&#8221;Titillium Web||||||||&#8221; header_3_font_size=&#8221;66px&#8221; header_3_line_height=&#8221;1.5em&#8221; header_4_font=&#8221;Titillium Web||||||||&#8221; header_4_font_size=&#8221;66px&#8221; header_4_line_height=&#8221;1.5em&#8221; header_5_font=&#8221;Titillium Web||||||||&#8221; header_5_font_size=&#8221;66px&#8221; header_5_line_height=&#8221;1.5em&#8221; header_6_font=&#8221;Titillium Web||||||||&#8221; header_6_font_size=&#8221;66px&#8221; header_6_line_height=&#8221;1.5em&#8221; text_orientation=&#8221;center&#8221; background_layout=&#8221;dark&#8221; max_width=&#8221;700px&#8221; module_alignment=&#8221;center&#8221; hover_enabled=&#8221;0&#8243; header_font_size_tablet=&#8221;40px&#8221; header_font_size_phone=&#8221;&#8221; header_font_size_last_edited=&#8221;on|phone&#8221; global_colors_info=&#8221;{}&#8221; sticky_enabled=&#8221;0&#8243;]<\/p>\n<h1>Frequently Asked<\/h1>\n<p>[\/et_pb_text][et_pb_code _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;][\/et_pb_code][\/et_pb_column][\/et_pb_row][et_pb_row column_structure=&#8221;1_2,1_2&#8243; custom_padding_last_edited=&#8221;on|desktop&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; background_color=&#8221;rgba(79,79,79,0.16)&#8221; overflow-x=&#8221;visible&#8221; overflow-y=&#8221;visible&#8221; custom_padding=&#8221;80px|80px|80px|80px|true|true&#8221; custom_padding_tablet=&#8221;30px|30px|30px|30px|true|true&#8221; custom_padding_phone=&#8221;20px|20px|20px|20px|true|true&#8221; border_radii=&#8221;on|20px|20px|20px|20px&#8221; box_shadow_style=&#8221;preset1&#8243; box_shadow_horizontal=&#8221;-1px&#8221; box_shadow_vertical=&#8221;-1px&#8221; box_shadow_blur=&#8221;0px&#8221; box_shadow_color=&#8221;rgba(255,255,255,0.21)&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;1_2&#8243; _builder_version=&#8221;4.17.4&#8243; _module_preset=&#8221;default&#8221; custom_padding_tablet=&#8221;||||false|false&#8221; custom_padding_phone=&#8221;||30px||false|false&#8221; custom_padding_last_edited=&#8221;off|phone&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_blurb title=&#8221;How to view\/EDIT Metadata of audio file(s) with this tool?&#8221; use_icon=&#8221;on&#8221; font_icon=&#8221;&#x75;||divi||400&#8243; icon_color=&#8221;#f3be29&#8243; icon_placement=&#8221;left&#8221; _builder_version=&#8221;4.27.5&#8243; header_font=&#8221;&#8211;et_global_heading_font|700||on|||||&#8221; header_font_size=&#8221;14px&#8221; header_letter_spacing=&#8221;2px&#8221; header_line_height=&#8221;1.8em&#8221; body_font=&#8221;&#8211;et_global_heading_font||||||||&#8221; body_text_color=&#8221;#FFFFFF&#8221; body_font_size=&#8221;16px&#8221; body_line_height=&#8221;1.8em&#8221; background_enable_color=&#8221;off&#8221; use_background_color_gradient=&#8221;on&#8221; background_color_gradient_direction=&#8221;164deg&#8221; background_color_gradient_stops=&#8221;rgba(243,190,41,0.17) 0%|rgba(205,59,167,0.17) 100%&#8221; background_layout=&#8221;dark&#8221; custom_margin=&#8221;||12%|&#8221; custom_margin_tablet=&#8221;70px|||&#8221; custom_margin_last_edited=&#8221;off|desktop&#8221; custom_padding=&#8221;30px|16px|30px|16px&#8221; animation_style=&#8221;fold&#8221; border_radii=&#8221;on|20px|20px|20px|20px&#8221; box_shadow_style=&#8221;preset1&#8243; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<div class=\"faq-item\">\n<ol>\n<li class=\"faq-answer\">Drag &amp; Drop (or click to Browse) to import audio file(s)<\/li>\n<li class=\"faq-answer\">You&#8217;ll instantly see the metadata for each file loaded.<\/li>\n<li class=\"faq-answer\">Edit if desired (see how below)<\/li>\n<li class=\"faq-answer\">Save edited metadata (either overwrite file(s) or to a new one)<\/li>\n<\/ol>\n<p><strong>Options:<\/strong><\/p>\n<ul>\n<li class=\"faq-answer\">Double click a field to edit it<\/li>\n<li class=\"faq-answer\">Right click a field to Clear value OR Paste value to all other files<\/li>\n<li class=\"faq-answer\">Add\/remove files with the dedicated icons and buttons.<\/li>\n<li class=\"faq-answer\">Filter fields with the search bar<\/li>\n<\/ul>\n<\/div>\n<div class=\"faq-item\"><\/div>\n<p>[\/et_pb_blurb][et_pb_blurb title=&#8221;Is this Metadata Editor safe to use?&#8221; use_icon=&#8221;on&#8221; font_icon=&#8221;&#x75;||divi||400&#8243; icon_color=&#8221;#f3be29&#8243; icon_placement=&#8221;left&#8221; _builder_version=&#8221;4.27.5&#8243; header_font=&#8221;&#8211;et_global_heading_font|700||on|||||&#8221; header_font_size=&#8221;14px&#8221; header_letter_spacing=&#8221;2px&#8221; header_line_height=&#8221;1.8em&#8221; body_font=&#8221;&#8211;et_global_heading_font||||||||&#8221; body_text_color=&#8221;#FFFFFF&#8221; body_font_size=&#8221;16px&#8221; body_line_height=&#8221;1.8em&#8221; background_enable_color=&#8221;off&#8221; use_background_color_gradient=&#8221;on&#8221; background_color_gradient_direction=&#8221;164deg&#8221; background_color_gradient_stops=&#8221;rgba(243,190,41,0.17) 0%|rgba(205,59,167,0.17) 100%&#8221; background_layout=&#8221;dark&#8221; custom_margin=&#8221;||12%|&#8221; custom_margin_tablet=&#8221;70px|||&#8221; custom_margin_last_edited=&#8221;off|desktop&#8221; custom_padding=&#8221;30px|16px|30px|16px&#8221; animation_style=&#8221;fold&#8221; animation_delay=&#8221;100ms&#8221; border_radii=&#8221;on|20px|20px|20px|20px&#8221; box_shadow_style=&#8221;preset1&#8243; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<div class=\"faq-item\">\n<div class=\"faq-answer\">\n<p>Absolutely. Your audio files never leave your device\u2014there are no uploads, no servers, and no cloud processing. Everything happens 100% locally in your browser. Your files remain completely private and secure on your computer. We don&#8217;t collect, store, or have any access to your audio files whatsoever.<\/p>\n<p>Additionally this tool does not process the audio data of your files in any way when you save edited metadata, making the process not only 100% transparent but also faster.<\/p><\/div>\n<\/div>\n<div class=\"faq-item\"><\/div>\n<p>[\/et_pb_blurb][et_pb_blurb title=&#8221;Do I need to install any software to use this Metadata Viewer\/Editor?&#8221; use_icon=&#8221;on&#8221; font_icon=&#8221;&#x75;||divi||400&#8243; icon_color=&#8221;#f3be29&#8243; icon_placement=&#8221;left&#8221; _builder_version=&#8221;4.27.5&#8243; header_font=&#8221;&#8211;et_global_heading_font|700||on|||||&#8221; header_font_size=&#8221;14px&#8221; header_letter_spacing=&#8221;2px&#8221; header_line_height=&#8221;1.8em&#8221; body_font=&#8221;&#8211;et_global_heading_font||||||||&#8221; body_text_color=&#8221;#FFFFFF&#8221; body_font_size=&#8221;16px&#8221; body_line_height=&#8221;1.8em&#8221; background_enable_color=&#8221;off&#8221; use_background_color_gradient=&#8221;on&#8221; background_color_gradient_direction=&#8221;164deg&#8221; background_color_gradient_stops=&#8221;rgba(243,190,41,0.17) 0%|rgba(205,59,167,0.17) 100%&#8221; background_layout=&#8221;dark&#8221; custom_margin=&#8221;||12%|&#8221; custom_margin_tablet=&#8221;70px|||&#8221; custom_margin_last_edited=&#8221;off|desktop&#8221; custom_padding=&#8221;30px|16px|30px|16px&#8221; animation_style=&#8221;fold&#8221; animation_delay=&#8221;100ms&#8221; border_radii=&#8221;on|20px|20px|20px|20px&#8221; box_shadow_style=&#8221;preset1&#8243; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<div class=\"faq-item\">\n<div class=\"faq-answer\"><span>No installation required (and no account neither!)<br \/>This is a completely free and web-based tool that runs directly in your browser. <\/span><\/div>\n<div class=\"faq-answer\"><span><\/span><\/div>\n<div class=\"faq-answer\">It works on any modern browser (Chrome, Firefox, Safari, Edge) on Windows, Mac, Linux, and even mobile devices. Just open the page and import audio files to view and eventually edit their metadata \u2014no downloads, no plugins, no registration needed.<span><\/span><\/div>\n<\/div>\n<div class=\"faq-item\"><\/div>\n<p>[\/et_pb_blurb][\/et_pb_column][et_pb_column type=&#8221;1_2&#8243; _builder_version=&#8221;4.17.4&#8243; _module_preset=&#8221;default&#8221; custom_padding_tablet=&#8221;|||0%|false|false&#8221; custom_padding_phone=&#8221;|||0%|false|false&#8221; custom_padding_last_edited=&#8221;off|desktop&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_blurb title=&#8221;What are Metadata?&#8221; use_icon=&#8221;on&#8221; font_icon=&#8221;&#x75;||divi||400&#8243; icon_color=&#8221;#f3be29&#8243; icon_placement=&#8221;left&#8221; _builder_version=&#8221;4.27.5&#8243; header_font=&#8221;&#8211;et_global_heading_font|700||on|||||&#8221; header_font_size=&#8221;14px&#8221; header_letter_spacing=&#8221;2px&#8221; header_line_height=&#8221;1.8em&#8221; body_font=&#8221;&#8211;et_global_heading_font||||||||&#8221; body_text_color=&#8221;#FFFFFF&#8221; body_font_size=&#8221;16px&#8221; body_line_height=&#8221;1.8em&#8221; background_enable_color=&#8221;off&#8221; use_background_color_gradient=&#8221;on&#8221; background_color_gradient_direction=&#8221;164deg&#8221; background_color_gradient_stops=&#8221;rgba(243,190,41,0.17) 0%|rgba(205,59,167,0.17) 100%&#8221; background_layout=&#8221;dark&#8221; custom_margin=&#8221;||12%|&#8221; custom_margin_tablet=&#8221;70px|||&#8221; custom_margin_last_edited=&#8221;off|desktop&#8221; custom_padding=&#8221;30px|16px|30px|16px&#8221; animation_style=&#8221;fold&#8221; animation_delay=&#8221;250ms&#8221; border_radii=&#8221;on|20px|20px|20px|20px&#8221; box_shadow_style=&#8221;preset1&#8243; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<div class=\"faq-item\">\n<div class=\"faq-answer\">\n<p>Metadata are different information embedded within a file either a picture, video, audio file or else. They allow to store various information about the file such as its date of creation, creator name, length, name and more directly within the file.<\/p>\n<p>In the music industry context, they allow to track artist &amp; copyright information by tagging directly into the audio files informations such as Artist, Track, Album, Genre, Involved People, ISRC code\u2026<\/p>\n<p>The most common<strong><span>\u00a0<\/span>types of metadata retained in audio formats<\/strong><span>\u00a0<\/span>are: IDv3, ID3v2, Riff, Bwf, Cart, AXML, IXML, XMP.<\/p>\n<p>For more information read <a href=\"https:\/\/smartdsp.pro\/mastering-metadata\/\" target=\"_blank\" rel=\"noopener\">this article I wrote about Audio Metadata<\/a>. <a href=\"https:\/\/smartdsp.pro\/mastering-metadata\/\"><\/a>\u00a0<\/p>\n<\/div>\n<\/div>\n<p>[\/et_pb_blurb][et_pb_blurb title=&#8221;How long is it to save edited metadata?&#8221; use_icon=&#8221;on&#8221; font_icon=&#8221;&#x75;||divi||400&#8243; icon_color=&#8221;#f3be29&#8243; icon_placement=&#8221;left&#8221; _builder_version=&#8221;4.27.5&#8243; header_font=&#8221;&#8211;et_global_heading_font|700||on|||||&#8221; header_font_size=&#8221;14px&#8221; header_letter_spacing=&#8221;2px&#8221; header_line_height=&#8221;1.8em&#8221; body_font=&#8221;&#8211;et_global_heading_font||||||||&#8221; body_text_color=&#8221;#FFFFFF&#8221; body_font_size=&#8221;16px&#8221; body_line_height=&#8221;1.8em&#8221; background_enable_color=&#8221;off&#8221; use_background_color_gradient=&#8221;on&#8221; background_color_gradient_direction=&#8221;164deg&#8221; background_color_gradient_stops=&#8221;rgba(243,190,41,0.17) 0%|rgba(205,59,167,0.17) 100%&#8221; background_layout=&#8221;dark&#8221; custom_margin=&#8221;||12%|&#8221; custom_margin_tablet=&#8221;70px|||&#8221; custom_margin_last_edited=&#8221;off|desktop&#8221; custom_padding=&#8221;30px|16px|30px|16px&#8221; animation_style=&#8221;fold&#8221; animation_delay=&#8221;150ms&#8221; border_radii=&#8221;on|20px|20px|20px|20px&#8221; box_shadow_style=&#8221;preset1&#8243; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<p>Under a few seconds, pretty much instantly after you click the save button.<\/p>\n<p>[\/et_pb_blurb][et_pb_blurb title=&#8221;METADATA IN WAV FILE?&#8221; use_icon=&#8221;on&#8221; font_icon=&#8221;&#x75;||divi||400&#8243; icon_color=&#8221;#f3be29&#8243; icon_placement=&#8221;left&#8221; _builder_version=&#8221;4.27.5&#8243; header_font=&#8221;&#8211;et_global_heading_font|700||on|||||&#8221; header_font_size=&#8221;14px&#8221; header_letter_spacing=&#8221;2px&#8221; header_line_height=&#8221;1.8em&#8221; body_font=&#8221;&#8211;et_global_heading_font||||||||&#8221; body_text_color=&#8221;#FFFFFF&#8221; body_font_size=&#8221;16px&#8221; body_line_height=&#8221;1.8em&#8221; background_enable_color=&#8221;off&#8221; use_background_color_gradient=&#8221;on&#8221; background_color_gradient_direction=&#8221;164deg&#8221; background_color_gradient_stops=&#8221;rgba(243,190,41,0.17) 0%|rgba(205,59,167,0.17) 100%&#8221; background_layout=&#8221;dark&#8221; custom_margin=&#8221;||12%|&#8221; custom_margin_tablet=&#8221;70px|||&#8221; custom_margin_last_edited=&#8221;off|desktop&#8221; custom_padding=&#8221;30px|16px|30px|16px&#8221; animation_style=&#8221;fold&#8221; animation_delay=&#8221;100ms&#8221; border_radii=&#8221;on|20px|20px|20px|20px&#8221; box_shadow_style=&#8221;preset1&#8243; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<div class=\"faq-item\">\n<div class=\"faq-answer\">\n<p><span>Contrary to the common belief, it is possible to embed metadata in Wav files thanks to the Bradcast Wav File (Bwf) extension. ISRC code can also be embedded in to the AXML chunk of the file.<\/span><br \/><span>This data isn\u2019t read by all media players, but it might tomorrow. <\/span><\/p>\n<p>At\u00a0<a href=\"https:\/\/smartdsp.pro\/\">Smart DSP<\/a><span> we ensure proper embedding of all your information, including artwork and are happy to future proof your wav files by being able to tag the data into them as well.<\/span><\/p>\n<\/div>\n<\/div>\n<p>[\/et_pb_blurb][\/et_pb_column][\/et_pb_row][et_pb_row _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_heading title=&#8221;We&#8217;ve much more for you to explore:&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; title_level=&#8221;h2&#8243; title_font=&#8221;&#8211;et_global_heading_font||||||||&#8221; title_text_color=&#8221;#FFFFFF&#8221; global_colors_info=&#8221;{}&#8221;][\/et_pb_heading][\/et_pb_column][\/et_pb_row][et_pb_row column_structure=&#8221;1_4,1_4,1_4,1_4&#8243; _builder_version=&#8221;4.18.0&#8243; custom_margin=&#8221;1vw|auto||auto|false|false&#8221; animation_style=&#8221;flip&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;1_4&#8243; _builder_version=&#8221;4.18.0&#8243; custom_padding=&#8221;|||&#8221; global_colors_info=&#8221;{}&#8221; custom_padding__hover=&#8221;|||&#8221;][et_pb_button button_url=&#8221;https:\/\/smartdsp.pro\/mastering-services&#8221; button_text=&#8221;Mastering&#8221; button_alignment=&#8221;center&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;3117bc07-6a8a-4679-b3bb-b6ed74b48a2f&#8221; custom_button=&#8221;on&#8221; button_text_color=&#8221;#FFFFFF&#8221; button_bg_use_color_gradient=&#8221;on&#8221; button_bg_color_gradient_direction=&#8221;229deg&#8221; button_bg_color_gradient_stops=&#8221;rgba(189,22,179,0.8) 0%|rgba(253,202,65,0.8) 100%&#8221; button_border_width=&#8221;0px&#8221; button_border_radius=&#8221;15px&#8221; button_font=&#8221;Be Vietnam Pro|600|||||||&#8221; button_use_icon=&#8221;off&#8221; box_shadow_style=&#8221;preset1&#8243; box_shadow_blur=&#8221;35px&#8221; box_shadow_spread=&#8221;-11px&#8221; box_shadow_color=&#8221;rgba(255,255,255,0.28)&#8221; global_colors_info=&#8221;{}&#8221; button_bg_color__hover_enabled=&#8221;on|desktop&#8221; button_bg_color__hover=&#8221;rgba(0,127,31,0.7)&#8221; button_bg_enable_color__hover=&#8221;on&#8221; button_border_width__hover=&#8221;0px&#8221; button_border_width__hover_enabled=&#8221;on|desktop&#8221; button_border_radius__hover=&#8221;15px&#8221; button_border_radius__hover_enabled=&#8221;on|desktop&#8221; box_shadow_color__hover=&#8221;rgba(255,255,255,0.49)&#8221; box_shadow_color__hover_enabled=&#8221;on|hover&#8221; button_text_size__hover_enabled=&#8221;on|desktop&#8221; button_border_color__hover=&#8221;rgba(255,255,255,0.02)&#8221; button_border_color__hover_enabled=&#8221;on|hover&#8221; button_icon_color__hover=&#8221;#FFFFFF&#8221; button_icon_color__hover_enabled=&#8221;on|hover&#8221;][\/et_pb_button][\/et_pb_column][et_pb_column type=&#8221;1_4&#8243; _builder_version=&#8221;4.18.0&#8243; custom_padding=&#8221;|||&#8221; global_colors_info=&#8221;{}&#8221; custom_padding__hover=&#8221;|||&#8221;][et_pb_button button_url=&#8221;https:\/\/smartdsp.pro\/smart-dsp-products\/&#8221; button_text=&#8221;Audio Effects&#8221; button_alignment=&#8221;center&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;3117bc07-6a8a-4679-b3bb-b6ed74b48a2f&#8221; custom_button=&#8221;on&#8221; button_text_color=&#8221;#FFFFFF&#8221; button_bg_use_color_gradient=&#8221;on&#8221; button_bg_color_gradient_direction=&#8221;229deg&#8221; button_bg_color_gradient_stops=&#8221;rgba(189,22,179,0.8) 0%|rgba(253,202,65,0.8) 100%&#8221; button_border_width=&#8221;0px&#8221; button_border_radius=&#8221;15px&#8221; button_font=&#8221;Be Vietnam Pro|600|||||||&#8221; button_use_icon=&#8221;off&#8221; box_shadow_style=&#8221;preset1&#8243; box_shadow_blur=&#8221;35px&#8221; box_shadow_spread=&#8221;-11px&#8221; box_shadow_color=&#8221;rgba(255,255,255,0.28)&#8221; global_colors_info=&#8221;{}&#8221; button_bg_color__hover_enabled=&#8221;on|desktop&#8221; button_bg_color__hover=&#8221;rgba(0,127,31,0.7)&#8221; button_bg_enable_color__hover=&#8221;on&#8221; button_border_width__hover=&#8221;0px&#8221; button_border_width__hover_enabled=&#8221;on|desktop&#8221; button_border_radius__hover=&#8221;15px&#8221; button_border_radius__hover_enabled=&#8221;on|desktop&#8221; box_shadow_color__hover=&#8221;rgba(255,255,255,0.49)&#8221; box_shadow_color__hover_enabled=&#8221;on|hover&#8221; button_text_size__hover_enabled=&#8221;on|desktop&#8221; button_border_color__hover=&#8221;rgba(255,255,255,0.02)&#8221; button_border_color__hover_enabled=&#8221;on|hover&#8221; button_icon_color__hover=&#8221;#FFFFFF&#8221; button_icon_color__hover_enabled=&#8221;on|hover&#8221;][\/et_pb_button][\/et_pb_column][et_pb_column type=&#8221;1_4&#8243; _builder_version=&#8221;4.18.0&#8243; custom_padding=&#8221;|||&#8221; global_colors_info=&#8221;{}&#8221; custom_padding__hover=&#8221;|||&#8221;][et_pb_button button_url=&#8221;https:\/\/www.patreon.com\/posts\/how-to-get-most-96445637&#8243; url_new_window=&#8221;on&#8221; button_text=&#8221;Learning&#8221; button_alignment=&#8221;center&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;3117bc07-6a8a-4679-b3bb-b6ed74b48a2f&#8221; custom_button=&#8221;on&#8221; button_text_color=&#8221;#FFFFFF&#8221; button_bg_use_color_gradient=&#8221;on&#8221; button_bg_color_gradient_direction=&#8221;229deg&#8221; button_bg_color_gradient_stops=&#8221;rgba(189,22,179,0.8) 0%|rgba(253,202,65,0.8) 100%&#8221; button_border_width=&#8221;0px&#8221; button_border_radius=&#8221;15px&#8221; button_font=&#8221;Be Vietnam Pro|600|||||||&#8221; button_use_icon=&#8221;off&#8221; box_shadow_style=&#8221;preset1&#8243; box_shadow_blur=&#8221;35px&#8221; box_shadow_spread=&#8221;-11px&#8221; box_shadow_color=&#8221;rgba(255,255,255,0.28)&#8221; global_colors_info=&#8221;{}&#8221; button_bg_color__hover_enabled=&#8221;on|desktop&#8221; button_bg_color__hover=&#8221;rgba(0,127,31,0.7)&#8221; button_bg_enable_color__hover=&#8221;on&#8221; button_border_width__hover=&#8221;0px&#8221; button_border_width__hover_enabled=&#8221;on|desktop&#8221; button_border_radius__hover=&#8221;15px&#8221; button_border_radius__hover_enabled=&#8221;on|desktop&#8221; box_shadow_color__hover=&#8221;rgba(255,255,255,0.49)&#8221; box_shadow_color__hover_enabled=&#8221;on|hover&#8221; button_text_size__hover_enabled=&#8221;on|desktop&#8221; button_border_color__hover=&#8221;rgba(255,255,255,0.02)&#8221; button_border_color__hover_enabled=&#8221;on|hover&#8221; button_icon_color__hover=&#8221;#FFFFFF&#8221; button_icon_color__hover_enabled=&#8221;on|hover&#8221;][\/et_pb_button][\/et_pb_column][et_pb_column type=&#8221;1_4&#8243; _builder_version=&#8221;4.18.0&#8243; custom_padding=&#8221;|||&#8221; global_colors_info=&#8221;{}&#8221; custom_padding__hover=&#8221;|||&#8221;][et_pb_button button_url=&#8221;https:\/\/smartdsp.pro\/tools&#8221; button_text=&#8221;Online Tools&#8221; button_alignment=&#8221;center&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;3117bc07-6a8a-4679-b3bb-b6ed74b48a2f&#8221; custom_button=&#8221;on&#8221; button_text_color=&#8221;#FFFFFF&#8221; button_bg_use_color_gradient=&#8221;on&#8221; button_bg_color_gradient_direction=&#8221;229deg&#8221; button_bg_color_gradient_stops=&#8221;rgba(189,22,179,0.8) 0%|rgba(253,202,65,0.8) 100%&#8221; button_border_width=&#8221;0px&#8221; button_border_radius=&#8221;15px&#8221; button_font=&#8221;Be Vietnam Pro|600|||||||&#8221; button_use_icon=&#8221;off&#8221; box_shadow_style=&#8221;preset1&#8243; box_shadow_blur=&#8221;35px&#8221; box_shadow_spread=&#8221;-11px&#8221; box_shadow_color=&#8221;rgba(255,255,255,0.28)&#8221; global_colors_info=&#8221;{}&#8221; button_bg_color__hover_enabled=&#8221;on|desktop&#8221; button_bg_color__hover=&#8221;rgba(0,127,31,0.7)&#8221; button_bg_enable_color__hover=&#8221;on&#8221; button_border_width__hover=&#8221;0px&#8221; button_border_width__hover_enabled=&#8221;on|desktop&#8221; button_border_radius__hover=&#8221;15px&#8221; button_border_radius__hover_enabled=&#8221;on|desktop&#8221; box_shadow_color__hover=&#8221;rgba(255,255,255,0.49)&#8221; box_shadow_color__hover_enabled=&#8221;on|hover&#8221; button_text_size__hover_enabled=&#8221;on|desktop&#8221; button_border_color__hover=&#8221;rgba(255,255,255,0.02)&#8221; button_border_color__hover_enabled=&#8221;on|hover&#8221; button_icon_color__hover=&#8221;#FFFFFF&#8221; button_icon_color__hover_enabled=&#8221;on|hover&#8221;][\/et_pb_button][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=&#8221;1&#8243; admin_label=&#8221;Support&#8221; _builder_version=&#8221;4.18.0&#8243; background_enable_color=&#8221;off&#8221; use_background_color_gradient=&#8221;on&#8221; background_color_gradient_stops=&#8221;#000000 0%|rgba(41,196,169,0) 100%&#8221; background_color_gradient_overlays_image=&#8221;on&#8221; background_image=&#8221;https:\/\/smartdsp.pro\/wp-content\/uploads\/2022\/10\/footer-background-scaled-1.jpg&#8221; custom_padding=&#8221;100px|0px|100px|0px&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_row column_structure=&#8221;3_5,2_5&#8243; _builder_version=&#8221;4.16&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;3_5&#8243; _builder_version=&#8221;4.16&#8243; custom_padding=&#8221;40px||40px|&#8221; global_colors_info=&#8221;{}&#8221; custom_padding__hover=&#8221;|||&#8221;][et_pb_text _builder_version=&#8221;4.18.0&#8243; text_font=&#8221;PT Sans|700|||||||&#8221; text_text_color=&#8221;#00B22D&#8221; text_font_size=&#8221;22px&#8221; header_font=&#8221;||||||||&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<p>FEEDBACK, ANSWERS, HELP WITH TROUBLESHOOTING<\/p>\n<p>[\/et_pb_text][et_pb_text _builder_version=&#8221;4.18.0&#8243; text_font=&#8221;PT Sans|700|||||||&#8221; text_text_color=&#8221;#FFFFFF&#8221; text_font_size=&#8221;18px&#8221; text_line_height=&#8221;1.8em&#8221; header_font=&#8221;||||||||&#8221; header_2_font=&#8221;Poppins|500|||||||&#8221; header_2_text_color=&#8221;#ffffff&#8221; header_2_font_size=&#8221;38px&#8221; header_2_line_height=&#8221;1.3em&#8221; header_3_font=&#8221;||||||||&#8221; header_4_font=&#8221;||||||||&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<h2>Available 7\/7<\/h2>\n<p>You want some feedback on your project, you have some audio related question or even need some help troubleshooting something?<br \/>Don&#8217;t wait any longer, hit us up!<\/p>\n<p>[\/et_pb_text][\/et_pb_column][et_pb_column type=&#8221;2_5&#8243; _builder_version=&#8221;4.16&#8243; custom_padding=&#8221;|||&#8221; global_colors_info=&#8221;{}&#8221; custom_padding__hover=&#8221;|||&#8221;][et_pb_image src=&#8221;https:\/\/smartdsp.pro\/wp-content\/uploads\/2020\/07\/finance-illustration-03.png&#8221; title_text=&#8221;finance-illustration-03&#8243; align=&#8221;center&#8221; align_tablet=&#8221;center&#8221; align_phone=&#8221;&#8221; align_last_edited=&#8221;on|desktop&#8221; disabled_on=&#8221;on|on|off&#8221; _builder_version=&#8221;4.16&#8243; width=&#8221;40%&#8221; custom_margin=&#8221;45px|||||&#8221; animation_style=&#8221;slide&#8221; animation_direction=&#8221;bottom&#8221; animation_intensity_slide=&#8221;10%&#8221; global_colors_info=&#8221;{}&#8221;][\/et_pb_image][\/et_pb_column][\/et_pb_row][et_pb_row column_structure=&#8221;1_4,1_4,1_4,1_4&#8243; _builder_version=&#8221;4.27.4&#8243; global_colors_info=&#8221;{}&#8221; button_border_width__hover=&#8221;0px&#8221; button_border_width__hover_enabled=&#8221;on|desktop&#8221; button_border_radius__hover=&#8221;15px&#8221; button_border_radius__hover_enabled=&#8221;on|desktop&#8221; box_shadow_color__hover=&#8221;rgba(255,255,255,0.49)&#8221; box_shadow_color__hover_enabled=&#8221;on|hover&#8221; button_text_size__hover_enabled=&#8221;on|desktop&#8221; button_bg_color__hover=&#8221;rgba(0,127,31,0.7)&#8221; button_bg_color__hover_enabled=&#8221;on|desktop&#8221; button_border_color__hover=&#8221;rgba(255,255,255,0.02)&#8221; button_border_color__hover_enabled=&#8221;on|hover&#8221; button_icon_color__hover=&#8221;#FFFFFF&#8221; button_icon_color__hover_enabled=&#8221;on|hover&#8221;][et_pb_column type=&#8221;1_4&#8243; _builder_version=&#8221;4.16&#8243; custom_padding=&#8221;40px||40px|&#8221; global_colors_info=&#8221;{}&#8221; custom_padding__hover=&#8221;|||&#8221;][\/et_pb_column][et_pb_column type=&#8221;1_4&#8243; _builder_version=&#8221;4.16&#8243; custom_padding=&#8221;|||&#8221; global_colors_info=&#8221;{}&#8221; custom_padding__hover=&#8221;|||&#8221;][et_pb_button button_url=&#8221;https:\/\/smartdsp.pro\/get-feedback&#8221; url_new_window=&#8221;on&#8221; button_text=&#8221;Get some feedback&#8221; button_alignment=&#8221;center&#8221; _builder_version=&#8221;4.27.4&#8243; custom_button=&#8221;on&#8221; button_text_size=&#8221;18px&#8221; button_text_color=&#8221;#FFFFFF&#8221; button_bg_use_color_gradient=&#8221;on&#8221; button_bg_color_gradient_direction=&#8221;229deg&#8221; button_bg_color_gradient_stops=&#8221;rgba(189,22,179,0.8) 0%|rgba(253,202,65,0.8) 100%&#8221; button_border_width=&#8221;0px&#8221; button_border_radius=&#8221;15px&#8221; button_font=&#8221;Be Vietnam Pro|600|||||||&#8221; button_use_icon=&#8221;off&#8221; box_shadow_style=&#8221;preset1&#8243; box_shadow_blur=&#8221;35px&#8221; box_shadow_spread=&#8221;-11px&#8221; box_shadow_color=&#8221;rgba(255,255,255,0.28)&#8221; global_colors_info=&#8221;{}&#8221; button_text_size__hover_enabled=&#8221;on|desktop&#8221; button_one_text_size__hover_enabled=&#8221;off&#8221; button_two_text_size__hover_enabled=&#8221;off&#8221; button_text_color__hover_enabled=&#8221;off&#8221; button_one_text_color__hover_enabled=&#8221;off&#8221; button_two_text_color__hover_enabled=&#8221;off&#8221; button_border_width__hover_enabled=&#8221;on|desktop&#8221; button_one_border_width__hover_enabled=&#8221;off&#8221; button_two_border_width__hover_enabled=&#8221;off&#8221; button_border_color__hover_enabled=&#8221;on|hover&#8221; button_one_border_color__hover_enabled=&#8221;off&#8221; button_two_border_color__hover_enabled=&#8221;off&#8221; button_border_radius__hover_enabled=&#8221;on|desktop&#8221; button_one_border_radius__hover_enabled=&#8221;off&#8221; button_two_border_radius__hover_enabled=&#8221;off&#8221; button_letter_spacing__hover_enabled=&#8221;off&#8221; button_one_letter_spacing__hover_enabled=&#8221;off&#8221; button_two_letter_spacing__hover_enabled=&#8221;off&#8221; button_bg_color__hover_enabled=&#8221;on|desktop&#8221; button_one_bg_color__hover_enabled=&#8221;off&#8221; button_two_bg_color__hover_enabled=&#8221;off&#8221; button_bg_color__hover=&#8221;rgba(0,127,31,0.7)&#8221; button_border_width__hover=&#8221;0px&#8221; button_border_radius__hover=&#8221;15px&#8221; box_shadow_color__hover=&#8221;rgba(255,255,255,0.49)&#8221; box_shadow_color__hover_enabled=&#8221;on|hover&#8221; button_border_color__hover=&#8221;rgba(255,255,255,0.02)&#8221; button_icon_color__hover=&#8221;#FFFFFF&#8221; button_icon_color__hover_enabled=&#8221;on|hover&#8221; button_text_size__hover=&#8221;18px&#8221;][\/et_pb_button][\/et_pb_column][et_pb_column type=&#8221;1_4&#8243; _builder_version=&#8221;4.16&#8243; custom_padding=&#8221;|||&#8221; global_colors_info=&#8221;{}&#8221; custom_padding__hover=&#8221;|||&#8221;][et_pb_button button_url=&#8221;https:\/\/smartdsp.pro\/contact&#8221; url_new_window=&#8221;on&#8221; button_text=&#8221;I have a question&#8221; button_alignment=&#8221;center&#8221; _builder_version=&#8221;4.27.4&#8243; custom_button=&#8221;on&#8221; button_text_size=&#8221;18px&#8221; button_text_color=&#8221;#FFFFFF&#8221; button_bg_use_color_gradient=&#8221;on&#8221; button_bg_color_gradient_direction=&#8221;229deg&#8221; button_bg_color_gradient_stops=&#8221;rgba(189,22,179,0.8) 0%|rgba(253,202,65,0.8) 100%&#8221; button_border_width=&#8221;0px&#8221; button_border_radius=&#8221;15px&#8221; button_font=&#8221;Be Vietnam Pro|600|||||||&#8221; button_use_icon=&#8221;off&#8221; box_shadow_style=&#8221;preset1&#8243; box_shadow_blur=&#8221;35px&#8221; box_shadow_spread=&#8221;-11px&#8221; box_shadow_color=&#8221;rgba(255,255,255,0.28)&#8221; global_colors_info=&#8221;{}&#8221; button_text_size__hover_enabled=&#8221;on|desktop&#8221; button_one_text_size__hover_enabled=&#8221;off&#8221; button_two_text_size__hover_enabled=&#8221;off&#8221; button_text_color__hover_enabled=&#8221;off&#8221; button_one_text_color__hover_enabled=&#8221;off&#8221; button_two_text_color__hover_enabled=&#8221;off&#8221; button_border_width__hover_enabled=&#8221;on|desktop&#8221; button_one_border_width__hover_enabled=&#8221;off&#8221; button_two_border_width__hover_enabled=&#8221;off&#8221; button_border_color__hover_enabled=&#8221;on|hover&#8221; button_one_border_color__hover_enabled=&#8221;off&#8221; button_two_border_color__hover_enabled=&#8221;off&#8221; button_border_radius__hover_enabled=&#8221;on|desktop&#8221; button_one_border_radius__hover_enabled=&#8221;off&#8221; button_two_border_radius__hover_enabled=&#8221;off&#8221; button_letter_spacing__hover_enabled=&#8221;off&#8221; button_one_letter_spacing__hover_enabled=&#8221;off&#8221; button_two_letter_spacing__hover_enabled=&#8221;off&#8221; button_bg_color__hover_enabled=&#8221;on|desktop&#8221; button_one_bg_color__hover_enabled=&#8221;off&#8221; button_two_bg_color__hover_enabled=&#8221;off&#8221; button_bg_color__hover=&#8221;rgba(0,127,31,0.7)&#8221; button_border_width__hover=&#8221;0px&#8221; button_border_radius__hover=&#8221;15px&#8221; box_shadow_color__hover=&#8221;rgba(255,255,255,0.49)&#8221; box_shadow_color__hover_enabled=&#8221;on|hover&#8221; button_border_color__hover=&#8221;rgba(255,255,255,0.02)&#8221; button_icon_color__hover=&#8221;#FFFFFF&#8221; button_icon_color__hover_enabled=&#8221;on|hover&#8221; button_text_size__hover=&#8221;18px&#8221;][\/et_pb_button][\/et_pb_column][et_pb_column type=&#8221;1_4&#8243; _builder_version=&#8221;4.16&#8243; custom_padding=&#8221;|||&#8221; global_colors_info=&#8221;{}&#8221; custom_padding__hover=&#8221;|||&#8221;][\/et_pb_column][\/et_pb_row][\/et_pb_section]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Frequently Asked Drag &amp; Drop (or click to Browse) to import audio file(s) You&#8217;ll instantly see the metadata for each file loaded. Edit if desired (see how below) Save edited metadata (either overwrite file(s) or to a new one) Options: Double click a field to edit it Right click a field to Clear value OR [&hellip;]<\/p>\n","protected":false},"author":392,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_et_pb_use_builder":"on","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"class_list":["post-4584","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/smartdsp.pro\/fr\/wp-json\/wp\/v2\/pages\/4584","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/smartdsp.pro\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/smartdsp.pro\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/smartdsp.pro\/fr\/wp-json\/wp\/v2\/users\/392"}],"replies":[{"embeddable":true,"href":"https:\/\/smartdsp.pro\/fr\/wp-json\/wp\/v2\/comments?post=4584"}],"version-history":[{"count":14,"href":"https:\/\/smartdsp.pro\/fr\/wp-json\/wp\/v2\/pages\/4584\/revisions"}],"predecessor-version":[{"id":4664,"href":"https:\/\/smartdsp.pro\/fr\/wp-json\/wp\/v2\/pages\/4584\/revisions\/4664"}],"wp:attachment":[{"href":"https:\/\/smartdsp.pro\/fr\/wp-json\/wp\/v2\/media?parent=4584"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}