modified create dialog to display torrent infos detected from files
This commit is contained in:
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user