Newer
Older
save-to-mylist / background.js
var currentMovieUrl = "";
var targetTabId = null;
var isEnabled = false;
var dataMylist;
var selectMylist;
var selectTags;

function setMylist(url) {
    chrome.tabs.create({"url": url + '?group_id=' + selectMylist, active: false}, function (tab) {
        chrome.tabs.executeScript(tab.id, {file: "save_mylist.js"})
    });
}

function getMylist(){
    return selectMylist;
}

function getTags() {
    return selectTags.toString();
}

function init() {
    var xhr = new XMLHttpRequest;
    // 第3引数で非同期を明示的に指定
    xhr.open("GET", "http://www.nicovideo.jp/api/mylistgroup/list", true);
    xhr.onload = function (e) {
        if (xhr.readyState === 4){
            if (xhr.status === 200) {
                dataMylist = JSON.parse(xhr.responseText);
                chrome.runtime.sendMessage({
                    type: "finish"
                }, function (response) {});
            } else {
                console.log(xhr.statusText);
            }
        }
    }
    xhr.onerror = function (e) {
        console.error(xhr.statusText);
    }
    xhr.send(null);
}

function stop(msg) {
    if(msg) alert(msg);
    currentMovieUrl = "";
    targetTabId = null;
    isEnabled = false;
}

function start(id, tags) {
    selectMylist = id;
    selectTags = tags.split(',');
    chrome.tabs.query({currentWindow: true, active: true}, function (tabs) {
        var tab = tabs[0];
        if(!isEnabled) {
            //alert("マイリス自動追加を開始します");
            // マイリス自動追加をするタブのIDを保持
            targetTabId = tab.id;
            isEnabled = true;
            // マイリス追加
            currentMovieUrl = tab.url;
            updateMylist();
        }
    });
}

function updateMylist() {
    getMylistList(selectMylist, function(list) {
        if (list.mylistitem.length < 500) {
            if (selectTags[0].length) {
                getTagsTag(function(tag){
                    for (var i in selectTags) {
                        if (tag == selectTags[i]) {
                            chrome.tabs.executeScript(targetTabId, {file: "content_script.js"});
                        }
                    }
                });
            } else {
                chrome.tabs.executeScript(targetTabId, {file: "content_script.js"});
            }
        } else {
            stop("選択されたマイリストにはこれ以上動画を追加できません");
        }
    });
}

function getMylistList(id, callback) {
    var xhr = new XMLHttpRequest;
    xhr.open("GET", "http://www.nicovideo.jp/api/mylist/list/?group_id="+id, true);
    xhr.onload = function(e) {
        if (xhr.readyState === 4) {
            if (xhr.status === 200) {
                var list = JSON.parse(xhr.responseText);
                callback(list);
            }
        }
    }
    xhr.send();
}

function getTagsTag(callback) {
    chrome.tabs.executeScript(targetTabId, {
        code: "document.documentElement.outerHTML"
    }, function(result) {
        var parser = new DOMParser();
        var dom = parser.parseFromString(result, 'text/html');
        var tags = dom.getElementsByClassName('videoHeaderTagLink');
        for(var i = 0; i < tags.length; i++) {
            callback(tags[i].textContent);
        }
    });
}


chrome.tabs.onUpdated.addListener(function(tabId, cahngeInfo, tab) {
    if(tabId == targetTabId && tab.status == 'complete') {
        var mvRe = /http:\/\/www.nicovideo.jp\/watch\//;
        // 更新タブがニコ動URLか
        if(mvRe.test(tab.url)) {
            // 前回のURL違うURLに変更されたか
            if(currentMovieUrl != tab.url) {
                currentMovieUrl = tab.url;
                // マイリス追加
                setTimeout(function() {
                    updateMylist();
                }, 5000)
            }
        } else {
            // 更新先がニコ動URLじゃないので停止
            stop("遷移先がニコニコ動画再生画面でないのでマイリス自動追加を停止します");
        }
        waitTab = 2;
    }
});

chrome.tabs.onRemoved.addListener(function(tabId, removeInfo) {
    if(tabId == targetTabId) {
        stop("タブが閉じられたのでマイリス自動追加を停止します");
    }
});

chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
    switch (request.type) {
        case "mylist":
            sendResponse(dataMylist);
            break;
        case "setMylist":
            setMylist(request.url);
            break;
        case "hasAdded":
            //alert("追加完了");
            break;
        default:
            break;
    }
});