Source for "Flickr More Home"

By Plutor
Has 13 other scripts.


// ==UserScript==
// @name       Flickr More Home
// @namespace      http://plutor.org/
// @description    Increases the amount of content on your Flickr home page.
// @include    http://flickr.com/
// @include    http://www.flickr.com/
// ==/UserScript==
//
// DONE 2008-05-01
//  * Document configuring
//  * Put images into an array of hashes, not a mixed array
//  * Space multiple rows
// TODO
//  * Allow 0 image rows

/* -------------------------------------------------------------------------- */

// IMAGE_ROWS lists the number of rows of images for each type.
// Default is 1 for yours and everyones, and 2 for contacts.
var IMAGE_ROWS = { "yours": 1,
                   "contacts": 2,
                   "everyones": 1 };

// CACHE_AGE represents the number of seconds to wait from one update of the
// home page images to the next.  Clicking the "Refresh" button in the upper
// right corner of the home page will avoid this.
//
// 0 is "never cache", but there's no real reason to use anything but the
// default (15 minutes)
var CACHE_AGE = 15 * 60;     // 15 minutes

/* -------------------------------------------------------------------------- */

var userid = "-";
var numperrow = 8;

/* -------------------------------------------------------------------------- */

function getpage(url, valname, cb) {
    var last = GM_getValue("STAMP:" + valname);
    var now = Math.floor((new Date().getTime())/1000);
    var force = GM_getValue("FORCE");
    var data = GM_getValue("DATA:" + valname);

    if ( !last || force || now - last >= CACHE_AGE || !data || data.length == 0 ) {
        GM_setValue( "STAMP:" + valname, now );

        GM_xmlhttpRequest({
                    method: "GET",
                    url: url,
                    onload: cb
                  });
    }
    else {
        cb({
             status: 999,
             statusText: "From cache",
             responseText: data
           });
    }
}

function getgroup(group, page) {
    var url = 'http://www.flickr.com/photos/';
    if (group == 'yours')           { url += userid + "/"; }
    else if (group == 'contacts')   { url += "friends/"; }
    else if (group == 'everyones')  { }
    else                            { return }

    if (page && page > 1) {
        getpage( url + "page" + page, "XXXXX",
                 function(details) { updategroup(details, group, page) } );
    } else {
        addthrobber(group);
        getpage( url, group,
                 function(details) { updategroup(details, group, 1) } );
    }
}

/* -------------------------------------------------------------------------- */

function getimglist(pagehtml, imgdata_regexp) {
    var rv = new Array();

    var mgrps;
    while (mgrps = imgdata_regexp.exec(pagehtml)) {
        var nextimg = {
            url: mgrps[1],
            // Show square, not medium or thumbnail
            src: mgrps[2].replace(/(_[mt])?.jpg$/, "_s.jpg"),
            by: (mgrps.length > 3 ? mgrps[3] : "")
        };
        rv.push(nextimg);
    }
    return rv;
}

function addthrobber(group) {
    var tablerow;
    if (group == 'yours') {
        tablerow = 0;
    } else if (group == 'contacts') {
        tablerow = 1;
    } else if (group == 'everyones') {
        tablerow = 2;
    } else {
        return
    }

    var imgtable = getimgtable(tablerow);
    if (!imgtable) return;

    var n = document.createElement("img");
    n.src = 'data:image/gif;base64,R0lGODlhEAAQAOMIAAAAABoaGjMzM0xMTGZmZoCAgJmZmbKysv///////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgAIACwAAAAAEAAQAAAESBDJiQCgmFqbZwjVhhwH9n3hSJbeSa1sm5GUIHSTYSC2jeu63q0D3PlwCB1lMMgUChgmk/J8LqUIAgFRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+UKgmFqbpxDV9gAA9n3hSJbeSa1sm5HUMHTTcTy2jeu63q0D3PlwDx2FQMgYDBgmk/J8LqWPQuFRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+YSgmFqb5xjV9gQB9n3hSJbeSa1sm5EUQXQTADy2jeu63q0D3PlwDx2lUMgcDhgmk/J8LqUPg+FRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+cagmFqbJyHV9ggC9n3hSJbeSa1sm5FUUXRTEDy2jeu63q0D3PlwDx3FYMgAABgmk/J8LqWPw+FRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+QihmFqbZynV9gwD9n3hSJbeSa1sm5GUYXSTIDy2jeu63q0D3PlwDx3lcMgEAhgmk/J8LqUPAOBRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+UqhmFqbpzHV9hAE9n3hSJbeSa1sm5HUcXTTMDy2jeu63q0D3PlwDx0FAMgIBBgmk/J8LqWPQOBRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+YyhmFqb5znV9hQF9n3hSJbeSa1sm5EUAHQTQTy2jeu63q0D3PlwDx0lEMgMBhgmk/J8LqUPgeBRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+c6hmFqbJwDV9hgG9n3hSJbeSa1sm5FUEHRTUTy2jeu63q0D3PlwDx1FIMgQCBgmk/J8LqWPweBRhV6z2q0VF94iJ9pOBAA7';
    n.style.margin = '30px';
    imgtable.appendChild(n);
}

function updateimgtable(imgs, numrows, rownum, showname) {
    var imgtable = getimgtable(rownum);
    if (!imgtable) return;

    while (imgtable.childNodes.length > 0) {
        imgtable.removeChild(imgtable.childNodes[0])
    }
    for (var i = 0; i < numrows * numperrow && i < imgs.length; ++i) {
        var n = document.createElement("div");
        n.className = 'thumb-squirt-indv';
        var h = '<span class="photo_container pc_s"><a href="' + imgs[i].url + '"><img src="' + imgs[i].src + '" width="75" height="75" /></a></a>';
        if (showname) {
            h += '<br> ' + imgs[i].by;
        }
        h += '</span>';
        n.innerHTML = h;
        if (i % numperrow == 0)
            n.style.clear = 'left';
        if (numrows > 0 && Math.floor(i / numperrow) < (numrows-1))
            n.style.paddingBottom = '1em'; // space all rows except the last
        imgtable.appendChild(n);
    }
}

var grpimgs = new Object();
function updategroup(det, group, page) {
    var re;
    var tablerow;
    var showname;
    if (group == 'yours') {
        re = /<p class="Photo">\s*<[^>]*><a href="([^"]*)"[^>]*><img src="([^"]*)/gi;
        tablerow = 0;
        showname = 0;
    } else if (group == 'contacts') {
        re = /<p class="RecentPhotos">\s*<[^>]*><a href="([^"]*)"[^>]*><img src="([^"]*)"[^>]*><\/a>.*\s*<br>\s*(From <a[^>]*>[^<]*<\/a>)/gi;
        tablerow = 1;
        showname = 1;
    } else if (group == 'everyones') {
        re = /<p class="StreamList">\s*<[^>]*><a href="([^"]*)"[^>]*><img src="([^"]*)"[^>]*><\/a><\/[^>]*>\s*<br>\s*(From <a[^>]*>[^<]*<\/a>)/gi;
        tablerow = 2;
        showname = 1;
    } else {
        return
    }
    
    if (det.status < 400) {
        var thispage = getimglist(det.responseText, re);

        if (thispage && thispage.length > 0) {
            if (page == 1) grpimgs[group] = new Array();
            grpimgs[group] = Array.concat(grpimgs[group], thispage);
            if (grpimgs[group].length < IMAGE_ROWS[group]) {
                getgroup(group, page + 1);
            } else {
                updateimgtable(grpimgs[group], IMAGE_ROWS[group], tablerow, showname);
                GM_setValue( "DATA:" + group, grpimgs[group].toSource() );
            }
        } else if (grpimgs[group] && grpimgs[group].length > 0) {
            updateimgtable(grpimgs[group], IMAGE_ROWS[group], tablerow, showname);
            GM_setValue( "DATA:" + group, grpimgs[group].toSource() );
        }
    } else if (det.status == 999) {
        // From cache
        try {
            grpimgs[group] = eval(det.responseText);
            updateimgtable(grpimgs[group], IMAGE_ROWS[group], tablerow, showname);
        } catch(e) { GM_log("Failure parsing " + group + " cache") }
    }
}

/* -------------------------------------------------------------------------- */

function addrefreshbutton() {
    var newbutton = document.createElement("input");
    newbutton.type = "submit";
    newbutton.className = "Butt";
    newbutton.value = "REFRESH";
    newbutton.addEventListener( "click", refresh, true );
    newbutton.style.cssFloat = "right";

    var imgtable = getimgtable(0);
    if (!imgtable) return;
    imgtable.parentNode.insertBefore( newbutton, imgtable.parentNode.firstChild );
}

function refresh() {
    GM_setValue("FORCE", 1);
    window.location.reload();
    return false;
}

/* -------------------------------------------------------------------------- */

function isloggedin() {
    if (userid == "-")
        userid = getuserid();

    return (userid != "");
}

function getuserid() {
    var u

    try {
        var imgs = document.getElementsByTagName("img")
        var nsid_regex = new RegExp("/buddyicons/([^\.]*)\.jpg")

        for (i in imgs) {
            var nsid_matches = nsid_regex.exec(imgs[i].src)
            if (nsid_matches && nsid_matches.length >= 2) {
                return nsid_matches[1];
            }
        }
    }
    catch (e) {
        // GM_log(e)
    }

    return u
}

/* -------------------------------------------------------------------------- */

function getimgtable(n) {
    var alldivs = document.getElementsByTagName('div');
    var seen = 0;

    for (var i=0; i<alldivs.length; ++i) {
        if (alldivs[i].className.indexOf("thumb-squirt-cont") != -1) {
            if (seen++ >= n)
                return (alldivs[i]);
        }
    }
}

function getmaintable() {
    var xpath = "//table[@width='800']";    // FIXME - make this better
    var candidates = document.evaluate(xpath, document, null,
                 XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);

    var rv = candidates.snapshotItem(0);
    return (rv);
}

function moveleftside() {
    var tr = maintable.rows;
    for (var i = tr.length - 1; i >= 0; --i) {
        var td = tr[i].cells;
        if (td.length >= 2) {
            var left = td[0];
            tr[i].removeChild(left);

            var newtr = maintable.insertRow(i+1);
            newtr.appendChild(left);
        }
    }
}

/* -------------------------------------------------------------------------- */

var maintable;

function main() {
    if (isloggedin()) {
        maintable = getmaintable();

        if (maintable) {
            moveleftside();

            getgroup('yours');
            getgroup('contacts');
            getgroup('everyones');

            addrefreshbutton();
        }
    }

    GM_setValue( "FORCE", 0 );
}

//addEventListener("load", main, true)
main();