Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support exporting source media to google drive #115

Open
wants to merge 22 commits into
base: main
Choose a base branch
from

Conversation

philmcmahon
Copy link
Contributor

@philmcmahon philmcmahon commented Jan 8, 2025

What does this change?

This PR adds a new option to the export page to export the original source media to google drive. As part of this I've redesigned the export page - it now looks like this:

Screenshot 2025-01-08 at 16 59 58

The export has several stages - see below for screenshots of that

On the assumption that, following this change, users will frequently be exporting more than one file, all exported files (even if there's just one) are now stored in a subfolder of the 'Guardian Transcribe Tool' folder (suffixed with date/time in case they have multiple files with the same name).

I decided to use a lambda to perform the export to google drive. This has the advantages of being easier to setup than an ECS task, and faster to start. It has the disadvantage that we can only export files up to 10GB (the maximum ephemeral storage), and we only have 15 minutes to do the upload. In my (limited) testing, I found that the lambda was able to export a 1.2GB file in 70 seconds, so I suspect we'll be limited more by the max file size than the timeout - but only just.

I had to use a separate lambda function for this rather than the API itself because API gateway has a 30s timeout, and once the lambda returns a http response it gets terminated. There are workarounds to this but I couldn't find anything that works nicely with serverless-express so I decided to create a separate function (this has the advantage that we don't need our API lambda to have loads of memory/disk space).

Some error reporting exists for if the file is too large. I still need to add an error for if the lambda times out whilst performing the export - might leave for a future PR though.

The feature relies on the file extension to tell google drive what type the file is - this seems to work reasonably well. A future feature could run apache tika or something similar on the file to determine the file type.

In theory the uploadFileToGoogleDrive function should be streaming the file 128MB at a time, in practice I found that the function ran out of memory when uploading a 1.2Gb file when the lambda only had 512MB. This needs more investigation - for now I have set the memory to 2GB. I think it's worth getting in as is because my 1.2GB test file was off a 1h30 youtube video, and I suspect many videos will be under this length. Might be a bit of fun though to try and work out how memory management in node works.

How to test

This is currently live on CODE, you can try it out here https://transcribe.code.dev-gutools.co.uk/

Screenshots

Screenshot 2025-01-10 at 15 42 02 Screenshot 2025-01-10 at 15 42 05 Screenshot 2025-01-10 at 15 42 10 Screenshot 2025-01-10 at 15 42 15

@philmcmahon philmcmahon requested a review from a team as a code owner January 8, 2025 17:20
@philmcmahon philmcmahon marked this pull request as draft January 9, 2025 10:03
@philmcmahon philmcmahon force-pushed the pm-save-media-google-drive branch from d6baa92 to 0ef1107 Compare January 9, 2025 12:35
@philmcmahon philmcmahon marked this pull request as ready for review January 10, 2025 15:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant