Bangumi-Index-Batch-Edit

批量添加目录条目,直接修改条目排序和评论,批量保存已修改的条目,可选择按当前列表顺序保存

  1. // ==UserScript==
  2. // @name Bangumi-Index-Batch-Edit
  3. // @namespace https://github.com/bangumi/scripts/liaune
  4. // @author binota,Liaune
  5. // @license MIT
  6. // @description 批量添加目录条目,直接修改条目排序和评论,批量保存已修改的条目,可选择按当前列表顺序保存
  7. // @include /^https?:\/\/((bgm|bangumi)\.tv|chii\.in)\/index\/\d+/
  8. // @version 1.1.1
  9. // @require https://code.jquery.com/ui/1.11.4/jquery-ui.min.js
  10. // @grant GM_addStyle
  11. // ==/UserScript==
  12.  
  13. function postData(url, data) {
  14. return new Promise((resolve, reject) => {
  15. $.post(url,data,()=>{resolve()});
  16. });
  17. }
  18.  
  19. function closeDialog() {
  20. $('#TB_overlay').remove();
  21. $('#TB_window').remove();
  22. }
  23.  
  24. async function saveRelateItems(items) {
  25. for(let i = 0;i < items.length; i++) {
  26. let data = {
  27. content: items[i].content.trim(),
  28. formhash: formhash,
  29. order: items[i].order,
  30. submit: '提交'
  31. };
  32. await postData('/index/related/' + items[i].item_id + '/modify', data).then(()=> {
  33. console.log(i);
  34. $('#savenowOrder').html('保存中... (' + (i+1) + '/' + items.length +')');
  35. if(i == items.length-1){
  36. $('#savenowOrder').html('保存完毕...!');
  37. setTimeout(()=>{location.reload()}, 500);
  38. }
  39. });
  40. }
  41. };
  42.  
  43. async function addRelateBatch(url, items){
  44. for(let i = 0;i < items.length; i++) {
  45. await postData(url, {add_related: items[i], formhash: formhash, submit: '添加新关联'}).then(()=> {
  46. console.log(i);
  47. $('#submit_list').val('添加中... (' + (i+1) + '/' + items.length +')');
  48. if(i == items.length-1){
  49. $('.bibeBox input[name="submit"]').val('添加完毕...!');
  50. setTimeout(()=>{location.reload()}, 500);
  51. }
  52. });
  53. }
  54. }
  55. //Check the owner of index, then insert the button for modify orders
  56. if($('.idBadgerNeue a.avatar').attr('href').search($('.grp_box a.avatar').attr('href')) >= 0) {
  57. $('.grp_box .tip_j').append(` / <a id="modifyOrder" class="chiiBtn" href="javascript:;">批量编辑</a>`);
  58. $('#indexCatBox ul').append(`<li class="add"><a id="addRelateBatch" class="add thickbox" href="javascript:;"><span>+批量添加</span></a></li>`);
  59. }
  60.  
  61. //Get formhash
  62. const formhash = $('input[name="formhash"]').val();
  63.  
  64. //make items sortable.
  65. $.getScript('https://code.jquery.com/ui/1.11.4/jquery-ui.min.js',function(){
  66. console.log('getScript');
  67. $('#browserItemList').sortable({ handle: ".cover"});
  68. $('#columnSubjectBrowserA .browserList,#columnSubjectBrowserA .browserCrtList').sortable({ handle: ".avatar"});
  69. });
  70.  
  71. $('#modifyOrder').click(function() {
  72. $(this).remove();
  73. $('.grp_box .tip_j').append('<a id="saveOrder" class="chiiBtn" href="#">保存修改</a>');
  74. $('.grp_box .tip_j').append('<a id="savenowOrder" class="chiiBtn" href="#">按当前列表顺序保存</a>');
  75.  
  76. //insert comment_box if needs.
  77. $('#browserItemList .tools,#columnSubjectBrowserA .browserList .tools,#columnSubjectBrowserA .browserCrtList .tools').each(function() {
  78. let order = parseInt($(this).find('a').attr('order'));
  79. if($(this).parent().find('.text').length === 0){
  80. $('<div id="comment_box"><div class="item"><div style="float:none;" class="text_main_even"><div class="text"><br></div><div class="text_bottom"></div></div></div></div>').insertBefore($(this));
  81. }
  82. $(`<span class="tip">排序:</span><input id="modify_order" name="order" type="text" value=${order} class="inputtext" style="width:30px;height:15px">`).insertAfter($(this));
  83. });
  84. $('#browserItemList .text,#columnSubjectBrowserA .browserList .text,#columnSubjectBrowserA .browserCrtList .text').attr('contenteditable', 'true');
  85. let contents = [], item_ids = [], orders = [], items = [];
  86. $('#browserItemList > li,#columnSubjectBrowserA .browserList > li,#columnSubjectBrowserA .browserCrtList > div').each(function(i) {
  87. contents[i] = $(this).find('.text').text().trim();
  88. item_ids[i] = $(this).find('.tools :first-child').attr('id').match(/modify_(\d+)/)[1];
  89. orders[i] = parseInt($(this).find('input').attr('value'));
  90. });
  91. $('#saveOrder').click(function() {
  92. if(!confirm('确定要保存么?')) return;
  93. $(this).attr('disabled', 'disabled');
  94. $(this).html('保存中...');
  95. $('#browserItemList > li,#columnSubjectBrowserA .browserList > li,#columnSubjectBrowserA .browserCrtList > div').each(function(i) {
  96. let content = $(this).find('.text').text().trim();
  97. let item_id = $(this).find('.tools :first-child').attr('id').match(/modify_(\d+)/)[1];
  98. let order = parseInt($(this).find('input').attr('value'));
  99. if((order != orders[i])|(content != contents[i])){
  100. items.push({"item_id": item_id, "content": content, "order":order});
  101. }
  102. });
  103. saveRelateItems(items);
  104. });
  105.  
  106. $('#savenowOrder').click(function() {
  107. if(!confirm('确定按当前列表顺序保存么?')) return;
  108. $(this).attr('disabled', 'disabled');
  109. $(this).html('保存中...');
  110. $('#browserItemList > li,#columnSubjectBrowserA .browserList > li,#columnSubjectBrowserA .browserCrtList > div').each(function(i) {
  111. let content = $(this).find('.text').text().trim();
  112. let item_id = $(this).find('.tools :first-child').attr('id').match(/modify_(\d+)/)[1];
  113. let order = i;
  114. if((order != orders[i])|(content != contents[i])){
  115. items.push({"item_id": item_id, "content": content, "order":order});
  116. }
  117. });
  118. saveRelateItems(items);
  119. });
  120. });
  121.  
  122. $('#addRelateBatch').on('click', ()=> {
  123. let dialog = `<div id="TB_overlay" class="TB_overlayBG TB_inline"></div>
  124. <div id="TB_window" style="margin-left: -240px; width: 480px; margin-top: -100px; display: block;">
  125. <div id="TB_title"><div id="TB_ajaxWindowTitle">批量添加关联条目</div><div id="TB_closeWindowButton" title="Close">X 关闭</div></div>
  126. <div class="bibeBox" style="padding:10px">
  127. <label>请输入url https://bgm.tv/subject/265,一行一个</label>
  128. <textarea rows="10" class="quick" name="urls"></textarea>
  129. </div>
  130. <input class="inputBtn" value="添加关联" id="submit_list" type="submit">
  131. </div></div>`;
  132. $('body').append(dialog);
  133. $('#submit_list').on('click', ()=> {
  134. $('#submit_list').val('添加关联中...');
  135. let url = $('#indexCatBox a')[0].href + '/add_related';
  136. let items = $('.bibeBox textarea').val().split('\n');
  137. addRelateBatch(url, items);
  138. //$('.bibeBox input[name="submit"]').val('添加完毕...!');
  139. });
  140. $('#TB_closeWindowButton').on('click', closeDialog);
  141. });
  142.  
  143. /*$('#editRelateBatch').on('click', ()=> {
  144. let dialog = `<div id="TB_overlay" class="TB_overlayBG TB_inline"></div>
  145. <div id="TB_window" style="margin-left: -240px; width: 480px; margin-top: -100px; display: block;">
  146. <div id="TB_title"><div id="TB_ajaxWindowTitle">批量修改关联条目</div><div id="TB_closeWindowButton" title="Close">X 关闭</div></div>
  147. <div class="bibeBox" style="padding:10px">
  148. <label>请输入url如 https://bgm.tv/subject/265,一行一个</label>
  149. <textarea rows="10" class="quick" name="urls"></textarea>
  150. </div>
  151. <input class="inputBtn" value="添加关联" id="submit_list" type="submit">
  152. </div></div>`;
  153. $('body').append(dialog);
  154. $('#submit_list').on('click', ()=> {
  155. $('#submit_list').val('添加关联中...');
  156. let url = $('#indexCatBox a')[0].href + '/add_related';
  157. let items = $('.bibeBox textarea').val().split('\n');
  158. addRelateBatch(url, items);
  159. //$('.bibeBox input[name="submit"]').val('添加完毕...!');
  160. });
  161. $('#TB_closeWindowButton').on('click', closeDialog);
  162. });*/
  163.  
  164.  
  165.