代码片段

1.js新增前页面audio的播放按钮 下载全部的按钮

歌曲名设置为 data-desc=a.mp3
原始audio 下一首 下载所有 歌曲名
image

点击查看代码
let musics = document.querySelectorAll('audio')
// 音频链接
let musicSrcs=[]
let musicSrcNode={}
for (let i=0;i<musics.length;i++){
    musicSrcs[i]=musics[i].src
    musicSrcNode[musics[i].src]=musics[i]
}
// 添加音乐播放器
if (musics.length>0){
  let container=document.createElement('div')

  let display_audio=document.createElement('audio')
  display_audio.src=musics[0].src
  display_audio.setAttribute('controls',true)

  let playNext=document.createElement('button')
  playNext.textContent='下一首'
  let downAll=document.createElement('button')
  downAll.textContent='下载所有'

  let tipNow=document.createElement('span')
  tipNow.textContent='正在播放 '+musics[0].dataset.desc

  container.appendChild(display_audio)
  container.appendChild(playNext)
  container.appendChild(downAll)
  container.appendChild(tipNow)
  let insertObj=document.querySelector('.post-tabs')
  insertObj.insertBefore(container,insertObj.children[0])
  // row.insertBefore(audio,row.children[0])

  function PlayAudio(node){
    display_audio.src=node.src
    tipNow.textContent=node.dataset.desc 
    display_audio.play()
  }
//   点击项目播放
  musics.forEach((node) =>   {
    $(node.parentNode).click(()=>{
        PlayAudio(node)
    })
  })
//   播放下一首
  playNext.addEventListener('click',(e)=>{
    let index=musicSrcs.indexOf(display_audio.src)
    index=index+1
    if (index===musicSrcs.length)
    index=0
    PlayAudio(musicSrcNode[musicSrcs[index]])
   
  })

//   下载所有
  $(downAll).click(()=>{
    musics.forEach((node) =>   {
        var name = node.dataset.desc
        var src = window.location.origin + node.getAttribute('src')  
        downloadfile(src, name)
        //  this.downloadMp3('/api/musics?music_id=1',name);
  
      })
  })
}
点击查看代码

2.python获取文件信息 视频文件详细信息 缓存cache文件夹下 加速二次获取

代码量100行

点击查看代码
 
from os import path
import hashlib,pickle,os
from pathlib import Path

from progress.bar import Bar
from concurrent.futures import ThreadPoolExecutor,as_completed
import pymediainfo
# from base.mytools import *
# PickleM
 
def multi_threadpool(func,args, pool_size=1,desc='多线程',split_args=False):
    # 参数去空  
    args=[i  for i in args if i]
    count = len(args)
    if count==0:
        return []
     # 进度显示
    demo_desc='115 舌尖上的中国第1季 2012 7集 国语中字 MP4 1080P 6G'
    desc = '{} thread:{}'.format(desc[:len(demo_desc)], pool_size)
    suffix = ' eta:%(eta).2f  avg:%(avg).2f index:%(index)d(%(max)d) ela:%(elapsed).2f %(percent)d%%'
    if  pool_size == 1:
        ret_list = list(
            map(func, Bar(desc, fill='.', suffix=suffix).iter(args)))
        return ret_list
    # 线程池大小
    if count < pool_size:
        pool_size = count
    # 构造线程池
    pool = ThreadPoolExecutor(max_workers=pool_size)
    if split_args:
        tasks = [pool.submit(func,*arg) for arg in args]
    else:
        tasks = [pool.submit(func,arg) for arg in args]
    # wait(tasks, return_when=ALL_COMPLETED) //不要返回值
    # 收集返回值
    ret_list=[]
   

    with Bar(desc, max=len(args), suffix=suffix) as bar:
        for task in as_completed(tasks):
            if task.done():
                ret_i = task.result()
                ret_list.append(ret_i)
                bar.next()
        return ret_list

def _get_file(p,index):
    # 获取所有文件/夹
    ret=[] 
    for f in os.walk(p):
        for i in f[index]:
            file= '{}\\{}'.format(f[0], i)
            ret.append(file)
    return ret

def get_files(p):
    return _get_file(p,index=2)

class FIleInfo:
    def info(self,p):

        data=self.file_info(p)
        data['sizeMB']=data['size']//1024**2
        data['sizeGB']=data['size']//1024**3

        if self.is_video(p)  :
            t=self.video_info(p)
            if t:
                data.update(t)
                data['bit_rateMB']=data['bit_rate']//1024**2

        return data


    def is_video(self,p):
        def suffix( p, suffixs):
            suf=Path(p).suffix[1:]
            if suf.lower() in suffixs:
                return True
            return False
        suffixs = {'mp4', 'ts', 'wmv', 'mkv','avi','mov','.m4v', '.m4a','rmvb','mts','ts','m2ts'}
        return  suffix(p, suffixs)

    def file_info(self,p):
        data={
            'size':path.getsize(p),
            'mtime':int(path.getmtime(p))
        }
        return data
    def video_info(self,p):
        t=pymediainfo.MediaInfo.parse(p)
        t=t.video_tracks[0]
        data={
            'bit_rate':t.bit_rate,
            'duration':int(t.duration),
            'fps':round(float(t.frame_rate)),
            'h':t.height,
            'w':t.width,
            
        }
        
        return data

class GetInfo:
    cache='cache/fileinfo.pickle'
    def __init__(self) -> None:
        if path.exists(self.cache):
            self.infos=pickle.load(open(self.cache, 'rb'))
        else:
            os.mkdir('cache')
            self.infos=dict()
    def run(self,p,empty=False):
        if empty:
            self.infos=dict()
        def  f(i):
            h=hashlib.sha1()
            h.update(open(i,'rb').read(128*1024) )
            sha1=h.hexdigest().upper()
            if self.infos.get(sha1):
                data=self.infos.get(sha1)
            else:
                data=FIleInfo().info(i)
            return [i,sha1,data]
        ret=multi_threadpool(args=get_files(p)[:10] ,func=f,desc='file info')
        # 存储分析数据
        self.infos.update({i[1]:i[2] for i in ret})
        pickle.dump(self.infos,open(self.cache, 'wb'))

        ret_data={i[0]:i[2] for i in ret}
        return ret_data

t=GetInfo().run(p,empty=True)
pass
posted @ 2023-04-05 10:35  caiusxin  阅读(9)  评论(0编辑  收藏  举报
// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css