modified create dialog to display torrent infos detected from files

This commit is contained in:
sqozz
2015-02-21 03:01:47 +01:00
parent af9a8eb81b
commit ebc7da1d05
5 changed files with 270 additions and 37 deletions

View File

@ -2,34 +2,13 @@ window.onload = function () {
$('.dropdown li > a').click(function(e){
setDropdownButtonText(this.innerHTML, this.parentElement.parentElement.parentElement) //set the display-text to the selected value
fillDropdownByValue(this.innerHTML, $(".dropdown")["1"])
this.parentElement.parentElement.parentElement.classList.remove("open");
return false;
});
customizeUploadButton()
}
//function fillDropdownByValue(value, dropdownToFill) {
// dropdownToFill.getElementsByClassName("text")[0].innerHTML = "Subcategory"
// var dropdownToFillUl = dropdownToFill.getElementsByClassName("dropdown-menu")[0]
// dropdownToFillUl.innerHTML = ""
//
// subCategory = getDescriptorByLocalString("english", value)
// catList = document.getElementById("subcategory_list")
// catList.innerHTML = ""
// categories = global_categories[subCategory].sort()
// for(var key in categories) {
// var newEntry = document.createElement("li")
// var newEntryLink = document.createElement("a")
// newEntry.setAttribute("role", "presentation")
// newEntryLink.setAttribute("role", "menuitem")
// newEntryLink.tabIndex = -1
// newEntryLink.href = "#"
// newEntryLink.innerHTML = getLocalString("english", categories[key])
// newEntryLink.onclick = function(){ setDropdownButtonText(this.innerHTML, this.parentElement.parentElement.parentElement) }
// newEntry.appendChild(newEntryLink)
// dropdownToFillUl.appendChild(newEntry)
// }
//}
function setDropdownButtonText(text, dropdownButton) {
var dropdownTextSpan = dropdownButton.getElementsByClassName("text")[0]
dropdownTextSpan.innerHTML = text
@ -44,6 +23,40 @@ function sortCategories(categories) {
return sortedCategories
}
function fillDetectedFilelist(file) {
var reader = new FileReader();
fileList = document.querySelectorAll(".detectedFiles ul")[0]
fileList.innerHTML = ""
reader.onload = function() {
b = new bencode()
torrentObject = b.decode(reader.result)
for(var fileIndex = 0; fileIndex < torrentObject.info.files.length; fileIndex++){
newListElement = document.createElement("li")
newListElement.innerHTML = torrentObject.info.files[fileIndex].path[0]
fileList.appendChild(newListElement)
}
document.querySelectorAll("input.name")[0].value = torrentObject.info.name
sizeGroup = document.querySelectorAll(".sizeGroup")[0]
if(torrentObject.info.pieces.length && torrentObject.info["piece length"]){
sizeGroup.style.display = ""
document.querySelectorAll(".detectedSize")[0].innerHTML = ((Math.round((torrentObject.info.pieces.length / 20) * torrentObject.info["piece length"]) / 1024 / 1024 * 100) / 100) + " MB"
} else {
sizeGroup.style.display = "none"
}
trackerGroup = document.querySelectorAll(".trackerGroup")[0]
if(torrentObject.announce){
trackerGroup.style.display = ""
document.querySelectorAll(".detectedTracker")[0].innerHTML = torrentObject.announce
} else {
trackerGroup.style.display = "none"
}
}
reader.readAsArrayBuffer(file)
}
// Fill a defined dropdown with values.
// These values will be generated out of the categories.json
function fillDropdownByValue(value, dropdownToFill) {
@ -63,7 +76,11 @@ function fillDropdownByValue(value, dropdownToFill) {
newEntryLink.tabIndex = -1
newEntryLink.href = "#"
newEntryLink.innerHTML = subcategoryLocalString
newEntryLink.onclick = function(){ setDropdownButtonText(this.innerHTML, this.parentElement.parentElement.parentElement) }
newEntryLink.onclick = function(e){
setDropdownButtonText(this.innerHTML, this.parentElement.parentElement.parentElement)
this.parentElement.parentElement.parentElement.classList.remove("open");
return false;
}
newEntry.appendChild(newEntryLink)
dropdownToFillUl.appendChild(newEntry)
}
@ -85,6 +102,7 @@ function setButtonToFilename(event) {
targetInput = event["target"]
button = targetInput.previousSibling.getElementsByClassName("text")[0]
button.innerHTML = chunk(fileName, 40)
fillDetectedFilelist(this.files[0])
});
}
@ -162,3 +180,171 @@ function chunk(string, n) {
}
return ret
};
// Bencode Library
// Copyright 2014 Steven Goodwin
// Released under the GPL, version 2
// For format details, please see:
// http://en.wikipedia.org/wiki/Bencode
bencode = function() {
this.STATE_NULL = 0;
this.STATE_INTEGER = 1; // i-?[0-9]e
this.STATE_STRING_LENGTH = 2; // [0-9]+:\a+
this.STATE_STRING_CONTENT = 3; // [0-9]+:\a+
this.STATE_LIST = 4; // l<contents>e
this.STATE_DICTIONARY = 5; // d<contents>e
}
// Parse accepts an array of characters to process, and the index of the
// first character to parse.
// It returns an object containing the parsed result (in result.o), and the index
// of the next character to parse in result.idx
bencode.prototype.parse = function(dataArray, fromIndex) {
var length = dataArray.byteLength;
var idx = fromIndex;
var state = this.STATE_NULL;
// State data
var current = "";
var currentObject = null;;
// String-specific state data
var stringLength;
while(idx < length) {
var c = String.fromCharCode(dataArray[idx]) ;
switch(state) {
case this.STATE_NULL:
switch(c) {
case 'i':
state = this.STATE_INTEGER;
current = "";
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
state = this.STATE_STRING_LENGTH;
current = c;
break;
case 'l':
currentObject = new Array();
state = this.STATE_LIST;
break;
case 'd':
currentObject = new Object();
state = this.STATE_DICTIONARY;
break;
default:
return null;
}
//
++idx;
break;
case this.STATE_INTEGER:
switch(c) {
case '-': // we assume that negative numbers start with -
current = "-";
break;
case 'e':
return { o : current, idx : idx+1 };
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
current += c;
break;
}
++idx;
break;
case this.STATE_STRING_LENGTH:
switch(c) {
case ':': // the separator between length and content
stringLength = parseInt(current, 10);
state = this.STATE_STRING_CONTENT;
current = ""; // We now parse the string content
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
current += c;
break;
default:
return null;
}
++idx;
break;
case this.STATE_STRING_CONTENT:
current += c;
if (--stringLength == 0) {
return { o : current, idx : idx+1 };
}
++idx;
break;
case this.STATE_DICTIONARY:
if (c == 'e') {
return { o : currentObject, idx : idx+1 };
} else {
var objKey = this.parse(dataArray, idx);
var objValue = this.parse(dataArray, objKey.idx);
currentObject[objKey.o] = objValue.o;
idx = objValue.idx;
}
break;
case this.STATE_LIST:
if (c == 'e') {
return { o : currentObject, idx : idx+1 };
} else {
var obj = this.parse(dataArray, idx);
currentObject.push(obj.o);
idx = obj.idx;
}
break;
}
}
return null;
}
bencode.prototype.decode = function(byteArray) {
var dataArray = new Uint8Array(byteArray);
var result = this.parse(dataArray, 0);
return result.o;
}