1fichier tools

Tools to manage 1fichier links easily

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==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();
});