package jianshu.io.app.model.datapool; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import jianshu.io.app.model.CollectionUpdateItem; import jianshu.io.app.model.UnknownUpdateItem; import jianshu.io.app.model.UpdateItem; import jianshu.io.app.model.UserCommentUpdateItem; import jianshu.io.app.model.UserSubscribeUpdateItem; import jianshu.io.app.model.UserUpdateArticleUpdateItem; import jianshu.io.app.model.UserUpdateFollowUpdateItem; import jianshu.io.app.model.UserUpdateJoinUpdateItem; import jianshu.io.app.model.UserUpdateLikeUpdateItem; /** * Created by Administrator on 2014/6/7. */ public class TimeStreamDataPool extends DataPool { public static final String TIMELINE_URL = "http://jianshu.io/timeline"; protected final static String LOAD_MORE_SELECTOR = "div.load-more button"; protected final static String CURRENT_USER_SLUG = "meta#current_user_slug"; public TimeStreamDataPool() { super(TIMELINE_URL); } protected void onRefresh() { } @Override protected Object[] getItems(Document doc) throws LoginRequiredException { return getUpdateItems(doc); } private UpdateItem[] getUpdateItems(Document doc) { Elements loadMoreElements = doc.select(LOAD_MORE_SELECTOR); if (loadMoreElements.size() > 0) { mLoadMoreUrl = getHtmlUrl(loadMoreElements.get(0).attr("data-url")); } else { mLoadMoreUrl = null; mIsAtTheEnd = true;} UpdateItem[] result = null; Elements timelineEls = doc.select("ul.timeline-content li"); result = new UpdateItem[timelineEls.size()]; for (int i = 0; i < timelineEls.size(); i++) { Element timelineEl = timelineEls.get(i); String avatarUrl = parseAvatarUrl(timelineEl); String time = parseMetaTime(timelineEl); if (timelineEl.hasClass("user-update")) { if (timelineEl.hasClass("article")) { result[i] = parseUserUpdateArticle(timelineEl, avatarUrl, time); } else { Element span = timelineEl.select("span").get(0); String action = span.text(); Elements metaEls = span.select("a"); Element userMetaEl = metaEls.get(0); String user = userMetaEl.text(); if(action.contains(user + " 加入简书")) { result[i] = new UserUpdateJoinUpdateItem(user, action, "", avatarUrl, time); } else { Element targetMetaEl = metaEls.get(1); String target = targetMetaEl.text(); if(action.contains(user + " 喜欢")) { String url = "http://jianshu.io" + targetMetaEl.attr("href"); result[i] = new UserUpdateLikeUpdateItem(url, user, action, target, avatarUrl, time); } else if(action.contains(user + " 关注")) { result[i] = new UserUpdateFollowUpdateItem(user, action, target, avatarUrl, time); } else if(action.contains(user + " 订阅")) { result[i] = new UserSubscribeUpdateItem(user, action, target, avatarUrl, time); } } } } else if (timelineEl.hasClass("comment")) { Element metaSpan = timelineEl.select("div.meta span").get(0); Elements metaEls = metaSpan.select("a"); Element userMetaEl = metaEls.get(0); String user = userMetaEl.text(); Element targetMetaEl = metaEls.get(1); String target = targetMetaEl.text(); result[i] = parseComment(timelineEl, avatarUrl, time, user, target); } else if(timelineEl.hasClass("collection-update")) { Element span = timelineEl.select("span").get(0); String action = span.text(); Elements metaEls = span.select("a"); Element userMetaEl = metaEls.get(0); String user = userMetaEl.text(); Element targetMetaEl = metaEls.get(1); String target = targetMetaEl.text(); String url = "http://jianshu.io" + targetMetaEl.attr("href"); result[i] = new CollectionUpdateItem(url, user, action, target, time); } else { result[i] = parseUnknownUpdateItem(timelineEl, avatarUrl, time); } } return result; } private UpdateItem parseComment(Element timelineEl, String avatarUrl, String time, String user, String target) { Element commentContentEl = timelineEl.select("p.comment-content").get(0); String commentContent = extracContent(commentContentEl.text()); Element commentUrlEl = timelineEl.select("a.reply").get(0); String url = "http://jianshu.io" + commentUrlEl.attr("href"); int index = url.indexOf("?"); url = url.substring(0, index); return new UserCommentUpdateItem(url, commentContent, user, target, avatarUrl, time); } private String extracContent(String text) { return text.replace("\"", "").trim(); } private UpdateItem parseUnknownUpdateItem(Element timelineEl, String avatarUrl, String time) { return new UnknownUpdateItem(timelineEl.text(), avatarUrl, time); } private UpdateItem parseUserUpdateArticle(Element timelineEl, String avatarUrl, String time) { Element articleContentEl = timelineEl.select("div.article-content").get(0); Element titleEl = articleContentEl.select("a.title").get(0); String title = titleEl.text(); String url = "http://jianshu.io" + titleEl.attr("href"); Element contentEl = articleContentEl.select("p").get(0); String content = contentEl.text(); return new UserUpdateArticleUpdateItem(title, content, url, avatarUrl, time); } private String getHtmlUrl(String url) { String[] fragments = url.split("\\?"); return TIMELINE_URL + ".html?" + fragments[1]; } private String parseMetaTime(Element timelineEl) { Elements timeEls = timelineEl.select("div.meta time"); if(timeEls.size() > 0) { return timeEls.get(0).text(); } return null; } private String parseAvatarUrl(Element timelineEl) { Elements imgEls = timelineEl.select("div.avatar img"); if(imgEls.size() > 0) { return imgEls.get(0).attr("src"); } else { return null; } } }