// ==UserScript==
// @name Local Vk Downloader
// @namespace vkDownloadAuto
// @version 1.0.0
// @description Get Vk raw link without external service.
// @match https://m.vk.com/mail*
// ==/UserScript==
var peer = null;
function vkGet(url, callback) {
return ajax.plainpost(
url,
{ _ajax: 1 },
(function (e) {
callback(parseResponse(e));
}),
(function () {
callback(null)
}),
!0
);
}
function parseResponse(response) {
if (typeof response == "string" && response.indexOf("<!DOCTYPE html>") != -1) {
response = parseDialogPage(response);
}
return parseJSON(response);
}
function parseDialogPage(htmlString) {
var html = parseDocumentToHtml(htmlString);
document.body.innerHTML = html;
var itemsContainer = $(".items", html)[0];
var items = itemsContainer.children[0];
var searchMore = itemsContainer.children[1];
return {
data: [items.outerHTML, searchMore.outerHTML]
}
}
function parseDocumentToHtml(documentString) {
var htmlElement = document.createElement('div');
var docBody = documentString.substring(documentString.indexOf("<body"), documentString.indexOf("</body>") + 7);
var divElement = docBody.replace("<body", "<div").replace("</body>", "</div>");
htmlElement.innerHTML = divElement;
return htmlElement;
}
function getMore(href) {
vkGet(href, function (data) {
receiveMore(data);
});
}
function getSearchMoreHref(data) {
if (!data || !data[1]) {
return;
}
var showMore = $(".show_more", $(data[1]));
if (!showMore.length) {
return;
}
var href = showMore.attr("href");
if (!href) {
return null;
}
}
function checkSearch() {
var newPeer = getPeer();
if (newPeer && newPeer != peer) {
getAllMedia(newPeer);
}
}
function listenSearch() {
window.setInterval(checkSearch, 500);
}
function getPeer() {
var hash = window.location.search;
var idx = hash.indexOf("peer");
if (idx == -1) {
return null;
}
var end = hash.indexOf("&", idx);
if (end == -1) {
end = hash.length;
}
return hash.substring(idx + 5, end);
}
function getMediaUrl(newPeer, section) {
var mediaUrlBase = "/mail?act=show_medias&peer=";
var sectionUrl = "§ion=";
return mediaUrlBase + newPeer + sectionUrl + section;
}
function recursiveGetVideos(searchMoreLink, data, finishState) {
if (!searchMoreLink) {
finishState.videos = true;
finishSegment(data, "videos", finishState);
return;
}
vkGet(searchMoreLink, function (result) {
console.log("RECURSIVE RESULT:", result);
if (result && result.data) {
data.videos.concat(getVideosLinks(result.data));
}
var searchMoreLink = getSearchMoreHref(result.data);
recursiveGetVideos(searchMoreLink, data, finishState);
});
}
function getVideos(newPeer, data, finishState) {
vkGet(getMediaUrl(newPeer, "video"), function (result) {
console.log("RESULT:", result);
var data = parseDialogPage(result);
if (result && result.data) {
data.videos.concat(getVideosLinks(result.data));
}
var searchMoreLink = getSearchMoreHref(result.data);
recursiveGetVideos(searchMoreLink, data, finishState);
});
}
function getPhotos() {
}
function getDocs() {
}
function getAllMedia(newPeer) {
console.log("***********************************ALL_MEDIA************************************")
peer = newPeer;
var data = {
videos: [],
photos: [],
docs: []
}
var finishState = {
videos: false,
photos: false,
docs: false
}
getVideos(newPeer, data, finishState);
getPhotos(newPeer, data, finishState);
getDocs(newPeer, data, finishState);
}
function start() {
var newPeer = getPeer();
if (newPeer != null) {
getAllMedia(newPeer);
}
}
function finishSegment(data, segment, finishState) {
console.log(segment + ":", data[segment]);
if (finishState.videos && finishState.photos && finishState.docs) {
finish(data);
}
}
function finish(data) {
console.log(data);
console.log("************************************FINISH**************************************")
}
listenSearch();
start();