Skip to content

Commit

Permalink
add option to choose the transcript format
Browse files Browse the repository at this point in the history
  • Loading branch information
marjisound committed Mar 28, 2024
1 parent c29ba23 commit b7421c8
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 4 deletions.
6 changes: 5 additions & 1 deletion packages/api/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -189,10 +189,14 @@ const getApp = async () => {
res.status(404).send(`Transcript not found`);
return;
}

const transcriptS3Key =
parsedItem.data.transcriptKeys[exportRequest.data.transcriptFormat];
console.log(`transcriptS3Key: ${transcriptS3Key}`);
const transcriptText = await getObjectText(
s3Client,
config.app.transcriptionOutputBucket,
parsedItem.data.transcriptKeys.text,
transcriptS3Key,
);
if (isS3Failure(transcriptText)) {
if (transcriptText.failureReason === 'NoSuchKey') {
Expand Down
2 changes: 1 addition & 1 deletion packages/client/src/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export default function RootLayout({
</div>
</header>
<main>
<div className="mx-auto max-w-7xl py-6 sm:px-6 lg:px-8">
<div className="mx-auto max-w-7xl py-6 sm:px-6 lg:px-8 px-4">
{children}
</div>
</main>
Expand Down
65 changes: 63 additions & 2 deletions packages/client/src/components/ExportButton.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
import React, { useContext, useState } from 'react';
import { ExportResponse } from '@guardian/transcription-service-common';
import {
ExportResponse,
TranscriptFormat,
} from '@guardian/transcription-service-common';
import { AuthContext } from '@/app/template';
import Script from 'next/script';
import { useSearchParams } from 'next/navigation';
Expand All @@ -10,13 +13,19 @@ import {
} from '@heroicons/react/16/solid';
import { RequestStatus } from '@/types';
import { InfoMessage } from '@/components/InfoMessage';
import { Dropdown } from 'flowbite-react';

const ExportButton = () => {
const { token } = useContext(AuthContext);
const searchParams = useSearchParams();
const [docId, setDocId] = useState<string | undefined>();
const [loading, setLoading] = useState(false);
const [failureMessage, setFailureMessage] = useState<string>('');
const [transcriptFormat, setTranscriptFormat] =
useState<TranscriptFormat | null>(null);
const [transcriptFormatValid, setTranscriptFormatValid] = useState<
boolean | undefined
>(undefined);
const [requestStatus, setRequestStatus] = useState<RequestStatus>(
RequestStatus.Ready,
);
Expand All @@ -26,6 +35,13 @@ const ExportButton = () => {
<InfoMessage message={'not logged in'} status={RequestStatus.Failed} />
);
}

const transcriptFormatDescription: Record<TranscriptFormat, string> = {
srt: 'SRT format (Time Coded)',
text: 'TEXT format',
json: 'JSON format',
};

const transcriptId = searchParams.get('transcriptId');
if (!transcriptId) {
return (
Expand Down Expand Up @@ -69,9 +85,18 @@ const ExportButton = () => {
}

const exportHandler = async () => {
if (!transcriptFormat) {
console.log(`transcript format value is ${transcriptFormat}`);
setTranscriptFormatValid(false);
return;
}
setLoading(true);
try {
const response = await exportTranscript(token, transcriptId);
const response = await exportTranscript(
token,
transcriptId,
transcriptFormat,
);
setLoading(false);
if (response && response.status !== 200) {
const text = await response.text();
Expand Down Expand Up @@ -101,6 +126,42 @@ const ExportButton = () => {
return (
<>
<Script src="https://accounts.google.com/gsi/client" async></Script>
<div className="flex flex-col space-y-2 mb-8 ">
<Dropdown
color={transcriptFormatValid === false ? 'red' : 'gray'}
label={
transcriptFormat === null
? 'Choose transcript format'
: transcriptFormatDescription[transcriptFormat]
}
>
<Dropdown.Item
value={TranscriptFormat.TEXT}
onClick={() => {
setTranscriptFormat(TranscriptFormat.TEXT);
setTranscriptFormatValid(true);
}}
>
{transcriptFormatDescription[TranscriptFormat.TEXT]}
</Dropdown.Item>
<Dropdown.Divider />
<Dropdown.Item
value={TranscriptFormat.SRT}
onClick={() => {
setTranscriptFormat(TranscriptFormat.SRT);
setTranscriptFormatValid(true);
}}
>
{transcriptFormatDescription[TranscriptFormat.SRT]}
</Dropdown.Item>
</Dropdown>
{transcriptFormatValid === false ? (
<span className="font-light text-sm align-middle" color="red">
A transcript format must be chosen!
</span>
) : null}
</div>

<button
type="button"
className="text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center inline-flex items-center dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800"
Expand Down
3 changes: 3 additions & 0 deletions packages/client/src/services/export.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {
ClientConfig,
TranscriptExportRequest,
TranscriptFormat,
} from '@guardian/transcription-service-common';
import { authFetch } from '@/helpers';

Expand Down Expand Up @@ -48,6 +49,7 @@ const promiseInitTokenClient = (
export const exportTranscript = async (
authToken: string,
transcriptId: string,
transcriptFormat: TranscriptFormat,
): Promise<Response> => {
const config = await getClientConfig(authToken);

Expand All @@ -62,6 +64,7 @@ export const exportTranscript = async (
id: transcriptId,
// @ts-expect-error (return object from google isn't actually a TokenResponse, our zod type is more accurate)
oAuthTokenResponse: tokenResponse,
transcriptFormat,
};

const exportResponse = await authFetch('/api/export', authToken, {
Expand Down
7 changes: 7 additions & 0 deletions packages/common/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,9 +116,16 @@ export const ZTokenResponse = z.object({

export type ZTokenResponse = z.infer<typeof ZTokenResponse>;

export enum TranscriptFormat {
SRT = 'srt',
TEXT = 'text',
JSON = 'json',
}

export const TranscriptExportRequest = z.object({
id: z.string(),
oAuthTokenResponse: ZTokenResponse,
transcriptFormat: z.nativeEnum(TranscriptFormat),
});

export type TranscriptExportRequest = z.infer<typeof TranscriptExportRequest>;
Expand Down

0 comments on commit b7421c8

Please sign in to comment.