Large

Vkontakte Playlist maker

By NiCloAy Last update Aug 27, 2009 — Installed 1,384 times.

There are 9 previous versions of this script.

// Vkontakte Playlist maker script

// version 0.03 ALFA!

// 2009−03−05

// Copyright (c) 2009, Nikolay Kandalincev

// Released under the GPL license

// http://www.gnu.org/copyleft/gpl.html

//

// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

//

// This is a Greasemonkey user script.

//

// To install, you need Greasemonkey: http://greasemonkey.mozdev.org/

// Then restart Firefox and revisit this script.

// Under Tools, there will be a new menu item to "Install User Script".

// Accept the default configuration and install.

//

// To uninstall, go to Tools/Manage User Scripts,

// select "VKPlaylist", and click Uninstall.

//

// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

//

// ==UserScript==

// @name          Vkontakte Playlist maker

// @namespace     http://nicloay.blogspot.com/

// @description   make playlist from text data

// @include       http://vkontakte.ru/audio.php*

// ==/UserScript==









window.initPlayList = function() {

    var APPEND_TIMEOUT = 3000;

    var REMOVE_TIMEOUT = 1001;

    var activeSongIndex;

    var song;

    var big_timeout_count=0;

    var BIG_TIMEOUT_VALUE=50;

    var BIG_TIMEOUT = 15000;

    var TIMEOUT_DISPERSION= 1000;



    var content = document.getElementById("content");

    content.appendChild(createGUI());





    //-------------------test Data--------REMOVE THIS!!!!----

    //testData();





    function createGUI() {

        var gui = document.createElement("div");

        gui.appendChild(createInputList());

        gui.appendChild(createButton('startButton','Start',startButtonClick));



        gui.appendChild(createButton('generateDownloadList','Generate Download List', generateDownloadList));
	gui.appendChild(createCheckBox());

        gui.appendChild(createButton('deleteDuplikate','Delete Duplikate!',deleteDuplikat));

        gui.appendChild(createButton('deleteList','Delete Our List!',deleteListFull));



        gui.appendChild(createLogList());





        return gui;



        function createButton(id,caption,event){

           button = document.createElement('button');

            button.setAttribute('id', id);

            button.appendChild(document.createTextNode(caption));

            button.addEventListener('click', event, true);

            return button;

        }



        function createInputList() {

            var inputList = document.createElement("textarea");

            inputList.setAttribute("id", "inputList");

            inputList.setAttribute("cols", 95);

            inputList.setAttribute("rows", 15);

            return inputList;

        }



        function createLogList() {

            var logList = document.createElement("textarea");

            logList.setAttribute("id", "logList");

            logList.style.display = 'none';

            logList.setAttribute("cols", 95);

            logList.setAttribute("rows", 25);

            return logList;

        }
	function createCheckBox() {
	    var cBox=document.createElement("input");
            cBox.type="checkbox";
	    cBox.setAttribute("id","isTitle")
		return cBox;
	}





        function startButtonClick() {

            executePlaylist();

        }

    }





    function executePlaylist() {

        traceStr("execute play list......")

        var playList = document.getElementById("inputList").value;

        song = new Array();

        song = playList.split('\n');

        traceStr("totoal track: " + song.length);

        activeSongIndex = 0;

        getTrack(activeSongIndex);

        function getTrack(index) {

            if (index == song.length) {

                return;

            }

            var trackName = song[index];

            var url = 'http://vkontakte.ru/audiosearch.php?q=' +

                      encodeURIComponent(trackName);

            GM_xmlhttpRequest({

                'method': 'GET',

                'url': url,

                'onload': function(xhr) {

                    trace("[" + (1 + index) + "] " + trackName + ": ");

                    var summary;

                    var regex = /class="summary">(.*?)<\//gi;

                    if (regex.test(xhr.responseText)) {

                        summary = RegExp.$1;

                        if (summary == "") {

                            nextIteration();

                            return;

                        }

                    } else {

                        //todo real error handling

                        nextIteration();

                        traceStr("wtf? :(");

                        return;

                    }



                    summary = parseInt(summary.split(" ")[1]);

                    if (isNaN(summary)) {

                        trace("not found");

                        nextIteration();

                        return;

                    } else {

                        //todo mayby rating, or most length, or size

                        trace("founded(" + summary + ") get first");

                    }

                    regex = /onclick="addAudio\(this, (.*?)\);return false;/gi;

                    if (!regex.test(xhr.responseText)) {

                        nextIteration();

                        return;

                    }



                    //to execute page element look here http://wiki.greasespot.net/Location_hack#Executing_large_blocks_of_code

                    var oldBodyTitle = document.body.title;

                    document.body.title=nextIteration();

                    location.href = "javascript:(" + function() {

                        var param = RegExp.$1;

                        eval('var params='+param);

                        Ajax.postWithCaptcha('audio.php', params, {

                            onSuccess:function(res, text){

                                if (!text.split("Добавлено").length>0){

                                    setTimeout(document.body.title,15000)

                                } else {

                                    document.body.title;

                                }



                            },

                            onFail:function(res,text) {

                            }});

                    } + ")()";

                    document.body.title = oldBodyTitle;

                    return;

                    function nextIteration() {

                        trace("\n");

                        activeSongIndex++;

                        var tmpTimeout;

                        var delayed = function() {

                            getTrack(activeSongIndex);

                        };

                        if (++big_timeout_count<BIG_TIMEOUT_VALUE){

                            tmpTimeout=APPEND_TIMEOUT;

                        }else{

                            big_timeout_count=0;

                            tmpTimeout=BIG_TIMEOUT;

                        }





                        tmpTimeout=tmpTimeout+Math.ceil(Math.random()*500);

                        setTimeout(delayed, tmpTimeout);

                    }





                }

            });



        }

    }



    function traceStr(text) {

        trace(text + '\n');

    }





    function trace(text) {

        var logList = document.getElementById("logList");

        if (logList !== null) {

            if (logList.value == "") {

                logList.style.display = 'block';

            }

            logList.value = logList.value + text;

            logList.scrollTop = logList.scrollHeight - logList.clientHeight;

        } else {

            GM_log(text);

        }

    }

    function clearLog() {

        var logList = document.getElementById("logList");

        logList.value = "";

    }

    function testData() {

        var inputList = document.getElementById("inputList");

        inputList.value = 'uinya-muinyaalsdkjflaskjljkeasefasefas\nQueen  I Want To Break Free\nRage Against The Machine  Wake Up\nRam Jam  Black Betty\nRed Hot Chili Peppers  Dani California\nRed Hot Chili Peppers  Tell Me Baby';

        //inputList.value = 'Red Hot Chili Peppers  Tell Me Baby';



    }



    function generateDownloadList() {

        clearLog();

        traceStr("starting generate loading list....\n\n");

	var printTitle=document.getElementById('isTitle').checked

	if (printTitle){
		traceStr('copy data to some file.\n for download wia wget use folow script (change value FILE_NAME to you file name\n')	
		traceStr('FILE_NAME=vk.pls; for i in $(seq `wc -l $FILE_NAME|awk \'{print $1}\'`);do path=$(cat $FILE_NAME | awk \'NR==\'$i|awk -F\'\\t\' \'{print $1}\');name=$(cat $FILE_NAME | awk \'NR==\'$i|awk -F\'\\t\' \'{print $2}\'); echo $path  $name;wget -O "$name".mp3 $path;done')
		traceStr('=================================================================================')
	}        
	GM_xmlhttpRequest({

            'method': 'GET',

            'url': "http://vkontakte.ru/audio.php?act=edit",         //<b id="performer64519150">Rodrigo Y Gabriela</b> - <span id="title64519150">Diablo Rojo</span>

            'onload': function(xhr) {
		var regex = /class="playimg" src="images\/play.png" nosorthandle="true" onclick="return operate\((.*?),(.*?),(.*?),'(.*?)',(?:[\s\S]*?)performer(?:\d*)\">(.*)<\/b>(?:[\s\S]*?)title(?:\d*)\">(.*)<\/span>/gi;


                while (regex.test(xhr.responseText)) {			

                    var link = 'http://cs' + RegExp.$2 + ".vkontakte.ru/u" + RegExp.$3 + "/audio/" + RegExp.$4 + ".mp3" 

			if (printTitle){
				link=link+"\t"+RegExp.$5+" - "+ RegExp.$6
			}			                    
			traceStr(link);

                }

		if (printTitle){
			traceStr('=================================================================================')		
		}

                traceStr("\n task complite! :)")

            }

        });

    }



    function deleteDuplikat(){

        clearLog()

        traceStr("starting duplikate remove");

        var userId;

        var regex = /<a href="\/id(.*?)\?/gi;

        clearLog();

        if (regex.test(document.getElementById('myprofile').innerHTML)) {

            userId = RegExp.$1;

        } else {

            traceStr("wtf :(...?");

        }

        var songArray=new Array();

        var removeArray=new Array();

        GM_xmlhttpRequest({

            'method': 'GET',

            'url': "http://vkontakte.ru/audio.php?act=edit",

            'onload': function(xhr) {

                                                                                                 

                var regex = /class="playimg" src="images\/play.png" nosorthandle="true" onclick="return operate\((.*),(.*),(.*),'(.*)',(.*)\);/gi;

                while (regex.test(xhr.responseText)) {

                    var r=new Object;

                    r.userId=RegExp.$3;

                    r.songId=RegExp.$4;

                    r.innerId=RegExp.$1

                    var dupl=false;

                    for (i=0;i<songArray.length;i++){

                        if (songArray[i].userId==r.userId&&songArray[i].songId==r.songId){

                            dupl=true

                            trace("+");

                        }

                    }

                    if (dupl){

                        removeArray.push(r.innerId);

                    } else {

                        songArray.push(r);

                    }

                }



                i = 0;

                   traceStr("\nfound "+removeArray.length +" duplikate");

                   var delay = function() {

                       removeTrack(i)

                   };

                   setTimeout(delay, REMOVE_TIMEOUT);



                   function removeTrack(id) {

                       GM_xmlhttpRequest({

                           'method': 'GET',

                           'url': "http://vkontakte.ru/audio.php?act=adeleteaudio&aid=" + removeArray[id] + "&oid=" + userId,

                           'headers': {

                                   'Content-Type':

                                   'application/x-www-form-urlencoded; charset=UTF-8'

                           },

                           'onload': function(xhr) {

                               traceStr((++id) + " ["+removeArray[id]+"] removed "+xhr.responseText);

                               if (++i < removeArray.length) {

                                   var delay = function() {

                                       removeTrack(i)

                                   };

                                   setTimeout(delay, REMOVE_TIMEOUT);

                               } else {

                                   traceStr("\n\n task complite! :)");

                               }

                           }

                       });



                   }

            }

        });

        

    }







    function deleteListFull() {

        if (!confirm("A Your sure?, you can't restore your songs!!!")) {

            traceStr("canceled");

            return;

        }

        var userId;

        var regex = /<a href="\/id(.*?)\?/gi;

        clearLog();

        if (regex.test(document.getElementById('myprofile').innerHTML)) {

            userId = RegExp.$1;

        } else {

            traceStr("wtf :(...?");

        }

        traceStr("deleting list....\n\n");

        GM_xmlhttpRequest({

            'method': 'GET',

            'url': "http://vkontakte.ru/audio.php?act=edit",

            'onload': function(xhr) {

                var regex = /showDeleteAudioBox\((.*?)\)/gi;

                var songId = new Array();

                var i = 0;

                while (regex.test(xhr.responseText)) {

                    songId[i++] = RegExp.$1;

                }

                traceStr("total "+songId.length);

                i = 0;



                var delay = function() {

                    removeTrack(i)

                };

                setTimeout(delay, REMOVE_TIMEOUT);



                function removeTrack(id) {

                    GM_xmlhttpRequest({

                        'method': 'GET',

                        'url': "http://vkontakte.ru/audio.php?act=adeleteaudio&aid=" + songId[id] + "&oid=" + userId,

                        'headers': {

                                'Content-Type':

                                'application/x-www-form-urlencoded; charset=UTF-8'

                        },

                        'onload': function(xhr) {

                            traceStr((++id) + " removed "+xhr.responseText);

                            if (++i < songId.length) {

                                var delay = function() {

                                    removeTrack(i)

                                };

                                setTimeout(delay, REMOVE_TIMEOUT);

                            } else {

                                traceStr("\n\n task complite! :)");

                            }

                        }

                    });



                }





            }

        });





    }

};



initPlayList();