代码片段
1.js新增前页面audio的播放按钮 下载全部的按钮
歌曲名设置为 data-desc=a.mp3
原始audio 下一首 下载所有 歌曲名
点击查看代码
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