<?php
|
|
namespace App\Services;
|
|
use App\Services\QueuedFfmpegService;
|
|
use DateTime;
|
|
use Illuminate\Support\Facades\Log;
|
|
use Illuminate\Support\Facades\Redis;
|
|
|
|
class FileService {
|
|
|
|
private $queuedFfmpegService;
|
|
|
|
public function __construct() {
|
|
$this->queuedFfmpegService = new QueuedFfmpegService();
|
|
}
|
|
|
|
public function segmentFiles($baseDir) {
|
|
if (!is_dir($baseDir)) {
|
|
return;
|
|
}
|
|
// $files = new Finder();
|
|
// $files->files()->in($baseDir);
|
|
$files = $this->scan_dir($baseDir);
|
|
$firstTime = true;
|
|
$counter = 0;
|
|
$dirCounter = 0;
|
|
$dirName = "";
|
|
foreach ($files as $file) {
|
|
if ($firstTime) {
|
|
$dirName = $baseDir . "/" . date("Y-m-d", filectime($baseDir . "/" . $file)) . "-$dirCounter";
|
|
if (!is_dir($dirName)) {
|
|
mkdir($dirName);
|
|
}
|
|
$dirCounter++;
|
|
$firstTime = false;
|
|
}
|
|
rename($baseDir . "/" . $file, $dirName . "/" . $file);
|
|
$counter++;
|
|
if ($counter % 1000 == 0) {
|
|
$firstTime = true;
|
|
}
|
|
// exit;
|
|
}
|
|
|
|
}
|
|
|
|
private function scan_dir($dir) {
|
|
$ignored = array(".", "..", ".svn", ".htaccess", ".DS_Store");
|
|
|
|
$files = array();
|
|
foreach (scandir($dir) as $file) {
|
|
if (in_array($file, $ignored)) {
|
|
continue;
|
|
}
|
|
|
|
$files[$file] = filemtime($dir . '/' . $file);
|
|
}
|
|
|
|
asort($files);
|
|
$files = array_keys($files);
|
|
|
|
return ($files) ? $files : false;
|
|
}
|
|
|
|
public function queryFileTime($file) {
|
|
|
|
$mtime = date("Y-m-d H:i:s", filemtime($file));
|
|
$atime = date("Y-m-d H:i:s", fileatime($file));
|
|
$ctime = date("Y-m-d H:i:s", filectime($file));
|
|
echo "file mtime is $mtime, atime is $atime, ctime is $ctime";
|
|
}
|
|
|
|
public function compareLocalFilesAndGooglePhotoFiles() {
|
|
// $dir = "/Volumes/T7/S级女优 童年女神姐姐 天海翼 天海つばさ合集出道至今个别中文字幕无码破解目前最全【396V1.55TB】";
|
|
// $list = scandir($dir);
|
|
|
|
// $baseDir = "/Volumes/desktop-5rv69tq/very";
|
|
// $dirs = ["tg"];
|
|
$baseDir = "/Users/shixuesen/Documents/otherSync/very";
|
|
$dirs = ["mv1001"];
|
|
$files = [];
|
|
foreach ($dirs as $dir) {
|
|
$currentFiles = scandir($baseDir . DIRECTORY_SEPARATOR . $dir);
|
|
foreach ($currentFiles as $file) {
|
|
if ($file == "." || $file == ".." || $file == ".DS_Store") {
|
|
continue;
|
|
}
|
|
$files[] = $baseDir . DIRECTORY_SEPARATOR . $dir . DIRECTORY_SEPARATOR . $file;
|
|
}
|
|
|
|
// $files = array_merge($files, $currentFiles);
|
|
}
|
|
// $list = array_merge($list, scandir("/Users/shixuesen/Documents/sync/image/weibo04"));
|
|
// $list = [];
|
|
// $list = array_merge($list, scandir("/Volumes/desktop-81dpan3/pcSync/china_cam/china_cam_001"));
|
|
$photoList = [];
|
|
|
|
// $this->deleteFileListWithDir($photoList, "/Volumes/desktop-81dpan3/pcSync/china_cam/china_cam_001/");
|
|
$i = 0;
|
|
// $s1 = "ストッキング脚コンパイル_蓮実クレア-MIAD-711-C.mp4";
|
|
// $s2 = "ストッキング脚コンパイル_蓮実クレア-MIAD-711-C.mp4";
|
|
// $s3 = "ストッキング脚コンパイル_蓮実クレア-MIAD-711-C.mp4";
|
|
// $s4 = "ストッキング脚コンパイル_蓮実クレア-MIAD-711-C.mp4";
|
|
// $members = Redis::connection()->smembers("ストッキング脚コンパイル");
|
|
// dump($members);exit;
|
|
// dump($members);exit;
|
|
|
|
foreach ($files as $item) {
|
|
$basename = pathinfo($item, PATHINFO_BASENAME);
|
|
// dump($basename);continue;
|
|
// dump(Redis::connection()->smembers("腐团儿"));exit;
|
|
//
|
|
if (Redis::connection()->sismember("qqmv", $basename) == 0) {
|
|
// echo $item . " size is " . filesize($item) / 1024 . "kb\n";
|
|
|
|
if (!str_contains($basename, "baiduyun.uploading.cfg")) {
|
|
|
|
if (!starts_with($basename, ".")) {
|
|
dump($item);
|
|
$i++;
|
|
}
|
|
// rename($item, $baseDir . DIRECTORY_SEPARATOR . "tg_need" . DIRECTORY_SEPARATOR . $basename);
|
|
}
|
|
//
|
|
} else {
|
|
unlink($item);
|
|
}
|
|
}
|
|
echo "all file num is " . $i;
|
|
// dump(array_diff($list, $photoList));
|
|
}
|
|
|
|
public function deleteFilesForExtensions($dir, array $extensions) {
|
|
if (!is_dir($dir)) {
|
|
return;
|
|
}
|
|
$files = scandir($dir);
|
|
foreach ($files as $file) {
|
|
if (skipDefaultPathAndFile($file)) {
|
|
continue;
|
|
}
|
|
$currentItem = implode(DIRECTORY_SEPARATOR, [$dir, $file]);
|
|
if (is_dir($currentItem)) {
|
|
$this->deleteFilesForExtensions($currentItem, $extensions);
|
|
}
|
|
if (is_file($currentItem)) {
|
|
$pathInfo = pathinfo($currentItem);
|
|
if (in_array($pathInfo["extension"], $extensions)) {
|
|
dump("now delete file $currentItem");
|
|
unlink($currentItem);
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
public function renameFileExtensionToAnother($dir, $fromExtension, $toExtension) {
|
|
if (!is_dir($dir)) {
|
|
return;
|
|
}
|
|
$files = scandir($dir);
|
|
foreach ($files as $file) {
|
|
if (skipDefaultPathAndFile($file)) {
|
|
continue;
|
|
}
|
|
$currentItem = implode(DIRECTORY_SEPARATOR, [$dir, $file]);
|
|
if (is_dir($currentItem)) {
|
|
$this->renameFileExtensionToAnother($currentItem, $fromExtension, $toExtension);
|
|
}
|
|
if (is_file($currentItem)) {
|
|
$pathInfo = pathinfo($currentItem);
|
|
if ($pathInfo["extension"] == $fromExtension) {
|
|
$newFile = str_replace($fromExtension, $toExtension, $currentItem);
|
|
dump("now rename file $currentItem to $newFile");
|
|
rename($currentItem, $newFile);
|
|
$this->queuedFfmpegService->addToQueue($newFile);
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
public function renameFileAndAddToQueue($file, $fromExtension, $toExtension) {
|
|
if (is_file($file)) {
|
|
$pathInfo = pathinfo($file);
|
|
if ($pathInfo["extension"] == $fromExtension) {
|
|
$newFile = str_replace($fromExtension, $toExtension, $file);
|
|
dump("now rename file $file to $newFile");
|
|
rename($file, $newFile);
|
|
$this->queuedFfmpegService->addToQueue($newFile);
|
|
}
|
|
}
|
|
}
|
|
|
|
public function copySelectedFilesToMappedDirectory(array $sourceToDestMap) {
|
|
foreach ($sourceToDestMap as $sourceDir => $dest) {
|
|
// $lastTime = $this->processDirAndFindLastFileMTime($destDir);
|
|
$destDir = $dest[0];
|
|
$lastTime = $dest[1];
|
|
echo "sourceDir:{$sourceDir}, destDir: {$destDir}, lastTime: {$lastTime} \n";
|
|
$lastTime = strtotime("2022-10-10 23:00:00");
|
|
$this->deleteFilesInDir($destDir);
|
|
$list = $this->queryNewerFilesInDirectory($sourceDir, $lastTime);
|
|
$this->copyFileToDest($destDir, $list);
|
|
// dump($list);
|
|
|
|
}
|
|
}
|
|
|
|
public function mvFile($file, $destDirectory): bool {
|
|
return rename($file, $destDirectory . DIRECTORY_SEPARATOR . basename($file));
|
|
}
|
|
|
|
public function queryNewerFilesInDirectory($dir, $lastTime) {
|
|
$list = [];
|
|
if (!is_dir($dir)) {
|
|
return $list;
|
|
}
|
|
echo "start scandir $dir\n";
|
|
$files = scandir($dir);
|
|
// echo "end scandir $dir\n";
|
|
foreach ($files as $file) {
|
|
if ($file == "." || $file == ".." || $file == ".DS_Store") {
|
|
continue;
|
|
}
|
|
$currentItem = implode(DIRECTORY_SEPARATOR, [$dir, $file]);
|
|
if (is_dir($currentItem)) {
|
|
$list = array_merge($list, $this->queryNewerFilesInDirectory($currentItem, $lastTime));
|
|
} else if (is_file($currentItem)) {
|
|
if (filemtime($currentItem) > $lastTime) {
|
|
Log::info("now add file $currentItem");
|
|
// exit;
|
|
$list[] = $currentItem;
|
|
}
|
|
}
|
|
}
|
|
return $list;
|
|
}
|
|
|
|
/**
|
|
* 找出文件夹里的最新的的文件
|
|
* @param $destDir
|
|
* @return false|string
|
|
*/
|
|
public function processDirAndFindLastFileMTime($destDir) {
|
|
$date = new DateTime("last year");
|
|
$date = $date->format("Y-m-d H:i:s");
|
|
if (!is_dir($destDir)) {
|
|
|
|
return $date;
|
|
}
|
|
$files = scandir($destDir);
|
|
foreach ($files as $file) {
|
|
if ($file == "." || $file == ".." || $file == ".DS_Store") {
|
|
continue;
|
|
}
|
|
$currentItem = implode(DIRECTORY_SEPARATOR, [$destDir, $file]);
|
|
if (is_dir($currentItem)) {
|
|
$currentTime = $this->processDirAndFindLastFileMTime($currentItem);
|
|
} else {
|
|
$currentTime = date("Y-m-d H:i:s", filemtime($currentItem));
|
|
echo $currentItem . " " . $currentTime . "\n";
|
|
}
|
|
if (strtotime($currentTime) > strtotime($date)) {
|
|
$date = $currentTime;
|
|
}
|
|
|
|
}
|
|
return $date;
|
|
}
|
|
|
|
public function deleteFilesInDir($dir) {
|
|
if (!is_dir($dir)) {
|
|
return;
|
|
}
|
|
$files = scandir($dir);
|
|
foreach ($files as $file) {
|
|
if ($file == "." || $file == ".." || $file == ".DS_Store") {
|
|
continue;
|
|
}
|
|
$currentItem = implode(DIRECTORY_SEPARATOR, [$dir, $file]);
|
|
if (is_file($currentItem)) {
|
|
unlink($currentItem);
|
|
}
|
|
}
|
|
}
|
|
|
|
public function deleteFileListWithDir($list, $prefix) {
|
|
foreach ($list as $file) {
|
|
$file = $prefix . $file;
|
|
if (is_file($file)) {
|
|
unlink($file);
|
|
}
|
|
}
|
|
}
|
|
|
|
public function copyFileToDest($destDir, $fileList) {
|
|
$num = count($fileList);
|
|
foreach ($fileList as $file) {
|
|
// $filePathInfo = pathinfo($file);
|
|
// dump($filePathInfo);
|
|
// echo pathinfo($file, PATHINFO_BASENAME);
|
|
// exit;
|
|
$targetFile = $destDir . DIRECTORY_SEPARATOR . pathinfo($file, PATHINFO_BASENAME);
|
|
$num--;
|
|
if (is_file($targetFile)) {
|
|
echo "target file $targetFile exists \n";
|
|
continue;
|
|
}
|
|
copy($file, $targetFile);
|
|
echo "{$num} files left\n";
|
|
// exit;
|
|
// $filePathInfo[PATHINFO_DIRNAME];
|
|
}
|
|
}
|
|
}
|