(card, result)
| 912 | } |
| 913 | } |
| 914 | async function loadPreviewImage(card, result) { |
| 915 | const episodeMatch = result.filename?.match(/\[P(\d+)\]/); |
| 916 | const timeMatch = result.timestamp?.match(/^(\d+)m(\d+)s$/); |
| 917 | |
| 918 | if (!episodeMatch || !timeMatch) return; |
| 919 | |
| 920 | const episodeNum = parseInt(episodeMatch[1], 10); |
| 921 | const minutes = parseInt(timeMatch[1]); |
| 922 | const seconds = parseInt(timeMatch[2]); |
| 923 | const totalSeconds = minutes * 60 + seconds; |
| 924 | |
| 925 | const imgContainer = document.createElement("div"); |
| 926 | imgContainer.className = "preview-frame-container"; |
| 927 | |
| 928 | const placeholder = document.createElement("div"); |
| 929 | placeholder.className = "preview-frame-placeholder"; |
| 930 | imgContainer.appendChild(placeholder); |
| 931 | card.insertBefore(imgContainer, card.firstChild); |
| 932 | |
| 933 | try { |
| 934 | const imageBlob = await extractFrame( |
| 935 | episodeNum, |
| 936 | totalSeconds, |
| 937 | CONFIG.imageBaseUrl, |
| 938 | ); |
| 939 | const imageUrl = URL.createObjectURL(imageBlob); |
| 940 | const img = new Image(); |
| 941 | img.src = imageUrl; |
| 942 | img.className = "preview-frame"; |
| 943 | img.decoding = "async"; |
| 944 | |
| 945 | img.onerror = () => { |
| 946 | console.error("Failed to load preview image"); |
| 947 | imgContainer.remove(); |
| 948 | URL.revokeObjectURL(imageUrl); |
| 949 | }; |
| 950 | |
| 951 | img.onload = () => { |
| 952 | const originalCanvas = document.createElement("canvas"); |
| 953 | originalCanvas.width = img.width; |
| 954 | originalCanvas.height = img.height; |
| 955 | |
| 956 | try { |
| 957 | const originalCtx = originalCanvas.getContext("2d"); |
| 958 | if (!originalCtx) { |
| 959 | throw new Error("Failed to get canvas context"); |
| 960 | } |
| 961 | |
| 962 | originalCtx.drawImage(img, 0, 0); |
| 963 | |
| 964 | const displayCanvas = document.createElement("canvas"); |
| 965 | displayCanvas.width = img.width; |
| 966 | displayCanvas.height = img.height; |
| 967 | displayCanvas.className = "preview-frame"; |
| 968 | displayCanvas.originalCanvas = originalCanvas; |
| 969 | |
| 970 | const renderCanvas = () => { |
| 971 | const ctx = displayCanvas.getContext("2d"); |
no test coverage detected