Skip to content

Instantly share code, notes, and snippets.

@voldyman
Created April 16, 2013 07:45
Show Gist options
  • Save voldyman/5394153 to your computer and use it in GitHub Desktop.
Save voldyman/5394153 to your computer and use it in GitHub Desktop.
manga comic downloader
namespace MangaFoxParser {
//Delegate for afte comic data is received
public delegate void ComicDataCB (List<Comic?> comic);
public class ComicDataTask {
public unowned ComicDataManager manager;
public ComicDataCB callback;
public ComicDataTask (ComicDataManager manager) {
this.manager = manager;
}
public void got_message (Soup.Session session, Soup.Message msg) {
if (msg.status_code == Soup.KnownStatusCode.OK) {
List<Comic?> c_data = manager.parse_comic_data ((string) msg.response_body.data);
callback (c_data);
}
manager.task_list.remove (this);
}
}
public struct Comic {
public int rank;
public string title;
public string image;
}
public class ComicDataManager {
Soup.SessionAsync session;
public List<ComicDataTask> task_list;
// Methods
public ComicDataManager () {
session = new Soup.SessionAsync ();
task_list = new List<ComicDataTask>();
}
public List<Comic?> parse_comic_data (string data) {
List<Comic?> coms = new List<Comic?> ();
/*try {
var parser = new Json.Parser ();
parser.load_from_data (data, -1);
var root_object = parser.get_root ().dup_object ();
//var memebers = root_object.get_members ();
root_object.foreach_member ((obj, mem_name, mem_node) => {
print (mem_name+"\n");
});
} catch (Error e) {
print ("An error occured: %s".printf (e.message));
}*/
var list_regex = new Regex ("""<ul class=".*">((.*?(\R))+.*?)</ul>(\R)""");
MatchInfo list_match_info;
list_regex.match (data.replace ("\n", " "), 0, out list_match_info);
// print ("Found "+list_match_info.get_match_count ().to_string ()+"\n");
var list = list_match_info.fetch (1);
var image_regex = new Regex ("""<a class="manga_img" href="(.*?)".*?>""");
MatchInfo image_match_info;
image_regex.match (data, 0, out image_match_info);
print ("Found "+image_match_info.get_match_count ().to_string ()+"\n");
print (image_match_info.fetch(1));
return coms.copy ();
}
public void get_comic_data (owned ComicDataCB callback) {
var task = new ComicDataTask (this);
task.manager = this;
task.callback = (owned) callback;
task_list.append (task);
//var uri = "http://apify.heroku.com/api/directory.json";
var uri = "http://mangafox.me/directory/";
var message = new Soup.Message ("GET", uri);
session.queue_message (message, task.got_message);
}
private Comic new_comic (string name, string img, string rank_s) {
rank_s.replace ("st", "");
return Comic () {
rank = int.parse (rank_s),
title = name,
image = img
};
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment