Browse Source

date index function ready

master
filesite 6 days ago
parent
commit
477953422b
  1. 98
      themes/beauty/controller/CommandController.php

98
themes/beauty/controller/CommandController.php

@ -8,6 +8,8 @@ require_once __DIR__ . '/../../../plugins/Common.php';
Class CommandController extends Controller { Class CommandController extends Controller {
protected $logPrefix = '[MainBot]'; protected $logPrefix = '[MainBot]';
protected $scanedDirCacheKey = 'MainBotScanedDirs';
protected $dateIndexCacheKey = 'MainBotDateIndex';
public function actionIndex() { public function actionIndex() {
$commands = <<<eof $commands = <<<eof
@ -98,7 +100,13 @@ eof;
} }
//服务器端机器人程序,负责图片、视频文件拍摄时间等信息扫描,并缓存结果供前端使用 //服务器端机器人程序
/**
* 扫描照片目录里所有子目录和文件
* 建立年份、月份索引数据
* 汇总每个目录下的照片、视频、MP3音乐文件数量
* 记录没有original_ctime的文件,把它们单独归类
*/
public function actionMainBot() { public function actionMainBot() {
$thisTime = date('Y-m-d H:i:s'); $thisTime = date('Y-m-d H:i:s');
$botLogPrefix = $this->logPrefix; $botLogPrefix = $this->logPrefix;
@ -110,7 +118,11 @@ eof;
$htmlCateReadme = ''; //当前目录下的Readme.md 内容 $htmlCateReadme = ''; //当前目录下的Readme.md 内容
$menus_sorted = array(); //Readme_sort.txt 说明文件内容,一级目录菜单从上到下的排序 $menus_sorted = array(); //Readme_sort.txt 说明文件内容,一级目录菜单从上到下的排序
//执行一次扫描任务
$this->cleanScanCaches();
$this->scanMediaFiles(); $this->scanMediaFiles();
$this->saveDateIndexIntoCacheFile();
//while (true) { //while (true) {
//$time = date('Y-m-d H:i:s'); //$time = date('Y-m-d H:i:s');
@ -118,7 +130,12 @@ eof;
//sleep(3); //sleep(3);
//} //}
}
//清空内存中的临时缓存数据
protected function cleanScanCaches() {
Common::setCache($this->scanedDirCacheKey, array());
Common::setCache($this->dateIndexCacheKey, array());
} }
//扫描媒体文件:图片、视频、音乐 //扫描媒体文件:图片、视频、音乐
@ -130,7 +147,7 @@ eof;
$dirpath = $rootDir; $dirpath = $rootDir;
} }
echo "\n\n== Scanning directory {$dirpath} ...\n\n"; echo "\n\n== Scanning directory {$dirpath} ...\n";
$scanner = new DirScanner(); $scanner = new DirScanner();
$scanner->setWebRoot(FSC::$app['config']['content_directory']); $scanner->setWebRoot(FSC::$app['config']['content_directory']);
$scanner->setRootDir($dirpath); $scanner->setRootDir($dirpath);
@ -139,13 +156,12 @@ eof;
$dirTree = $scanner->scan($dirpath, $maxScanDeep); $dirTree = $scanner->scan($dirpath, $maxScanDeep);
$scanResults = $scanner->getScanResults(); $scanResults = $scanner->getScanResults();
echo 'Total directories or files: ' . count($scanResults); echo 'Total directories or files: ' . count($scanResults);
echo "\n\n"; echo "\n";
$supportedImageExts = FSC::$app['config']['supportedImageExts']; $supportedImageExts = FSC::$app['config']['supportedImageExts'];
$supportedVideoExts = FSC::$app['config']['supportedVideoExts']; $supportedVideoExts = FSC::$app['config']['supportedVideoExts'];
$supportedAudioExts = FSC::$app['config']['supportedAudioExts']; $supportedAudioExts = FSC::$app['config']['supportedAudioExts'];
$cacheKey = $this->scanedDirCacheKey;
$cacheKey = 'MainBotScanedDirs';
if (!empty($scanResults)) { if (!empty($scanResults)) {
$scanIndex = 0; $scanIndex = 0;
@ -160,22 +176,28 @@ eof;
&& in_array($item['extension'], $supportedImageExts) && in_array($item['extension'], $supportedImageExts)
&& !in_array($item['extension'], $scanner->exifSupportFileExtensions) && !in_array($item['extension'], $scanner->exifSupportFileExtensions)
) { ) {
//echo "Image file no original_ctime: {$item['filename']}.{$item['extension']}, {$item['realpath']}\n"; echo "Image file no original_ctime: {$item['filename']}.{$item['extension']}, {$item['realpath']}\n";
}else if ( }else if (
!empty($item['filename']) !empty($item['filename'])
&& empty($item['original_ctime']) && empty($item['original_ctime'])
&& (in_array($item['extension'], $supportedVideoExts) || in_array($item['extension'], $supportedAudioExts)) && (in_array($item['extension'], $supportedVideoExts) || in_array($item['extension'], $supportedAudioExts))
) { ) {
//echo "Video or audio file no original_ctime: {$item['filename']}.{$item['extension']}, {$item['realpath']}\n"; echo "Video or audio file no original_ctime: {$item['filename']}.{$item['extension']}, {$item['realpath']}\n";
}else if (!empty($item['directory']) && empty($hadScanedDirs[$id])) { //if it's directory }else if (!empty($item['directory']) && empty($hadScanedDirs[$id])) { //if it's directory
$hadScanedDirs[$id] = true; $hadScanedDirs[$id] = true;
Common::setCache($cacheKey, $hadScanedDirs); Common::setCache($cacheKey, $hadScanedDirs);
//sleep(1);
$this->scanMediaFiles($item['realpath']); $this->scanMediaFiles($item['realpath']);
} }
$scanIndex ++; $scanIndex ++;
//更新年份、月份时间索引
if (!empty($item['filename'])) {
$this->updateDateIndex($scanner, $item);
}
//更新扫描进度
$stats = $this->updateScanStats($dirpath, $scanTotal, $scanIndex); $stats = $this->updateScanStats($dirpath, $scanTotal, $scanIndex);
} }
@ -191,7 +213,7 @@ eof;
'currentDir' => $dirpath, 'currentDir' => $dirpath,
'total' => $total, 'total' => $total,
'current' => $index, 'current' => $index,
'percent' => round($index/$total, 2) * 100, 'percent' => floor($index*100/$total),
); );
$botLogPrefix = $this->logPrefix; $botLogPrefix = $this->logPrefix;
@ -203,7 +225,7 @@ eof;
$rootDir = __DIR__ . '/../../../www/' . FSC::$app['config']['content_directory']; $rootDir = __DIR__ . '/../../../www/' . FSC::$app['config']['content_directory'];
if ($dirpath == $rootDir) { if ($dirpath == $rootDir) {
echo "{$botLogPrefix} {$dirpath} scan has finished {$stats['percent']}%, total {$stats['total']}, current {$stats['current']}\n"; echo "{$botLogPrefix} Scan has finished {$stats['percent']}%, total {$stats['total']}, current {$stats['current']}\n";
//保存进度文件 //保存进度文件
file_put_contents($statsFile, json_encode($stats) . "\n"); file_put_contents($statsFile, json_encode($stats) . "\n");
@ -222,6 +244,62 @@ eof;
return $stats; return $stats;
} }
//建立年份、月份时间索引
/**
* 数据格式:
* {"y2024": {"m1": [id1, id2, ...], "m10": [id1, id2, ...]}}
*/
protected function updateDateIndex($scanner, $file) {
$ctime = !empty($file['original_ctime']) ? $file['original_ctime'] : $file['fstat']['ctime'];
$cacheKey = $this->dateIndexCacheKey;
$cacheData = Common::getCache($cacheKey);
if (empty($cacheData)) {
$cacheData = array();
}
$year = 'y' . date('Y', $ctime);
$month = 'm' . date('m', $ctime);
if (empty($cacheData[$year])) {
$cacheData[$year] = array();
}
if (empty($cacheData[$year][$month])) {
$cacheData[$year][$month] = array();
}
array_push($cacheData[$year][$month], $file['id']);
return Common::setCache($cacheKey, $cacheData);
}
protected function saveDateIndexIntoCacheFile() {
$cacheKey = $this->dateIndexCacheKey;
$cacheData = Common::getCache($cacheKey);
if (empty($cacheData)) {
return false;
}
return Common::saveCacheToFile($cacheKey, $cacheData);
}
//汇总每个目录下图片、视频、音乐文件数量
/**
* 数据格式:
* {dirid: {image: 10, video: 20, audio: 0}, ...}
*/
protected function updateDirCounter() {
}
//归类没有original_ctime的图片、视频文件
/**
* 数据格式:
* [id1, id2, ...]
*/
protected function saveNoOriginalCtimeFiles() {
}
public function actionTest() { public function actionTest() {
$cacheKey = 'TestSTData'; $cacheKey = 'TestSTData';
$time = Common::getCache($cacheKey); $time = Common::getCache($cacheKey);

Loading…
Cancel
Save