(html: string)
| 170 | } |
| 171 | |
| 172 | export function parseAudioElements(html: string): AudioElement[] { |
| 173 | const elements: AudioElement[] = []; |
| 174 | const { document } = parseHTML(unwrapTemplate(html)); |
| 175 | |
| 176 | // Parse <audio> elements |
| 177 | const audioEls = document.querySelectorAll("audio[id][src]"); |
| 178 | for (const el of audioEls) { |
| 179 | const id = el.getAttribute("id"); |
| 180 | const src = el.getAttribute("src"); |
| 181 | if (!id || !src) continue; |
| 182 | |
| 183 | const startAttr = el.getAttribute("data-start"); |
| 184 | const endAttr = el.getAttribute("data-end"); |
| 185 | const mediaStartAttr = el.getAttribute("data-media-start"); |
| 186 | const layerAttr = el.getAttribute("data-layer"); |
| 187 | const volumeAttr = el.getAttribute("data-volume"); |
| 188 | |
| 189 | elements.push({ |
| 190 | id, |
| 191 | src, |
| 192 | start: startAttr ? parseFloat(startAttr) : 0, |
| 193 | end: endAttr ? parseFloat(endAttr) : 0, |
| 194 | mediaStart: mediaStartAttr ? parseFloat(mediaStartAttr) : 0, |
| 195 | layer: layerAttr ? parseInt(layerAttr) : 0, |
| 196 | volume: volumeAttr ? parseFloat(volumeAttr) : 1.0, |
| 197 | type: "audio", |
| 198 | }); |
| 199 | } |
| 200 | |
| 201 | // Parse <video> elements with data-has-audio="true" |
| 202 | const videoEls = document.querySelectorAll('video[id][src][data-has-audio="true"]'); |
| 203 | for (const el of videoEls) { |
| 204 | const id = el.getAttribute("id"); |
| 205 | const src = el.getAttribute("src"); |
| 206 | if (!id || !src) continue; |
| 207 | |
| 208 | const startAttr = el.getAttribute("data-start"); |
| 209 | const endAttr = el.getAttribute("data-end"); |
| 210 | const mediaStartAttr = el.getAttribute("data-media-start"); |
| 211 | const layerAttr = el.getAttribute("data-layer"); |
| 212 | const volumeAttr = el.getAttribute("data-volume"); |
| 213 | |
| 214 | elements.push({ |
| 215 | id: `${id}-audio`, |
| 216 | src, |
| 217 | start: startAttr ? parseFloat(startAttr) : 0, |
| 218 | end: endAttr ? parseFloat(endAttr) : 0, |
| 219 | mediaStart: mediaStartAttr ? parseFloat(mediaStartAttr) : 0, |
| 220 | layer: layerAttr ? parseInt(layerAttr) : 0, |
| 221 | volume: volumeAttr ? parseFloat(volumeAttr) : 1.0, |
| 222 | type: "video", |
| 223 | }); |
| 224 | } |
| 225 | |
| 226 | return elements; |
| 227 | } |
| 228 | |
| 229 | async function extractAudioFromVideo( |
no test coverage detected