@hed-hog/lms 0.0.351 → 0.0.354

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/dist/course/course-audio-transcription.service.d.ts +29 -0
  2. package/dist/course/course-audio-transcription.service.d.ts.map +1 -0
  3. package/dist/course/course-audio-transcription.service.js +291 -0
  4. package/dist/course/course-audio-transcription.service.js.map +1 -0
  5. package/dist/course/course-lesson.controller.d.ts +10 -0
  6. package/dist/course/course-lesson.controller.d.ts.map +1 -0
  7. package/dist/course/course-lesson.controller.js +62 -0
  8. package/dist/course/course-lesson.controller.js.map +1 -0
  9. package/dist/course/course-structure.controller.d.ts +41 -15
  10. package/dist/course/course-structure.controller.d.ts.map +1 -1
  11. package/dist/course/course-structure.controller.js +50 -6
  12. package/dist/course/course-structure.controller.js.map +1 -1
  13. package/dist/course/course-structure.service.d.ts +50 -15
  14. package/dist/course/course-structure.service.d.ts.map +1 -1
  15. package/dist/course/course-structure.service.js +238 -73
  16. package/dist/course/course-structure.service.js.map +1 -1
  17. package/dist/course/course-video-conversion.service.d.ts +20 -2
  18. package/dist/course/course-video-conversion.service.d.ts.map +1 -1
  19. package/dist/course/course-video-conversion.service.js +730 -10
  20. package/dist/course/course-video-conversion.service.js.map +1 -1
  21. package/dist/course/course.controller.d.ts +24 -8
  22. package/dist/course/course.controller.d.ts.map +1 -1
  23. package/dist/course/course.module.d.ts.map +1 -1
  24. package/dist/course/course.module.js +5 -3
  25. package/dist/course/course.module.js.map +1 -1
  26. package/dist/course/course.service.d.ts +24 -8
  27. package/dist/course/course.service.d.ts.map +1 -1
  28. package/dist/course/course.service.js +112 -176
  29. package/dist/course/course.service.js.map +1 -1
  30. package/dist/course/dto/create-course-lesson-frame.dto.d.ts +5 -0
  31. package/dist/course/dto/create-course-lesson-frame.dto.d.ts.map +1 -0
  32. package/dist/course/dto/create-course-lesson-frame.dto.js +30 -0
  33. package/dist/course/dto/create-course-lesson-frame.dto.js.map +1 -0
  34. package/dist/course/dto/create-course-structure-lesson.dto.d.ts +4 -2
  35. package/dist/course/dto/create-course-structure-lesson.dto.d.ts.map +1 -1
  36. package/dist/course/dto/create-course-structure-lesson.dto.js +10 -3
  37. package/dist/course/dto/create-course-structure-lesson.dto.js.map +1 -1
  38. package/dist/course/dto/create-course.dto.d.ts +1 -1
  39. package/dist/course/dto/create-course.dto.d.ts.map +1 -1
  40. package/dist/course/dto/create-course.dto.js +6 -6
  41. package/dist/course/dto/create-course.dto.js.map +1 -1
  42. package/dist/course/dto/update-course-lesson-frame.dto.d.ts +5 -0
  43. package/dist/course/dto/update-course-lesson-frame.dto.d.ts.map +1 -0
  44. package/dist/course/dto/update-course-lesson-frame.dto.js +32 -0
  45. package/dist/course/dto/update-course-lesson-frame.dto.js.map +1 -0
  46. package/dist/course/dto/update-course-resources.dto.d.ts +4 -2
  47. package/dist/course/dto/update-course-resources.dto.d.ts.map +1 -1
  48. package/dist/course/dto/update-course-resources.dto.js +10 -3
  49. package/dist/course/dto/update-course-resources.dto.js.map +1 -1
  50. package/dist/course/dto/update-transcription-segments.dto.d.ts +10 -0
  51. package/dist/course/dto/update-transcription-segments.dto.d.ts.map +1 -0
  52. package/dist/course/dto/update-transcription-segments.dto.js +38 -0
  53. package/dist/course/dto/update-transcription-segments.dto.js.map +1 -0
  54. package/dist/course/lms-setting.controller.d.ts +13 -0
  55. package/dist/course/lms-setting.controller.d.ts.map +1 -0
  56. package/dist/course/lms-setting.controller.js +53 -0
  57. package/dist/course/lms-setting.controller.js.map +1 -0
  58. package/dist/enterprise/training/training-admin.service.d.ts.map +1 -1
  59. package/dist/enterprise/training/training-admin.service.js +74 -33
  60. package/dist/enterprise/training/training-admin.service.js.map +1 -1
  61. package/dist/index.d.ts +2 -0
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +2 -0
  64. package/dist/index.js.map +1 -1
  65. package/dist/lms.module.d.ts.map +1 -1
  66. package/dist/lms.module.js +6 -0
  67. package/dist/lms.module.js.map +1 -1
  68. package/hedhog/data/route.yaml +63 -0
  69. package/hedhog/data/setting_group.yaml +76 -0
  70. package/hedhog/frontend/app/courses/[id]/_components/CourseCertificateCard.tsx.ejs +3 -0
  71. package/hedhog/frontend/app/courses/[id]/_components/CourseClassificationCard.tsx.ejs +10 -1
  72. package/hedhog/frontend/app/courses/[id]/_components/CourseContentCard.tsx.ejs +7 -2
  73. package/hedhog/frontend/app/courses/[id]/_components/CourseDangerZoneCard.tsx.ejs +5 -2
  74. package/hedhog/frontend/app/courses/[id]/_components/CourseFlagsCard.tsx.ejs +7 -1
  75. package/hedhog/frontend/app/courses/[id]/_components/CourseMediaCard.tsx.ejs +3 -0
  76. package/hedhog/frontend/app/courses/[id]/_components/CourseMultiEntityPicker.tsx.ejs +95 -50
  77. package/hedhog/frontend/app/courses/[id]/_components/CourseRelationsCard.tsx.ejs +11 -36
  78. package/hedhog/frontend/app/courses/[id]/_components/CourseSectionCard.tsx.ejs +19 -5
  79. package/hedhog/frontend/app/courses/[id]/_components/course-edit-types.ts.ejs +1 -1
  80. package/hedhog/frontend/app/courses/[id]/page.tsx.ejs +30 -10
  81. package/hedhog/frontend/app/courses/[id]/structure/_components/CourseInstructorsSummaryCard.tsx.ejs +95 -0
  82. package/hedhog/frontend/app/courses/[id]/structure/_components/course-tree-dnd.tsx.ejs +29 -11
  83. package/hedhog/frontend/app/courses/[id]/structure/_components/course-tree-panel.tsx.ejs +42 -31
  84. package/hedhog/frontend/app/courses/[id]/structure/_components/course-tree.tsx.ejs +10 -1
  85. package/hedhog/frontend/app/courses/[id]/structure/_components/detail-lesson.tsx.ejs +51 -9
  86. package/hedhog/frontend/app/courses/[id]/structure/_components/drag-handle.tsx.ejs +25 -22
  87. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-bulk.tsx.ejs +12 -9
  88. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-course.tsx.ejs +315 -229
  89. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-lesson.tsx.ejs +3220 -534
  90. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-session.tsx.ejs +20 -15
  91. package/hedhog/frontend/app/courses/[id]/structure/_components/icon-action-tooltip.tsx.ejs +35 -0
  92. package/hedhog/frontend/app/courses/[id]/structure/_components/multi-select-bar.tsx.ejs +76 -67
  93. package/hedhog/frontend/app/courses/[id]/structure/_components/search-filter.tsx.ejs +13 -10
  94. package/hedhog/frontend/app/courses/[id]/structure/_components/shortcuts-help.tsx.ejs +18 -16
  95. package/hedhog/frontend/app/courses/[id]/structure/_components/sortable-tree-row.tsx.ejs +6 -0
  96. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-context-menu.tsx.ejs +1 -1
  97. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-display-settings-popover.tsx.ejs +23 -11
  98. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-helpers.ts.ejs +48 -9
  99. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-row-course.tsx.ejs +11 -2
  100. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-row-lesson.tsx.ejs +121 -15
  101. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-row-session.tsx.ejs +69 -14
  102. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-row.tsx.ejs +11 -0
  103. package/hedhog/frontend/app/courses/[id]/structure/_components/types.ts.ejs +31 -0
  104. package/hedhog/frontend/app/courses/[id]/structure/_data/adapters/course-structure.adapter.ts.ejs +32 -6
  105. package/hedhog/frontend/app/courses/[id]/structure/_data/services/course-structure.service.ts.ejs +57 -3
  106. package/hedhog/frontend/app/courses/[id]/structure/_data/types/api-course.types.ts.ejs +46 -6
  107. package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-structure-mutations.ts.ejs +14 -0
  108. package/hedhog/frontend/app/courses/[id]/structure/_data/use-lesson-audio-files.ts.ejs +23 -0
  109. package/hedhog/frontend/app/courses/[id]/structure/_data/use-lms-settings-query.ts.ejs +34 -0
  110. package/hedhog/frontend/app/courses/[id]/structure/_data/use-transcription-segments.ts.ejs +76 -0
  111. package/hedhog/frontend/messages/en.json +39 -3
  112. package/hedhog/frontend/messages/pt.json +39 -3
  113. package/hedhog/table/course.yaml +8 -0
  114. package/hedhog/table/course_lesson_file.yaml +12 -4
  115. package/hedhog/table/course_lesson_transcription_segment.yaml +22 -0
  116. package/hedhog/table/course_lesson_video_frame.yaml +25 -0
  117. package/package.json +9 -9
  118. package/src/course/course-audio-transcription.service.ts +393 -0
  119. package/src/course/course-lesson.controller.ts +28 -0
  120. package/src/course/course-structure.controller.ts +49 -3
  121. package/src/course/course-structure.service.ts +294 -32
  122. package/src/course/course-video-conversion.service.ts +972 -6
  123. package/src/course/course.module.ts +5 -3
  124. package/src/course/course.service.ts +87 -139
  125. package/src/course/dto/create-course-lesson-frame.dto.ts +14 -0
  126. package/src/course/dto/create-course-structure-lesson.dto.ts +19 -3
  127. package/src/course/dto/create-course.dto.ts +5 -5
  128. package/src/course/dto/update-course-lesson-frame.dto.ts +16 -0
  129. package/src/course/dto/update-course-resources.dto.ts +18 -3
  130. package/src/course/dto/update-transcription-segments.dto.ts +20 -0
  131. package/src/course/lms-setting.controller.ts +30 -0
  132. package/src/enterprise/training/training-admin.service.ts +77 -24
  133. package/src/index.ts +2 -0
  134. package/src/lms.module.ts +6 -0
  135. package/hedhog/table/course_instructor.yaml +0 -27
@@ -0,0 +1,29 @@
1
+ import { PrismaService } from '@hed-hog/api-prisma';
2
+ import { FileService, NotificationService, SettingService } from '@hed-hog/core';
3
+ import { IJobHandler, QueueHandlerRegistry } from '@hed-hog/queue';
4
+ import { OnModuleInit } from '@nestjs/common';
5
+ export declare class CourseAudioTranscriptionService implements OnModuleInit, IJobHandler {
6
+ private readonly prismaService;
7
+ private readonly settingService;
8
+ private readonly fileService;
9
+ private readonly notificationService;
10
+ private readonly registry;
11
+ private readonly logger;
12
+ private createProgressEvent;
13
+ private resolveNotificationProgress;
14
+ private updateAsyncNotification;
15
+ constructor(prismaService: PrismaService, settingService: SettingService, fileService: FileService, notificationService: NotificationService, registry: QueueHandlerRegistry);
16
+ onModuleInit(): void;
17
+ handle(job: {
18
+ id: number;
19
+ type: string;
20
+ queue_name: string;
21
+ payload: Record<string, any>;
22
+ attempts: number;
23
+ max_attempts: number;
24
+ source_module?: string | null;
25
+ source_entity?: string | null;
26
+ source_entity_id?: string | null;
27
+ }): Promise<void>;
28
+ }
29
+ //# sourceMappingURL=course-audio-transcription.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"course-audio-transcription.service.d.ts","sourceRoot":"","sources":["../../src/course/course-audio-transcription.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAIH,YAAY,EAEf,MAAM,gBAAgB,CAAC;AAexB,qBACa,+BAAgC,YAAW,YAAY,EAAE,WAAW;IAsE7E,OAAO,CAAC,QAAQ,CAAC,aAAa;IAE9B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IAEpC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IA7E3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoD;YAE7D,mBAAmB;IAqBjC,OAAO,CAAC,2BAA2B;YAqBrB,uBAAuB;gBAyBlB,aAAa,EAAE,aAAa,EAE5B,cAAc,EAAE,cAAc,EAE9B,WAAW,EAAE,WAAW,EAExB,mBAAmB,EAAE,mBAAmB,EAExC,QAAQ,EAAE,oBAAoB;IAGjD,YAAY;IAKN,MAAM,CAAC,GAAG,EAAE;QAChB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC7B,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAClC,GAAG,OAAO,CAAC,IAAI,CAAC;CA+QlB"}
@@ -0,0 +1,291 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __importDefault = (this && this.__importDefault) || function (mod) {
15
+ return (mod && mod.__esModule) ? mod : { "default": mod };
16
+ };
17
+ var CourseAudioTranscriptionService_1;
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.CourseAudioTranscriptionService = void 0;
20
+ const api_prisma_1 = require("@hed-hog/api-prisma");
21
+ const core_1 = require("@hed-hog/core");
22
+ const queue_1 = require("@hed-hog/queue");
23
+ const common_1 = require("@nestjs/common");
24
+ const axios_1 = __importDefault(require("axios"));
25
+ const child_process_1 = require("child_process");
26
+ const fs_1 = require("fs");
27
+ const os_1 = require("os");
28
+ const path_1 = require("path");
29
+ const util_1 = require("util");
30
+ const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
31
+ let CourseAudioTranscriptionService = CourseAudioTranscriptionService_1 = class CourseAudioTranscriptionService {
32
+ async createProgressEvent(queueJobId, message, metadata) {
33
+ try {
34
+ await this.prismaService.queue_job_event.create({
35
+ data: Object.assign({ queue_job_id: queueJobId, event_type: 'started', message }, (metadata ? { metadata } : {})),
36
+ });
37
+ }
38
+ catch (error) {
39
+ this.logger.warn(`Queue job ${queueJobId}: failed to persist transcription progress event "${message}": ${error instanceof Error ? error.message : 'unknown error'}`);
40
+ }
41
+ }
42
+ resolveNotificationProgress(metadata) {
43
+ var _a, _b, _c;
44
+ const phase = String((_a = metadata === null || metadata === void 0 ? void 0 : metadata.phase) !== null && _a !== void 0 ? _a : '');
45
+ if (phase === 'transcription_download_audio')
46
+ return 92;
47
+ if (phase === 'transcription_split_audio')
48
+ return 94;
49
+ if (phase === 'transcription_split_done')
50
+ return 96;
51
+ if (phase === 'transcription_ai_chunk') {
52
+ const chunkIndex = Number((_b = metadata === null || metadata === void 0 ? void 0 : metadata.chunkIndex) !== null && _b !== void 0 ? _b : 0);
53
+ const chunkCount = Number((_c = metadata === null || metadata === void 0 ? void 0 : metadata.chunkCount) !== null && _c !== void 0 ? _c : 0);
54
+ if (chunkIndex > 0 && chunkCount > 0) {
55
+ const ratio = Math.min(1, Math.max(0, chunkIndex / chunkCount));
56
+ return 96 + Math.round(ratio * 3);
57
+ }
58
+ return 98;
59
+ }
60
+ if (phase === 'transcription_save')
61
+ return 99;
62
+ if (phase === 'transcription_done')
63
+ return 100;
64
+ return 95;
65
+ }
66
+ async updateAsyncNotification(context, progress, body, success) {
67
+ try {
68
+ await this.notificationService.updateProgress(context.userId, context.notificationId, Object.assign({ progress,
69
+ body }, (success != null ? { success } : {})));
70
+ }
71
+ catch (error) {
72
+ this.logger.warn(`Failed to update async notification ${context.notificationId} for user ${context.userId}: ${error instanceof Error ? error.message : 'unknown error'}`);
73
+ }
74
+ }
75
+ constructor(prismaService, settingService, fileService, notificationService, registry) {
76
+ this.prismaService = prismaService;
77
+ this.settingService = settingService;
78
+ this.fileService = fileService;
79
+ this.notificationService = notificationService;
80
+ this.registry = registry;
81
+ this.logger = new common_1.Logger(CourseAudioTranscriptionService_1.name);
82
+ }
83
+ onModuleInit() {
84
+ this.registry.register('lms.audio.transcribe', this);
85
+ this.logger.log('Registered handler for "lms.audio.transcribe"');
86
+ }
87
+ async handle(job) {
88
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
89
+ const { courseId, lessonId, audioFileId, parentJobId, notificationId, notificationUserId } = job.payload;
90
+ const notificationContext = Number.isInteger(Number(notificationId)) &&
91
+ Number.isInteger(Number(notificationUserId))
92
+ ? {
93
+ notificationId: Number(notificationId),
94
+ userId: Number(notificationUserId),
95
+ }
96
+ : undefined;
97
+ const emitProgress = async (message, metadata) => {
98
+ await this.createProgressEvent(job.id, message, metadata);
99
+ if (parentJobId) {
100
+ await this.createProgressEvent(parentJobId, message, metadata);
101
+ }
102
+ if (notificationContext) {
103
+ await this.updateAsyncNotification(notificationContext, this.resolveNotificationProgress(metadata), message);
104
+ }
105
+ };
106
+ const settings = await this.settingService.getSettingValues([
107
+ 'ai-openai-api-key',
108
+ 'ai-openai-api-key-enabled',
109
+ 'lms-audio-transcription-enabled',
110
+ ]);
111
+ const apiKey = settings['ai-openai-api-key'];
112
+ const enabled = settings['ai-openai-api-key-enabled'];
113
+ const transcriptionEnabled = settings['lms-audio-transcription-enabled'] !== false;
114
+ if (!transcriptionEnabled) {
115
+ this.logger.warn(`Transcription skipped for lesson ${lessonId}: disabled by lms-audio-transcription-enabled setting`);
116
+ if (notificationContext) {
117
+ await this.updateAsyncNotification(notificationContext, 100, 'Transcrição desabilitada nas configurações do LMS.', false);
118
+ }
119
+ return;
120
+ }
121
+ if (!enabled || !apiKey) {
122
+ this.logger.warn(`Transcription skipped for lesson ${lessonId}: OpenAI key not configured`);
123
+ if (notificationContext) {
124
+ await this.updateAsyncNotification(notificationContext, 100, 'Transcrição não iniciada: chave da IA não configurada.', false);
125
+ }
126
+ return;
127
+ }
128
+ const course = await this.prismaService.course.findUnique({
129
+ where: { id: courseId },
130
+ include: { locale: true },
131
+ });
132
+ const language = (_b = (_a = course === null || course === void 0 ? void 0 : course.locale) === null || _a === void 0 ? void 0 : _a.code) !== null && _b !== void 0 ? _b : 'pt';
133
+ const tempDir = (0, path_1.join)((0, os_1.tmpdir)(), `lms-transcribe-${lessonId}-${Date.now()}`);
134
+ await fs_1.promises.mkdir(tempDir, { recursive: true });
135
+ try {
136
+ const sourceAudioPath = (0, path_1.join)(tempDir, `audio_${lessonId}.source`);
137
+ const normalizedAudioPath = (0, path_1.join)(tempDir, `audio_${lessonId}.normalized.mp3`);
138
+ await emitProgress('Baixando áudio para transcrição...', {
139
+ phase: 'transcription_download_audio',
140
+ lessonId,
141
+ audioFileId,
142
+ });
143
+ await this.fileService.downloadToPath(audioFileId, sourceAudioPath);
144
+ await emitProgress('Normalizando áudio para transcrição...', {
145
+ phase: 'transcription_split_audio',
146
+ lessonId,
147
+ });
148
+ await execFileAsync('ffmpeg', [
149
+ '-y',
150
+ '-i',
151
+ sourceAudioPath,
152
+ '-ar',
153
+ '16000',
154
+ '-ac',
155
+ '1',
156
+ '-c:a',
157
+ 'libmp3lame',
158
+ '-b:a',
159
+ '32k',
160
+ normalizedAudioPath,
161
+ ], {
162
+ maxBuffer: 1024 * 1024 * 20,
163
+ windowsHide: true,
164
+ });
165
+ const chunkPattern = (0, path_1.join)(tempDir, 'chunk_%04d.mp3');
166
+ await emitProgress('Dividindo áudio em partes para transcrição...', {
167
+ phase: 'transcription_split_audio',
168
+ lessonId,
169
+ });
170
+ await execFileAsync('ffmpeg', [
171
+ '-y',
172
+ '-i',
173
+ normalizedAudioPath,
174
+ '-f',
175
+ 'segment',
176
+ '-segment_time',
177
+ '60',
178
+ '-ar',
179
+ '16000',
180
+ '-ac',
181
+ '1',
182
+ '-c:a',
183
+ 'libmp3lame',
184
+ '-b:a',
185
+ '32k',
186
+ chunkPattern,
187
+ ], {
188
+ maxBuffer: 1024 * 1024 * 20,
189
+ windowsHide: true,
190
+ });
191
+ const allFiles = await fs_1.promises.readdir(tempDir);
192
+ const chunks = allFiles
193
+ .filter((name) => name.startsWith('chunk_') && name.endsWith('.mp3'))
194
+ .sort((a, b) => a.localeCompare(b));
195
+ await emitProgress(`Áudio dividido em ${chunks.length} parte(s).`, {
196
+ phase: 'transcription_split_done',
197
+ lessonId,
198
+ chunks: chunks.length,
199
+ });
200
+ const allSegments = [];
201
+ for (let i = 0; i < chunks.length; i += 1) {
202
+ const chunkName = chunks[i];
203
+ if (!chunkName)
204
+ continue;
205
+ await emitProgress(`Transcrevendo com IA a parte ${i + 1} de ${chunks.length}...`, {
206
+ phase: 'transcription_ai_chunk',
207
+ lessonId,
208
+ chunkIndex: i + 1,
209
+ chunkCount: chunks.length,
210
+ });
211
+ const chunkPath = (0, path_1.join)(tempDir, chunkName);
212
+ const offsetSeconds = i * 60;
213
+ const chunkBuffer = await fs_1.promises.readFile(chunkPath);
214
+ const formData = new FormData();
215
+ formData.append('file', new Blob([chunkBuffer], { type: 'audio/mpeg' }), chunkName);
216
+ formData.append('model', 'whisper-1');
217
+ formData.append('response_format', 'verbose_json');
218
+ formData.append('language', language);
219
+ const headers = {
220
+ Authorization: `Bearer ${apiKey}`,
221
+ };
222
+ const maybeHeaders = (_d = (_c = formData).getHeaders) === null || _d === void 0 ? void 0 : _d.call(_c);
223
+ if (maybeHeaders && typeof maybeHeaders === 'object') {
224
+ Object.assign(headers, maybeHeaders);
225
+ }
226
+ const response = await axios_1.default.post('https://api.openai.com/v1/audio/transcriptions', formData, { headers });
227
+ const segments = (_f = (_e = response.data) === null || _e === void 0 ? void 0 : _e.segments) !== null && _f !== void 0 ? _f : [];
228
+ for (const segment of segments) {
229
+ const text = String((_g = segment === null || segment === void 0 ? void 0 : segment.text) !== null && _g !== void 0 ? _g : '').trim();
230
+ if (!text)
231
+ continue;
232
+ allSegments.push({
233
+ course_lesson_id: lessonId,
234
+ start_seconds: offsetSeconds + Number((_h = segment === null || segment === void 0 ? void 0 : segment.start) !== null && _h !== void 0 ? _h : 0),
235
+ end_seconds: offsetSeconds + Number((_j = segment === null || segment === void 0 ? void 0 : segment.end) !== null && _j !== void 0 ? _j : 0),
236
+ text,
237
+ });
238
+ }
239
+ }
240
+ await emitProgress('Salvando transcrição gerada pela IA...', {
241
+ phase: 'transcription_save',
242
+ lessonId,
243
+ segments: allSegments.length,
244
+ });
245
+ await this.prismaService.$transaction([
246
+ this.prismaService.course_lesson_transcription_segment.deleteMany({
247
+ where: { course_lesson_id: lessonId },
248
+ }),
249
+ this.prismaService.course_lesson_transcription_segment.createMany({
250
+ data: allSegments,
251
+ }),
252
+ ]);
253
+ this.logger.log(`Transcription saved for lesson ${lessonId}: ${allSegments.length} segments`);
254
+ await emitProgress(`Transcrição concluída com ${allSegments.length} segmento(s).`, {
255
+ phase: 'transcription_done',
256
+ lessonId,
257
+ segments: allSegments.length,
258
+ });
259
+ if (notificationContext) {
260
+ await this.updateAsyncNotification(notificationContext, 100, `Transcrição concluída com ${allSegments.length} segmento(s).`, true);
261
+ }
262
+ }
263
+ catch (error) {
264
+ if (notificationContext) {
265
+ const message = error instanceof Error && error.message
266
+ ? error.message
267
+ : 'Falha ao transcrever o áudio.';
268
+ await this.updateAsyncNotification(notificationContext, 100, `Falha na transcrição: ${message}`, false);
269
+ }
270
+ throw error;
271
+ }
272
+ finally {
273
+ await fs_1.promises.rm(tempDir, { recursive: true, force: true });
274
+ }
275
+ }
276
+ };
277
+ exports.CourseAudioTranscriptionService = CourseAudioTranscriptionService;
278
+ exports.CourseAudioTranscriptionService = CourseAudioTranscriptionService = CourseAudioTranscriptionService_1 = __decorate([
279
+ (0, common_1.Injectable)(),
280
+ __param(0, (0, common_1.Inject)((0, common_1.forwardRef)(() => api_prisma_1.PrismaService))),
281
+ __param(1, (0, common_1.Inject)((0, common_1.forwardRef)(() => core_1.SettingService))),
282
+ __param(2, (0, common_1.Inject)((0, common_1.forwardRef)(() => core_1.FileService))),
283
+ __param(3, (0, common_1.Inject)((0, common_1.forwardRef)(() => core_1.NotificationService))),
284
+ __param(4, (0, common_1.Inject)((0, common_1.forwardRef)(() => queue_1.QueueHandlerRegistry))),
285
+ __metadata("design:paramtypes", [api_prisma_1.PrismaService,
286
+ core_1.SettingService,
287
+ core_1.FileService,
288
+ core_1.NotificationService,
289
+ queue_1.QueueHandlerRegistry])
290
+ ], CourseAudioTranscriptionService);
291
+ //# sourceMappingURL=course-audio-transcription.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"course-audio-transcription.service.js","sourceRoot":"","sources":["../../src/course/course-audio-transcription.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,oDAAoD;AACpD,wCAAiF;AACjF,0CAAmE;AACnE,2CAMwB;AACxB,kDAA0B;AAC1B,iDAAyC;AACzC,2BAAoC;AACpC,2BAA4B;AAC5B,+BAA4B;AAC5B,+BAAiC;AAEjC,MAAM,aAAa,GAAG,IAAA,gBAAS,EAAC,wBAAQ,CAAC,CAAC;AAQnC,IAAM,+BAA+B,uCAArC,MAAM,+BAA+B;IAGlC,KAAK,CAAC,mBAAmB,CAC/B,UAAkB,EAClB,OAAe,EACf,QAAkC;QAElC,IAAI,CAAC;YACH,MAAO,IAAI,CAAC,aAAqB,CAAC,eAAe,CAAC,MAAM,CAAC;gBACvD,IAAI,kBACF,YAAY,EAAE,UAAU,EACxB,UAAU,EAAE,SAAS,EACrB,OAAO,IACJ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAClC;aACF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,aAAa,UAAU,qDAAqD,OAAO,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CACpJ,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,2BAA2B,CAAC,QAAkC;;QACpE,MAAM,KAAK,GAAG,MAAM,CAAC,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,KAAK,mCAAI,EAAE,CAAC,CAAC;QAE5C,IAAI,KAAK,KAAK,8BAA8B;YAAE,OAAO,EAAE,CAAC;QACxD,IAAI,KAAK,KAAK,2BAA2B;YAAE,OAAO,EAAE,CAAC;QACrD,IAAI,KAAK,KAAK,0BAA0B;YAAE,OAAO,EAAE,CAAC;QACpD,IAAI,KAAK,KAAK,wBAAwB,EAAE,CAAC;YACvC,MAAM,UAAU,GAAG,MAAM,CAAC,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,UAAU,mCAAI,CAAC,CAAC,CAAC;YACrD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,UAAU,mCAAI,CAAC,CAAC,CAAC;YACrD,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;gBACrC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC;gBAChE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YACpC,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,KAAK,KAAK,oBAAoB;YAAE,OAAO,EAAE,CAAC;QAC9C,IAAI,KAAK,KAAK,oBAAoB;YAAE,OAAO,GAAG,CAAC;QAE/C,OAAO,EAAE,CAAC;IACZ,CAAC;IAEO,KAAK,CAAC,uBAAuB,CACnC,OAA4B,EAC5B,QAAgB,EAChB,IAAY,EACZ,OAAiB;QAEjB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAC3C,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,cAAc,kBAEpB,QAAQ;gBACR,IAAI,IACD,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAE1C,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,uCAAuC,OAAO,CAAC,cAAc,aAAa,OAAO,CAAC,MAAM,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CACxJ,CAAC;QACJ,CAAC;IACH,CAAC;IAED,YAEE,aAA6C,EAE7C,cAA+C,EAE/C,WAAyC,EAEzC,mBAAyD,EAEzD,QAA+C;QAR9B,kBAAa,GAAb,aAAa,CAAe;QAE5B,mBAAc,GAAd,cAAc,CAAgB;QAE9B,gBAAW,GAAX,WAAW,CAAa;QAExB,wBAAmB,GAAnB,mBAAmB,CAAqB;QAExC,aAAQ,GAAR,QAAQ,CAAsB;QA7EhC,WAAM,GAAG,IAAI,eAAM,CAAC,iCAA+B,CAAC,IAAI,CAAC,CAAC;IA8ExE,CAAC;IAEJ,YAAY;QACV,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAUZ;;QACC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,GAAG,CAAC,OAOhG,CAAC;QAEF,MAAM,mBAAmB,GACvB,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YACxC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;YAC1C,CAAC,CAAC;gBACE,cAAc,EAAE,MAAM,CAAC,cAAc,CAAC;gBACtC,MAAM,EAAE,MAAM,CAAC,kBAAkB,CAAC;aACnC;YACH,CAAC,CAAC,SAAS,CAAC;QAEhB,MAAM,YAAY,GAAG,KAAK,EAAE,OAAe,EAAE,QAAkC,EAAE,EAAE;YACjF,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YAC1D,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YACjE,CAAC;YACD,IAAI,mBAAmB,EAAE,CAAC;gBACxB,MAAM,IAAI,CAAC,uBAAuB,CAChC,mBAAmB,EACnB,IAAI,CAAC,2BAA2B,CAAC,QAAQ,CAAC,EAC1C,OAAO,CACR,CAAC;YACJ,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC;YAC1D,mBAAmB;YACnB,2BAA2B;YAC3B,iCAAiC;SAClC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,mBAAmB,CAAW,CAAC;QACvD,MAAM,OAAO,GAAG,QAAQ,CAAC,2BAA2B,CAAC,CAAC;QACtD,MAAM,oBAAoB,GAAG,QAAQ,CAAC,iCAAiC,CAAC,KAAK,KAAK,CAAC;QAEnF,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,oCAAoC,QAAQ,uDAAuD,CACpG,CAAC;YACF,IAAI,mBAAmB,EAAE,CAAC;gBACxB,MAAM,IAAI,CAAC,uBAAuB,CAChC,mBAAmB,EACnB,GAAG,EACH,oDAAoD,EACpD,KAAK,CACN,CAAC;YACJ,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,oCAAoC,QAAQ,6BAA6B,CAC1E,CAAC;YACF,IAAI,mBAAmB,EAAE,CAAC;gBACxB,MAAM,IAAI,CAAC,uBAAuB,CAChC,mBAAmB,EACnB,GAAG,EACH,wDAAwD,EACxD,KAAK,CACN,CAAC;YACJ,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,MAAO,IAAI,CAAC,aAAqB,CAAC,MAAM,CAAC,UAAU,CAAC;YACjE,KAAK,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE;YACvB,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;SAC1B,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,MAAA,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,0CAAE,IAAI,mCAAI,IAAI,CAAC;QAE9C,MAAM,OAAO,GAAG,IAAA,WAAI,EAAC,IAAA,WAAM,GAAE,EAAE,kBAAkB,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC3E,MAAM,aAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7C,IAAI,CAAC;YACH,MAAM,eAAe,GAAG,IAAA,WAAI,EAAC,OAAO,EAAE,SAAS,QAAQ,SAAS,CAAC,CAAC;YAClE,MAAM,mBAAmB,GAAG,IAAA,WAAI,EAAC,OAAO,EAAE,SAAS,QAAQ,iBAAiB,CAAC,CAAC;YAC9E,MAAM,YAAY,CAAC,oCAAoC,EAAE;gBACvD,KAAK,EAAE,8BAA8B;gBACrC,QAAQ;gBACR,WAAW;aACZ,CAAC,CAAC;YACH,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;YAEpE,MAAM,YAAY,CAAC,wCAAwC,EAAE;gBAC3D,KAAK,EAAE,2BAA2B;gBAClC,QAAQ;aACT,CAAC,CAAC;YACH,MAAM,aAAa,CACjB,QAAQ,EACR;gBACE,IAAI;gBACJ,IAAI;gBACJ,eAAe;gBACf,KAAK;gBACL,OAAO;gBACP,KAAK;gBACL,GAAG;gBACH,MAAM;gBACN,YAAY;gBACZ,MAAM;gBACN,KAAK;gBACL,mBAAmB;aACpB,EACD;gBACE,SAAS,EAAE,IAAI,GAAG,IAAI,GAAG,EAAE;gBAC3B,WAAW,EAAE,IAAI;aAClB,CACF,CAAC;YAEF,MAAM,YAAY,GAAG,IAAA,WAAI,EAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;YACrD,MAAM,YAAY,CAAC,+CAA+C,EAAE;gBAClE,KAAK,EAAE,2BAA2B;gBAClC,QAAQ;aACT,CAAC,CAAC;YACH,MAAM,aAAa,CACjB,QAAQ,EACR;gBACE,IAAI;gBACJ,IAAI;gBACJ,mBAAmB;gBACnB,IAAI;gBACJ,SAAS;gBACT,eAAe;gBACf,IAAI;gBACJ,KAAK;gBACL,OAAO;gBACP,KAAK;gBACL,GAAG;gBACH,MAAM;gBACN,YAAY;gBACZ,MAAM;gBACN,KAAK;gBACL,YAAY;aACb,EACD;gBACE,SAAS,EAAE,IAAI,GAAG,IAAI,GAAG,EAAE;gBAC3B,WAAW,EAAE,IAAI;aAClB,CACF,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,aAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,MAAM,GAAG,QAAQ;iBACpB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;iBACpE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,MAAM,YAAY,CAAC,qBAAqB,MAAM,CAAC,MAAM,YAAY,EAAE;gBACjE,KAAK,EAAE,0BAA0B;gBACjC,QAAQ;gBACR,MAAM,EAAE,MAAM,CAAC,MAAM;aACtB,CAAC,CAAC;YAEH,MAAM,WAAW,GAKZ,EAAE,CAAC;YAER,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC5B,IAAI,CAAC,SAAS;oBAAE,SAAS;gBACzB,MAAM,YAAY,CAChB,gCAAgC,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,MAAM,KAAK,EAC9D;oBACE,KAAK,EAAE,wBAAwB;oBAC/B,QAAQ;oBACR,UAAU,EAAE,CAAC,GAAG,CAAC;oBACjB,UAAU,EAAE,MAAM,CAAC,MAAM;iBAC1B,CACF,CAAC;gBAEF,MAAM,SAAS,GAAG,IAAA,WAAI,EAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBAC3C,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,CAAC;gBAC7B,MAAM,WAAW,GAAG,MAAM,aAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAEjD,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAChC,QAAQ,CAAC,MAAM,CACb,MAAM,EACN,IAAI,IAAI,CAAC,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAC/C,SAAS,CACV,CAAC;gBACF,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBACtC,QAAQ,CAAC,MAAM,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;gBACnD,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;gBAEtC,MAAM,OAAO,GAA2B;oBACtC,aAAa,EAAE,UAAU,MAAM,EAAE;iBAClC,CAAC;gBACF,MAAM,YAAY,GAAG,MAAA,MAAC,QAAgB,EAAC,UAAU,kDAAI,CAAC;gBACtD,IAAI,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;oBACrD,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;gBACvC,CAAC;gBAED,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAC/B,gDAAgD,EAChD,QAAQ,EACR,EAAE,OAAO,EAAE,CACZ,CAAC;gBAEF,MAAM,QAAQ,GAAG,MAAA,MAAA,QAAQ,CAAC,IAAI,0CAAE,QAAQ,mCAAI,EAAE,CAAC;gBAC/C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;oBAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,mCAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;oBAChD,IAAI,CAAC,IAAI;wBAAE,SAAS;oBAEpB,WAAW,CAAC,IAAI,CAAC;wBACf,gBAAgB,EAAE,QAAQ;wBAC1B,aAAa,EAAE,aAAa,GAAG,MAAM,CAAC,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK,mCAAI,CAAC,CAAC;wBAC1D,WAAW,EAAE,aAAa,GAAG,MAAM,CAAC,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,GAAG,mCAAI,CAAC,CAAC;wBACtD,IAAI;qBACL,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,MAAM,YAAY,CAAC,wCAAwC,EAAE;gBAC3D,KAAK,EAAE,oBAAoB;gBAC3B,QAAQ;gBACR,QAAQ,EAAE,WAAW,CAAC,MAAM;aAC7B,CAAC,CAAC;YACH,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC;gBACnC,IAAI,CAAC,aAAqB,CAAC,mCAAmC,CAAC,UAAU,CAAC;oBACzE,KAAK,EAAE,EAAE,gBAAgB,EAAE,QAAQ,EAAE;iBACtC,CAAC;gBACD,IAAI,CAAC,aAAqB,CAAC,mCAAmC,CAAC,UAAU,CAAC;oBACzE,IAAI,EAAE,WAAW;iBAClB,CAAC;aACH,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,kCAAkC,QAAQ,KAAK,WAAW,CAAC,MAAM,WAAW,CAC7E,CAAC;YACF,MAAM,YAAY,CAChB,6BAA6B,WAAW,CAAC,MAAM,eAAe,EAC9D;gBACE,KAAK,EAAE,oBAAoB;gBAC3B,QAAQ;gBACR,QAAQ,EAAE,WAAW,CAAC,MAAM;aAC7B,CACF,CAAC;YACF,IAAI,mBAAmB,EAAE,CAAC;gBACxB,MAAM,IAAI,CAAC,uBAAuB,CAChC,mBAAmB,EACnB,GAAG,EACH,6BAA6B,WAAW,CAAC,MAAM,eAAe,EAC9D,IAAI,CACL,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,mBAAmB,EAAE,CAAC;gBACxB,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO;oBACrC,CAAC,CAAC,KAAK,CAAC,OAAO;oBACf,CAAC,CAAC,+BAA+B,CAAC;gBACtC,MAAM,IAAI,CAAC,uBAAuB,CAChC,mBAAmB,EACnB,GAAG,EACH,yBAAyB,OAAO,EAAE,EAClC,KAAK,CACN,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,MAAM,aAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;CACF,CAAA;AA/WY,0EAA+B;0CAA/B,+BAA+B;IAD3C,IAAA,mBAAU,GAAE;IAsER,WAAA,IAAA,eAAM,EAAC,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,0BAAa,CAAC,CAAC,CAAA;IAEvC,WAAA,IAAA,eAAM,EAAC,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,qBAAc,CAAC,CAAC,CAAA;IAExC,WAAA,IAAA,eAAM,EAAC,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,kBAAW,CAAC,CAAC,CAAA;IAErC,WAAA,IAAA,eAAM,EAAC,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,0BAAmB,CAAC,CAAC,CAAA;IAE7C,WAAA,IAAA,eAAM,EAAC,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,4BAAoB,CAAC,CAAC,CAAA;qCAPf,0BAAa;QAEZ,qBAAc;QAEjB,kBAAW;QAEH,0BAAmB;QAE9B,4BAAoB;GA9EtC,+BAA+B,CA+W3C"}
@@ -0,0 +1,10 @@
1
+ import { CourseStructureService } from './course-structure.service';
2
+ import { UpdateTranscriptionSegmentsDTO } from './dto/update-transcription-segments.dto';
3
+ export declare class CourseLessonController {
4
+ private readonly courseStructureService;
5
+ constructor(courseStructureService: CourseStructureService);
6
+ getTranscriptionSegments(id: number): Promise<any>;
7
+ updateTranscriptionSegments(id: number, dto: UpdateTranscriptionSegmentsDTO): Promise<[any, any]>;
8
+ getAudioFiles(id: number): Promise<any>;
9
+ }
10
+ //# sourceMappingURL=course-lesson.controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"course-lesson.controller.d.ts","sourceRoot":"","sources":["../../src/course/course-lesson.controller.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,8BAA8B,EAAE,MAAM,yCAAyC,CAAC;AAEzF,qBAEa,sBAAsB;IACrB,OAAO,CAAC,QAAQ,CAAC,sBAAsB;gBAAtB,sBAAsB,EAAE,sBAAsB;IAG3E,wBAAwB,CAA4B,EAAE,EAAE,MAAM;IAK9D,2BAA2B,CACE,EAAE,EAAE,MAAM,EAC7B,GAAG,EAAE,8BAA8B;IAM7C,aAAa,CAA4B,EAAE,EAAE,MAAM;CAGpD"}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.CourseLessonController = void 0;
16
+ const api_1 = require("@hed-hog/api");
17
+ const common_1 = require("@nestjs/common");
18
+ const course_structure_service_1 = require("./course-structure.service");
19
+ const update_transcription_segments_dto_1 = require("./dto/update-transcription-segments.dto");
20
+ let CourseLessonController = class CourseLessonController {
21
+ constructor(courseStructureService) {
22
+ this.courseStructureService = courseStructureService;
23
+ }
24
+ getTranscriptionSegments(id) {
25
+ return this.courseStructureService.getTranscriptionSegments(id);
26
+ }
27
+ updateTranscriptionSegments(id, dto) {
28
+ return this.courseStructureService.updateTranscriptionSegments(id, dto);
29
+ }
30
+ getAudioFiles(id) {
31
+ return this.courseStructureService.getAudioFiles(id);
32
+ }
33
+ };
34
+ exports.CourseLessonController = CourseLessonController;
35
+ __decorate([
36
+ (0, common_1.Get)(':id/transcription-segments'),
37
+ __param(0, (0, common_1.Param)('id', common_1.ParseIntPipe)),
38
+ __metadata("design:type", Function),
39
+ __metadata("design:paramtypes", [Number]),
40
+ __metadata("design:returntype", void 0)
41
+ ], CourseLessonController.prototype, "getTranscriptionSegments", null);
42
+ __decorate([
43
+ (0, common_1.Put)(':id/transcription-segments'),
44
+ __param(0, (0, common_1.Param)('id', common_1.ParseIntPipe)),
45
+ __param(1, (0, common_1.Body)()),
46
+ __metadata("design:type", Function),
47
+ __metadata("design:paramtypes", [Number, update_transcription_segments_dto_1.UpdateTranscriptionSegmentsDTO]),
48
+ __metadata("design:returntype", void 0)
49
+ ], CourseLessonController.prototype, "updateTranscriptionSegments", null);
50
+ __decorate([
51
+ (0, common_1.Get)(':id/audio-files'),
52
+ __param(0, (0, common_1.Param)('id', common_1.ParseIntPipe)),
53
+ __metadata("design:type", Function),
54
+ __metadata("design:paramtypes", [Number]),
55
+ __metadata("design:returntype", void 0)
56
+ ], CourseLessonController.prototype, "getAudioFiles", null);
57
+ exports.CourseLessonController = CourseLessonController = __decorate([
58
+ (0, api_1.Role)(),
59
+ (0, common_1.Controller)('lms/lessons'),
60
+ __metadata("design:paramtypes", [course_structure_service_1.CourseStructureService])
61
+ ], CourseLessonController);
62
+ //# sourceMappingURL=course-lesson.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"course-lesson.controller.js","sourceRoot":"","sources":["../../src/course/course-lesson.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,sCAAoC;AACpC,2CAAiF;AACjF,yEAAoE;AACpE,+FAAyF;AAIlF,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IACjC,YAA6B,sBAA8C;QAA9C,2BAAsB,GAAtB,sBAAsB,CAAwB;IAAG,CAAC;IAG/E,wBAAwB,CAA4B,EAAU;QAC5D,OAAO,IAAI,CAAC,sBAAsB,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC;IAGD,2BAA2B,CACE,EAAU,EAC7B,GAAmC;QAE3C,OAAO,IAAI,CAAC,sBAAsB,CAAC,2BAA2B,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC1E,CAAC;IAGD,aAAa,CAA4B,EAAU;QACjD,OAAO,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC;CACF,CAAA;AApBY,wDAAsB;AAIjC;IADC,IAAA,YAAG,EAAC,4BAA4B,CAAC;IACR,WAAA,IAAA,cAAK,EAAC,IAAI,EAAE,qBAAY,CAAC,CAAA;;;;sEAElD;AAGD;IADC,IAAA,YAAG,EAAC,4BAA4B,CAAC;IAE/B,WAAA,IAAA,cAAK,EAAC,IAAI,EAAE,qBAAY,CAAC,CAAA;IACzB,WAAA,IAAA,aAAI,GAAE,CAAA;;6CAAM,kEAA8B;;yEAG5C;AAGD;IADC,IAAA,YAAG,EAAC,iBAAiB,CAAC;IACR,WAAA,IAAA,cAAK,EAAC,IAAI,EAAE,qBAAY,CAAC,CAAA;;;;2DAEvC;iCAnBU,sBAAsB;IAFlC,IAAA,UAAI,GAAE;IACN,IAAA,mBAAU,EAAC,aAAa,CAAC;qCAE6B,iDAAsB;GADhE,sBAAsB,CAoBlC"}
@@ -1,11 +1,13 @@
1
1
  import { CourseStructureService } from './course-structure.service';
2
2
  import { CourseVideoConversionService } from './course-video-conversion.service';
3
+ import { CreateCourseLessonFrameDto } from './dto/create-course-lesson-frame.dto';
3
4
  import { CreateCourseStructureLessonDto, CreateLessonVideoConversionDto } from './dto/create-course-structure-lesson.dto';
4
5
  import { CreateCourseStructureSessionDto } from './dto/create-course-structure-session.dto';
5
6
  import { MoveLessonDto } from './dto/move-lesson.dto';
6
7
  import { PasteLessonsDto } from './dto/paste-lessons.dto';
7
8
  import { ReorderLessonsDto } from './dto/reorder-lessons.dto';
8
9
  import { ReorderSessionsDto } from './dto/reorder-sessions.dto';
10
+ import { UpdateCourseLessonFrameDto } from './dto/update-course-lesson-frame.dto';
9
11
  import { UpdateCourseResourcesDto } from './dto/update-course-resources.dto';
10
12
  import { UpdateCourseStructureLessonDto } from './dto/update-course-structure-lesson.dto';
11
13
  import { UpdateCourseStructureSessionDto } from './dto/update-course-structure-session.dto';
@@ -42,8 +44,15 @@ export declare class CourseStructureController {
42
44
  nome: string;
43
45
  fileId: number;
44
46
  tamanho: string;
45
- tipo: any;
46
- publico: any;
47
+ type: "lesson_audio" | "student_download" | "supplementary_material" | "video_original" | `video_profile:${number}`;
48
+ is_public: boolean;
49
+ }[];
50
+ frames: {
51
+ id: string;
52
+ nome: string;
53
+ fileId: number;
54
+ timeSeconds: number;
55
+ url: string;
47
56
  }[];
48
57
  instrutores: {
49
58
  id: string;
@@ -69,8 +78,8 @@ export declare class CourseStructureController {
69
78
  id: number;
70
79
  nome: string;
71
80
  fileId: number;
72
- tipo: string;
73
- publico: boolean;
81
+ type: string;
82
+ is_public: boolean;
74
83
  }[];
75
84
  operationsProjectId: number;
76
85
  operationsProjectCode: string;
@@ -81,15 +90,15 @@ export declare class CourseStructureController {
81
90
  id: number;
82
91
  nome: string;
83
92
  fileId: number;
84
- tipo: string;
85
- publico: boolean;
93
+ type: string;
94
+ is_public: boolean;
86
95
  }[]>;
87
96
  updateCourseResources(courseId: number, dto: UpdateCourseResourcesDto): Promise<{
88
97
  id: number;
89
98
  nome: string;
90
99
  fileId: number;
91
- tipo: string;
92
- publico: boolean;
100
+ type: string;
101
+ is_public: boolean;
93
102
  }[]>;
94
103
  createSession(courseId: number, dto: CreateCourseStructureSessionDto): Promise<{
95
104
  id: string;
@@ -142,8 +151,8 @@ export declare class CourseStructureController {
142
151
  nome: string;
143
152
  fileId: number;
144
153
  tamanho: string;
145
- tipo: any;
146
- publico: any;
154
+ type: "lesson_audio" | "student_download" | "supplementary_material" | "video_original" | `video_profile:${number}`;
155
+ is_public: boolean;
147
156
  }[];
148
157
  instrutores: {
149
158
  id: string;
@@ -181,8 +190,8 @@ export declare class CourseStructureController {
181
190
  nome: string;
182
191
  fileId: number;
183
192
  tamanho: string;
184
- tipo: any;
185
- publico: any;
193
+ type: "lesson_audio" | "student_download" | "supplementary_material" | "video_original" | `video_profile:${number}`;
194
+ is_public: boolean;
186
195
  }[];
187
196
  instrutores: {
188
197
  id: string;
@@ -196,13 +205,30 @@ export declare class CourseStructureController {
196
205
  moveLesson(courseId: number, sessionId: number, lessonId: number, dto: MoveLessonDto): Promise<{
197
206
  success: boolean;
198
207
  }>;
199
- createLessonVideoConversion(courseId: number, sessionId: number, lessonId: number, dto: CreateLessonVideoConversionDto): Promise<{
208
+ createLessonVideoConversion({ id: userId }: {
209
+ id: any;
210
+ }, courseId: number, sessionId: number, lessonId: number, dto: CreateLessonVideoConversionDto): Promise<{
200
211
  queueJobId: any;
201
212
  status: string;
202
213
  }>;
203
214
  deleteLesson(courseId: number, sessionId: number, lessonId: number): Promise<{
204
215
  success: boolean;
205
216
  }>;
217
+ deleteLessonFrame(courseId: number, sessionId: number, lessonId: number, frameId: number): Promise<{
218
+ success: boolean;
219
+ }>;
220
+ createLessonFrame(courseId: number, sessionId: number, lessonId: number, dto: CreateCourseLessonFrameDto): Promise<{
221
+ success: boolean;
222
+ id: number;
223
+ fileId: number;
224
+ timeSeconds: number;
225
+ }>;
226
+ updateLessonFrame(courseId: number, sessionId: number, lessonId: number, frameId: number, dto: UpdateCourseLessonFrameDto): Promise<{
227
+ success: boolean;
228
+ id: number;
229
+ fileId: number;
230
+ timeSeconds: number;
231
+ }>;
206
232
  duplicateLesson(courseId: number, sessionId: number, lessonId: number): Promise<{
207
233
  id: string;
208
234
  codigo: string;
@@ -224,8 +250,8 @@ export declare class CourseStructureController {
224
250
  nome: string;
225
251
  fileId: number;
226
252
  tamanho: string;
227
- tipo: any;
228
- publico: any;
253
+ type: "lesson_audio" | "student_download" | "supplementary_material" | "video_original" | `video_profile:${number}`;
254
+ is_public: boolean;
229
255
  }[];
230
256
  instrutores: {
231
257
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"course-structure.controller.d.ts","sourceRoot":"","sources":["../../src/course/course-structure.controller.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,EACL,8BAA8B,EAC9B,8BAA8B,EAC/B,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,+BAA+B,EAAE,MAAM,2CAA2C,CAAC;AAC5F,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,8BAA8B,EAAE,MAAM,0CAA0C,CAAC;AAC1F,OAAO,EAAE,+BAA+B,EAAE,MAAM,2CAA2C,CAAC;AAE5F,qBAEa,yBAAyB;IAElC,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,4BAA4B;gBAD5B,sBAAsB,EAAE,sBAAsB,EAC9C,4BAA4B,EAAE,4BAA4B;IAI7E,YAAY,CAA4B,QAAQ,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAKxD,kBAAkB,CAA4B,QAAQ,EAAE,MAAM;;;;;;;IAK9D,qBAAqB,CACQ,QAAQ,EAAE,MAAM,EACnC,GAAG,EAAE,wBAAwB;;;;;;;IAQvC,aAAa,CACgB,QAAQ,EAAE,MAAM,EACnC,GAAG,EAAE,+BAA+B;;;;;;;IAO9C,eAAe,CACc,QAAQ,EAAE,MAAM,EACnC,GAAG,EAAE,kBAAkB;;;IAMjC,aAAa,CACgB,QAAQ,EAAE,MAAM,EACT,SAAS,EAAE,MAAM,EAC3C,GAAG,EAAE,+BAA+B;;;;;;;IAM9C,aAAa,CACgB,QAAQ,EAAE,MAAM,EACT,SAAS,EAAE,MAAM;;;IAMrD,gBAAgB,CACa,QAAQ,EAAE,MAAM,EACT,SAAS,EAAE,MAAM;;;;;;;;;;IAQrD,YAAY,CACiB,QAAQ,EAAE,MAAM,EACT,SAAS,EAAE,MAAM,EAC3C,GAAG,EAAE,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAM7C,YAAY,CACiB,QAAQ,EAAE,MAAM,EACT,SAAS,EAAE,MAAM,EAC3C,GAAG,EAAE,eAAe;;;IAO9B,cAAc,CACe,QAAQ,EAAE,MAAM,EACT,SAAS,EAAE,MAAM,EAC3C,GAAG,EAAE,iBAAiB;;;IAMhC,YAAY,CACiB,QAAQ,EAAE,MAAM,EACT,SAAS,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EACzC,GAAG,EAAE,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAW7C,UAAU,CACmB,QAAQ,EAAE,MAAM,EACT,SAAS,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EACzC,GAAG,EAAE,aAAa;;;IAM5B,2BAA2B,CACE,QAAQ,EAAE,MAAM,EACT,SAAS,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EACzC,GAAG,EAAE,8BAA8B;;;;IAW7C,YAAY,CACiB,QAAQ,EAAE,MAAM,EACT,SAAS,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM;;;IAMnD,eAAe,CACc,QAAQ,EAAE,MAAM,EACT,SAAS,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAIpD"}
1
+ {"version":3,"file":"course-structure.controller.d.ts","sourceRoot":"","sources":["../../src/course/course-structure.controller.ts"],"names":[],"mappings":"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"}