class HentaidudeDownloadThread extends Thread {

        private URL url;

        public HentaidudeDownloadThread(URL url, int index) {
            this.url = url;
            // this.index = index;
        }

        @Override
        public void run() {
            try {
                Document doc = Http.url(url).get();
                URL videoSourceUrl = new URL(getVideoUrl(doc));
                addURLToDownload(videoSourceUrl, "", "", "", null, getVideoName(), "mp4");
            } catch (Exception e) {
                LOGGER.error("Could not get video url for " + getVideoName(), e);
            }
        }

        private String getVideoName() {
            try {
                return getGID(url);
            } catch (MalformedURLException e) {
                LOGGER.error("Unable to get video title from " + url.toExternalForm());
                e.printStackTrace();
            }
            return "unknown";
        }

        /*
         * TO find data object: $.ajax({ url:
         * 'https://hentaidude.com/wp-admin/admin-ajax.php', type: 'post', data: {
         * action: 'msv-get-sources', id: '48227', nonce: '907f1bd45c' }
         */
        public String getVideoUrl(Document doc) throws IOException {<FILL_FUNCTION_BODY>}
    }

            String jsonString = null;
            Matcher m = p2.matcher(doc.html());

            while (m.find()) {
                jsonString = m.group(1);
                if (jsonString.contains("msv-get-sources"))
                    break;
            }

            if (jsonString != null) {
                // send POST request to https://hentaidude.com/wp-admin/admin-ajax.php with the
                // data object parameters.
                JSONObject dataObject = new JSONObject(jsonString);
                Map<String, String> dataMap = new HashMap<>();
                for (String key : JSONObject.getNames(dataObject)) {
                    dataMap.put(key, dataObject.getString(key));
                }
                JSONObject jsonResopnse = Http.url("https://hentaidude.com/wp-admin/admin-ajax.php").data(dataMap)
                        .method(Method.POST).getJSON();
                // return source url from below JSON.
                /*
                 * success true sources { video-source-0
                 * https://cdn1.hentaidude.com/index.php?data=
                 * 2f4a576957694872754d6736466f6c585579704b4d584e4a434372546c51346d4f4c697a6c734f6678307a59324c5458624f4675664863323768397a3371452f41384b62375246643243466f744447536b2b6250565a3859306a41506d366942713066336c6659386d78513d
                 * video-source-1 <iframe src="https://openload.co/embed/iaJ_zDCTW0M/"
                 * scrolling="no" frameborder="0" width="100%" height="430"
                 * allowfullscreen="true" webkitallowfullscreen="true"
                 * mozallowfullscreen="true"></iframe> }
                 */

                if (jsonResopnse.getBoolean("success")) {
                    // get the hentaidude video source
                    for (String key : JSONObject.getNames(jsonResopnse.getJSONObject("sources"))) {
                        if (jsonResopnse.getJSONObject("sources").getString(key).contains("hentaidude.com")) {
                            return jsonResopnse.getJSONObject("sources").getString(key);
                        }
                    }
                } else {
                    throw new IOException("Could not get video url from JSON response.");
                }

            }

            throw new IOException("Could not get video download url.");
        
<methods>public int getCompletionPercentage() ,public java.lang.String getStatusText() ,public void setBytesCompleted(int) ,public void setBytesTotal(int) ,public boolean useByteProgessBar() <variables>private int bytesCompleted,private int bytesTotal