content.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599
  1. var port = chrome.runtime.connect({ name: "hello" });
  2. let file = null
  3. let local_file_url = ''
  4. let local_player_state = false
  5. let test_tweet_state = false
  6. let tweet_json = {}
  7. let current_target
  8. let test_list_progress_time = -1
  9. let test_list_progress_duration = 0
  10. // let mediaSource = new MediaSource()
  11. // var mime = 'video/mp4;'
  12. // var sourceBuffer = null
  13. function partFilePost(res, file) {
  14. let buffer_str = ''
  15. let end_index = res.length - 1
  16. for (let i in res) {
  17. buffer_str = arrayBufferToString(res[i])
  18. port.postMessage({ state: 'SEDN_FILE_START', index: i, end_index, buffer_str, name: file.name, type: file.type })
  19. }
  20. }
  21. port.onMessage.addListener(function (res) {
  22. switch (res.state) {
  23. case 'CHECK_MD5_END':
  24. checkMd5(res)
  25. break
  26. case 'SEDN_FILE_END':
  27. // 切换状态
  28. switchState()
  29. break
  30. case 'UPLOAD_FILE':
  31. // 进度
  32. changeProgress(res)
  33. break
  34. case 'UPLOAD_FILE_END':
  35. showPlayer(res)
  36. break
  37. case 'AUDIO_CANPLAY':
  38. current_target.parentNode.querySelector('.test_list_start_time').innerText = '00:00'
  39. current_target.parentNode.querySelector('.test_list_end_time').innerText = formateTime(res.duration)
  40. test_list_progress_duration = res.duration
  41. test_list_progress_time = 0
  42. break
  43. case 'AUDIO_END':
  44. current_target.parentNode.querySelector('.test_list_start_time').innerText = '00:00'
  45. current_target.parentNode.querySelector('.test_list_player_state').src = 'https://webeditter.piaoquantv.com/data/play.png'
  46. current_target.parentNode.querySelector('.test_list_player_state').dataset.state = 'pause'
  47. break
  48. // case 'TEST_VIDEO':
  49. // debugger
  50. // sourceBuffer.appendBuffer(new Uint8Array(stringToArrayBuffer(res.str)))
  51. // break
  52. }
  53. });
  54. // function sourceOpen(){
  55. // console.log('sourceOpen')
  56. // sourceBuffer = mediaSource.addSourceBuffer(mime);
  57. // port.postMessage({state:'TEST_VIDEO'})
  58. // }
  59. // mediaSource.addEventListener('sourceopen', sourceOpen);
  60. function switchState() {
  61. dom.test_player.style.display = 'none'
  62. dom.test_progress.style.display = 'flex'
  63. dom.test_upload.style.display = 'none'
  64. }
  65. function showPlayer(res) {
  66. if (res.code == 0) {
  67. dom.test_player.style.display = 'block'
  68. dom.test_progress.style.display = 'none'
  69. dom.test_upload.style.display = 'none'
  70. tweet_json.url = res.data.url
  71. dom.test_tweet.style.background = '#0091E9'
  72. } else {
  73. dom.test_player.style.display = 'none'
  74. dom.test_progress.style.display = 'none'
  75. dom.test_upload.style.display = 'block'
  76. alert('Upload error')
  77. }
  78. dom.test_progress_detail.style.width = '0px'
  79. }
  80. function changeProgress(res) {
  81. dom.test_player.style.display = 'none'
  82. dom.test_progress.style.display = 'flex'
  83. dom.test_upload.style.display = 'none'
  84. let bili = parseInt(res.bili * 100)
  85. dom.test_progress_detail.style.width = 290 * bili / 100 + 'px'
  86. dom.test_progress_bili.innerText = bili + '%'
  87. }
  88. function checkMd5(res) {
  89. dom.test_upload_error.innerText = ''
  90. dom.test_player_audio.src = local_file_url
  91. if (res.code == 0) {
  92. // 云端有
  93. dom.test_player.style.display = 'block'
  94. dom.test_progress.style.display = 'none'
  95. dom.test_upload.style.display = 'none'
  96. dom.test_start_time.innerText = '00:00'
  97. tweet_json.url = res.data.url
  98. dom.test_tweet.style.background = '#0091E9'
  99. } else {
  100. dom.test_player.style.display = 'none'
  101. dom.test_progress.style.display = 'flex'
  102. dom.test_upload.style.display = 'none'
  103. // 云端没有,执行上传
  104. localFileSlice(file, (res) => {
  105. partFilePost(res, file)
  106. })
  107. }
  108. }
  109. // 获取dom
  110. let dom = {}
  111. function getDOM() {
  112. // dom.text =
  113. }
  114. // 弹框
  115. //
  116. dom.div_layer = document.createElement('div')
  117. dom.div_layer.style = 'width:100%;height:100%; background-color: rgba(0, 0, 0, 0.4); position: fixed; z-index:999; top:0;left:0;'
  118. dom.div_layer_form_html = document.createElement('div')
  119. dom.div_layer_form_html.innerHTML = `
  120. <div class="test_form">
  121. <div class="test_head">
  122. <img src="https://webeditter.piaoquantv.com/data/menu_close.png" class="test_menu_close" />
  123. </div>
  124. <div class="test_content">
  125. <div class="test_type">
  126. <textarea class="test_type_textarea" placeholder="What’s happening?" ></textarea>
  127. </div>
  128. <!-- Upload -->
  129. <div class="test_upload" style="display:none;">
  130. <div class="test_upload_txt">Drag File Upload</div>
  131. <div class="test_upload_note">Mp3 or Wav</div>
  132. <div class="test_upload_btn">Upload</div>
  133. <div class="test_upload_error" hidden>*Only Supports Mp3、Wav</div>
  134. <input type="file" accept="audio/mpeg" hidden class="test_form_file"/>
  135. </div>
  136. <!-- player -->
  137. <div class="test_card test_player" style="display:none;">
  138. <img class="test_player_close" src="https://webeditter.piaoquantv.com/data/close.png" />
  139. <img src="https://webeditter.piaoquantv.com/data/play.png" class="test_player_state" data-state='play'/>
  140. <audio src="" hidden></audio>
  141. <div class="test_progress_point"></div>
  142. <div class="test_progress_time"></div>
  143. <div class="test_start_time">00:00</div>
  144. <div class="test_end_time">01:05</div>
  145. </div>
  146. <div class="test_card test_progress" style="display:none;">
  147. <div class="test_progress_area">
  148. <div class="test_progress_back">
  149. <div class="test_progress_detail"></div>
  150. </div>
  151. <span class="test_progress_bili">0%</span>
  152. </div>
  153. </div>
  154. <div class="test_link">
  155. <input type="text" class="test_link_input" placeholder="Original Aduio Link (Optional)">
  156. </div>
  157. <div class="test_tweet">Tweet</div>
  158. </div>
  159. </div>`
  160. // css
  161. function showError(str) {
  162. dom.test_upload_error.hidden = false
  163. dom.test_upload_error.innerText = str
  164. }
  165. // 事件
  166. // DOM
  167. dom.btn_music = document.createElement('div')
  168. dom.btn_music2 = document.createElement('div')
  169. dom.image = document.createElement('img')
  170. dom.image.src = 'https://webeditter.piaoquantv.com/data/audio_icon.png'
  171. dom.image.width = "20"
  172. dom.image2 = document.createElement('img')
  173. dom.image2.src = 'https://webeditter.piaoquantv.com/data/1.png'
  174. dom.image2.width = "20"
  175. dom.div_layer.hidden = true
  176. document.addEventListener('DOMContentLoaded', function () {
  177. // let sc = document.createElement('script')
  178. // sc.src = 'https://webeditter.piaoquantv.com/data/1.js'
  179. // document.body.appendChild(sc)
  180. dom.btn_music.appendChild(dom.image)
  181. dom.btn_music2.appendChild(dom.image2)
  182. var iframe = document.createElement('iframe');
  183. iframe.src = chrome.runtime.getURL('iframe.html');
  184. iframe.id = 'id12'
  185. iframe.dataset.link = 'https://www.baidu.com'
  186. iframe.style.cssText = 'position:fixed;top:0px;right:0;display:block;' +
  187. 'width:50px;height:50px;z-index:1000;';
  188. document.body.appendChild(iframe);
  189. let _div = document.createElement('div')
  190. _div.style = `width:200px;height:0px;position:fixed;top:0px;z-index:9999;right:0px;`
  191. let _input = document.createElement('input')
  192. let _input_link = document.createElement('input')
  193. _input_link.type = 'text'
  194. _input.type = 'text'
  195. _input_link.placeholder = 'link'
  196. _input.placeholder = '宽高'
  197. _input.style.border = '1px solid black'
  198. _input_link.style.border = '1px solid black'
  199. _input.style = 'width:100px'
  200. _div.appendChild(_input)
  201. _div.appendChild(_input_link)
  202. _input.oninput = (e) => {
  203. let str = {
  204. w: _input.value,
  205. h: _input.value,
  206. link: _input_link.value
  207. }
  208. chrome.storage.sync.set({ iframe: JSON.stringify(str) });
  209. iframe.style.width = `${e.target.value}`
  210. iframe.style.height = `${e.target.value}`
  211. }
  212. _input_link.oninput = (e) => {
  213. let str = {
  214. w: _input.value,
  215. h: _input.value,
  216. link: _input_link.value
  217. }
  218. chrome.storage.sync.set({ iframe: JSON.stringify(str) });
  219. iframe.dataset.link = e.target.value
  220. }
  221. document.body.appendChild(_div);
  222. dom.iframe = document.querySelector('iframe')
  223. chrome.storage.sync.get({ iframe: '' }, (item) => {
  224. if (item.iframe) {
  225. let _j = JSON.parse(item.iframe)
  226. _input.value = _j.w
  227. _input_link.value = _j.link
  228. iframe.style.width = `${_j.w}`
  229. iframe.style.height = `${_j.h}`
  230. iframe.dataset.link = _input_link.value
  231. }
  232. });
  233. dom.div_layer.appendChild(dom.div_layer_form_html)
  234. document.body.appendChild(dom.div_layer)
  235. dom.menu_close = document.querySelector('.test_menu_close')
  236. dom.test_upload_btn = document.querySelector('.test_upload_btn')
  237. dom.test_form_file = document.querySelector('.test_form_file')
  238. dom.test_upload_error = document.querySelector('.test_upload_error')
  239. dom.test_type_textarea = document.querySelector('.test_type_textarea')
  240. dom.test_link_input = document.querySelector('.test_link_input')
  241. dom.test_upload = document.querySelector('.test_upload')
  242. dom.test_progress = document.querySelector('.test_progress')
  243. dom.test_player = document.querySelector('.test_player')
  244. dom.test_player_audio = dom.test_player.querySelector('audio')
  245. dom.test_tweet = document.querySelector('.test_tweet')
  246. dom.test_progress_detail = document.querySelector('.test_progress_detail')
  247. dom.test_progress_bili = document.querySelector('.test_progress_bili')
  248. dom.test_player_close = document.querySelector('.test_player_close')
  249. dom.test_player_state = document.querySelector('.test_player_state')
  250. dom.test_start_time = document.querySelector('.test_start_time')
  251. dom.test_end_time = document.querySelector('.test_end_time')
  252. dom.test_progress_point = document.querySelector('.test_progress_point')
  253. dom.twitter_input = document.querySelector('[contenteditable]')
  254. dom.test_player_audio.addEventListener('canplay', () => {
  255. dom.test_end_time.innerText = formateTime(dom.test_player_audio.duration)
  256. })
  257. dom.test_player_audio.addEventListener('ended', () => {
  258. dom.test_player_state.src = 'https://webeditter.piaoquantv.com/data/play.png'
  259. e.target.dataset.state = 'pause'
  260. dom.test_player_audio.pause()
  261. local_player_state = false
  262. })
  263. dom.test_player_state.addEventListener('click', (e) => {
  264. let state = e.target.dataset.state
  265. if (state == 'play') {
  266. e.target.dataset.state = 'pause'
  267. e.target.src = 'https://webeditter.piaoquantv.com/data/play.png'
  268. dom.test_player_audio.pause()
  269. local_player_state = false
  270. } else {
  271. e.target.dataset.state = 'play'
  272. e.target.src = 'https://webeditter.piaoquantv.com/data/pause.png'
  273. dom.test_player_audio.play()
  274. local_player_state = true
  275. }
  276. })
  277. dom.test_upload.addEventListener('dragover', (e) => {
  278. dom.test_upload.style.background = 'rgba(136, 136, 136, 0.1)'
  279. e.preventDefault();
  280. e.stopPropagation();
  281. })
  282. dom.test_upload.addEventListener('dragenter', (e) => {
  283. e.preventDefault();
  284. e.stopPropagation();
  285. })
  286. dom.test_upload.addEventListener('drop', (e) => {
  287. e.preventDefault();
  288. e.stopPropagation();
  289. var df = e.dataTransfer;
  290. var dropFiles = []; // 存放拖拽的文件对象
  291. let _file
  292. if (df.items !== undefined) {
  293. // Chrome有items属性,对Chrome的单独处理
  294. for (var i = 0; i < df.items.length; i++) {
  295. var item = df.items[i];
  296. // 用webkitGetAsEntry禁止上传目录
  297. if (item.kind === "file" && item.webkitGetAsEntry().isFile) {
  298. _file = item.getAsFile();
  299. dropFiles.push(_file);
  300. }
  301. }
  302. }
  303. if (dropFiles.length == 0) {
  304. showError('Can only is a file')
  305. return
  306. }
  307. if (dropFiles.length > 1) {
  308. showError('Can only one')
  309. return
  310. }
  311. file = dropFiles[0]
  312. let _index = file.name.lastIndexOf(".");
  313. //获取后缀
  314. var ext = file.name.substr(_index + 1);
  315. let typelist = ['mp3', 'wav']
  316. let result = typelist.find(item => item === ext.toLocaleLowerCase());
  317. if (!result) {
  318. showError('File type can only is MP3 or Wav')
  319. return
  320. }
  321. if (file.size > (1024 * 1024 * 100)) {
  322. showError('Cannot exceed 100MB')
  323. return
  324. }
  325. test_tweet_state = true
  326. local_file_url = URL.createObjectURL(file)
  327. //
  328. localFileToMD5(file, (md5) => {
  329. port.postMessage({ state: 'CHECK_MD5_START', md5 })
  330. })
  331. })
  332. dom.test_upload.addEventListener('dragleave', (e) => {
  333. e.preventDefault();
  334. e.stopPropagation();
  335. dom.test_upload.style.background = 'rgba(136, 136, 136, 0.01)'
  336. })
  337. dom.test_player_close.addEventListener('click', (e) => {
  338. dom.test_player.style.display = 'none'
  339. dom.test_progress.style.display = 'none'
  340. dom.test_upload.style.display = 'block'
  341. dom.test_tweet.style.background = '#C4C4C4'
  342. dom.test_progress_point.style.left = `${116}px`
  343. dom.test_player_audio.pause()
  344. dom.test_form_file.value = ''
  345. test_tweet_state = false
  346. if (local_file_url != '') {
  347. URL.revokeObjectURL(local_file_url)
  348. }
  349. })
  350. // dom.div_layer.addEventListener('click',(e)=>{
  351. // dom.div_layer.hidden = true
  352. // e.stopPropagation();
  353. // },false)
  354. dom.test_upload_btn.addEventListener('click', () => {
  355. dom.test_form_file.click()
  356. })
  357. dom.test_form_file.addEventListener('change', (e) => {
  358. file = e.target.files[0]
  359. // 1.check md5
  360. showError('Checking...')
  361. if (file.size > (1024 * 1024 * 100)) {
  362. showError('Cannot exceed 100MB')
  363. return
  364. }
  365. test_tweet_state = true
  366. local_file_url = URL.createObjectURL(file)
  367. //
  368. localFileToMD5(file, (md5) => {
  369. port.postMessage({ state: 'CHECK_MD5_START', md5 })
  370. })
  371. // 2.upload
  372. // 3.进度
  373. })
  374. dom.test_tweet.addEventListener('click', (e) => {
  375. if (!test_tweet_state && tweet_json.type == '') {
  376. return
  377. }
  378. document.querySelector('.r-e7q0ms').children[0].click()
  379. tweet_json.txt = dom.test_type_textarea.value
  380. tweet_json.link = dom.test_link_input.value
  381. if (tweet_json.type == 'iframe') {
  382. let content = '安装 #test 解密此贴文 ! https://test.io/?' + encodeURI(JSON.stringify(tweet_json))
  383. setTimeout(() => {
  384. document.execCommand("insertText", false, content);
  385. }, 500);
  386. dom.div_layer.hidden = true
  387. return
  388. }
  389. document.querySelector('.r-e7q0ms').children[0].click()
  390. document.querySelector('[contenteditable]').focus()
  391. let content = '安装 #test 解密此贴文 ! https://test.io/?' + encodeURI(JSON.stringify(tweet_json)) + ' ' + tweet_json.link
  392. setTimeout(() => {
  393. document.execCommand("insertText", false, content);
  394. }, 500);
  395. dom.div_layer.hidden = true
  396. })
  397. dom.menu_close.addEventListener('click', (e) => {
  398. dom.div_layer.hidden = true
  399. dom.test_tweet.style.background = 'rgb(196, 196, 196)'
  400. dom.test_upload_error.innerText = ''
  401. dom.test_type_textarea.value = ''
  402. dom.test_link_input.value = ''
  403. dom.test_upload_error.hidden = true
  404. })
  405. // let video = document.createElement('video')
  406. // video.style = ` top: 0px;
  407. // left: 0px;
  408. // width: 168px;
  409. // height: 100px;
  410. // position: fixed;
  411. // z-index: 9999;
  412. // border: 1px solid;`
  413. // video.src = URL.createObjectURL(mediaSource)
  414. // video.controls = 'controls'
  415. // document.body.appendChild(video)
  416. }, false)
  417. let has_btn_music = false
  418. let timer = setInterval(() => {
  419. let dom_twitter_nav = document.querySelector('.r-1s2bzr4')
  420. if (dom_twitter_nav && !has_btn_music) {
  421. has_btn_music = true
  422. dom.twitter_nav = dom_twitter_nav
  423. dom.twitter_nav.appendChild(dom.btn_music);
  424. dom.twitter_nav.appendChild(dom.btn_music2);
  425. dom.btn_music.addEventListener('click', () => {
  426. dom.div_layer.hidden = false
  427. dom.test_upload.style.display = 'block'
  428. tweet_json.type = ''
  429. })
  430. dom.btn_music2.addEventListener('click', (e) => {
  431. dom.div_layer.hidden = false
  432. dom.test_upload.style.display = 'none'
  433. document.querySelector('.test_type').style.display = 'none'
  434. dom.test_tweet.style.background = '#0091E9'
  435. tweet_json.type = 'iframe'
  436. })
  437. }
  438. if (local_player_state) {
  439. let bili = dom.test_player_audio.currentTime / dom.test_player_audio.duration
  440. dom.test_progress_point.style.left = `${230 * bili + 116}px`
  441. dom.test_start_time.innerText = formateTime(dom.test_player_audio.currentTime)
  442. }
  443. //
  444. render()
  445. //
  446. if (test_list_progress_time >= 0) {
  447. test_list_progress_time++
  448. let bili = test_list_progress_time / test_list_progress_duration
  449. if (bili <= 1) {
  450. current_target.parentNode.querySelector('.test_list_start_time').innerText = formateTime(test_list_progress_time)
  451. current_target.parentNode.querySelector('.test_list_progress_point').style.left = `${230 * bili + 116}px`
  452. }
  453. }
  454. }, 1000);
  455. window.onbeforeunload = function (ev) {
  456. port.postMessage({ state: 'AUDIO_PAUSE' })
  457. };
  458. // document.querySelectorAll('.test_post_play').addEventListener('click',function(e){
  459. // e.stopPropagation();
  460. // },true)
  461. document.addEventListener('click', (e) => {
  462. if (e.target.className == 'test_list_player_state') {
  463. current_target = e.target
  464. let url = e.target.dataset.url
  465. if (e.target.dataset.state == 'play') {
  466. test_list_progress_time = -1
  467. e.target.dataset.state = 'pause'
  468. e.target.src = 'https://webeditter.piaoquantv.com/data/play.png'
  469. // 暂停
  470. port.postMessage({ state: 'AUDIO_PAUSE', url })
  471. } else {
  472. e.target.dataset.state = 'play'
  473. e.target.src = 'https://webeditter.piaoquantv.com/data/pause.png'
  474. port.postMessage({ state: 'AUDIO_PLAY', url })
  475. }
  476. e.stopPropagation()
  477. }
  478. }, true)
  479. function render() {
  480. let all = document.querySelectorAll('.r-kzbkwu')
  481. // console.log(all)
  482. let net = 'https://test.io/?'
  483. try {
  484. let all_iframe = document.querySelectorAll('iframe')
  485. for (let j = 0; j < all_iframe.length; j++) {
  486. all_iframe[j].contentWindow.postMessage(all_iframe[j].dataset.link, '*')
  487. }
  488. for (let i in all) {
  489. let _dom = all[i].children[1].children[0].children[0]
  490. let text = _dom.innerText
  491. text = text.replace('…', '')
  492. let num = text.indexOf('安装 #test')
  493. let num2 = text.indexOf(net)
  494. if (num >= 0 && num2 >= 0) {
  495. text = decodeURI(text.substring((num2 + net.length)))
  496. text = text.substring(0, text.indexOf('}') + 1)
  497. let _json = JSON.parse(text)
  498. if (all[i].children[1].children[0].children[0]) {
  499. all[i].children[1].children[0].children[0].remove()
  500. }
  501. let div = document.createElement('div')
  502. if (_json.type == 'iframe') {
  503. var iframe = document.createElement('iframe');
  504. // iframe.src = chrome.runtime.getURL('iframe.html');
  505. iframe.src = _json.link
  506. iframe.id = 'id' + new Date().getTime()
  507. iframe.width = '100%'
  508. iframe.height = '100%'
  509. // iframe.dataset.link = _json.link
  510. iframe.style.cssText = 'width:100%;height:500px';
  511. div.appendChild(iframe)
  512. all[i].children[1].children[0].appendChild(div)
  513. return
  514. }
  515. // } else {
  516. // var iframe = document.createElement('iframe');
  517. // iframe.src = chrome.runtime.getURL('iframe.html');
  518. // // iframe.src = _json.link
  519. // iframe.id = 'id' + new Date().getTime()
  520. // iframe.width = '100%'
  521. // iframe.height = '100%'
  522. // iframe.dataset.url = _json.url
  523. // iframe.style.cssText = 'width:100%;height:500px';
  524. // div.appendChild(iframe)
  525. // all[i].children[1].children[0].appendChild(div)
  526. // }
  527. _json.txt = _json.txt.replace('<', '[')
  528. _json.txt = _json.txt.replace('>', ']')
  529. div.innerHTML = `
  530. <div class="test_list_txt">${_json.txt}</div>
  531. <div class="test_list_link">
  532. <a class="MuiTypography-root MuiTypography-inherit MuiLink-root MuiLink-underlineHover mui-wxdxbxanymd-10p1q4g" href="${_json.link}" target="_blank">
  533. ${_json.link}
  534. </a>
  535. </div>
  536. <div class="test_list_tag"><a class="MuiTypography-root MuiTypography-inherit MuiLink-root MuiLink-underlineHover mui-xvbctlsiwvx-10p1q4g" href="/hashtag/test?src=hashtag_click">#test</a></div>
  537. <div class="test_card test_player" >
  538. <img src="https://webeditter.piaoquantv.com/data/play.png" class="test_list_player_state" data-state='pause' data-url="${_json.url}"/>
  539. <div class="test_list_progress_point"></div>
  540. <div class="test_list_progress_time"></div>
  541. <div class="test_list_start_time"></div>
  542. <div class="test_list_end_time"></div>
  543. </div>`
  544. all[i].children[1].children[0].appendChild(div)
  545. all[i].children[1].children[0].children[0].remove()
  546. }
  547. }
  548. } catch (error) {
  549. }
  550. }