























@@ -379,6 +379,25 @@ function buildSavedMediaResult(params: {
379379};
380380}
381381382+type SavedMediaTempWriteResult = Omit<SavedMedia, "path">;
383+384+async function saveMediaSiblingTempFile(params: {
385+dir: string;
386+tempPrefix: string;
387+writeTemp: (tempPath: string) => Promise<SavedMediaTempWriteResult>;
388+}): Promise<SavedMedia> {
389+const { result } = await retryAfterRecreatingDir(params.dir, () =>
390+writeSiblingTempFile<SavedMediaTempWriteResult>({
391+dir: params.dir,
392+mode: MEDIA_FILE_MODE,
393+tempPrefix: params.tempPrefix,
394+writeTemp: params.writeTemp,
395+resolveFinalPath: (result) => path.join(params.dir, result.id),
396+}),
397+);
398+return buildSavedMediaResult({ dir: params.dir, ...result });
399+}
400+382401async function writeSavedMediaBuffer(params: {
383402subdir: string;
384403id: string;
@@ -501,36 +520,26 @@ export async function saveMediaSource(
501520await cleanOldMedia(DEFAULT_TTL_MS, { recursive: false });
502521const baseId = crypto.randomUUID();
503522if (looksLikeUrl(source)) {
504-const saved = await retryAfterRecreatingDir(dir, () =>
505-writeSiblingTempFile({
506- dir,
507-mode: MEDIA_FILE_MODE,
508-tempPrefix: `.${baseId}`,
509-writeTemp: async (tempPath) => {
510-const { headerMime, sniffBuffer, size } = await downloadToFile(
511-source,
512-tempPath,
513-headers,
514-5,
515-maxBytes,
516-);
517-const mime = await detectMime({
518-buffer: sniffBuffer,
519- headerMime,
520-filePath: source,
521-});
522-const ext = extensionForMime(mime) ?? path.extname(new URL(source).pathname);
523-const id = buildSavedMediaId({ baseId, ext });
524-return { id, size, contentType: mime };
525-},
526-resolveFinalPath: (result) => path.join(dir, result.id),
527-}),
528-);
529-return buildSavedMediaResult({
523+return await saveMediaSiblingTempFile({
530524 dir,
531-id: saved.result.id,
532-size: saved.result.size,
533-contentType: saved.result.contentType,
525+tempPrefix: `.${baseId}`,
526+writeTemp: async (tempPath) => {
527+const { headerMime, sniffBuffer, size } = await downloadToFile(
528+source,
529+tempPath,
530+headers,
531+5,
532+maxBytes,
533+);
534+const mime = await detectMime({
535+buffer: sniffBuffer,
536+ headerMime,
537+filePath: source,
538+});
539+const ext = extensionForMime(mime) ?? path.extname(new URL(source).pathname);
540+const id = buildSavedMediaId({ baseId, ext });
541+return { id, size, contentType: mime };
542+},
534543});
535544}
536545try {
@@ -591,39 +600,29 @@ export async function saveMediaStream(
591600await fs.mkdir(dir, { recursive: true, mode: 0o700 });
592601const baseId = crypto.randomUUID();
593602const headerExt = extensionForAuthoritativeHeaderMime(contentType);
594-const saved = await retryAfterRecreatingDir(dir, () =>
595-writeSiblingTempFile<{ id: string; size: number; contentType?: string }>({
596- dir,
597-mode: MEDIA_FILE_MODE,
598-tempPrefix: `.${baseId}`,
599-writeTemp: async (tempPath) => {
600-const { sniffBuffer, size } = await writeMediaStreamToFile({
601- stream,
602- tempPath,
603- maxBytes,
604-});
605-const mime = await detectMime({
606-buffer: sniffBuffer,
607-headerMime: contentType,
608-filePath: originalFilename ?? detectionFilePathHint,
609-});
610-const ext = resolveSavedMediaExtension({
611-detectedMime: mime,
612- headerExt,
613- contentType,
614- originalFilename,
615-});
616-const id = buildSavedMediaId({ baseId, ext, originalFilename });
617-return { id, size, contentType: mime };
618-},
619-resolveFinalPath: (result) => path.join(dir, result.id),
620-}),
621-);
622-return buildSavedMediaResult({
603+return await saveMediaSiblingTempFile({
623604 dir,
624-id: saved.result.id,
625-size: saved.result.size,
626-contentType: saved.result.contentType,
605+tempPrefix: `.${baseId}`,
606+writeTemp: async (tempPath) => {
607+const { sniffBuffer, size } = await writeMediaStreamToFile({
608+ stream,
609+ tempPath,
610+ maxBytes,
611+});
612+const mime = await detectMime({
613+buffer: sniffBuffer,
614+headerMime: contentType,
615+filePath: originalFilename ?? detectionFilePathHint,
616+});
617+const ext = resolveSavedMediaExtension({
618+detectedMime: mime,
619+ headerExt,
620+ contentType,
621+ originalFilename,
622+});
623+const id = buildSavedMediaId({ baseId, ext, originalFilename });
624+return { id, size, contentType: mime };
625+},
627626});
628627}
629628此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。