-
Notifications
You must be signed in to change notification settings - Fork 21
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
2e62e4a
commit 67387f9
Showing
6 changed files
with
340 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,6 @@ | ||
# Site Config | ||
SITE_URL=https://splatoon3.ink | ||
|
||
# Nintendo API | ||
NINTENDO_TOKEN= | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
import fs from 'fs/promises'; | ||
import path from 'path'; | ||
import mkdirp from 'mkdirp'; | ||
import prefixedConsole from "../common/prefixedConsole.mjs"; | ||
|
||
export default class ImageProcessor | ||
{ | ||
destinationDirectory = 'dist'; | ||
outputDirectory = 'assets/splatnet'; | ||
|
||
constructor() { | ||
this.console = prefixedConsole('Images'); | ||
this.siteUrl = process.env.SITE_URL; | ||
} | ||
|
||
async process(url) { | ||
// Normalize the path | ||
let destination = this.normalize(url); | ||
|
||
// Download the image if necessary | ||
await this.maybeDownload(url, destination); | ||
|
||
// Return the new public URL | ||
return this.publicUrl(destination); | ||
} | ||
|
||
normalize(url) { | ||
// Parse the URL | ||
let u = new URL(url); | ||
|
||
// Get just the pathname (without the host, query string, etc.) | ||
let result = u.pathname; | ||
|
||
// Remove "/resources/prod" from the beginning if it exists | ||
result = result.replace(/^\/resources\/prod/, ''); | ||
|
||
// Remove the leading slash | ||
result = result.replace(/^\//, ''); | ||
|
||
return result; | ||
} | ||
|
||
localPath(file) { | ||
return `${this.destinationDirectory}/${this.outputDirectory}/${file}`; | ||
} | ||
|
||
publicUrl(file) { | ||
return `${this.siteUrl}/${this.outputDirectory}/${file}`; | ||
} | ||
|
||
async exists(file) { | ||
try { | ||
await fs.access(this.localPath(file)); | ||
|
||
return true; | ||
} catch (e) { | ||
// | ||
} | ||
|
||
return false; | ||
} | ||
|
||
async maybeDownload(url, destination) { | ||
// If the file already exists, we don't need to download it again | ||
if (await this.exists(destination)) { | ||
return | ||
} | ||
|
||
return await this.download(url, destination); | ||
} | ||
|
||
async download(url, destination) { | ||
this.console.info(`Downloading image: ${destination}`); | ||
|
||
try { | ||
let result = await fetch(url); | ||
|
||
await mkdirp(path.dirname(this.localPath(destination))); | ||
await fs.writeFile(this.localPath(destination), result.body); | ||
} catch (e) { | ||
this.console.error(`Image download failed for ${destination}`, e); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.