Changeset 8f6225c in Klonkt


Ignore:
Timestamp:
06/20/2026 01:57:35 AM (3 months ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
85d5972
Parents:
fa08981
Message:

feat(images): new uploads automatically converted to WebP

Shared ImageWebpService.toWebp() converts uploaded images via cwebp (q82)
and removes the original; cwebp absent/error → original preserved (graceful).
Wired up in all upload routes: post images/cover, avatar, site photo, hub
hero, audio cover. GIF stays GIF, already-webp skipped.

Co-Authored-By: Claude <noreply@…>

Location:
src
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • src/routes/account.js

    rfa08981 r8f6225c  
    2525import { requireAuth } from '../middleware/auth.js';
    2626import { googleConfigured } from '../config/google.js';
     27import { toWebp } from '../services/ImageWebpService.js';
    2728
    2829const __dirname = path.dirname(fileURLToPath(import.meta.url));
     
    190191    }
    191192
    192     const url = `/media/avatars/${req.file.filename}`;
     193    const url = `/media/avatars/${toWebp(req.file)}`;
    193194
    194195    // Remove the old avatar file (if it lives in our avatar dir)
  • src/routes/admin-audio.js

    rfa08981 r8f6225c  
    1818import db from '../config/database.js';
    1919import { renderPage } from '../middleware/render.js';
     20import { toWebp } from '../services/ImageWebpService.js';
    2021import { requireGod } from '../middleware/auth.js';
    2122import { transcodeToMp3 } from '../services/AudioTranscoder.js';
     
    478479    }
    479480
    480     const newUrl = `/media/audio-covers/${file.filename}`;
     481    const newUrl = `/media/audio-covers/${toWebp(file)}`;
    481482    try {
    482483      db.prepare('UPDATE audio_tracks SET cover_url = ? WHERE id = ? AND site_id = ?')
  • src/routes/admin-settings.js

    rfa08981 r8f6225c  
    2525import { entitlementStatus, premiumUnlocked } from '../services/PatreonService.js';
    2626import { googleConfigured, redirectUri, currentClientId, clientSecretSet } from '../config/google.js';
     27import { toWebp } from '../services/ImageWebpService.js';
    2728
    2829const router = express.Router();
     
    120121    // Hero: een geüploade afbeelding wint; anders het URL-tekstveld.
    121122    if (req.file) {
    122       const newUrl = `/media/hero/${req.file.filename}`;
     123      const newUrl = `/media/hero/${toWebp(req.file)}`;
    123124      // Ruim een vorige geüploade hero op (alleen als die uit onze hero-map kwam).
    124125      const old = getSetting('hub_hero_image') || '';
  • src/routes/admin-sites.js

    rfa08981 r8f6225c  
    2525import ThemeService from '../services/ThemeService.js';
    2626import { listPlatforms, PLATFORMS } from '../services/PlatformIcons.js';
     27import { toWebp } from '../services/ImageWebpService.js';
    2728
    2829const __dirname = path.dirname(fileURLToPath(import.meta.url));
     
    8889    res.json({
    8990      ok: true,
    90       url: `/media/avatars/${req.file.filename}`,
     91      url: `/media/avatars/${toWebp(req.file)}`,
    9192      size: req.file.size,
    9293      mime: req.file.mimetype,
  • src/routes/posts.js

    rfa08981 r8f6225c  
    1616import PlaylistService from '../services/PlaylistService.js';
    1717import { audioUrl } from '../services/AudioStreamService.js';
     18import { toWebp } from '../services/ImageWebpService.js';
    1819
    1920const __dirname = path.dirname(fileURLToPath(import.meta.url));
     
    5556    if (err) return res.status(400).json({ error: err.message });
    5657    if (!req.file) return res.status(400).json({ error: 'No file' });
    57     const url = '/media/post-images/' + req.file.filename;
     58    const url = '/media/post-images/' + toWebp(req.file);
    5859    res.json({ url, size: req.file.size, mime: req.file.mimetype });
    5960  });
Note: See TracChangeset for help on using the changeset viewer.