Search code examples
laravelstreamingdropbox-api

possible to stream a mp3/mp4 from Dropbox API V2 with PHP?


Yesterday I set it up so I can serve MP3 files stored in my Dropbox using https://github.com/spatie/dropbox-api and Laravel. However this only works for small'ish files as the way it's working now, it has to load the entire file first and then serve it from Laravel. This doesn't work at all for movies or for long tracks as it takes forever and runs out of memory.

Here's the code I'm currently using

    $authorizationToken = 'my-api-token';
    $client = new \Spatie\Dropbox\Client($authorizationToken);

    $path = "/offline/a-very-long-song.mp3"; // path in dropbox

    $stream = $client->download($path);

    $file = stream_get_contents($stream);
    fclose($stream);
    unset($stream);

    $file_info = new \finfo(FILEINFO_MIME_TYPE);

    return response($file, 200)->withHeaders([
        'Content-Type' => $file_info->buffer($file),
        'Content-Disposition' => 'inline; filename="' . basename($path) . '"',
    ]);

I was wondering if there's a way to stream it so it doesn't have to load the entire file first. I guess this happens naturally when you load a media file in the browser, but since there are no direct links to the physical file with Dropbox, I'm not sure if it's possible.


Solution

  • The Dropbox API does offer the ability to retrieve temporary direct links that can be used for streaming files like this, via the /2/files/get_temporary_link endpoint:

    https://www.dropbox.com/developers/documentation/http/documentation#files-get_temporary_link

    In the library you're using, that appears to be available as the getTemporaryLink method, as shown in the example here:

    https://github.com/spatie/dropbox-api#a-minimal-implementation-of-dropbox-api-v2