@@ -67,7 +67,7 @@ class Challenge {
6767
6868 // English Challenges
6969 final FillInTheBlank ? fillInTheBlank;
70- final EnglishAudio ? audio;
70+ final EnglishScene ? audio;
7171 final Scene ? scene;
7272
7373 // Nodules for interactive challenges
@@ -125,7 +125,7 @@ class Challenge {
125125 ? FillInTheBlank .fromJson (data['fillInTheBlank' ])
126126 : null ,
127127 audio: data['scene' ] != null
128- ? EnglishAudio .fromJson (data['scene' ]['setup' ]['audio' ])
128+ ? EnglishScene .fromJson (data['scene' ]['setup' ]['audio' ])
129129 : null ,
130130 tests: (data['tests' ] ?? [])
131131 .map <ChallengeTest >((file) => ChallengeTest .fromJson (file))
@@ -440,11 +440,13 @@ class QuizQuestion {
440440 final String text;
441441 final List <Answer > answers;
442442 final int solution;
443+ final QuizAudioData ? audioData;
443444
444445 const QuizQuestion ({
445446 required this .text,
446447 required this .answers,
447448 required this .solution,
449+ this .audioData,
448450 });
449451
450452 factory QuizQuestion .fromJson (Map <String , dynamic > data) {
@@ -466,7 +468,13 @@ class QuizQuestion {
466468 allAnswers.indexWhere ((a) => a.answer == data['answer' ]) + 1 ;
467469
468470 return QuizQuestion (
469- text: data['text' ], answers: allAnswers, solution: solutionIndex);
471+ text: data['text' ],
472+ answers: allAnswers,
473+ solution: solutionIndex,
474+ audioData: data['audioData' ] != null
475+ ? QuizAudioData .fromJson (data['audioData' ])
476+ : null ,
477+ );
470478 }
471479}
472480
@@ -510,7 +518,7 @@ class Scene {
510518class SceneSetup {
511519 final String background;
512520 final bool ? alwaysShowDialogue;
513- final EnglishAudio audio;
521+ final EnglishScene audio;
514522 final List <SceneCharacter > characters;
515523
516524 const SceneSetup ({
@@ -523,7 +531,7 @@ class SceneSetup {
523531 factory SceneSetup .fromJson (Map <String , dynamic > data) {
524532 return SceneSetup (
525533 background: data['background' ],
526- audio: EnglishAudio .fromJson (data['audio' ]),
534+ audio: EnglishScene .fromJson (data['audio' ]),
527535 characters: data['characters' ]
528536 .map <SceneCharacter >(
529537 (character) => SceneCharacter .fromJson (character),
@@ -626,25 +634,96 @@ class SceneDialogue {
626634 }
627635}
628636
629- class EnglishAudio {
637+ abstract class AudioClip {
638+ String get fileName;
639+ String ? get startTimeStamp;
640+ String ? get finishTimeStamp;
641+ }
642+
643+ class EnglishScene implements AudioClip {
644+ @override
630645 final String fileName;
631646 final String startTime;
647+ @override
632648 final String ? startTimeStamp;
649+ @override
633650 final String ? finishTimeStamp;
634651
635- const EnglishAudio ({
652+ const EnglishScene ({
636653 required this .fileName,
637654 required this .startTime,
638655 required this .startTimeStamp,
639656 required this .finishTimeStamp,
640657 });
641658
642- factory EnglishAudio .fromJson (Map <String , dynamic > data) {
643- return EnglishAudio (
659+ factory EnglishScene .fromJson (Map <String , dynamic > data) {
660+ return EnglishScene (
644661 fileName: data['filename' ],
645662 startTime: data['startTime' ].toString (),
646663 startTimeStamp: data['startTimestamp' ]? .toString (),
647664 finishTimeStamp: data['finishTimestamp' ]? .toString (),
648665 );
649666 }
650667}
668+
669+ class QuizTranscriptLine {
670+ final String character;
671+ final String text;
672+
673+ const QuizTranscriptLine ({
674+ required this .character,
675+ required this .text,
676+ });
677+
678+ factory QuizTranscriptLine .fromJson (Map <String , dynamic > data) {
679+ return QuizTranscriptLine (
680+ character: data['character' ],
681+ text: data['text' ],
682+ );
683+ }
684+ }
685+
686+ class QuizAudio implements AudioClip {
687+ @override
688+ final String fileName;
689+ @override
690+ final String ? startTimeStamp;
691+ @override
692+ final String ? finishTimeStamp;
693+
694+ const QuizAudio ({
695+ required this .fileName,
696+ this .startTimeStamp,
697+ this .finishTimeStamp,
698+ });
699+
700+ factory QuizAudio .fromJson (Map <String , dynamic > data) {
701+ return QuizAudio (
702+ fileName: data['filename' ],
703+ startTimeStamp: data['startTimestamp' ]? .toString (),
704+ finishTimeStamp: data['finishTimestamp' ]? .toString (),
705+ );
706+ }
707+ }
708+
709+ class QuizAudioData {
710+ final QuizAudio audio;
711+ final List <QuizTranscriptLine > transcript;
712+
713+ const QuizAudioData ({
714+ required this .audio,
715+ required this .transcript,
716+ });
717+
718+ factory QuizAudioData .fromJson (Map <String , dynamic > data) {
719+ final audioData = data['audio' ];
720+ return QuizAudioData (
721+ audio: QuizAudio .fromJson (audioData),
722+ transcript: (data['transcript' ] as List )
723+ .map <QuizTranscriptLine >(
724+ (item) => QuizTranscriptLine .fromJson (item),
725+ )
726+ .toList (),
727+ );
728+ }
729+ }
0 commit comments