fileUtils.js
1 import * as electronService from '../services/electronService'; 2 3 const preferredExtensions = ['.gif', '.mp4', '.png', '.jpg', '.jpeg', '.webp']; 4 5 export async function getRepoData(repoName) { 6 try { 7 const metadata = await electronService.readMetadata(repoName); 8 const dreamTalkMedia = await getAllMediaFiles(repoName); 9 const dreamSongCanvas = await readDreamSongCanvas(repoName); 10 const dreamSongMedia = await getDreamSongMedia(repoName); 11 console.log(`DreamTalk media for ${repoName}:`, dreamTalkMedia); 12 return { metadata, dreamTalkMedia, dreamSongCanvas, dreamSongMedia }; 13 } catch (error) { 14 console.error('Error getting repo data:', error); 15 return { metadata: {}, dreamTalkMedia: [], dreamSongCanvas: null, dreamSongMedia: [] }; 16 } 17 } 18 19 async function getDreamSongMedia(repoName) { 20 try { 21 const canvasData = await readDreamSongCanvas(repoName); 22 if (!canvasData || !canvasData.nodes) { 23 return []; 24 } 25 26 const fileNodes = canvasData.nodes.filter(node => node.type === 'file' && node.file); 27 const mediaPromises = fileNodes.map(async node => { 28 const filePath = node.file.startsWith(repoName + '/') ? node.file.slice(repoName.length + 1) : node.file; 29 const mediaPath = await electronService.getDreamSongMediaFilePath(repoName, filePath); 30 if (!mediaPath) { 31 return null; 32 } 33 34 const mediaData = await electronService.readFile(mediaPath); 35 if (!mediaData) { 36 return null; 37 } 38 39 const fileExtension = filePath.split('.').pop().toLowerCase(); 40 const mimeType = getMimeType(fileExtension); 41 42 return { 43 id: node.id, 44 type: mimeType, 45 filePath: node.file, 46 data: mediaData, 47 mimeType: mimeType 48 }; 49 }); 50 51 const mediaContents = await Promise.all(mediaPromises); 52 return mediaContents.filter(media => media !== null); 53 } catch (error) { 54 return []; 55 } 56 } 57 58 function getMimeType(fileExtension) { 59 const mimeTypes = { 60 'mp4': 'video/mp4', 61 'gif': 'image/gif', 62 'png': 'image/png', 63 'jpg': 'image/jpeg', 64 'jpeg': 'image/jpeg', 65 'webp': 'image/webp' 66 }; 67 return mimeTypes[fileExtension] || 'application/octet-stream'; 68 } 69 70 async function getAllMediaFiles(repoName) { 71 try { 72 const files = await electronService.listFiles(repoName); 73 const rootMediaFiles = files.filter(file => 74 !file.includes('/') && preferredExtensions.some(ext => file.toLowerCase().endsWith(ext)) 75 ); 76 77 const mediaPromises = rootMediaFiles.map(async file => { 78 const mediaPath = await electronService.getMediaFilePath(repoName, file); 79 console.log("mediaPath", mediaPath) 80 if (!mediaPath) { 81 console.log(`No media path found for file: ${file}`); 82 return null; 83 } 84 85 const mediaData = await electronService.readFile(mediaPath); 86 if (!mediaData) { 87 console.log(`No media data found for file: ${file}`); 88 return null; 89 } 90 91 const fileExtension = file.split('.').pop().toLowerCase(); 92 const mimeType = getMimeType(fileExtension); 93 94 console.log(`Processed media file: ${file}, type: ${mimeType}`); 95 96 return { 97 type: mimeType, 98 path: mediaPath, 99 data: `data:${mimeType};base64,${mediaData}`, 100 filename: file 101 }; 102 }); 103 104 const mediaFiles = (await Promise.all(mediaPromises)).filter(media => media !== null); 105 106 // Sort media files 107 mediaFiles.sort((a, b) => { 108 const aNameMatch = a.filename.toLowerCase() === repoName.toLowerCase(); 109 const bNameMatch = b.filename.toLowerCase() === repoName.toLowerCase(); 110 if (aNameMatch && !bNameMatch) return -1; 111 if (!aNameMatch && bNameMatch) return 1; 112 return a.filename.localeCompare(b.filename); 113 }); 114 115 console.log(`Total media files found for ${repoName}:`, mediaFiles.length); 116 return mediaFiles; 117 } catch (error) { 118 console.error('Error getting all media files:', error); 119 return []; 120 } 121 } 122 123 export async function readDreamSongCanvas(repoName) { 124 try { 125 const canvasContent = await electronService.readDreamSongCanvas(repoName); 126 if (!canvasContent || canvasContent.trim() === '') { 127 return null; 128 } 129 return JSON.parse(canvasContent); 130 } catch (error) { 131 return null; 132 } 133 } 134 135 export async function listFiles(repoName) { 136 return electronService.listFiles(repoName); 137 } 138 139 export async function listMediaFiles(repoName) { 140 try { 141 const files = await electronService.listFiles(repoName); 142 const mediaExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.mp4', '.mov', '.webm', '.ogg']; 143 return files.filter(file => 144 mediaExtensions.some(ext => file.toLowerCase().endsWith(ext)) 145 ).map(file => `${repoName}/${file}`); 146 } catch (error) { 147 return []; 148 } 149 } 150 151 export async function addFileToNode(nodeName, file) { 152 try { 153 if (!nodeName || !file) { 154 throw new Error('Both nodeName and file are required'); 155 } 156 157 const result = await electronService.addFileToNode(nodeName, file); 158 159 if (result) { 160 const stageResult = await electronService.stageFile(nodeName, file.name); 161 if (stageResult) { 162 const commitMessage = `Added ${file.name}`; 163 const commitResult = await electronService.commitChanges(nodeName, commitMessage); 164 if (commitResult) { 165 return true; 166 } 167 } 168 } 169 return false; 170 } catch (error) { 171 return false; 172 } 173 }