Downloading media from Drone through SkyControlller RNDIS

Hello all,

I am in need of programmatically downloading videos and pictures triggered in flight. I have several options but they are all weird. I will detail below:

  • I found that if I run Sphinx of ANAFI I am able to connect to an FTP server in the IP address of the simulated Anafi. Unfortunately when I connect to the real ANAFI (through SkyController or not), I cannot reach any FTP server. Am i missing something?

  • I found that there is a REST API for the media, but the location is not reachable if I connect to the ANAFI IP address (192.168.53.1). On the other hand if I connect directly to the ANAFI wifi hotspot 192.168.42.1, i am offered the REST API. I guess this is due to the fact that I cannot reach the ANAFI network directly through the SkyController, but then this makes me have to choose between having the SkyController and Media Download, which is a terrible choice.

  • I found that the Android(Java) and iOS(swift) SDKs have support for download and listing of media. Unfortunately for Olympe(python) I can only find media listing, nothing about downloading and thumbnails.

With all of this I am very sad and this seems like a massive set-back on my project where i created a web based fleet manager of ANAFIs. It already takes off, lands, moves on map, streams live low latency videos to the browser and mobile…but i cannot download media :frowning:

Hope somebody can offer me a way out of this problem.

Hi,

You’ve correctly found that the Anafi provides a REST API for media downloading. This API is also available when you’re connected through a SkyController 3, but in this case you will need to use the SkyController 3 IP address (usually 192.168.53.1), and use port 180 instead of 80.

So basically, to list your medias, you can use either http://192.168.42.1/api/v1/media/medias when directly connected to the drone access point, or http://192.168.53.1:180/api/v1/media/medias when connected through a SkyController 3. The same applies for all the download URLs.

However, due to how the redirect is handled, you cannot use the web interface with the SkyController 3, just the REST API.

Regards,
Nicolas.

3 Likes

Hi Nicolas,

Thanks a lot! So cool. I have no use for the web interface so no loss for me, even so i am convinced some greasemonkey hacks could probably fix it, but is just some advice for whoever may need it.

Now the last thing. Where can I find documentation on this API? Do i need to have a look at the website code?

Best regards
Paulo Neves

So answering to myself…
The API is very simple just access http://192.168.53.1:180/api/v1/media/medias and there is json file with the data and url’s. An example:

[ { "media_id": "10000057", "type": "VIDEO", "datetime": "20191004T002534+0200", "size": 68545156, "video_mode": "Standard", "duration": 5163, "run_id": "0B0321BC3660A808E74A665813C81793", "thumbnail": "/data/thumbnails/100000570059.MP4", "resources": [ { "media_id": "10000057", "resource_id": "100000570059.MP4", "type": "VIDEO", "format": "MP4", "datetime": "20191004T002534+0200", "size": 68545156, "url": "/data/media/100000570059.MP4", "width": 3840, "height": 2160, "thumbnail": "/data/thumbnails/100000570059.MP4", "video_mode": "Standard", "replay_url": "replay/100000570059.MP4", "duration": 5163 } ] } ]
Notes:

  • The urls are all relative to the IP address not to the API.
  • The thumbnails have extension MP4 but are in fact JPEG

Also if you need to use SkyController to access the dashboard you do not need greasemonkey. Just
sudo socat tcp-listen:80,reuseaddr,fork tcp:192.168.53.1:180 and connect to localhost in your browser.

1 Like

We will provide the full Web API documentation really soon! :slight_smile:

Hi,
I am also using olympe with the SkyController connection to download media and have followed the steps above for downloading and listing media, which works, but when I try delete any media items I get a HTTP 400 BAD REQUEST response code.

I am using this code, with the resource URL from the listed media:
import requests
response = requests.delete(“http://192.168.53.1:180{}”.format(resource_url))

The response I get back always has status code 400. Any advice on what I might be doing wrong with my request?

Thanks,
Chloe

Hi @Chloe ,

What’s in resource_url ? Can you post the full HTTP delete URL you are trying?

Sure an example of the complete url I am using is:
http://192.168.53.1:180/data/media/1000001718.JPG

It is the same URL I am using for the GET call to download the image which works fine.

Note: I do have some networking rules set up so it does use different IP addresses sometimes depending on which SkyController I am communicating with (similar to this post Multiple Parrot Anafi controlled via Olympe on Linux, configure IP ) just in case that might somehow be interfering

1 Like