baidu-netdisk-rename

A tool for renaming files on web-based Baidu Netdisk 百度网盘网页版的文件重命名脚本

当前为 2020-03-23 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name baidu-netdisk-rename
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.1
  5. // @description A tool for renaming files on web-based Baidu Netdisk 百度网盘网页版的文件重命名脚本
  6. // @author neotan
  7. // @match https://pan.baidu.com/disk/*
  8. // @grant GM_addStyle
  9. // @grant GM_getResourceText
  10. // @resource purecss https://cdn.jsdelivr.net/npm/purecss@1.0.1/build/pure-min.min.css
  11. // @resource responsiveCss https://cdn.jsdelivr.net/npm/purecss@1.0.1/build/grids-responsive-min.css
  12. // ==/UserScript==
  13.  
  14. ;(async function() {
  15. 'use strict'
  16.  
  17. // ------------------- Utilities START ------------------- //
  18.  
  19. var filemanagerUrl = 'https://pan.baidu.com/api/filemanager?opera=rename&async=2&onnest=fail&channel=chunlei&web=1&app_id=250528&bdstoken=19242d6d3971529615284f88b3e97255&logid=MTU4NDcwNjcxNjE5NzAuNDI5MDIyMzE5MjMwMzE3NzU=&clienttype=0'
  20. var taskqueryUrl ='https://pan.baidu.com/share/taskquery?taskid=139129799582709&channel=chunlei&web=1&app_id=250528&bdstoken=19242d6d3971529615284f88b3e97255&logid=MTU4NDcwNjcxNzk0NzAuMTg4MjI5NjY1MjE1NjQ0Nzc=&clienttype=0'
  21.  
  22. function getFileNames() {
  23. var nodes = document.querySelectorAll('.file-name .text a')
  24. return [...nodes].map(n => n.textContent)
  25. }
  26.  
  27. function createFileName(oldName, searchStr, replaceStr, applyToAll, caseSenstive) {
  28. var g = applyToAll ? 'g' : ''
  29. var i = caseSenstive ? '' : 'i'
  30. var rex = new RegExp(searchStr, g + i)
  31.  
  32. return oldName.replace(rex, replaceStr)
  33. }
  34.  
  35. function getCWD() {
  36. var addr = window.location.href
  37. var urlParams = new URLSearchParams(addr.substring(addr.indexOf('?') + 1))
  38. var cwd = urlParams.get('path')
  39. if (!cwd) {
  40. throw new Error("Can't get current working directory.")
  41. }
  42. return cwd
  43. }
  44.  
  45. function getActions(cwd, fileNames, searchStr, replaceStr, applyToAll = true, caseSenstive = false) {
  46. return fileNames
  47. .map(name => {
  48. var path = cwd + '/' + name
  49. var newname = createFileName(name, searchStr, replaceStr, applyToAll, caseSenstive)
  50.  
  51. return name !== newname ? { path, newname } : ''
  52. })
  53. .filter(action => action)
  54. }
  55.  
  56. function getFormData(actions) {
  57. var formData = new FormData()
  58. formData.append('filelist', JSON.stringify(actions))
  59.  
  60. return formData
  61. }
  62.  
  63. function showMsg(msg){
  64. $('.msg').text(msg).show('slow').delay(10000).hide(500)
  65. }
  66.  
  67. function postData(url, formData) {
  68. fetch(url, {
  69. method: 'POST',
  70. body: formData,
  71. })
  72. .then(res => res.json())
  73. .catch(err => console.error('Error:', err))
  74. .then(res => console.log('Response:', res))
  75. }
  76.  
  77. // ------------------- Utilities END ------------------- //
  78.  
  79. // ------------------- Main Functions declaration START ------------------- //
  80. var msg = ''
  81. var customCss = `
  82. .pure-g {
  83. padding: 5px;
  84. display: flex;
  85. align-items: center;
  86. background: #f1f1f1;
  87. }
  88. .rename-form {
  89. width: 100%;
  90. }
  91. .rename-form > label:not(:first-child), button:not(:first-child) {
  92. margin-left: 5px;
  93. }
  94. .outter{
  95. display: flex;
  96. }
  97. .msg{
  98. background: #b1e279
  99. }
  100. `
  101. var domHtml = `
  102. <div class="outter">
  103. <button class="pure-button pure-button-primary toggle-btn">Toggle</button>
  104. <form class="pure-g pure-form rename-form">
  105. <label class="pure-u-1 pure-u-xl-4-24 pure-u-lg-8-24">Replace: <input type="text" name="searchStr" value=""/></label>
  106. <label class="pure-u-1 pure-u-xl-4-24 pure-u-lg-8-24">with: <input type="text" name="replaceStr" value=""/></label>
  107. <label class="pure-u-1 pure-u-xl-3-24 pure-u-lg-8-24">Extension: <input type="text" name="extention" size=10 value=".mp4" placeholder="all files"/></label>
  108. <label class="pure-u-1 pure-u-xl-3-24 pure-u-lg-8-24 pure-button">Case Senstive? <input type="checkbox" name="caseSenstive" checked></label>
  109. <label class="pure-u-1 pure-u-xl-3-24 pure-u-lg-8-24 pure-button">Apply to all? <input type="checkbox" name="applyToAll" checked></label>
  110.  
  111. <button type="submit" class="pure-u-1 pure-u-xl-3-24 pure-u-lg-6-24 pure-button pure-button-primary">Rename!</button>
  112. <a class="pure-link author-label" href="https://greasyfork.org/en/scripts/395215-numbeo-cost-of-living-comparison">&#9784;</a>
  113. </form>
  114. <div class="msg">${msg}</div>
  115. </div>
  116. `
  117.  
  118. function main() {
  119. GM_addStyle(GM_getResourceText('purecss'))
  120. GM_addStyle(GM_getResourceText('responsiveCss'))
  121. GM_addStyle(customCss)
  122. $('#layoutMain').prepend($(domHtml))
  123.  
  124. // initiate listeners
  125. $('.toggle-btn').click(() => $('.rename-form').slideToggle('fast'))
  126. $('.rename-form').submit(function(event) {
  127. event.preventDefault()
  128.  
  129. var urlParams = new URLSearchParams($(this).serialize())
  130. var searchStr = urlParams.get('searchStr')
  131. var replaceStr = urlParams.get('replaceStr')
  132. var extention = urlParams.get('extention')
  133. var applyToAll = urlParams.get('applyToAll')
  134. var caseSenstive = urlParams.get('caseSenstive')
  135.  
  136. var fileNames = getFileNames().filter(name => name.endsWith(extention))
  137.  
  138. var actions = getActions(getCWD(), fileNames, searchStr, replaceStr, applyToAll, caseSenstive)
  139. var formData = getFormData(actions)
  140.  
  141. if (actions.length> 0) {
  142. postData(filemanagerUrl, formData)
  143. postData(taskqueryUrl, formData)
  144. showMsg(`${actions.length} files renamed! Please REFRESH the page.`)
  145. } else {
  146. showMsg('Nothing matched!')
  147. }
  148. })
  149. console.log('baidu-netdisk-rename initiated!')
  150. }
  151.  
  152. // ------------------- Main Functions declaration END ------------------- //
  153.  
  154. // ------------------- Main Functions execution START ------------------- //
  155. main()
  156. })()