Loading Video to LeapPad Explorer

| by Ken | in Technology Add comments

I’ve been working on trying to take more control of the LeapPad Explorer for a while.  It works well for kids, but I’m frustrated by the LeapFrog Connect software which is really clunky and by the limited access you get to the device.  The following describes my journey to finally getting my music and video loaded on to the LeapPad.

Last summer, I found some info at elinux that led me to Claude Schwarz’s DIDJ hacking page.  It looked perfect to me: build your own cartridge with an SD card so that you can load whatever you want on the SD card and then have your LeapPad play anything there.  So I ordered my boards and my parts and waited.  Unfortunately, the materials arrived after my window of opportunity expired.  (AKA, started house renovation and side projects halted!)  So the box of goodies sat gathering dust in my office for a year until I could carve out some time this summer to get back to it.  I got the remainder of the parts and got to building.  But I’m not sure how to proceed with the software angle on that hack, so I switched gears.  (See the “Building a DIDJ Cartridge” post for full details.)

Before continuing with software hacking, I went back to the LeapFrog Connect software.  An update came through that said I could now download music, but I would need to update the firmware to do that.  So I updated the firmware and confirmed that the select MP3s button was now enabled.  Unfortunately, MP3s really means MP3, not some generic music file.  Since the files I wanted to load were AAC, that meant conversion (which turned out to be way more trouble than I would have expected) or just re-ripping.  For kids music, re-ripping was fine.  So that was an easy fix; now I have music – 1 out of 2!  But there was no easy fix for the video.  That would require some hacking…

My first thought was that I would see if I could decompile the MacOS build of LeapFrog Connect.  I know, dumb idea.  Assuming it wasn’t Java, decompiling would be ugly but worth a shot to see what I got.  Wow, even uglier than I had expected.  Why is that?  Ah, LeapFrog Connect uses Flash embedded in the executable so I’d somehow need to extract the flash component to decompile that.  And even if I succeeded, I’d end up needing to add code to a clunky application.

I Googled some more and found a page at elinux I had missed before.  It described “OpenLFConnect” – an alternative to using the regular LeapFrog Connect.  Ah-ha!  That sounds perfect.  And something I wish I had found last year which could have saved me lots of trouble.  (I still don’t know how I missed it.)  In the end, I did succeed in getting video loaded using OpenLFConnect, but there were some bumps on the road. Here’s my process:

First, on Ubuntu 13.04, I cloned the git repository (https://github.com/jrspruitt/OpenLFConnect.git).  I followed the instructions from the OpenLFConnect page for installing the udev rules and for good measure, I did a sudo service udev restart.  I plugged in the LeapPad and waited for the networking prompt…  nothing.  (Think Yukon Cornelius )

Next, I tried the same thing on Windows 7.  I used 32-bit Windows to make things less complicated and I installed Python.  It turned out you need a Python version less than 3.0 or you get syntax errors.  I used 2.7.  I had not previously used LeapFrog Connect on this PC so there were no drivers and there was no Monitor program that would need to be disabled.  When I plugged in the LeapPad, it downloaded a driver but I didn’t see anything show up for a network connection.

There was lots of debugging work that followed but the upshot was I was stuck.  So I sent an e-mail to the author of OpenLFConnect, Jason, and was very thankful to get a reply at all, nevermind one that had what seemed like good news: he was already aware of the issue and had started work on a new branch.  From him I learned that the new firmware (that I had just installed) changes the way the LeapPad appears to the computer from a network device to a mass storage device.  That means that the old way of connecting wouldn’t work any more.  Jason had added device profile options to his code so you can use the old firmware or the new firmware and the device profile is smart enough to adjust the connection algorithm.  Jason also had adjusted the udev rules so that newer versions of Linux would be able to correctly recognize the device.

You can get this new code from the testing branch in the Git repository.  I still had trouble with the Windows version but the Ubuntu version worked well.  This time, after adding the udev rules, the /dev/leapfrog device showed up as soon as I plugged in the LeapPad to the USB port.  Nice!  The new version of OpenLFConnect needs a default device set and it doesn’t come with one (this is code that is a work in progress, after all).  So I found the easiest thing to do is to copy the profile you plan to use in place and give the new copy the name “default.cfg”.  Before the first run, the profiles are in “extras/device_profiles”.  After the first run fails, you can find the profiles in “files/Extras/Profiles”.

I’ll pause here to point out that LeapFrog seems to reuse model names like a car company does.  It is very confusing.  There are LeapPads, Explorers, and Leapsters everywhere.  For the terminology used in OpenLFConnect, a Leapster Explorer is abbreviated “Explorer” and a LeapPad Explorer is abbreivated “LeapPad”.  (Although when I connected my LeapPad, OpenLFConnect told me it was connecting to an Explorer, even after I had set the device profile to be a LeapPad.)  Also note that the original LeapPad Explorer is the “leappad1_v1” or “leappad1_v2” where the “v#” refers to the firmware version, making it either a “v1” network device or a “v2” mass storage device.  The LeapPad Explorer 2 is a “leappad2” where there is only the later firmware which is a mass storage device.  Whew.

Okay, so once you have your device figured out, the profile copied to default, and the LeapPad connected, you can run OpenLFConnect.  After it starts, you can navigate in the local directory and then you can run dftp_connect.  This is the command to establish a remote connection.  The prompt will change to remote and then you can navigate the LeapPad (remote) file system.  Cool!!

Except I did run into an issue that Jason hadn’t seen before.  For some reason, on my device the file system listing would seemingly correctly show a directory in a listing but wouldn’t let me change to the directory claiming it wasn’t a directory.  I needed to modify the Python code to remove the protections for only changing to directories that are directories and then it let me change there.  I have some debugging homework to do here from Jason that I’ll get to when I can.  But for now, if you see the same directory error, it means you are hitting the same issue I did and may need to make some Python edits.

Once I conquered that last issue, I was ready to load my own video.  The question remained: where should the video file go and how would it be played through the end user UI?  I had been planning to treat it as a video that had been taken on the device so that you would go into the My Videos section and choose a video but that seemed a little too clunky.  I thought it would be way cooler to make my own application like an existing Video application I had purchased previously.  In fact, I would end up using that purchased Video as a framework for my new video.

As it happened, the purchased Video app was one of the directories that had the directory issue described above (which is why I needed to get past the problem rather than ignoring it).  And unfortunately, the download command has the same issue as the directory change.  Rather than fix the download command, it was easier for me to simply manually create the local directory and then download each file individually.  There were only 8 files in the application.  I chose a Thomas Video called Hero of the Rails as my framework to copy – I had two videos to choose from and it’s the first one I found.  Applications are stored in /LF/Bulk/ProgramFiles/ and you just need to search through each one looking at the meta.inf file in each directory.  (If the download works for you, then download the whole ProgramFiles directory and grep -r for a string you can search for.)  I thought about including my application framework here, but since it is a copy of a purchased application, I decided against it.  You’ll need to do your own digging on your own LeapPad, sorry.

After successfully downloading the original application that ended with a “-000000”, I created a copy of it and simply incremented the number by 1 so that the new copy was identical to the original except it ended with a “-000001”.  Inside my application framework, I had the meta.inf file, a GameInfo.json file, two icon files, the App.so application object file, and the video file.  There’s also a md5 file that I deleted since it didn’t appear to be needed.  The App.so file I left alone.  The previewimage.png file doesn’t appear to be used on the LeapPad so I left the original.  I modified the GameInfo.json file and the VideoInfo.json files to reflect the new information, including the length (in seconds) of the video and the new name of the video.  I could have left the name alone and just replaced the video with a new one with exactly the same name, but fortunately, the name of the video doesn’t appear to be hardcoded in the App.so file and I figured things would be more clear if I used a different video name.

Because I’m a complete dork, I used Photoshop to make new icons.  It’s a little tricky because you need to create a mask to get the rounded look – surprisingly, the LeapPad doesn’t have its own mask to enforce appearance rules on the icons.  I found that the previewimage icon, while it isn’t used, worked well for creating that mask.  I pulled an image off the ‘Net that had a white background and used the magic wand to delete the white and leave a transparrent background which is what the iconLPAD.png file appears to need.

Now, for my video, I used a recording file from MythTV!  I imagine you could use anything as a source file, but I found that if the video file that goes to the LeapPad doesn’t match the format that the App.so is expecting, you get a green screen.  I used VLC to figure out what the contents of the original source video file were.  Did you know that the resolution of the LeapPad and LeapPad screens are 480×272?  Weird resolution.  And the original video file was a 320×240 file that was squished left to right so that when it was stretched for the 480 wide screen, it looked right.  Seems like a lot of trouble.  I found it hard to get the video size right.  The video I was using was HD which I converted to 400×300 and then in VideoInfo, I had it set to display at 480×300 on the LeapPad which somehow worked out to filling up the screen with the right aspect ratio – lots of trial and error to get that right.  I have also found that volume on many applications on the LeapPad is too low to be easily heard in noisy environments and the converted TV shows were especially quiet so I found I could boost the volume during the conversion process.  So here is my command for converting an HD recording file from MythTV to a format to be used by the application that I happened to choose as a basis for copying:

ffmpeg -i <inputfilename>.mpg -acodec libvorbis -ac 2 -ab 56k -ar 16000 -vol 1792 -r 15 -s 400x300 <outputfilename>.ogg

(Thanks to Paul Rouget for the post about ffmpeg for OGG files.)

Once you have your video file, your icon file, your 2 updated json files, and your updated meta.inf file, you can proceed with uploading these 4 new files and the App.so and previewimage.png file copied from the original.  That gives you a full application that the LeapPad can use.  And it shows up as a new application in the LeapPad screen with a “new” label on it, just like a real application.  Of course, you can replace the video file with one of the same name and length and specs without needing to change anything else, so you can use the same command for conversion and just get a new episode into the application any time you want.


The video on the LeapPad can get really out of sync with the audio. I’m sure it has to do with the transcoding but that doesn’t make me feel better about it. I tried a couple of things to no avail. I tried the -itsoffset and the -ss tricks and both of them did something but they both also produced wildly unpredictable results. And on top of that, when testing on Ubuntu before uploading to LeapPad, I found that VLC worked nicely all of the time whereas mplayer more closely mimicked the results of the LeapPad. But even the same video on the LeapPad would sometimes play better than other times. So I am going to chalk it up to lousy video player with a lousy video format and just walk away. For posterity, these are the two commands I tried (with probably a couple dozen variations from these base attempts):

ffmpeg -i -itsoffset 4.7 -i -map 0:0 -map 1:1 -acodec copy -vcodec copy
ffmpeg -ss 0.0 -i -ss 4.7 -i -map 0:0 -map 1:1 -acodec libvorbis -ac 2 -ab 56k -ar 16000 -vol 1792 -s 400x300

The first command attempts to modify the file that has already been created, which is preferable since you can repeatedly execute the command. But it doesn’t work well with negative numbers. So you have to switch the mapping and that’s where things got inconsistent – or they were too consistent, always giving me the same result even when I varied the input. I tried this same technique embedded in the conversion because some reports are that the itsoffset doesn’t work well when just copying. But same inconsistent results.


6 Responses to “Loading Video to LeapPad Explorer”

  1. kevin says:

    Thank you! This was a very well written post, helped me understand the architecture of my LeapPad Ultra.. I got videos and SWF games on there. Very happy 😀

  2. Cindy says:

    Hi Ken, I’m a mom and I have been looking for how to crack the leappad as well. Your process looks complicated to me.. isn’t there a link that I could download, the software that allows me to do this (and not change and hack code)….Please help “) I would also love to know how I can download the catridges that I have onto the devices… as well as disguising my location as I fall under the “other countries” location which means I can’t get Most Disney apps

    • Ken says:

      Yeah, this was complicated. I spent way more time on it than I had planned to. And in the end, it was really tedious to load my own video. I wouldn’t recommend spending much time on it. In fact, it was only a year or so after I worked so hard to hack it that we replaced the LeapPads with Kindle Fire tablets and now the kids have a lot more flexibility without any of the arbitrary limits of the LeapPad.

      As for disguising your location, that’s an interesting one. I suspect, though, that the limitation there is based on the computer you are using to download the apps. I don’t think it would be in the device. So perhaps you could use one of those World VPNs so you could mask the location?

  3. Jennifer says:

    Do you know anything about getting videos and photos off of the leaped explorer? I’m nearly in tears. Their software sucks. And I could only transfer to my computer apparently “new” items that were never transferred before … despite the fact that I no longer have the computer they must have originally been connected to. They are no longer in the connect software. I can’t find any other way to get them off of the Explorer. There are old videos and pictures of my kids from when they were 3. Now that they graduated to iPads (age 8) entirely, I’m getting ready to give these away but won’t until I get the videos of my kids off of it.

    • Ken says:

      The Leap software does really really suck, you have that right. Or at least the old version of their software that I saw at the time I did this did. Maybe there is new software for newer hardware. But at least the version I used had an embedded flash within a Mac application? Clunky, dumb, hard to maintain, slow, etc..

      And I know what you mean about wanting to get the videos off before passing the devices along – I did the same thing. But I didn’t get stuck with the missing file problem that you have.

      You are saying that you can see files on the Leap device that you can’t see on the computer in the Leap software? Try another computer perhaps? I would have thought that “new” was defined by the computer attached to the Leap, not by the Leap device itself so maybe another computer will trigger that.

      Another long shot would be calling Leap support. I know I tried to reach them once before and it was a bad experience, but if you are stuck, that might be worth the trouble. At least then you’d know. Just be sure when working with them that they don’t have you do something like reset your device that would end up clearing out the files you are trying to archive.

      But if you do need to connect to the device using something other than Leap software, something like OpenLFConnect linked in the post above at Git could work for you. The idea is that rather than using the sucky software, you can connect to the Leap like another computer and then run commands to communicate with it. It’s a raw environment though, and it takes some geeky stuff to get even to that point. Then you’d need to dig around in the internal file structure to find the files you wanted. In other words, if you are a power geek and you have time to kill, then the info in the post above may help you find what you want.

      If you aren’t a power geek and don’t have time to kill, then maybe you can find somebody local to you that is that you could pay to do the work? You might be able to describe the situation and refer to this post and maybe find somebody who has the time and skills to do it?

      Hopefully that helps and please write back to let me know if you succeeded.

Leave a Reply

Human Verification *

All content Copyright © Katharsys LLC Created with Wordpress, Theme "Synergy" by Pagelines modified by Katharsys LLC