feat(editor): audio block (#10947)

AudioMedia entity for loading & controlling a single audio media
AudioMediaManagerService: Global audio state synchronization across tabs
AudioAttachmentService + AudioAttachmentBlock for manipulating AttachmentBlock in affine - e.g., filling transcription (using mock endpoint for now)
Added AudioBlock + AudioPlayer for rendering audio block in affine (new transcription block whose renderer is provided in affine)

fix AF-2292
fix AF-2337
This commit is contained in:
pengx17
2025-03-20 12:46:14 +00:00
parent 8a5393ea50
commit fad49bb070
120 changed files with 5407 additions and 950 deletions

View File

@@ -2,8 +2,9 @@ import type { AttachmentBlockModel } from '@blocksuite/affine/model';
import { Entity, LiveData, ObjectPool } from '@toeverything/infra';
import { catchError, from, map, of, startWith, switchMap } from 'rxjs';
import { downloadBlobToBuffer } from '../../media/utils';
import type { PDFMeta } from '../renderer';
import { downloadBlobToBuffer, PDFRenderer } from '../renderer';
import { PDFRenderer } from '../renderer';
import { PDFPage } from './pdf-page';
export enum PDFStatus {

View File

@@ -1,3 +1,2 @@
export { PDFRenderer } from './renderer';
export type { PDFMeta, RenderedPage, RenderPageOpts } from './types';
export { downloadBlobToBuffer } from './utils';

View File

@@ -1,15 +0,0 @@
import type { AttachmentBlockModel } from '@blocksuite/affine/model';
export async function downloadBlobToBuffer(model: AttachmentBlockModel) {
const sourceId = model.props.sourceId;
if (!sourceId) {
throw new Error('Attachment not found');
}
const blob = await model.doc.blobSync.get(sourceId);
if (!blob) {
throw new Error('Attachment not found');
}
return await blob.arrayBuffer();
}