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

@@ -89,6 +89,7 @@ export const AttachmentBlockSchema = defineBlockSchema({
'affine:paragraph',
'affine:list',
],
children: ['@attachment-viewer'],
},
transformer: transformerConfigs =>
new AttachmentBlockTransformer(transformerConfigs),

View File

@@ -31,6 +31,7 @@ export const CalloutBlockSchema = defineBlockSchema({
'affine:paragraph',
'affine:list',
'affine:edgeless-text',
'affine:transcription',
],
children: ['affine:paragraph'],
},

View File

@@ -15,3 +15,4 @@ export * from './paragraph/index.js';
export * from './root/index.js';
export * from './surface-ref/index.js';
export * from './table';
export * from './transcription';

View File

@@ -44,6 +44,7 @@ export const ParagraphBlockSchema = defineBlockSchema({
'affine:list',
'affine:edgeless-text',
'affine:callout',
'affine:transcription',
],
},
toModel: () => new ParagraphBlockModel(),

View File

@@ -0,0 +1 @@
export * from './transcription-model.js';

View File

@@ -0,0 +1,33 @@
import {
BlockModel,
BlockSchemaExtension,
defineBlockSchema,
} from '@blocksuite/store';
export const TranscriptionBlockFlavour = 'affine:transcription';
export const TranscriptionBlockSchema = defineBlockSchema({
flavour: TranscriptionBlockFlavour,
props: () => ({
transcription: {},
jobId: '',
}),
metadata: {
version: 1,
role: 'attachment-viewer',
parent: ['affine:attachment'],
children: ['affine:callout'],
},
toModel: () => new TranscriptionBlockModel(),
});
export type TranscriptionBlockProps = {
transcription: Record<string, any>;
jobId: string;
};
export class TranscriptionBlockModel extends BlockModel<TranscriptionBlockProps> {}
export const TranscriptionBlockSchemaExtension = BlockSchemaExtension(
TranscriptionBlockSchema
);