Greasy Fork is available in English.

1fichier tools

Tools to manage 1fichier links easily

// ==UserScript==
// @name           1fichier tools
// @namespace      surrealmoviez.info
// @description    Tools to manage 1fichier links easily
// @require        http://code.jquery.com/jquery-1.11.1.min.js
// @include        http://www.1fichier.com/console/*
// @include        http://www.1fichier.com/*/console/*
// @include        http://1fichier.com/console/*
// @include        http://1fichier.com/*/console/*
// @include        https://www.1fichier.com/console/*
// @include        https://www.1fichier.com/*/console/*
// @include        https://1fichier.com/console/*
// @include        https://1fichier.com/*/console/*
// @grant          none
// @version        1.2.3
// ==/UserScript==

this.$ = this.jQuery = jQuery.noConflict(true);

// Creates an array of direct links
function createArrayLinks() {
    var links = [];
    $("li.file.ext_gif.ui-selectee.ui-selected").each(function () {
        var temp_id = $(this).attr("rel");
        var id_start = temp_id.lastIndexOf("_") + 1;
        var id = "https://1fichier.com/?" + temp_id.substring(id_start);
        links.push(id);
    });
    return (links);
}

// Retrieves all IDs of the folders in the current account as an array
function getFoldersIds() {

    var folders_droppable = ["0"];
    var folders_ids = ["0"];
    var temp_html = "";

    while (folders_droppable.length !== 0) {
        $.ajax({
            type: "GET",
            url: "/console/dirs.pl?dir_id=" + folders_droppable[0] + "&map=0&start=0&fk=false",
            async: false,
            success: function (text) {
                temp_html = text;
            }
        });

        $(temp_html).find('li').each(function () {
            if (!$(this).hasClass('root') && $("div > a", $(this)).text() !== "Ignore") {
                folders_ids.push($(this).attr('rel'));
            }
            if ($(this).hasClass('fcp')) {
                folders_droppable.push($(this).attr('rel'));
            }
        });
        folders_droppable.shift();
    }

    return folders_ids;
}

// Extracts the ID, query ID, name and upload date of all files in the current folder
// Returns an array of [id, id_ref, date, name]. Date as yyyy-mm-dd
function extractFoldersData(folder_ids) {

    var collection = [];

    for (var i = 0; i < folder_ids.length; i++) {
        $.ajax({
            type: "GET",
            url: "/console/files.pl?dir_id=" + folder_ids[i] + "&oby=",
            async: false,
            success: function (data) {
                $("li.file", $(data)).each(function () {
                    var current = [];
                    var temp_id = $(this).attr("rel");
                    current[0] = temp_id.substring(temp_id.lastIndexOf("_") + 1);
                    current[1] = "selected%5B%5D=" + temp_id;
                    current[2] = formatDate($(this).find("div.dD").text());
                    current[3] = $(this).find("div.dF").text();
                    collection.push(current);
                });
            },
            error: function (request, status, error) {
                console.log("Error in extractFoldersData()\nStatus: " + status + ", error: " + error + "\n" + request.responseText);
            }
        });
    }

    return (collection);
}

// Groups the ref_ids to make the info requests
// Returns an array of querries
function createQueries(folders_data) {

    var array_id_ref = [];
    for (var i = 0; i < folders_data.length; i++) {
        array_id_ref.push(folders_data[i][1]);
    }
    var array_queries = []; // Array containing all IDs in the current folder
    var size_split = 150; // Number of files to send in each info request

    while (array_id_ref.length !== 0) {
        var current = array_id_ref.splice(0, size_split);
        array_queries.push(current.join("&"));
    }

    return (array_queries);
}

// Returns the id, total downloads and last download date of all files in the account
// Returns an array with [id, total_downloads, date_last_download]. Date as yyyy-mm-dd
function retrieveInfo(array_queries) {

    var files_info = [];

    for (var i = 0; i < array_queries.length; i++) {
        $.ajax({
            method: "POST",
            async: false,
            url: "/console/info.pl",
            data: array_queries[i],
            success: function (data) {
                files_info = files_info.concat(extractStats(data));
            }
        });
    }

    return files_info;

}

// Extracts the info of the curent query
// Returns an array of [id, total_downloads, date_last_download]. Date as yyyy-mm-dd
function extractStats(data) {

    var info = [];
    $("tr td:has(a):first-child", $(data)).each(function () {
        var id = $("a", $(this)).attr("href");
        id = id.substring(id.lastIndexOf('?') + 1);
        var total_downloads, date_last_download;
        var $nextTr = $(this).parent().next("tr");
        // Check if a "not downloaded yet" message is present
        if ($("td", $nextTr).length === 1) {
            total_downloads = 0;
            date_last_download = "NO_DOWNLOADS";
        } else {
            var $lastDownloadTr = $(this).parent().nextUntil('tr:not(.t,.t1)').last();
            var $totalTr = $lastDownloadTr.next();
            total_downloads = $('td:eq(2)', $totalTr).text();
            date_last_download = $('td:eq(1) > a', $lastDownloadTr).text();
        }
        info.push([id, total_downloads, date_last_download]);
    });

    return info;

}

// Returns a date in the format yyyy-mm-dd
function formatDate(uglyDate) {
    var arr_date = uglyDate.split("/");
    if (arr_date.length === 3) {
        arr_date[2] = arr_date[2].substring(0, arr_date[2].indexOf(" "));
        var niceDate = arr_date[2] + "-" + arr_date[1] + "-" + arr_date[0];
    } else {
        console.log("Error parsing date: " + uglyDate);
        niceDate = uglyDate;
    }

    return (niceDate);
}

// Checks if the link weren't downloaded since a given ammount of days
// Returns an array with the file name and the download link as a string, containing only the endangered ones
function checkEndangered(date_last_download, milliseconds_now) {

    var danger_time = 45; // days since the last download. Files are stored for 90 days
    danger_time = danger_time * 86400000; // days to milliseconds
    var milliseconds_last_download = Date.parse(date_last_download);

    if (milliseconds_now - milliseconds_last_download > danger_time) {
        return true;
    }

    return false;
}

// Creates a table containing all file names and time since the last download
// Displayed in a new window
function createExtensiveTable(complete_info) {
    //[id, total_downloads, date_last_download, name]

    complete_info = sortArrayOfArrays(complete_info, 3);

    var page_beginning = "<html><head><title>Files Summary</title></head><body>"
            + "<table align='center' border='0'  width='80%' cellpadding='1' cellspacing='0'>"
            + "<tr style='background-color:#484848; color:#EAE9E9'><th>File name</th><th>Link</th><th>Total downloads</th><th>Time since last download</th>";
    var page_end = "</table></body></html>";
    var table = "";

    var els = complete_info.length;
    var milliseconds_date_now = Date.now();
    var row_colour = "#F8F7F7";
    var grand_total = 0;

    for (var i = 0; i < els; i++) {
        var milliseconds_last_download = milliseconds_date_now - Date.parse(complete_info[i][2]);
        var real_time_last_download = convertMS(milliseconds_last_download);
        table += "<tr style='background-color:" + row_colour + "'><td>" + complete_info[i][3] + "</td><td>http://" + complete_info[i][0] + ".1fichier.com/</td><td>" + complete_info[i][1] + "</td><td>" + real_time_last_download + "</td></tr>";

        if (i % 2 === 0)
            row_colour = "#DAD9D9";
        else
            row_colour = "#F8F7F7";

        grand_total += parseInt(complete_info[i][1]);
    }

    table += "<tr style='background-color:" + row_colour + "'><td></td><td></td><td><b>" + grand_total + "</b></td><td></td></tr>";

    var page_table = page_beginning + table + page_end;

    var j = window.open('', '_blank');
    j.document.write(page_table);
    j.stop();

}

// Converts milliseconds to a string formatted as "X days Y hours"
function convertMS(ms) {
    var d, h, m, s;
    s = Math.floor(ms / 1000);
    m = Math.floor(s / 60);
    s = s % 60;
    h = Math.floor(m / 60);
    m = m % 60;
    d = Math.floor(h / 24);
    h = h % 24;
    return (" " + d + " days " + h + " hours ");
}

function sortArrayOfArrays(array, index) {
    var sortedArray = array.sort(function (a, b) {
        return a[index] > b[index] ? 1 : -1;
    });

    return sortedArray;
}

function dogbert() {

    $("#transparentLayerWaiting").show();
    $("#containerWaiting").show();

    var now = Date.now();
    var list_endangered_links = [];

    var folder_ids = getFoldersIds();
    var folders_data = extractFoldersData(folder_ids);
    var array_queries = createQueries(folders_data);
    var files_info = retrieveInfo(array_queries);

    if (folders_data.length !== files_info.length) {
        alert("Something failed! " + folders_data.length + " files were detected in the folders but " + files_info.length + " were processed for information.\nPlease try again and inform this error if it persists over days.");
    } else {
        folders_data = sortArrayOfArrays(folders_data, 0);
        files_info = sortArrayOfArrays(files_info, 0);

        for (var i = 0; i < files_info.length; i++) {
            if (folders_data[i][0] === files_info[i][0]) {
                if (files_info[i][2] === "NO_DOWNLOADS") {
                    files_info[i][2] = folders_data[i][2];
                }
                if (checkEndangered(files_info[i][2], now)) {
                    list_endangered_links.push(folders_data[i]);
                }
            } else {
                alert("The IDs of an element didn't match, the process wasn't accurate any more and was stopped.\nPlease reload the page, try again and report this error if the problem persists.");
                break;
            }
        }
    }

    var complete_info = [];
    for (var i = 0; i < folders_data.length; i++) {
        complete_info.push([files_info[i][0], files_info[i][1], files_info[i][2], folders_data[i][3]]);
    }

    if (list_endangered_links.length === 0) {
        $("#clean_links").val("No links dying in the next 2 weeks found :)");
        $('#message_links').html("<br>" + files_info.length + " link(s) in " + folder_ids.length + " folder(s) checked<br>Click <a href='#' id='ext_table' style='color:#E6E6E6; text-decoration:underline; font-weight: bold;'><b>here</b></a> for a detailed list (opens in a new window)");
    } else {
        var readeable_endangered_links = [];
        for (var i = 0; i < list_endangered_links.length; i++) {
            readeable_endangered_links.push(list_endangered_links[i][3] + " - http://" + list_endangered_links[i][0] + ".1fichier.com/");
        }
        readeable_endangered_links.sort(function (a, b) {
            return a.localeCompare(b);
        });
        $("#clean_links").val("Dying in 2 weeks or less:\n\n" + readeable_endangered_links.join("\n"));
        $('#message_links').html("<br>" + list_endangered_links.length + " endangered link(s) found<br>" + files_info.length + " link(s) in " + folder_ids.length + " folder(s) checked<br>Click <a href='#' id='ext_table' style='color:#E6E6E6; text-decoration:underline; font-weight: bold;'><b>here</b></a> for a detailed list (opens in a new window)");
    }

    $('#ext_table').click(function (event) {
        event = event || window.event;
        createExtensiveTable(complete_info);
        return false;
    });

    $("#transparentLayer").show();
    $("#container").show();
    $("#transparentLayerWaiting").hide();
    $("#containerWaiting").hide();
    list_endangered_links = "";
    $("#clean_links").select();
}

// New elements for the page
{
    var img_endangered = '<div id="div_endangered" style="position: fixed; bottom: 0px; left: 0px; z-index: 3000">'
            + '<img id="img_endangered" src="http://i.imgur.com/x3CC8ht.png" alt="Retrieve endangered links" title="Retrieve endangered links">'
            + '</div>';

    var winHeight = $(window).height();
    var winWidth = $(window).width();
    var marginTop = Math.floor((winHeight - 400) / 2);
    var marginLeft = Math.floor((winWidth - 470) / 2);
    var marginTopW = Math.floor((winHeight - 200) / 2);
    var marginLeftW = Math.floor((winWidth - 200) / 2);

    var div_links = '<div id="transparentLayer" style="display: none; opacity: 0.9; position: fixed; top: 0px; left: 0px; right: 0px; bottom: 0px; background-color: black; z-index: 5001;"></div>'
            + '<div id="container" style="display: none; position: fixed; top: ' + marginTop + 'px; left: ' + marginLeft + 'px; z-index: 6001">'
            + '<textarea id="clean_links" style="width:450px; height:300px; background-color:#D1C5C5; float:top;"></textarea>'
            + '<div id="message_links" style="width:450px; height:120px; float:bottom; color:silver;"></div>'
            + '</div>';

    var div_waiting = '<div id="transparentLayerWaiting"  style="display: none; opacity: 0.9; position: fixed; top: 0px; left: 0px; right: 0px; bottom: 0px; background-color: black; z-index: 3001;"></div>'
            + '<div id="containerWaiting" style="display: none; position: fixed; top: ' + marginTopW + 'px; left: ' + marginLeftW + 'px;  z-index: 4001">'
            + '<img src="http://i.imgur.com/uQqkT4p.png" title="absolutely">'
            + '</div>';

    $("body").append(div_links + img_endangered + div_waiting);

    var interval = window.setInterval(function () {
        if ($('#dirTree > .jqFT').length === 1 && $('#fileTree #sable').length === 1) {
            $('#dirTree').append('<textarea id="links-display" style="bottom: 10px; height: 150px; width: 95%; margin-top: 15px;"></textarea>');
            $('#links-display').click(function () {
                this.select();
            });
            $('#dirTree, #fileTree').bind('mousedown.namespace', function (e) {
                $(document).one('mouseup click', function () {
                    $('#links-display').val(createArrayLinks().join("\n"));
                    $(document).unbind('mousedown.namespace');
                    $('#links-display').select();
                });
            });
            window.clearInterval(interval);
        }
    }, 500);
}

// Show/hide containers method, Wally's and Show links functions setters
{
    $(document).mouseup(function (e) {
        var container_sel = $("#container");
        var container_tohide1 = $("#transparentLayer");
        var container_tohide2 = $("#container");
        if (container_sel.has(e.target).length === 0) {
            container_tohide1.hide();
            container_tohide2.hide();
        }
    });
}

// Setter for Dogbert's function
$('#img_endangered').click(function () {
    dogbert();
});