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 15KB

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