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

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