const path = require('path');
nv_create_dirs('./nv-content/data/');
const db_media = new NV_Database(path.join(process.cwd(),"./nv-content/data/media.json"),{
columns: ['user_id','created_time','content','title','modified_time','filename'],
index: 'id'
});
nvdb.media = db_media;
const getDateTime = (timeStamp)=> {
const moment = require('moment-timezone');
// var timeZone = getOption('timeZone','Asia/Shanghai');
// 时区只使用UTC,为了防止在每个月初和月末的时候,如果时区发生改变,保存时候的时区和读取时不一样,就得不到正确的文件路径
var timeZone = 'UTC';
var momentTz = moment( new Date(timeStamp || new Date()) ).tz(timeZone);
return {
year: momentTz.format('YYYY'),
month: momentTz.format('MM'),
date: momentTz.format('DD'),
string: momentTz.format('YYYY-MM-DD HH:mm:ss'),
}
}
exports.getDateTime = getDateTime;
global.nv_insert_media = (args)=>{
/* user_id,created_time,content,title,modified_time,filename */
var media_id = db_media.insert(args);
do_action( 'media_insert', media_id, args );
return media_id;
}
global.nv_get_media = (media_id)=> {
var media = db_media.find(r=>r.id == media_id)[0];
if (media) {
media.metas = get_media_meta(media_id);
var {year,month} = getDateTime(media.created_time);
var base_url = get_option('nv_media_use_relative_url',false) ? '' : get_option('nv_home_url','');
var originalUrl = `${base_url}/uploads/${year}/${month}/${media.filename}`;
// hasThumbnail: 1-webp,2-avif(暂定)
// hasMiddle: 1-webp,2-avif(暂定)
var thumbnail = media.metas.hasThumbnail == 1 ? `${originalUrl}.thumbnail.webp`
: media.metas.hasThumbnail == 2 ? `${originalUrl}.thumbnail.avif`
: "";
var middle = media.metas.hasMiddle == 1 ? `${originalUrl}.middle.webp`
: media.metas.hasMiddle == 2 ? `${originalUrl}.middle.avif`
: "";
media.urls = {
original: originalUrl,
thumbnail,
middle,
}
return media;
} else {
return false;
}
}
global.nv_delete_media = (media_id)=> {
id = parseInt(media_id);
if (!id) {
return new NV_Error('参数错误');
}
var error = null;
//删除文件
var media = nv_get_media(media_id);
if (media) {
var {year,month} = getDateTime(media.created_time);
var originalPath = `/nv-content/uploads/${year}/${month}/${media.filename}`;
var removeFileResult = nv_remove_file(originalPath);
if (!removeFileResult) {
error = new NV_Error('删除文件失败');
}
var thumbnailPath = media.metas.hasThumbnail == 1 ? `${originalPath}.thumbnail.webp`
: media.metas.hasThumbnail == 2 ? `${originalPath}.thumbnail.avif`
: "";
var middlePath = media.metas.hasMiddle == 1 ? `${originalPath}.middle.webp`
: media.metas.hasMiddle == 2 ? `${originalPath}.middle.avif`
: "";
if (thumbnailPath) {
if (!nv_remove_file(thumbnailPath)) {
error = new NV_Error('删除缩略图失败');
}
}
if (middlePath) {
if (!nv_remove_file(middlePath)) {
error = new NV_Error('删除中等图失败');
}
}
// 看看有哪些用户meta使用了这个媒体id,直接drop掉
nvdb.usermeta.drop(r=>r.key=="avatar_id" && r.value==media_id)
//删除数据
db_media.drop(r=>r.id==id);
delete_media_meta(id);
} else {
error = new NV_Error('文件ID不存在');
}
if (error) {
return error;
} else {
return id;
}
}
global.nv_update_media = (args)=> {
args.id = parseInt(args.id);
var {id} = args;
delete args.id;
delete args.created_time;
delete args.filename;
db_media.setColumn(r=>r.id==id,{
...args,
modified_time: new Date().getTime(),
});
return id;
}
/*global.query_media = (filter,current_page,media_per_page)=>{
var list = db_media.find(filter).reverse();
var start = (current_page - 1) * media_per_page;
var result = list.slice(start, start + media_per_page + 1);
return {
data: result.map(r=>{
var media = nv_get_media(r.id);
return {
...media,
uploadUser: get_user_by_id(media.user_id).name,
}
}),
pagination: {
current_page,
media_per_page,
total: list.length
}
}
}*/
global.query_media = ({filter,meta_filter,relation,current_page,media_per_page}) => {
var ids = [];
var media_ids = [];
var metaIDs = [];
if (!filter) { filter = r=>true; }
if (!meta_filter) { meta_filter = r=>true; }
media_ids = db_media.find(filter).map(r=>r.id);
metaIDs = nvdb.mediameta.find(meta_filter).map(r=>r.media_id);
switch(relation) {
case "AND":
metaIDs.forEach(id=>{
if ( media_ids.includes(id) && !ids.includes(id) ) {
ids.push(id)
}
})
break;
default:
//OR
ids = media_ids;
metaIDs.forEach(id=>{
if ( !ids.includes(id) ) {
ids.push(id)
}
})
}
ids.sort((a,b)=>b-a);
var start = (current_page - 1) * media_per_page;
var pagedIds = ids.slice(start, start + media_per_page);
return {
data: pagedIds.map(id=>{
var media = nv_get_media(id);
return {
...media,
uploadUser: get_user_by_id(media.user_id).name,
}
}),
pagination: {
current_page,
media_per_page,
total: ids.length
}
}
}
global.nv_set_media_fields = (media_ids, obj)=>{
db_media.setColumn(r=>media_ids.includes(r.id),obj);
}
global.update_media_meta = (media_id,key,value) => {
return update_metadata('media',media_id,key,value);
}
global.get_media_meta = (media_id,key)=>{
return get_metadata('media',media_id,key);
}
global.delete_media_meta = (media_id,key) => {
return delete_metadata('media',media_id,key);
}