BioTorrents.de’s version of Gazelle
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

upload.js 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584
  1. /**
  2. * Categories
  3. *
  4. * Toggle category metadata.
  5. * Displays dynamic selects on upload.php.
  6. * These change with each category.
  7. */
  8. function Categories() {
  9. let def = [
  10. "javdb", // Accession Number
  11. "audio", // Version
  12. "title", // Torrent Title
  13. "title_rj", // Organism
  14. "title_jp", // Strain/Variety
  15. "artists", // Authors(s)
  16. "studio", // Department/Lab
  17. "series", // Location
  18. "year", // Year
  19. "codec", // License
  20. // Platform *changes below*
  21. "resolution", // Scope *changes below*
  22. // Format *changes below*
  23. "archive", // Archive
  24. "tags", // Tags
  25. "cover", // Picture
  26. "mirrors", // Mirrors
  27. "screenshots", // Publications
  28. //'seqhash', // Seqhash
  29. "group_desc", // Torrent Group Description
  30. "release_desc", // Torrent Description
  31. "censored", // Aligned/Annotated
  32. "anon", // Upload Anonymously
  33. ];
  34. let cats = [
  35. {
  36. // Sequences
  37. media: {}, // Platform
  38. container: {}, // Format
  39. seqhash: {}, // Seqhash
  40. },
  41. {
  42. // Graphs
  43. media_graphs: {}, // Platform
  44. container_graphs: {}, // Format
  45. },
  46. {
  47. // Systems
  48. media_graphs: {}, // Platform
  49. container_graphs: {}, // Format
  50. },
  51. {
  52. // Geometric
  53. media_graphs: {}, // Platform
  54. container_graphs: {}, // Format
  55. },
  56. {
  57. // Scalars/Vectors
  58. media_scalars_vectors: {}, // Platform
  59. container_scalars_vectors: {}, // Format
  60. },
  61. {
  62. // Patterns
  63. media_graphs: {}, // Platform
  64. container_graphs: {}, // Format
  65. },
  66. {
  67. // Constraints
  68. media_graphs: {}, // Platform
  69. container_graphs: {}, // Format
  70. },
  71. {
  72. // Images
  73. media_images: {}, // Platform
  74. container_images: {}, // Format
  75. },
  76. {
  77. // Spatial
  78. media_graphs: {}, // Platform
  79. container_spatial: {}, // Format
  80. },
  81. {
  82. // Models
  83. media_graphs: {}, // Platform
  84. container_spatial: {}, // Format
  85. },
  86. {
  87. // Documents
  88. media_documents: {}, // Platform
  89. container_documents: {}, // Format
  90. },
  91. {
  92. // Machine Data
  93. media_machine_data: {}, // Platform
  94. container: {}, // Format
  95. },
  96. ];
  97. let active = {};
  98. for (let field of def) active[field] = {};
  99. let category = 0;
  100. if ($('input[name="type"]').raw())
  101. category = $('input[name="type"]').raw().value;
  102. if ($("#categories").raw()) category = $("#categories").raw().value;
  103. active = Object.assign(active, cats[category]);
  104. let hide = (el) => {
  105. Array.from(
  106. $(`#${el.id} input, #${el.id} select, #${el.id} textarea`)
  107. ).forEach((inp) => (inp.disabled = true));
  108. $(el).ghide();
  109. };
  110. let show = (el) => {
  111. Array.from(
  112. $(`#${el.id} input, #${el.id} select, #${el.id} textarea`)
  113. ).forEach((inp) => (inp.disabled = false));
  114. $(el).gshow();
  115. };
  116. let trs = $("#dynamic_form tr");
  117. for (let tr of trs) {
  118. let field = tr.id.slice(0, -3);
  119. if (active[field]) {
  120. if (active[field].name) {
  121. tr.children[0].innerHTML = active[field].name;
  122. }
  123. let notes = $(`#${tr.id} p.notes`).raw();
  124. if (notes) notes.innerHTML = active[field].notes || "";
  125. show(tr);
  126. } else {
  127. hide(tr);
  128. }
  129. }
  130. }
  131. /**
  132. * add_tag
  133. */
  134. function add_tag() {
  135. if ($("#tags").raw().value == "") {
  136. $("#tags").raw().value =
  137. $("#genre_tags").raw().options[
  138. $("#genre_tags").raw().selectedIndex
  139. ].value;
  140. } else if (
  141. $("#genre_tags").raw().options[$("#genre_tags").raw().selectedIndex]
  142. .value == "---"
  143. ) {
  144. } else {
  145. $("#tags").raw().value =
  146. $("#tags").raw().value +
  147. ", " +
  148. $("#genre_tags").raw().options[$("#genre_tags").raw().selectedIndex]
  149. .value;
  150. }
  151. }
  152. /**
  153. * AddLogField
  154. */
  155. var LogCount = 1;
  156. function AddLogField() {
  157. if (LogCount >= 200) {
  158. return;
  159. }
  160. var LogField = document.createElement("input");
  161. LogField.type = "file";
  162. LogField.id = "file";
  163. LogField.name = "logfiles[]";
  164. LogField.size = 50;
  165. var x = $("#logfields").raw();
  166. x.appendChild(document.createElement("br"));
  167. x.appendChild(LogField);
  168. LogCount++;
  169. }
  170. /**
  171. * RemoveLogField
  172. */
  173. function RemoveLogField() {
  174. if (LogCount == 1) {
  175. return;
  176. }
  177. var x = $("#logfields").raw();
  178. for (i = 0; i < 2; i++) {
  179. x.removeChild(x.lastChild);
  180. }
  181. LogCount--;
  182. }
  183. /**
  184. * AddExtraLogField
  185. */
  186. var ExtraLogCount = 1;
  187. function AddExtraLogField(id) {
  188. if (LogCount >= 200) {
  189. return;
  190. }
  191. var LogField = document.createElement("input");
  192. LogField.type = "file";
  193. LogField.id = "file_" + id;
  194. LogField.name = "logfiles_" + id + "[]";
  195. LogField.size = 50;
  196. var x = $("#logfields_" + id).raw();
  197. x.appendChild(document.createElement("br"));
  198. x.appendChild(LogField);
  199. LogCount++;
  200. }
  201. /**
  202. * RemoveLogField
  203. */
  204. function RemoveLogField() {
  205. if (LogCount == 1) {
  206. return;
  207. }
  208. var x = $("#logfields").raw();
  209. for (i = 0; i < 2; i++) {
  210. x.removeChild(x.lastChild);
  211. }
  212. LogCount--;
  213. }
  214. /**
  215. * AddFormat
  216. */
  217. var FormatCount = 0;
  218. function AddFormat() {
  219. if (FormatCount >= 10) {
  220. return;
  221. }
  222. FormatCount++;
  223. $("#extras").raw().value = FormatCount;
  224. var NewRow = document.createElement("tr");
  225. NewRow.id = "new_torrent_row" + FormatCount;
  226. NewRow.setAttribute(
  227. "style",
  228. "border-top-width: 5px; border-left-width: 5px; border-right-width: 5px;"
  229. );
  230. var NewCell1 = document.createElement("td");
  231. NewCell1.setAttribute("class", "label");
  232. NewCell1.innerHTML = "Extra Torrent File";
  233. var NewCell2 = document.createElement("td");
  234. var TorrentField = document.createElement("input");
  235. TorrentField.type = "file";
  236. TorrentField.id = "extra_torrent_file" + FormatCount;
  237. TorrentField.name = "extra_torrent_files[]";
  238. TorrentField.size = 50;
  239. NewCell2.appendChild(TorrentField);
  240. NewRow.appendChild(NewCell1);
  241. NewRow.appendChild(NewCell2);
  242. NewRow = document.createElement("tr");
  243. NewRow.id = "new_format_row" + FormatCount;
  244. NewRow.setAttribute(
  245. "style",
  246. "border-left-width: 5px; border-right-width: 5px;"
  247. );
  248. NewCell1 = document.createElement("td");
  249. NewCell1.setAttribute("class", "label");
  250. NewCell1.innerHTML = "Extra Format / Bitrate";
  251. NewCell2 = document.createElement("td");
  252. tmp =
  253. '<select id="releasetype" name="extra_formats[]"><option value="">---</option>';
  254. var formats = ["Saab", "Volvo", "BMW"];
  255. for (var i in formats) {
  256. tmp += '<option value="' + formats[i] + '">' + formats[i] + "</option>\n";
  257. }
  258. tmp += "</select>";
  259. var bitrates = ["1", "2", "3"];
  260. tmp +=
  261. '<select id="releasetype" name="extra_bitrates[]"><option value="">---</option>';
  262. for (var i in bitrates) {
  263. tmp += '<option value="' + bitrates[i] + '">' + bitrates[i] + "</option>\n";
  264. }
  265. tmp += "</select>";
  266. NewCell2.innerHTML = tmp;
  267. NewRow.appendChild(NewCell1);
  268. NewRow.appendChild(NewCell2);
  269. NewRow = document.createElement("tr");
  270. NewRow.id = "new_description_row" + FormatCount;
  271. NewRow.setAttribute(
  272. "style",
  273. "border-bottom-width: 5px; border-left-width: 5px; border-right-width: 5px;"
  274. );
  275. NewCell1 = document.createElement("td");
  276. NewCell1.setAttribute("class", "label");
  277. NewCell1.innerHTML = "Extra Release Description";
  278. NewCell2 = document.createElement("td");
  279. NewCell2.innerHTML =
  280. '<textarea name="extra_release_desc[]" id="release_desc" cols="60" rows="4"></textarea>';
  281. NewRow.appendChild(NewCell1);
  282. NewRow.appendChild(NewCell2);
  283. }
  284. /**
  285. * RemoveFormat
  286. */
  287. function RemoveFormat() {
  288. if (FormatCount == 0) {
  289. return;
  290. }
  291. $("#extras").raw().value = FormatCount;
  292. var x = $("#new_torrent_row" + FormatCount).raw();
  293. x.parentNode.removeChild(x);
  294. x = $("#new_format_row" + FormatCount).raw();
  295. x.parentNode.removeChild(x);
  296. x = $("#new_description_row" + FormatCount).raw();
  297. x.parentNode.removeChild(x);
  298. FormatCount--;
  299. }
  300. /**
  301. * AddArtistField
  302. */
  303. var ArtistCount = 1;
  304. function AddArtistField() {
  305. window.getSelection().removeAllRanges();
  306. ArtistCount = $('input[name="artists[]"]').length;
  307. if (ArtistCount >= 200) {
  308. return;
  309. }
  310. var ArtistField = document.createElement("input");
  311. ArtistField.type = "text";
  312. ArtistField.id = "artist_" + ArtistCount;
  313. ArtistField.name = "artists[]";
  314. ArtistField.size = 45;
  315. var x = $("#artistfields").raw();
  316. x.appendChild(document.createElement("br"));
  317. x.appendChild(ArtistField);
  318. x.appendChild(document.createTextNode("\n"));
  319. if ($("#artist_0").data("gazelle-autocomplete")) {
  320. $(ArtistField).on("focus", function () {
  321. $(ArtistField).autocomplete({
  322. serviceUrl: ARTIST_AUTOCOMPLETE_URL,
  323. });
  324. });
  325. }
  326. ArtistCount++;
  327. }
  328. /**
  329. * RemoveArtistField
  330. */
  331. function RemoveArtistField() {
  332. window.getSelection().removeAllRanges();
  333. ArtistCount = $('input[name="artists[]"]').length;
  334. if (ArtistCount == 1) {
  335. return;
  336. }
  337. var x = $("#artistfields").raw();
  338. for (i = 0; i < 3; i++) {
  339. x.removeChild(x.lastChild);
  340. }
  341. ArtistCount--;
  342. }
  343. /**
  344. * AddScreenshotField
  345. */
  346. function AddScreenshotField() {
  347. var sss = $('[name="screenshots[]"]');
  348. if (sss.length >= 10) return;
  349. var ScreenshotField = document.createElement("input");
  350. ScreenshotField.type = "text";
  351. ScreenshotField.id = "ss_" + sss.length;
  352. ScreenshotField.name = "screenshots[]";
  353. ScreenshotField.size = 45;
  354. var a = document.createElement("a");
  355. a.className = "brackets";
  356. a.innerHTML = "−";
  357. a.onclick = function () {
  358. RemoveScreenshotField(this);
  359. };
  360. var x = $("#screenshots").raw();
  361. var y = document.createElement("div");
  362. y.appendChild(ScreenshotField);
  363. y.appendChild(document.createTextNode("\n"));
  364. y.appendChild(a);
  365. x.appendChild(y);
  366. }
  367. function RemoveScreenshotField(el) {
  368. var sss = $('[name="screenshots[]"]');
  369. el.parentElement.remove();
  370. }
  371. /**
  372. * AnimeAutofill
  373. */
  374. function AnimeAutofill() {
  375. var map = {
  376. artist: "artist_0",
  377. title: "title",
  378. title_rj: "title_rj",
  379. title_jp: "title_jp",
  380. year: "year",
  381. description: "album_desc",
  382. };
  383. var aid = $("#anidb").raw().value;
  384. $.getJSON("/api.php?action=autofill&cat=anime&aid=" + aid, function (data) {
  385. if (data.status != "success") return;
  386. for (i in data.response) {
  387. if (map[i] && !$("#" + map[i]).raw().value) {
  388. $("#" + map[i]).raw().value = data.response[i];
  389. }
  390. }
  391. });
  392. }
  393. /**
  394. * JavAutofill
  395. */
  396. function JavAutofill() {
  397. var map = {
  398. cn: "javdb",
  399. artists: "artists",
  400. title: "title",
  401. title_jp: "title_jp",
  402. year: "year",
  403. studio: "studio",
  404. image: "image",
  405. tags: "tags",
  406. description: "album_desc",
  407. };
  408. var cn = $("#javdb_tr #catalogue").raw().value.toUpperCase();
  409. $.getJSON("/api.php?action=autofill&cat=jav&cn=" + cn, function (data) {
  410. if (data.status != "success") {
  411. $("#catalogue").raw().value = "Failed";
  412. return;
  413. } else {
  414. $("#catalogue").raw().value = data.response.cn;
  415. }
  416. for (i in data.response) {
  417. if (Array.isArray(data.response[i])) {
  418. for (j in data.response[i]) {
  419. if (i == "artists") {
  420. if (!$("#" + map[i] + "_" + j).raw()) {
  421. AddArtistField();
  422. }
  423. $("#" + map[i] + "_" + j).raw().value = data.response[i][j];
  424. }
  425. if (map[i] == "tags" && !$("#" + map[i]).raw().value) {
  426. $("#" + map[i]).raw().value = data.response[i].join(", ");
  427. }
  428. }
  429. }
  430. if (map[i] && $("#" + map[i]).raw() && !$("#" + map[i]).raw().value) {
  431. $("#" + map[i]).raw().value = data.response[i];
  432. }
  433. }
  434. if (data.response.screens.length) {
  435. $("#album_desc").raw().value =
  436. "[spoiler=Automatically located thumbs][img]" +
  437. data.response.screens.join("[/img][img]") +
  438. "[/img][/spoiler]\n\n" +
  439. $("#album_desc").raw().value;
  440. }
  441. });
  442. }
  443. /**
  444. * MangaAutofill
  445. */
  446. function MangaAutofill() {
  447. var map = {
  448. artists: "artists",
  449. title: "title",
  450. title_jp: "title_jp",
  451. year: "year",
  452. tags: "tags",
  453. lang: "lang",
  454. cover: "image",
  455. circle: "series",
  456. pages: "pages",
  457. description: "release_desc",
  458. };
  459. var nh = $("#ehentai_tr #catalogue").raw().value;
  460. $.getJSON("/api.php?action=autofill&cat=manga&url=" + nh, function (data) {
  461. if (data.status != "success") {
  462. $("#catalogue").raw().value = "Failed";
  463. return;
  464. }
  465. for (i in data.response) {
  466. if (Array.isArray(data.response[i])) {
  467. for (j in data.response[i]) {
  468. if (i == "artists") {
  469. if (!$("#" + map[i] + "_" + j).raw()) {
  470. AddArtistField();
  471. }
  472. $("#" + map[i] + "_" + j).raw().value = data.response[i][j];
  473. }
  474. if (map[i] == "tags" && !$("#" + map[i]).raw().value) {
  475. $("#" + map[i]).raw().value = data.response[i].join(", ");
  476. }
  477. }
  478. }
  479. if (
  480. map[i] &&
  481. $("#" + map[i]).raw() &&
  482. (!$("#" + map[i]).raw().value || $("#" + map[i]).raw().value == "---")
  483. ) {
  484. $("#" + map[i]).raw().value = data.response[i];
  485. }
  486. }
  487. });
  488. }
  489. /**
  490. * SetResolution
  491. */
  492. function SetResolution() {
  493. if ($("#ressel").raw().value != "Other") {
  494. $("#resolution").raw().value = $("#ressel").raw().value;
  495. $("#resolution").ghide();
  496. } else {
  497. $("#resolution").raw().value = "";
  498. $("#resolution").gshow();
  499. $("#resolution").raw().readOnly = false;
  500. }
  501. }
  502. /**
  503. * initAutofill
  504. */
  505. function initAutofill() {
  506. $("[autofill]").each(function (i, el) {
  507. el.addEventListener("click", function (event) {
  508. ({ douj: MangaAutofill, anime: AnimeAutofill, jav: JavAutofill }[
  509. el.attributes["autofill"].value
  510. ]());
  511. });
  512. });
  513. }
  514. $(function () {
  515. Categories();
  516. initAutofill();
  517. $(document).on("click", ".add_artist_button", AddArtistField);
  518. $(document).on("click", ".remove_artist_button", RemoveArtistField);
  519. });