JSONProxy

Before I begin with what this is actually about, some words for those who aren’t familiar with AniDB, MyAnimelist, XDCC-Bots or at least one of those:
AniDB and MyAnimelist are both websites that let you create a list of anime titles. In the case of AniDB the focus lies on the anime episodes you have stored somewhere, MyAnimelist cares more about what episodes you saw.
XDCC bots are IRC bots that send you files on demand. They are a common distribution method for fansubbed anime and offer so called packlists, where the list all the files they offer.

Now to the real story: I’m a user of both AniDB and MyAnimelist, but I only maintain a list on the latter. I use AniDB of keeping up to date with newly released episodes of airing series. The problem is, that if you only want to see notifies for new releases of certain subgroups, you have to add episodes of the respective anime from that subgroup to your list. I, however, don’t maintain a list on that site, so I’d get a ton of unnecessary notifies.

Now, since I get all my new episodes from XDCC bots I though I could make use of simply parsing their packlists, which was the first thing I did: write a JSON file with all neccessary info, a small PHP script to parse the packlist and a minimalistic site to display the output. With that I always had an up to date list of all released episodes of the series I watch and only from the subgroup I want them from.
The problem with that approach was, that I had to memorize the number of the last episode I saw for every of those anime. So I had to come up with something different. Since MyAnimelist always has the information on which episode of which anime I watched last it seemed natural to use that. Also, since I open the page with my list on it several times a day, it seemed to be a good idea to simply include the information about new episodes there.

So I wanted to write a userscript that should obtain the information from both my JSON file and the packlists, look at the site itself and, if there were any episodes released that I hadn’t seen, inform me about that … well, same origin policy says no. The userscript is written in JavaScript and common browsers won’t let it perform an XMLHttpRequest for stuff stored on other servers than the one the site you are viewing when the script is executed is hosted on.
I had to find a workaround and I though of JSONP, a method where you create a new script tag in the head of the site with the remote thing you want to access as the src attribute of that tag. Problem is, that remote thing should be a string with a JavaScript method call, so that you actually can use what you got from the remote server. But I wanted to access packlists I had no control over. It then came to my mind, that I simply could write a PHP script that would access and parse the packlist and return a JSONP string — a JSONP proxy you could say. ^^ And then access this with my userscript.

This is what I ended up doning. :) My JSONProxy parses packlists based on my listing of urls, titles and subgroups and my userscript (actual code) uses that to inform me about new episodes. :3

I guess it would be quite easy to write a universal JSONProxy which takes a get parameter (the url to the document one wants to access) and returns a JavaScript method call with the whole site as a parameter. What I’m not sure about is, wether or not there are regulations on the src attribute of script tags and how messy the escaping of whole websites for the JS method call would get. ^^
Oh and by the way: since the actual request to the site you do not control (in my case the packlists) is not performed by the browser the JS is running on but by the PHP script on your server this method doesn’t even violate the same origin policy more than JSONP itself — it’s just a handy way to access data from other servers when you write userscripts. :)

2012-07-19