Search in sources :

Example 16 with GalleryInfo

use of com.hippo.ehviewer.client.data.GalleryInfo in project EhViewer by seven332.

the class FavoritesScene method onItemClick.

@Override
@Implemented(EasyRecyclerView.OnItemClickListener.class)
public boolean onItemClick(EasyRecyclerView parent, View view, int position, long id) {
    if (mDrawerLayout != null && mDrawerLayout.isDrawerOpen(Gravity.RIGHT)) {
        // Skip if in search mode
        if (mRecyclerView != null && mRecyclerView.isInCustomChoice()) {
            return true;
        }
        if (mUrlBuilder == null || mHelper == null) {
            return true;
        }
        // Local favorite position is 0, All favorite position is 1, so position - 2 is OK
        int newFavCat = position - 2;
        // Check is the same
        if (mUrlBuilder.getFavCat() == newFavCat) {
            return true;
        }
        // Ensure outOfCustomChoiceMode to avoid error
        if (mRecyclerView != null) {
            mRecyclerView.isInCustomChoice();
        }
        exitSearchMode(true);
        mUrlBuilder.setKeyword(null);
        mUrlBuilder.setFavCat(newFavCat);
        updateSearchBar();
        mHelper.refresh();
        closeDrawer(Gravity.RIGHT);
    } else {
        if (mRecyclerView != null && mRecyclerView.isInCustomChoice()) {
            mRecyclerView.toggleItemChecked(position);
        } else if (mHelper != null) {
            GalleryInfo gi = mHelper.getDataAtEx(position);
            if (gi == null) {
                return true;
            }
            Bundle args = new Bundle();
            args.putString(GalleryDetailScene.KEY_ACTION, GalleryDetailScene.ACTION_GALLERY_INFO);
            args.putParcelable(GalleryDetailScene.KEY_GALLERY_INFO, gi);
            Announcer announcer = new Announcer(GalleryDetailScene.class).setArgs(args);
            View thumb;
            if (null != (thumb = view.findViewById(R.id.thumb))) {
                announcer.setTranHelper(new EnterGalleryDetailTransaction(thumb));
            }
            startScene(announcer);
        }
    }
    return true;
}
Also used : Announcer(com.hippo.scene.Announcer) Bundle(android.os.Bundle) GalleryInfo(com.hippo.ehviewer.client.data.GalleryInfo) EasyRecyclerView(com.hippo.easyrecyclerview.EasyRecyclerView) ShowcaseView(com.github.amlcurran.showcaseview.ShowcaseView) View(android.view.View) RecyclerView(androidx.recyclerview.widget.RecyclerView) TextView(android.widget.TextView) SuppressLint(android.annotation.SuppressLint) Point(android.graphics.Point) Implemented(com.hippo.annotation.Implemented)

Example 17 with GalleryInfo

use of com.hippo.ehviewer.client.data.GalleryInfo in project EhViewer by seven332.

the class GalleryApiParser method parse.

public static void parse(String body, List<GalleryInfo> galleryInfoList) throws JSONException {
    JSONObject jo = new JSONObject(body);
    JSONArray ja = jo.getJSONArray("gmetadata");
    for (int i = 0, length = ja.length(); i < length; i++) {
        JSONObject g = ja.getJSONObject(i);
        long gid = g.getLong("gid");
        GalleryInfo gi = getGalleryInfoByGid(galleryInfoList, gid);
        if (gi == null) {
            continue;
        }
        gi.title = ParserUtils.trim(g.getString("title"));
        gi.titleJpn = ParserUtils.trim(g.getString("title_jpn"));
        gi.category = EhUtils.getCategory(g.getString("category"));
        gi.thumb = EhUtils.handleThumbUrlResolution(g.getString("thumb"));
        gi.uploader = g.getString("uploader");
        gi.posted = ParserUtils.formatDate(ParserUtils.parseLong(g.getString("posted"), 0) * 1000);
        gi.rating = NumberUtils.parseFloatSafely(g.getString("rating"), 0.0f);
        // tags
        JSONArray tagJa = g.getJSONArray("tags");
        int tagLength = tagJa.length();
        String[] tags = new String[tagLength];
        for (int j = 0; j < tagLength; j++) {
            tags[j] = tagJa.getString(j);
        }
        gi.simpleTags = tags;
        gi.pages = NumberUtils.parseIntSafely(g.getString("filecount"), 0);
        gi.generateSLang();
    }
}
Also used : JSONObject(org.json.JSONObject) JSONArray(org.json.JSONArray) GalleryInfo(com.hippo.ehviewer.client.data.GalleryInfo)

Example 18 with GalleryInfo

use of com.hippo.ehviewer.client.data.GalleryInfo in project EhViewer by seven332.

the class GalleryListParser method parse.

public static Result parse(@NonNull String body) throws Exception {
    Result result = new Result();
    Document d = Jsoup.parse(body);
    try {
        Element ptt = d.getElementsByClass("ptt").first();
        Elements es = ptt.child(0).child(0).children();
        result.pages = Integer.parseInt(es.get(es.size() - 2).text().trim());
        Element e = es.get(es.size() - 1);
        if (e != null) {
            e = e.children().first();
            if (e != null) {
                String href = e.attr("href");
                Matcher matcher = PATTERN_NEXT_PAGE.matcher(href);
                if (matcher.find()) {
                    result.nextPage = NumberUtils.parseIntSafely(matcher.group(1), 0);
                }
            }
        }
    } catch (Throwable e) {
        ExceptionUtils.throwIfFatal(e);
        result.noWatchedTags = body.contains("<p>You do not have any watched tags");
        if (body.contains("No hits found</p>")) {
            result.pages = 0;
            // noinspection unchecked
            result.galleryInfoList = Collections.EMPTY_LIST;
            return result;
        } else if (d.getElementsByClass("ptt").isEmpty()) {
            result.pages = 1;
        } else {
            result.pages = Integer.MAX_VALUE;
        }
    }
    try {
        Element itg = d.getElementsByClass("itg").first();
        Elements es;
        if ("table".equalsIgnoreCase(itg.tagName())) {
            es = itg.child(0).children();
        } else {
            es = itg.children();
        }
        List<GalleryInfo> list = new ArrayList<>(es.size());
        // First one is table header, skip it
        for (int i = 0; i < es.size(); i++) {
            GalleryInfo gi = parseGalleryInfo(es.get(i));
            if (null != gi) {
                list.add(gi);
            }
        }
        if (list.isEmpty()) {
            throw new ParseException("No gallery", body);
        }
        result.galleryInfoList = list;
    } catch (Throwable e) {
        ExceptionUtils.throwIfFatal(e);
        e.printStackTrace();
        throw new ParseException("Can't parse gallery list", body);
    }
    return result;
}
Also used : Matcher(java.util.regex.Matcher) Element(org.jsoup.nodes.Element) GalleryInfo(com.hippo.ehviewer.client.data.GalleryInfo) ArrayList(java.util.ArrayList) ParseException(com.hippo.ehviewer.client.exception.ParseException) Document(org.jsoup.nodes.Document) Elements(org.jsoup.select.Elements)

Example 19 with GalleryInfo

use of com.hippo.ehviewer.client.data.GalleryInfo in project EhViewer by seven332.

the class GalleryListParser method parseGalleryInfo.

private static GalleryInfo parseGalleryInfo(Element e) {
    GalleryInfo gi = new GalleryInfo();
    // Title, gid, token (required), tags
    Element glname = JsoupUtils.getElementByClass(e, "glname");
    if (glname != null) {
        Element a = JsoupUtils.getElementByTag(glname, "a");
        if (a == null) {
            Element parent = glname.parent();
            if (parent != null && "a".equals(parent.tagName())) {
                a = parent;
            }
        }
        if (a != null) {
            GalleryDetailUrlParser.Result result = GalleryDetailUrlParser.parse(a.attr("href"));
            if (result != null) {
                gi.gid = result.gid;
                gi.token = result.token;
            }
        }
        Element child = glname;
        Elements children = glname.children();
        while (children.size() != 0) {
            child = children.get(0);
            children = child.children();
        }
        gi.title = child.text().trim();
        Element tbody = JsoupUtils.getElementByTag(glname, "tbody");
        if (tbody != null) {
            ArrayList<String> tags = new ArrayList<>();
            GalleryTagGroup[] groups = GalleryDetailParser.parseTagGroups(tbody.children());
            for (GalleryTagGroup group : groups) {
                for (int j = 0; j < group.size(); j++) {
                    tags.add(group.groupName + ":" + group.getTagAt(j));
                }
            }
            gi.simpleTags = tags.toArray(new String[tags.size()]);
        }
    }
    if (gi.title == null) {
        return null;
    }
    // Category
    gi.category = EhUtils.UNKNOWN;
    Element ce = JsoupUtils.getElementByClass(e, "cn");
    if (ce == null) {
        ce = JsoupUtils.getElementByClass(e, "cs");
    }
    if (ce != null) {
        gi.category = EhUtils.getCategory(ce.text());
    }
    // Thumb
    Element glthumb = JsoupUtils.getElementByClass(e, "glthumb");
    if (glthumb != null) {
        Element img = glthumb.select("div:nth-child(1)>img").first();
        if (img != null) {
            // Thumb size
            Matcher m = PATTERN_THUMB_SIZE.matcher(img.attr("style"));
            if (m.find()) {
                gi.thumbWidth = NumberUtils.parseIntSafely(m.group(2), 0);
                gi.thumbHeight = NumberUtils.parseIntSafely(m.group(1), 0);
            } else {
                Log.w(TAG, "Can't parse gallery info thumb size");
                gi.thumbWidth = 0;
                gi.thumbHeight = 0;
            }
            // Thumb url
            String url = img.attr("data-src");
            if (TextUtils.isEmpty(url)) {
                url = img.attr("src");
            }
            if (TextUtils.isEmpty(url)) {
                url = null;
            }
            gi.thumb = EhUtils.handleThumbUrlResolution(url);
        }
        // Pages
        Element div = glthumb.select("div:nth-child(2)>div:nth-child(2)>div:nth-child(2)").first();
        if (div != null) {
            Matcher matcher = PATTERN_PAGES.matcher(div.text());
            if (matcher.find()) {
                gi.pages = NumberUtils.parseIntSafely(matcher.group(1), 0);
            }
        }
    }
    // Try extended and thumbnail version
    if (gi.thumb == null) {
        Element gl = JsoupUtils.getElementByClass(e, "gl1e");
        if (gl == null) {
            gl = JsoupUtils.getElementByClass(e, "gl3t");
        }
        if (gl != null) {
            Element img = JsoupUtils.getElementByTag(gl, "img");
            if (img != null) {
                // Thumb size
                Matcher m = PATTERN_THUMB_SIZE.matcher(img.attr("style"));
                if (m.find()) {
                    gi.thumbWidth = NumberUtils.parseIntSafely(m.group(2), 0);
                    gi.thumbHeight = NumberUtils.parseIntSafely(m.group(1), 0);
                } else {
                    Log.w(TAG, "Can't parse gallery info thumb size");
                    gi.thumbWidth = 0;
                    gi.thumbHeight = 0;
                }
                gi.thumb = EhUtils.handleThumbUrlResolution(img.attr("src"));
            }
        }
    }
    // Posted
    gi.favoriteSlot = -2;
    Element posted = e.getElementById("posted_" + gi.gid);
    if (posted != null) {
        gi.posted = posted.text().trim();
        gi.favoriteSlot = parseFavoriteSlot(posted.attr("style"));
    }
    if (gi.favoriteSlot == -2) {
        gi.favoriteSlot = EhDB.containLocalFavorites(gi.gid) ? -1 : -2;
    }
    // Rating
    Element ir = JsoupUtils.getElementByClass(e, "ir");
    if (ir != null) {
        gi.rating = NumberUtils.parseFloatSafely(parseRating(ir.attr("style")), -1.0f);
        // TODO The gallery may be rated even if it doesn't has one of these classes
        gi.rated = ir.hasClass("irr") || ir.hasClass("irg") || ir.hasClass("irb");
    }
    // Uploader and pages
    Element gl = JsoupUtils.getElementByClass(e, "glhide");
    int uploaderIndex = 0;
    int pagesIndex = 1;
    if (gl == null) {
        // For extended
        gl = JsoupUtils.getElementByClass(e, "gl3e");
        uploaderIndex = 3;
        pagesIndex = 4;
    }
    if (gl != null) {
        Elements children = gl.children();
        if (children.size() > uploaderIndex) {
            Element a = children.get(uploaderIndex).children().first();
            if (a != null) {
                gi.uploader = a.text().trim();
            }
        }
        if (children.size() > pagesIndex) {
            Matcher matcher = PATTERN_PAGES.matcher(children.get(pagesIndex).text());
            if (matcher.find()) {
                gi.pages = NumberUtils.parseIntSafely(matcher.group(1), 0);
            }
        }
    }
    // For thumbnail
    Element gl5t = JsoupUtils.getElementByClass(e, "gl5t");
    if (gl5t != null) {
        Element div = gl5t.select("div:nth-child(2)>div:nth-child(2)").first();
        if (div != null) {
            Matcher matcher = PATTERN_PAGES.matcher(div.text());
            if (matcher.find()) {
                gi.pages = NumberUtils.parseIntSafely(matcher.group(1), 0);
            }
        }
    }
    gi.generateSLang();
    return gi;
}
Also used : GalleryTagGroup(com.hippo.ehviewer.client.data.GalleryTagGroup) Matcher(java.util.regex.Matcher) Element(org.jsoup.nodes.Element) GalleryInfo(com.hippo.ehviewer.client.data.GalleryInfo) ArrayList(java.util.ArrayList) Elements(org.jsoup.select.Elements)

Example 20 with GalleryInfo

use of com.hippo.ehviewer.client.data.GalleryInfo in project EhViewer by seven332.

the class DownloadService method handleIntent.

private void handleIntent(Intent intent) {
    String action = null;
    if (intent != null) {
        action = intent.getAction();
    }
    if (ACTION_START.equals(action)) {
        GalleryInfo gi = intent.getParcelableExtra(KEY_GALLERY_INFO);
        String label = intent.getStringExtra(KEY_LABEL);
        if (gi != null && mDownloadManager != null) {
            mDownloadManager.startDownload(gi, label);
        }
    } else if (ACTION_START_RANGE.equals(action)) {
        LongList gidList = intent.getParcelableExtra(KEY_GID_LIST);
        if (gidList != null && mDownloadManager != null) {
            mDownloadManager.startRangeDownload(gidList);
        }
    } else if (ACTION_START_ALL.equals(action)) {
        if (mDownloadManager != null) {
            mDownloadManager.startAllDownload();
        }
    } else if (ACTION_STOP.equals(action)) {
        long gid = intent.getLongExtra(KEY_GID, -1);
        if (gid != -1 && mDownloadManager != null) {
            mDownloadManager.stopDownload(gid);
        }
    } else if (ACTION_STOP_CURRENT.equals(action)) {
        if (mDownloadManager != null) {
            mDownloadManager.stopCurrentDownload();
        }
    } else if (ACTION_STOP_RANGE.equals(action)) {
        LongList gidList = intent.getParcelableExtra(KEY_GID_LIST);
        if (gidList != null && mDownloadManager != null) {
            mDownloadManager.stopRangeDownload(gidList);
        }
    } else if (ACTION_STOP_ALL.equals(action)) {
        if (mDownloadManager != null) {
            mDownloadManager.stopAllDownload();
        }
    } else if (ACTION_DELETE.equals(action)) {
        long gid = intent.getLongExtra(KEY_GID, -1);
        if (gid != -1 && mDownloadManager != null) {
            mDownloadManager.deleteDownload(gid);
        }
    } else if (ACTION_DELETE_RANGE.equals(action)) {
        LongList gidList = intent.getParcelableExtra(KEY_GID_LIST);
        if (gidList != null && mDownloadManager != null) {
            mDownloadManager.deleteRangeDownload(gidList);
        }
    } else if (ACTION_CLEAR.equals(action)) {
        clear();
    }
    checkStopSelf();
}
Also used : GalleryInfo(com.hippo.ehviewer.client.data.GalleryInfo) LongList(com.hippo.yorozuya.collect.LongList)

Aggregations

GalleryInfo (com.hippo.ehviewer.client.data.GalleryInfo)25 ArrayList (java.util.ArrayList)7 AlertDialog (androidx.appcompat.app.AlertDialog)6 SuppressLint (android.annotation.SuppressLint)5 Bundle (android.os.Bundle)5 View (android.view.View)5 TextView (android.widget.TextView)5 Activity (android.app.Activity)4 Context (android.content.Context)4 DialogInterface (android.content.DialogInterface)4 Intent (android.content.Intent)4 RecyclerView (androidx.recyclerview.widget.RecyclerView)4 DownloadInfo (com.hippo.ehviewer.dao.DownloadInfo)4 MainActivity (com.hippo.ehviewer.ui.MainActivity)4 Point (android.graphics.Point)3 Drawable (android.graphics.drawable.Drawable)3 AdapterView (android.widget.AdapterView)3 ListView (android.widget.ListView)3 EhApplication (com.hippo.ehviewer.EhApplication)3 EhDB (com.hippo.ehviewer.EhDB)3