diff options
author | Drew DeVault <sir@cmpwn.com> | 2013-08-24 04:27:14 -0600 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2013-08-24 04:27:14 -0600 |
commit | b278aa236487c03213ad8c7a98779089820b95e8 (patch) | |
tree | 17bb08d65695d1cd797b899198caca7fd299183b /_posts/2013-08-24-Music-syncing-on-Android.md | |
parent | 24f92865b9941d5896ba158e515c838c3f3afff7 (diff) |
Wrote post about android syncing
Diffstat (limited to '_posts/2013-08-24-Music-syncing-on-Android.md')
-rw-r--r-- | _posts/2013-08-24-Music-syncing-on-Android.md | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/_posts/2013-08-24-Music-syncing-on-Android.md b/_posts/2013-08-24-Music-syncing-on-Android.md new file mode 100644 index 0000000..5d2cead --- /dev/null +++ b/_posts/2013-08-24-Music-syncing-on-Android.md @@ -0,0 +1,111 @@ +--- +title: Custom Music Syncing on Android +layout: post +--- + +I have an HTC One, with CyanogenMod installed. I usually use Spotify, but I've been wanting to move away from it for a while. +The biggest thing keeping me there was the ease of syncing up with my phone - I added music on my PC and it just showed up +on my phone. + +So, I finally decided to make it work on my phone without Spotify. You might have success if you aren't using CyanogenMod, +but you definitely need to be rooted and you need to access a root shell on your phone. I was using `adb shell` to start with, +but it has poor terminal emulation. Instead, I ended up installing an SSH daemon on the phone and just using that. Easier to +use vim in such an enviornment. + +The end result is that a cronjob kicks off each hour on my phone and runs a script that uses rsync to sync up my phone's music +with my desktop's music. That's another thing - a prerequisite of this working is that you have to expose your music to the +outside world on an SSH server somewhere. + +I'll tell you how I got it working, then you can see if it works for you. It might take some effort on your part to tweak +these instructions to fit your requirements. + +## Sanity checks + +Get into your phone's shell and make sure you have basic things installed. You'll need to make sure you have: + +* bash +* cron +* ssh +* rsync + +If you don't have them, you can probably get them by installing busybox. + +## Setting up SSH + +We need to generate a key. I tried using ssh-keygen before, but it had problems with rsync on Android. Instead, we use +dropbearkey. Generate your key with `dropbearkey -t rsa -f /data/.ssh/id_rsa`. You'll see the public key echoed to stdout. +It's not saved anywhere for you, so grab it out of your shell and put it somewhere - namely, in the authorized_keys file +on the SSH server you plan to pull music from. + +At this point, you can probably SSH into the server you want to pull from. Run `ssh -i /data/.ssh/id_rsa <your server here>` +to double check. Note that this isn't just for fun - you need to do this to get your server into known_hosts, so we can +non-interactively access it. + +## Making Android more sane + +Now that this is working, we need to clean up a little before cron will run right. Android is only a "Linux" system in the +sense that `uname` outputs "Linux". It grossly ignores the FHS and you need to fix it a little. Figure out how to do a +nice init.d script on your phone. For my CyanogenMod install, I can add scripts to `/data/local/userlocal.d/` and they'll +be run at boot. Here's my little script for making Android a little more sane: + +{% highlight bash %} +#!/system/bin/sh +# Making /system rw isn't strictly needed +mount -o remount,rw /system +mount -o remount,rw / +ln -s /data/var /var +ln -s /system/bin /bin +ln -s /data/.ssh /.ssh +crond +{% endhighlight %} + +## Update script and initial import + +The following is the script we'll use to update your phone's music library. + +{% highlight bash %} +#!/system/xbin/bash +# Syncs music between a remote computer and this phone +RHOST=<remote hostname> +EHOST=<fallback, I use this for connecting from outside my LAN> +RPORT=22 +RUSER=<username> +ID=/data/.ssh/id_rsa +RPATH=/path/to/your/remote/music +# Omit the final directory. On my setup, this goes to /sdcard/Music, and my remote is /home/sircmpwn/Music +LPATH=/sdcard + +echo $(date) >> /var/log/update-music.log + +rsync -ruvL --delete --rsh="ssh -p $RPORT -i $ID" $RUSER@$RHOST:$RPATH $LPATH >> /var/log/update-music-rsync-so.log 2>&1 +if [[ $? != 0 ]]; then + rsync -ruvL --delete --rsh="ssh -p $RPORT -i $ID" $RUSER@$EHOST:$RPATH $LPATH >> /var/log/update-music-rsync-so.log 2>&1 +fi +{% endhighlight %} + +Save this script to `/data/updateMusic`, make it executable with `chmod +x /data/updateMusic`, then run the initial import +with `/data/updateMusic`. After a while, you'll have all your computer's music on your phone. Now, we just need to make it +update automatically. + +Note: I set up a couple of logs for you. `/var/log/update-music.log` has the timestamp of every time it did an update. Also, +`/var/log/update-music-rsync-so.log` has the output of rsync from each run. + +## Cron + +Finally, we need to set up a cronjob. If you followed the instructions so far (and if you're lucky), you should have everything +ready for cron. The biggest pain in my ass was getting cron to coorperate, but the init script earlier should take care of +that. Run `crontab -e` and write your crontab: + + 0 * * * * /data/updateMusic + +Nice and simple. Your phone will now sync up your music every hour, on the hour, with your home computer. Here are some +possible points for improvement: + +* Check wlan0 and only sync if it's up +* Log cron somewhere +* Alter the update script to do a little bit better about the "fallback" +* Sync more than just music + +After all of this, I now have a nice setup that syncs music to my phone so I can listen to it with Apollo. I might switch +away from Apollo, though, it's pretty buggy. [Let me know](mailto:sir@cmpwn.com) if you can suggest an alternative music +player, or if you get stuck working through this procedure yourself. |