Import Instagram archive to a Bluesky account
9
fork

Configure Feed

Select the types of activity you want to include in your feed.

Implement MediaProcessorFactory for flexible media processing strategy

- Add MediaProcessorFactory interface to abstract media processor creation
- Create DefaultMediaProcessorFactory to handle image and video media processing
- Update InstagramMediaProcessor to use factory for dynamic media processor selection
- Simplify media processing logic by delegating processor creation to factory
- Improve extensibility of media processing strategy

+34 -37
+34 -37
src/media/media.ts
··· 62 62 extends ProcessStrategy<MediaProcessResult>, 63 63 MIMEType {} 64 64 65 - export class InstagramMediaProcessor 66 - implements InstagramPostProcessingStrategy 67 - { 65 + export class InstagramMediaProcessor implements InstagramPostProcessingStrategy { 66 + readonly mediaProcessorFactory: MediaProcessorFactory; 67 + 68 68 constructor( 69 69 public instagramPosts: InstagramExportedPost[], 70 - public archiveFolder: string 71 - ) {} 70 + public archiveFolder: string, 71 + mediaProcessorFactory?: MediaProcessorFactory 72 + ) { 73 + this.mediaProcessorFactory = mediaProcessorFactory || new DefaultMediaProcessorFactory(); 74 + } 72 75 73 76 /** 74 77 * Processes Instagram posts and their associated media into a format ··· 81 84 * @returns {Promise<ProcessedPost[]>} A promise that resolves to an array of ProcessedPost objects. 82 85 */ 83 86 public process(): Promise<ProcessedPost[]> { 84 - // Array to hold promises for each processed post 85 87 const processingPosts: Promise<ProcessedPost>[] = []; 86 88 87 - // Iterate over each Instagram post 88 89 for (const post of this.instagramPosts) { 89 - // Create a new date object from the post's creation timestamp 90 90 const postDate = new Date(post.creation_timestamp * 1000); 91 - 92 - // Initialize a new ProcessedPostImpl object with the post date and title 93 91 const processingPost = new ProcessedPostImpl(postDate, post.title); 94 92 95 - // Declare a promise to hold the processing result for the media 96 - let processingMedia: Promise<ProcessedPost>; 97 - 98 - // Check if the post contains multiple media items (images) 99 - if (Array.isArray(post.media)) { 100 - // Create an image processor for the array of images 101 - const imageProcessor = new InstagramImageProcessor(post.media, this.archiveFolder); 102 - 103 - // Process the images and update the processingPost with the results 104 - const processingImages: Promise<MediaProcessResult[]> = imageProcessor.process(); 105 - processingMedia = processingImages.then((processedImages) => { 106 - processingPost.embeddedMedia = processedImages; // Set the embedded media 107 - return processingPost; // Return the processed post 108 - }); 109 - } else { 110 - // If the post contains a single video 111 - const videoProcessor = new InstagramVideoProcessor(post.media as VideoMedia, this.archiveFolder); 112 - 113 - // Process the video and update the processingPost with the result 114 - const processingVideo: Promise<MediaProcessResult> = videoProcessor.process(); 115 - processingMedia = processingVideo.then((processedVideo) => { 116 - processingPost.embeddedMedia = processedVideo; // Set the embedded media 117 - return processingPost; // Return the processed post 118 - }); 119 - } 93 + // Get appropriate strategy from factory 94 + const mediaProcessor = this.mediaProcessorFactory.createProcessor( 95 + post.media, 96 + this.archiveFolder 97 + ); 98 + 99 + // Process using the strategy 100 + const processingMedia = mediaProcessor.process().then(processedMedia => { 101 + processingPost.embeddedMedia = processedMedia; 102 + return processingPost; 103 + }); 120 104 121 - // Add the processing promise to the array 122 105 processingPosts.push(processingMedia); 123 106 } 124 107 125 - // Wait for all processing promises to resolve and return the final array of processed posts 126 108 return Promise.all(processingPosts); 127 109 } 128 110 } ··· 299 281 300 282 return mediaBuffer; 301 283 } 284 + 285 + // New factory interface 286 + interface MediaProcessorFactory { 287 + createProcessor(media: Media | Media[], archiveFolder: string): ProcessStrategy<MediaProcessResult | MediaProcessResult[]>; 288 + } 289 + 290 + // Default factory implementation 291 + class DefaultMediaProcessorFactory implements MediaProcessorFactory { 292 + createProcessor(media: Media | Media[], archiveFolder: string): ProcessStrategy<MediaProcessResult | MediaProcessResult[]> { 293 + if (Array.isArray(media)) { 294 + return new InstagramImageProcessor(media, archiveFolder); 295 + } 296 + return new InstagramVideoProcessor(media as VideoMedia, archiveFolder); 297 + } 298 + }