Browse Source

add some code

feature/new_bilibili_and_instagram_sxs20191126
shixuesen 4 years ago
parent
commit
7c8223cdb0
20 changed files with 781 additions and 67 deletions
  1. +2
    -0
      .idea/php.xml
  2. +6
    -0
      app/BilibiliVideos.php
  3. +2
    -0
      app/Console/Commands/BiliVideoCode.php
  4. +55
    -0
      app/Console/Commands/RecordDir.php
  5. +85
    -0
      app/Http/Controllers/ImageRecordController.php
  6. +30
    -0
      app/ImageRecord.php
  7. +20
    -0
      app/Repositories/BilibiliVideoRepository.php
  8. +107
    -44
      app/Services/BilibiliServiceV2.php
  9. +180
    -0
      app/Services/DirService.php
  10. +9
    -0
      app/Services/FfmpegService.php
  11. +7
    -2
      app/Services/NewNvshenService.php
  12. +28
    -7
      app/Services/XiurenjiService.php
  13. +1
    -0
      composer.json
  14. +139
    -2
      composer.lock
  15. +9
    -0
      database/factories/ImageRecordFactory.php
  16. +11
    -8
      database/migrations/2021_10_08_163234_create_google_photos_table.php
  17. +7
    -4
      database/migrations/2021_10_08_165821_create_google_photos_table.php
  18. +34
    -0
      database/migrations/2021_11_08_132032_create_image_records_table.php
  19. +35
    -0
      database/migrations/2021_11_24_133249_add_download_and_encode_status.php
  20. +14
    -0
      fail.log

+ 2
- 0
.idea/php.xml View File

@ -180,6 +180,8 @@
<path value="$PROJECT_DIR$/vendor/google/gax" />
<path value="$PROJECT_DIR$/vendor/doctrine/deprecations" />
<path value="$PROJECT_DIR$/vendor/paragonie/constant_time_encoding" />
<path value="$PROJECT_DIR$/vendor/prettus/laravel-validation" />
<path value="$PROJECT_DIR$/vendor/prettus/l5-repository" />
<path value="$PROJECT_DIR$/vendor/albertofem/rsync-lib" />
</include_path>
</component>


+ 6
- 0
app/BilibiliVideos.php View File

@ -39,6 +39,12 @@ use Illuminate\Database\Eloquent\Model;
* @method static \Illuminate\Database\Eloquent\Builder|\App\BilibiliVideos whereBvId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\BilibiliVideos whereCollectionMid($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\BilibiliVideos whereUpMid($value)
* @property int $download_status 下载状态,0 表示未在下载中 1 表示下载中
* @property int $encode_status 转码状态,0 表示未在转码中 1 表示转码中
* @property int $version 版本号,用做乐观锁更新
* @method static \Illuminate\Database\Eloquent\Builder|BilibiliVideos whereDownloadStatus($value)
* @method static \Illuminate\Database\Eloquent\Builder|BilibiliVideos whereEncodeStatus($value)
* @method static \Illuminate\Database\Eloquent\Builder|BilibiliVideos whereVersion($value)
*/
class BilibiliVideos extends Model
{


+ 2
- 0
app/Console/Commands/BiliVideoCode.php View File

@ -55,6 +55,8 @@ class BiliVideoCode extends Command
// exit;
$bilibili->queryDBCollectionList();
// $bilibili->compareAndDownloadUpVideos(true);
// $bilibili->compareAndDownloadCollectionVideos();
// exit;
$bilibili->queryForVideoParts();
if (App::environment() == "local") {


+ 55
- 0
app/Console/Commands/RecordDir.php View File

@ -0,0 +1,55 @@
<?php
namespace App\Console\Commands;
use App\ImageRecord;
use Illuminate\Console\Command;
use App\Services\DirService;
class RecordDir extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'record:dir';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
//
$service = new DirService();
$list = $service->recursiveScan("/Users/shixuesen/Documents/sync/image");
foreach ($list["files"] as $file) {
$fileInfo = pathinfo($file);
$imageRecord = new ImageRecord();
$imageRecord->path = $fileInfo["dirname"];
$imageRecord->name = $fileInfo["filename"];
$imageRecord->type = 2;
$imageRecord->save();
}
}
}

+ 85
- 0
app/Http/Controllers/ImageRecordController.php View File

@ -0,0 +1,85 @@
<?php
namespace App\Http\Controllers;
use App\ImageRecord;
use Illuminate\Http\Request;
class ImageRecordController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*
* @param \App\ImageRecord $imageRecord
* @return \Illuminate\Http\Response
*/
public function show(ImageRecord $imageRecord)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param \App\ImageRecord $imageRecord
* @return \Illuminate\Http\Response
*/
public function edit(ImageRecord $imageRecord)
{
//
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\ImageRecord $imageRecord
* @return \Illuminate\Http\Response
*/
public function update(Request $request, ImageRecord $imageRecord)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param \App\ImageRecord $imageRecord
* @return \Illuminate\Http\Response
*/
public function destroy(ImageRecord $imageRecord)
{
//
}
}

+ 30
- 0
app/ImageRecord.php View File

@ -0,0 +1,30 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
/**
* App\ImageRecord
*
* @property int $id
* @property string $name
* @property string $path
* @property int $type 1: 目录 2: 文件
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @method static \Illuminate\Database\Eloquent\Builder|ImageRecord newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|ImageRecord newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|ImageRecord query()
* @method static \Illuminate\Database\Eloquent\Builder|ImageRecord whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|ImageRecord whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|ImageRecord whereName($value)
* @method static \Illuminate\Database\Eloquent\Builder|ImageRecord wherePath($value)
* @method static \Illuminate\Database\Eloquent\Builder|ImageRecord whereType($value)
* @method static \Illuminate\Database\Eloquent\Builder|ImageRecord whereUpdatedAt($value)
* @mixin \Eloquent
*/
class ImageRecord extends Model
{
//
}

+ 20
- 0
app/Repositories/BilibiliVideoRepository.php View File

@ -0,0 +1,20 @@
<?php
namespace App;
use Illuminate\Support\Facades\DB;
use Prettus\Repository\Eloquent\BaseRepository;
class BilibiliVideoRepository extends BaseRepository{
function model()
{
return "App\\BilibiliVideos";
// TODO: Implement model() method.
}
public function softLockUpdate($where, $version, $attrs) {
$where["version"] = $version;
$attrs["version"] = DB::raw("version + 1");
return BilibiliVideos::where($where)->update($attrs);
}
}

+ 107
- 44
app/Services/BilibiliServiceV2.php View File

@ -6,6 +6,7 @@ namespace App\Services;
use App\BilibiliCollections;
use App\BilibiliUpVideos;
use App\BilibiliVideoParts;
use App\BilibiliVideoRepository;
use App\BilibiliVideos;
use Exception;
use GuzzleHttp\Client;
@ -27,7 +28,14 @@ class BilibiliServiceV2
private $baseDir = "/Volumes/intel660p/video/mv/";
private $remoteDir = "/data";
private $remoteDir = "/data/";
protected $repository;
public function __construct(BilibiliVideoRepository $repository)
{
$this->repository = $repository;
}
public function queryPlayList()
{
@ -249,6 +257,10 @@ class BilibiliServiceV2
if ($item["is_downloaded"] == 1) {
continue;
}
if (!$this->checkDiskSpace()) {
Log::info('磁盘空间不足');
exit;
}
Log::info("schedule compareAndDownloadUpVideos current up is {$item['up_name']}, started at: " . date("Y-m-d H:i:s"));
if ($isAll) {
$vItems = BilibiliVideos::where("up_mid", $item["mid"])->get();
@ -258,40 +270,59 @@ class BilibiliServiceV2
}
$videoList = [];
$videoPartsMap = [];
if (count($vItems) > 0) {
foreach ($vItems as $vItem) {
if ($vItem["is_download"] == 1 && $vItem["is_downloaded"] == 0) {
if (count($vItems) > 0) {
foreach ($vItems as $vItem) {
if ($vItem["is_download"] == 1 && $vItem["is_downloaded"] == 0 || $vItem["download_status"] != 1) {
// $videoList[] = "av" . $vItem["aid"];
$videoPartsMap = [];
$videoPartsMap[$vItem["aid"]] = $vItem["total_parts"];
echo "当前 up名称是: " . $item["up_name"] . " 当前下载的视频 title: " . $vItem["title"] . " 当前下载的视频 aid 是:" . $vItem["aid"] . "\n" ;
Log::info("当前 up名称是: " . $item["up_name"] . " 当前下载的视频 title: " . $vItem["title"] . " 当前下载的视频 aid 是:" . $vItem["aid"]);
if ($env == "local") {
$result = false;
if ($item['mid'] == 27174777) {
$result = $this->partDownloadBSitePlaylist($videoPartsMap, "/Volumes/WD/tmp/bilibili/", "女团");
} else if ($item["mid"] == 391316322) {
$result = $this->partDownloadBSitePlaylist($videoPartsMap, "/Volumes/WD/tmp/bilibili/", "娜娜");
} else if ($item["mid"] == 396501206) {
$result = $this->partDownloadBSitePlaylist($videoPartsMap, "/Volumes/WD/tmp/bilibili/", "佳佳");
} else {
$result = $this->partDownloadBSitePlaylist($videoPartsMap, $this->baseDir . "bilibili/", $item['up_name']);
}
if ($result) {
$vItem["is_downloaded"] = 1;
$vItem->save();
}
if (!$this->repository->softLockUpdate(["id" => $vItem["id"]], $vItem["version"], ["download_status" => 1])) {
Log::warning("soft Lock failed id : " . $vItem["id"]);
continue;
}
$videoPartsMap = [];
$videoPartsMap[$vItem["aid"]] = $vItem["total_parts"];
echo "当前 up名称是: " . $item["up_name"] . " 当前下载的视频 title: " . $vItem["title"] . " 当前下载的视频 aid 是:" . $vItem["aid"] . "\n";
Log::info("当前 up名称是: " . $item["up_name"] . " 当前下载的视频 title: " . $vItem["title"] . " 当前下载的视频 aid 是:" . $vItem["aid"]);
if ($env == "local") {
$result = false;
if ($item['mid'] == 27174777) {
$result = $this->partDownloadBSitePlaylist($videoPartsMap, "/Volumes/WD/tmp/bilibili/", "女团");
} else if ($item["mid"] == 391316322) {
$result = $this->partDownloadBSitePlaylist($videoPartsMap, "/Volumes/WD/tmp/bilibili/", "娜娜");
} else if ($item["mid"] == 396501206) {
$result = $this->partDownloadBSitePlaylist($videoPartsMap, "/Volumes/WD/tmp/bilibili/", "佳佳");
} else {
$result = $this->partDownloadBSitePlaylist($videoPartsMap, $this->remoteDir . "bilibili/", $item["up_name"]);
if ($result) {
$vItem["is_downloaded"] = 1;
$vItem->save();
$result = $this->partDownloadBSitePlaylist($videoPartsMap, $this->baseDir . "bilibili/", $item['up_name']);
}
if ($result) {
if (!$this->repository->softLockUpdate(
["id" => $vItem["id"]],
$vItem["version"],
["download_status" => 0,
"is_downloaded" => 1
])) {
Log::warning("soft Lock failed id : " . $vItem["id"]);
}
}
} else {
$result = $this->partDownloadBSitePlaylist($videoPartsMap, $this->remoteDir . "bilibili/", $item["up_name"]);
if ($result) {
if (!$this->repository->softLockUpdate(
["id" => $vItem["id"]],
$vItem["version"],
["download_status" => 0,
"is_downloaded" => 1
])) {
Log::warning("soft Lock failed id : " . $vItem["id"]);
}
}
}
}
}
}
}
}
}
@ -304,6 +335,10 @@ class BilibiliServiceV2
if ($item["is_downloaded"] == 1) {
continue;
}
if (!$this->checkDiskSpace()) {
Log::info('磁盘空间不足');
exit;
}
Log::info("schedule compareAndDownloadCollectionVideos current collection is {$item['title']}, started at: " . date("Y-m-d H:i:s"));
$videoList = [];
$videoPartsMap = [];
@ -317,11 +352,15 @@ class BilibiliServiceV2
if (count($vItems) > 0) {
foreach ($vItems as $vItem) {
if ($vItem["is_download"] == 1 && $vItem["is_downloaded"] == 0) {
if ($vItem["is_download"] == 1 && $vItem["is_downloaded"] == 0 && $vItem["download_status"] == 0) {
// $videoList[] = "av" . $vItem["aid"];
if (!$this->repository->softLockUpdate(["id" => $vItem["id"]], $vItem["version"], ["download_status" => 1])) {
Log::warning("soft Lock failed id : " . $vItem["id"]);
continue;
}
$videoPartsMap = [];
$videoPartsMap[$vItem["aid"]] = $vItem["total_parts"];
echo "收藏夹名称是: " . $item["title"] . " 当前下载的视频 title: " . $vItem["title"] . " 当前下载的视频 aid 是:" . $vItem["aid"] . "\n" ;
echo "收藏夹名称是: " . $item["title"] . " 当前下载的视频 title: " . $vItem["title"] . " 当前下载的视频 aid 是:" . $vItem["aid"] . "\n";
Log::info("收藏夹名称是: " . $item["title"] . " 当前下载的视频 title: " . $vItem["title"] . " 当前下载的视频 aid 是:" . $vItem["aid"]);
if ($env == "local") {
$result = false;
@ -340,17 +379,28 @@ class BilibiliServiceV2
$result = $this->partDownloadBSitePlaylist($videoPartsMap, $this->baseDir . "bilibili/", $item['title']);
}
if ($result) {
$vItem["is_downloaded"] = 1;
$vItem->save();
if (!$this->repository->softLockUpdate(
["id" => $vItem["id"]],
$vItem["version"],
["download_status" => 0,
"is_downloaded" => 1
])) {
Log::warning("soft Lock failed id : " . $vItem["id"]);
}
}
} else {
$result = $this->partDownloadBSitePlaylist($videoPartsMap, $this->remoteDir . "bilibili", $item["title"]);
if ($result) {
$vItem["is_downloaded"] = 1;
$vItem->save();
if (!$this->repository->softLockUpdate(
["id" => $vItem["id"]],
$vItem["version"],
["download_status" => 0,
"is_downloaded" => 1
])) {
Log::warning("soft Lock failed id : " . $vItem["id"]);
}
}
}
}
}
}
@ -678,8 +728,8 @@ class BilibiliServiceV2
$dirFiles = [];
$dirFiles["/Volumes/WD/tmp/bilibili"] = scandir("/Volumes/WD/tmp/bilibili");
$dirFiles["/Volumes/WD/tmp/bilibili/aoa"] = scandir("/Volumes/WD/tmp/bilibili/aoa");
$dirFiles["/Volumes/WD/tmp/bilibili/女团"]= scandir("/Volumes/WD/tmp/bilibili/女团");
$dirFiles["/Volumes/WD/tmp/bilibili/少女时代"]= scandir("/Volumes/WD/tmp/bilibili/少女时代");
$dirFiles["/Volumes/WD/tmp/bilibili/女团"] = scandir("/Volumes/WD/tmp/bilibili/女团");
$dirFiles["/Volumes/WD/tmp/bilibili/少女时代"] = scandir("/Volumes/WD/tmp/bilibili/少女时代");
while ($list->isNotEmpty()) {
foreach ($list->items() as $item) {
// dump("current item", [$item->getAttributes()]);
@ -743,8 +793,8 @@ class BilibiliServiceV2
$dirFiles = [];
$dirFiles["/Volumes/WD/tmp/bilibili"] = scandir("/Volumes/WD/tmp/bilibili");
$dirFiles["/Volumes/WD/tmp/bilibili/aoa"] = scandir("/Volumes/WD/tmp/bilibili/aoa");
$dirFiles["/Volumes/WD/tmp/bilibili/女团"]= scandir("/Volumes/WD/tmp/bilibili/女团");
$dirFiles["/Volumes/WD/tmp/bilibili/少女时代"]= scandir("/Volumes/WD/tmp/bilibili/少女时代");
$dirFiles["/Volumes/WD/tmp/bilibili/女团"] = scandir("/Volumes/WD/tmp/bilibili/女团");
$dirFiles["/Volumes/WD/tmp/bilibili/少女时代"] = scandir("/Volumes/WD/tmp/bilibili/少女时代");
while ($list->isNotEmpty()) {
foreach ($list->items() as $item) {
dump("current item", [$item->getAttributes()]);
@ -770,7 +820,7 @@ class BilibiliServiceV2
if ($file == "." || $file == "..") {
continue;
} else {
dump("current file: ". $file ." ".$part["title"]);
dump("current file: " . $file . " " . $part["title"]);
$pos = strpos($file, $part["title"]);
// dump("current compare result " . $pos);
if ($pos !== false) {
@ -874,7 +924,7 @@ class BilibiliServiceV2
}
foreach ($aidList as $aid) {
Log::info("current download command is : cd '{$innerDir}' && annie -r https://www.bilibili.com/video/av80815149 -p " . $aid);
$downloadResult = shell_exec('cd "' .$innerDir .'" && annie -r https://www.bilibili.com/video/av80815149 -p ' . $aid);
$downloadResult = shell_exec('cd "' . $innerDir . '" && annie -r https://www.bilibili.com/video/av80815149 -p ' . $aid);
Log::info($downloadResult);
Log::info("current download result: " . $downloadResult);
try {
@ -896,14 +946,19 @@ class BilibiliServiceV2
$env = App::environment();
$dirExists = is_dir($dir);
dump($dirExists);
echo "dir is $dir, and $dirExists";
if ($dirExists) {
$innerDir = $dir . "/" . $subDir;
dump($innerDir);
if (!is_dir($innerDir)) {
mkdir($innerDir);
}
if (!$this->checkDiskSpace($innerDir)) {
Log::info('磁盘空间不足');
exit;
}
echo "当前视频的下载路径是: " . $innerDir . "\n";
Log::info("当前视频的下载路径是: " . $innerDir );
Log::info("当前视频的下载路径是: " . $innerDir);
foreach ($aidMap as $aid => $parts) {
dump($aid);
Log::info("current download command is : cd '{$innerDir}' && annie -r https://www.bilibili.com/video/av80815149 -p " . $aid);
@ -985,7 +1040,7 @@ done && echo "ok"');
$aNo = 484525;
for ($i = 0; $i < 5000000; $i++) {
$tempANo = $aNo + $i;
$sql = "insert into `bilibili_video_temps`( `aid`, `title`, `from_type`, `from_collection_name`, `from_up_name`, `is_download`, `is_downloaded`, `total_parts`, `created_at`, `updated_at`) VALUES ( " .$tempANo . ", '【钢琴】《鬼灭之刃》OP《红莲华》by LiSA', 2, '', '绯绯', 1, 1, 1, '2020-01-08 10:05:40', '2020-01-13 23:35:17');";
$sql = "insert into `bilibili_video_temps`( `aid`, `title`, `from_type`, `from_collection_name`, `from_up_name`, `is_download`, `is_downloaded`, `total_parts`, `created_at`, `updated_at`) VALUES ( " . $tempANo . ", '【钢琴】《鬼灭之刃》OP《红莲华》by LiSA', 2, '', '绯绯', 1, 1, 1, '2020-01-08 10:05:40', '2020-01-13 23:35:17');";
$result = DB::insert($sql);
if ($i % 100 == 0) {
print_r($result);
@ -996,7 +1051,15 @@ done && echo "ok"');
public function searchVideoFiles($filename)
{
$list = BilibiliVideos::where("title", "like", "%". trim($filename) ."%" )->get();
$list = BilibiliVideos::where("title", "like", "%" . trim($filename) . "%")->get();
dump($list);
}
public function checkDiskSpace($dir = "/data")
{
if (disk_free_space($dir) > 5 * 1024 * 1024 * 1024) {
return true;
}
return false;
}
}

+ 180
- 0
app/Services/DirService.php View File

@ -0,0 +1,180 @@
<?php
namespace App\Services;
use Closure;
class DirService
{
public function simpleScan($dir) {
$files = array();
$dirs = array();
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
if ($file != '.' && $file != '..') {
if (is_dir($dir . '/' . $file)) {
$dirs[] = $file;
} else {
$files[] = $file;
}
}
}
closedir($dh);
}
}
return array('files' => $files, 'dirs' => $dirs);
}
public function recursiveScan($dir) {
$files = array();
$dirs = array();
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
if ($file != '.' && $file != '..') {
if (is_dir($dir . DIRECTORY_SEPARATOR . $file)) {
$dirs[] = $file;
$tempResult = $this->recursiveScan($dir . DIRECTORY_SEPARATOR . $file);
$dirs = array_merge($dirs, $tempResult['dirs']);
$files = array_merge($files, $tempResult['files']);
} else {
$files[] = $dir . DIRECTORY_SEPARATOR . $file;
}
}
}
closedir($dh);
}
}
return array('files' => $files, 'dirs' => $dirs);
}
/**
* 扫描目录下所有文件,
* @var array
*/
protected static $files = [];
public static $ret = [];
/**
* 扫描目录路径
* @param $path string 带扫描的路径
* @param array $options 要附加的选项,后面可以根据自己需求扩展
* @return array
* @author: Vencenty
*/
static function scan($path, $options = [])
{
$options = array_merge([
'callback' => null, // 对查找到的文件进行操作
'filterExt' => [], // 要过滤的文件后缀
], $options);
$scanQueue = [$path];
while (count($scanQueue) != 0) {
$rootPath = array_pop($scanQueue);
// 过滤['.', '..']目录
$paths = array_filter(scandir($rootPath), function ($path) {
return !in_array($path, ['.', '..']);
});
foreach ($paths as $path) {
// 拼接完整路径
$fullPath = $rootPath . DIRECTORY_SEPARATOR . $path;
// 如果是目录的话,合并到扫描队列中继续进行扫描
if (is_dir($fullPath)) {
array_unshift($scanQueue, $fullPath);
continue;
}
// 如果不是空,进行过滤
if (!empty($options['filterExt'])) {
$pathInfo = pathinfo($fullPath);
$ext = $pathInfo['extension'] ?? null;
if (in_array($ext, $options['filterExt'])) {
continue;
}
}
if ($options['callback'] instanceof Closure) {
// 经过callback处理之后为空的数据不作处理
$fullPath = $options['callback']($fullPath);
// 返回的只要不是字符串路径,不作处理
if (!is_string($fullPath)) {
continue;
}
}
array_push(static::$files, $fullPath);
}
}
return static::$files;
}
/**
* 目录拷贝,返回被拷贝的文件数,
* @param $source string 源文件,填写绝对路径
* @param $dest string 目标路径,填写绝对路径
* @param $force bool 开启会每次强制覆盖原文件,false不进行覆盖,存在文件不做处理
* @return int 拷贝的文件数
* @author: Vencenty
*/
static function copy($source, $dest, $force = true)
{
static $counter = 0;
$paths = array_filter(scandir($source), function ($file) {
return !in_array($file, ['.', '..']);
});
foreach ($paths as $path) {
// 要拷贝的源文件的完整路径
$sourceFullPath = $source . DIRECTORY_SEPARATOR . $path;
// 要拷贝到的文件的路径
$destFullPath = $dest . DIRECTORY_SEPARATOR . $path;
// 拷贝的目标地址如果是不是文件夹,那么说明文件夹不存在,那么首先创建文件夹
if (is_dir($sourceFullPath)) {
if (!is_dir($destFullPath)) {
mkdir($destFullPath);
chmod($destFullPath, 0755);
}
// 递归copy
static::copy($sourceFullPath, $destFullPath, $force);
continue;
}
// 不开启强制覆盖的话如果已经存在文件了那么直接跳过,不进行处理
if (!$force && file_exists($destFullPath)) {
continue;
}
// 每次copy成功文件计数器+1
if (copy($sourceFullPath, $destFullPath)) {
$counter++;
}
}
return $counter;
}
}
// $path = realpath('../');
// $r = Dir::scan($path, [
// 'callback' => function ($file) {
// return filemtime($file) > strtotime('-1 day') ? $file : null; // 查找修改过的文件
// },
// 'filterExt' => []
// ]);
// //print_r($r);
// $r = Dir::copy('C:\phpStudy\PHPTutorial\WWW\php\.idea', 'C:\phpStudy\PHPTutorial\WWW\php', true);
// print_r($r);

+ 9
- 0
app/Services/FfmpegService.php View File

@ -107,6 +107,14 @@ class FfmpegService
exit;
}
$fileInfo = pathinfo($pathFile);
if (Redis::get("encode:lock:" . $fileInfo["filename"]) == 1) {
Log::info("file is encoding filename: " . $fileInfo["filename"]);
return;
}
if (!Redis::set("encode:lock:" . $fileInfo["filename"] , 1, "nx", "ex", 36000)) {
Log::info("lock failed filename: " . $fileInfo["filename"]);
return;
}
if (Redis::sismember("unneed", $fileInfo["filename"])) {
return;
}
@ -156,6 +164,7 @@ class FfmpegService
rename($targetFile, $pathFile);
}
}
Redis::del("encode:lock:" . $fileInfo["filename"]);
}
}
}


+ 7
- 2
app/Services/NewNvshenService.php View File

@ -158,12 +158,17 @@ class NewNvshenService
if ($isAll) {
$countLimit = 5000;
}
for ($i = 0; $i <= $totalAlbumPage; $i++) {
for ($i = 1; $i <= $totalAlbumPage; $i++) {
dump("current album page no: " . $i);
if ($onlyOnePage) {
$albumQl = $mainQl->get($peopleUrl);
} else {
$albumQl = $mainQl->get($baseAlbumUrl . $i . ".html");
if ($i == 1) {
$albumQl = $mainQl->get($baseAlbumUrl);
} else {
$albumQl = $mainQl->get($baseAlbumUrl . $i . ".html");
}
}
// dump($albumQl->getHtml());
$albumList = $albumQl->find(".igalleryli > .igalleryli_div > .igalleryli_link")->attrs("href");


+ 28
- 7
app/Services/XiurenjiService.php View File

@ -11,8 +11,8 @@ use QL\QueryList;
class XiurenjiService
{
public $domainUrl = "https://www.xiurenji.vip";
public $xiurenRootUrl = "https://www.xiurenji.vip/XiuRen/";
public $domainUrl = "https://www.xiurenji.net";
public $xiurenRootUrl = "https://www.xiurenji.net/XiuRen/";
// public $rootDir = "/Users/shixuesen/Documents/tmp/xiuren/";
// public $rootDir = "/Volumes/Backup/images/xiuren/";
public $rootDir = "/Volumes/intel660p/image/xiuren/";
@ -27,7 +27,7 @@ class XiurenjiService
public function scrapeAlbum()
{
$pageSize = 20;
$pageCount = $this->getEncodeHtmlContent("https://www.xiurenji.vip/XiuRen/index.html")->find(".page span")->htmls()->get(0);
$pageCount = $this->getEncodeHtmlContent("https://www.xiurenji.net/XiuRen/index.html")->find(".page span")->htmls()->get(0);
print_r($pageCount);
if ((int)$pageCount > 0) {
$pageCount = 100;
@ -126,7 +126,7 @@ class XiurenjiService
usleep(random_int(10, 100) * 100);
$imageUrl = $image->getAttribute("src");
$trueImageUrl = "https://x1.plmn5.com/U". substr($imageUrl, 2);
$trueImageUrl = "https://www.xiurenji.vip" . $imageUrl;
$trueImageUrl = "https://www.xiurenji.net" . $imageUrl;
$fileInfo = pathinfo($trueImageUrl);
if (file_exists($dir . "/" .$fileInfo["basename"])) {
rename($dir . "/" . $fileInfo["basename"], $dir . "/" . $imageNo . "-" . $fileInfo["basename"]);
@ -149,11 +149,32 @@ class XiurenjiService
try {
$curl_handle=curl_init();
curl_setopt($curl_handle, CURLOPT_URL, $trueImageUrl);
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2000);
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 20000);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_handle, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36');
curl_setopt($curl_handle, CURLOPT_REFERER, $this->xiurenRootUrl);
curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl_handle, CURLOPT_ENCODING, '');
curl_setopt($curl_handle, CURLOPT_MAXREDIRS, 10);
curl_setopt($curl_handle, CURLOPT_TIMEOUT, 0);
curl_setopt($curl_handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($curl_handle, CURLOPT_HTTPHEADER, array(
'authority: www.xiurenji.net',
'pragma: no-cache',
'cache-control: no-cache',
'sec-ch-ua: "Google Chrome";v="95", "Chromium";v="95", ";Not A Brand";v="99"',
'sec-ch-ua-mobile: ?0',
'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36',
'sec-ch-ua-platform: "macOS"',
'accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
'sec-fetch-site: same-origin',
'sec-fetch-mode: no-cors',
'sec-fetch-dest: image',
'referer: https://www.xiurenji.net/XiuRen/9483.html',
'accept-language: zh-CN,zh;q=0.9',
'cookie: UM_distinctid=17cfa8bea8eb9e-0dd0c6d032d0fc-1c306851-13c680-17cfa8bea8fc85; CNZZDATA1278618868=1505121253-1636283360-%7C1636283360; __51cke__=; ASPSESSIONIDQAQAATSQ=LBLGNPMDHKKMNOPDBCEAPIMH; __tins__20641871=%7B%22sid%22%3A%201636291046220%2C%20%22vd%22%3A%202%2C%20%22expires%22%3A%201636292852634%7D; __51laig__=2'
));
$content = curl_exec($curl_handle);
if ($content === false) {
$le = new Exception("get image has error: " . curl_error($curl_handle));
@ -210,7 +231,7 @@ class XiurenjiService
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_HTTPHEADER => array(
'authority: www.xiurenji.vip',
'authority: www.xiurenji.net',
'pragma: no-cache',
'cache-control: no-cache',
'sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
@ -222,7 +243,7 @@ class XiurenjiService
'sec-fetch-mode: navigate',
'sec-fetch-user: ?1',
'sec-fetch-dest: document',
'referer: https://www.xiurenji.vip/XiuRen/',
'referer: https://www.xiurenji.net/XiuRen/',
'accept-language: zh-CN,zh;q=0.9',
'cookie: UM_distinctid=177fd93a0ca93c-06b94658d5d337-121a4759-13c680-177fd93a0cbcaf; ASPSESSIONIDCATDQACD=FDPMPCLAMHNCPJFCBLKFLCKH; CNZZDATA1278618868=367774893-1614867004-%7C1625926983; __51cke__=; __tins__20641871=%7B%22sid%22%3A%201625931982756%2C%20%22vd%22%3A%203%2C%20%22expires%22%3A%201625933829110%7D; __51laig__=7'
),


+ 1
- 0
composer.json View File

@ -32,6 +32,7 @@
"netresearch/jsonmapper": "^1.6",
"norkunas/youtube-dl-php": "^1.4",
"php-ffmpeg/php-ffmpeg": "^0.18.0",
"prettus/l5-repository": "dev-master",
"protoqol/prequel": "^1.22",
"ps/image-optimizer": "^2.0",
"qcloud/cos-sdk-v5": ">=1.0",


+ 139
- 2
composer.lock View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "c7229f1acc25872366cc3bcf890dddc8",
"content-hash": "783aef1da9b015e3f7e49b63fac3fc55",
"packages": [
{
"name": "albertofem/rsync-lib",
@ -6226,6 +6226,142 @@
],
"time": "2021-09-29T17:48:39+00:00"
},
{
"name": "prettus/l5-repository",
"version": "dev-master",
"source": {
"type": "git",
"url": "https://github.com/andersao/l5-repository.git",
"reference": "834d61f0d5d9b6ef5786980e0bf4900fffbccd76"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/andersao/l5-repository/zipball/834d61f0d5d9b6ef5786980e0bf4900fffbccd76",
"reference": "834d61f0d5d9b6ef5786980e0bf4900fffbccd76",
"shasum": "",
"mirrors": [
{
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
"preferred": true
}
]
},
"require": {
"illuminate/config": "~5.0|~6.0|~7.0|^8.0",
"illuminate/console": "~5.0|~6.0|~7.0|^8.0",
"illuminate/database": "~5.0|~6.0|~7.0|^8.0",
"illuminate/filesystem": "~5.0|~6.0|~7.0|^8.0",
"illuminate/http": "~5.0|~6.0|~7.0|^8.0",
"illuminate/pagination": "~5.0|~6.0|~7.0|^8.0",
"illuminate/support": "~5.0|~6.0|~7.0|^8.0",
"illuminate/validation": "~5.0|~6.0|~7.0|^8.0",
"prettus/laravel-validation": "~1.1|~1.2"
},
"suggest": {
"league/fractal": "Required to use the Fractal Presenter (0.12.*).",
"prettus/laravel-validation": "Required to provide easy validation with the repository (1.1.*)",
"robclancy/presenter": "Required to use the Presenter Model (1.3.*)"
},
"default-branch": true,
"type": "library",
"extra": {
"laravel": {
"providers": [
"Prettus\\Repository\\Providers\\RepositoryServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Prettus\\Repository\\": "src/Prettus/Repository/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Anderson Andrade",
"email": "contato@andersonandra.de",
"homepage": "http://andersonandra.de",
"role": "Developer"
}
],
"description": "Laravel 5|6|7|8 - Repositories to the database layer",
"homepage": "http://andersao.github.io/l5-repository",
"keywords": [
"cache",
"eloquent",
"laravel",
"model",
"repository"
],
"support": {
"docs": "http://andersao.github.io/l5-repository",
"email": "contato@andersonandra.de",
"issues": "https://github.com/andersao/l5-repository/issues",
"source": "https://github.com/andersao/l5-repository",
"wiki": "https://github.com/andersao/l5-repository"
},
"time": "2021-10-14T23:03:30+00:00"
},
{
"name": "prettus/laravel-validation",
"version": "1.3.0",
"source": {
"type": "git",
"url": "https://github.com/andersao/laravel-validator.git",
"reference": "cce3c273c9d44f77de031dc4dedd261ab936c497"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/andersao/laravel-validator/zipball/cce3c273c9d44f77de031dc4dedd261ab936c497",
"reference": "cce3c273c9d44f77de031dc4dedd261ab936c497",
"shasum": "",
"mirrors": [
{
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
"preferred": true
}
]
},
"require": {
"illuminate/support": "~5.4|^6.0|^7.0|^8.0",
"illuminate/validation": "~5.4|^6.0|^7.0|^8.0",
"php": ">=5.4.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Prettus\\Validator\\": "src/Prettus/Validator/"
}
},
"notification-url": "https://packagist.org/downloads/",
"authors": [
{
"name": "Anderson Andrade",
"email": "contato@andersonandra.de",
"homepage": "http://andersonandra.de",
"role": "Developer"
}
],
"description": "Laravel Validation Service",
"homepage": "http://andersao.github.io/laravel-validation",
"keywords": [
"laravel",
"service",
"validation"
],
"support": {
"docs": "http://andersao.github.io/laravel-validation",
"email": "contato@andersonandra.de",
"issues": "https://github.com/andersao/laravel-validation/issues",
"source": "https://github.com/andersao/laravel-validation",
"wiki": "https://github.com/andersao/laravel-validation"
},
"time": "2020-09-21T20:20:45+00:00"
},
{
"name": "protoqol/prequel",
"version": "v1.22.61",
@ -12878,7 +13014,8 @@
"minimum-stability": "dev",
"stability-flags": {
"league/oauth2-client": 20,
"mgp25/instagram-php": 20
"mgp25/instagram-php": 20,
"prettus/l5-repository": 20
},
"prefer-stable": true,
"prefer-lowest": false,


+ 9
- 0
database/factories/ImageRecordFactory.php View File

@ -0,0 +1,9 @@
<?php
use Faker\Generator as Faker;
$factory->define(App\ImageRecord::class, function (Faker $faker) {
return [
//
];
});

+ 11
- 8
database/migrations/2021_10_08_163234_create_google_photos_table.php View File

@ -13,14 +13,17 @@ class CreateGooglePhotosTable extends Migration
*/
public function up()
{
Schema::create('google_photos', function (Blueprint $table) {
$table->increments('id');
$table->string("photo_id");
$table->string("filename");
$table->string("product_url");
$table->timestamp("creation_time");
$table->timestamps();
});
if (!Schema::hasTable('google_photos')) {
Schema::create('google_photos', function (Blueprint $table) {
$table->increments('id');
$table->string("photo_id");
$table->string("filename");
$table->string("product_url");
$table->timestamp("creation_time");
$table->timestamps();
});
}
}
/**


+ 7
- 4
database/migrations/2021_10_08_165821_create_google_photos_table.php View File

@ -13,10 +13,13 @@ class CreateGooglePhotosTable extends Migration
*/
public function up()
{
Schema::create('google_photos', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
});
if (!Schema::hasTable('google_photos')) {
Schema::create('google_photos', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
});
}
}
/**


+ 34
- 0
database/migrations/2021_11_08_132032_create_image_records_table.php View File

@ -0,0 +1,34 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateImageRecordsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('image_records', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('path');
$table->tinyInteger('type')->comment("1: 目录 2: 文件");
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('image_records');
}
}

+ 35
- 0
database/migrations/2021_11_24_133249_add_download_and_encode_status.php View File

@ -0,0 +1,35 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AddDownloadAndEncodeStatus extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('bilibili_videos', function (Blueprint $table) {
//
$table->unsignedTinyInteger("download_status")->after("total_parts")->comment("下载状态,0 表示未在下载中 1 表示下载中")->default(0);
$table->unsignedTinyInteger("encode_status")->after("download_status")->comment("转码状态,0 表示未在转码中 1 表示转码中")->default(0);
$table->integer("version")->after("encode_status")->comment("版本号,用做乐观锁更新")->default(0);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('bilibili_videos', function (Blueprint $table) {
//
});
}
}

+ 14
- 0
fail.log View File

@ -2382,3 +2382,17 @@
/Users/shixuesen/OneDrive/Pictures/instagram/amandacerny/ https://scontent-lax3-2.cdninstagram.com/v/t50.12441-16/245270156_4510623145652065_114301360091157778_n.mp4?efg=eyJ2ZW5jb2RlX3RhZyI6InZ0c192b2RfdXJsZ2VuLjcyMC5zdG9yeS5iYXNlbGluZSJ9&_nc_ht=scontent-lax3-2.cdninstagram.com&_nc_cat=101&_nc_ohc=SXnJS1YXP3QAX8CHOpk&edm=AOVtZ6oBAAAA&vs=1870059469864735_3599376607&_nc_vs=HBksFQAYJEdJeUduZzVoNzA5S1l3WVFBQkxWa3oxN0ZKWUJicGt3QUFBRhUAAsgBABUAGCRHQW9sblE0cjZWQ19YejhFQUFCc1c4a2o0R0VxYnBrd0FBQUYVAgLIAQAoABgAGwGIB3VzZV9vaWwBMRUAACbWzL7249%2F%2BPxUCKAJDMywXQC4AAAAAAAAYEmRhc2hfYmFzZWxpbmVfMV92MREAdegHAA%3D%3D&_nc_rid=f7c6ea7c99&ccb=7-4&oe=616B6CD8&oh=6903fb4645c9bebc3a9c41a0075ef9cc&_nc_sid=bab638&_nc_vts_prog=1&vts=1
/Users/shixuesen/OneDrive/Pictures/instagram/Likes/ https://scontent-lax3-2.cdninstagram.com/v/t51.2885-15/e35/245796969_121234556967162_1605669378150390448_n.jpg?se=7&_nc_ht=scontent-lax3-2.cdninstagram.com&_nc_cat=106&_nc_ohc=9LnckT_e3hcAX-ZZY6F&edm=APv5SkIBAAAA&ccb=7-4&oh=6331148356f76a70d2dfc03cb3d51b0b&oe=616F9316&_nc_sid=7479f6&ig_cache_key=MjY4NDIzMDAzMTEzOTgyMzEwNg%3D%3D.2-ccb7-4
/Users/shixuesen/OneDrive/Pictures/instagram/parlovetati/ https://scontent-lax3-1.cdninstagram.com/v/t50.2886-16/10000000_1240125606501674_5676588287682701350_n.mp4?efg=eyJ2ZW5jb2RlX3RhZyI6InZ0c192b2RfdXJsZ2VuLjcyMC5mZWVkLmRlZmF1bHQifQ&_nc_ht=scontent-lax3-1.cdninstagram.com&_nc_cat=102&_nc_ohc=QEOWaUZJHc8AX_nGqBd&edm=ABmJApABAAAA&vs=18167405827164894_2723734113&_nc_vs=HBksFQAYJEdJQ1dtQUFxblVBXzQyY0VBQ1pvZU1mNFNzZE9ia1lMQUFBRhUAAsgBABUAGCRHUElLekE1SW1VYk1Na1FCQUxabXNRcnczeU5mYmtZTEFBQUYVAgLIAQAoABgAGwGIB3VzZV9vaWwBMBUAACbm2Zuu863KPxUCKAJDMywXQEyAAAAAAAAYEmRhc2hfYmFzZWxpbmVfMl92MREAdeoHAA%3D%3D&_nc_rid=29492f4664&ccb=7-4&oe=617879C0&oh=f53d7a889e63f284ab2106dc448b9de4&_nc_sid=6136e7
/Users/shixuesen/OneDrive/Pictures/instagram/ngoctrinh89/ https://scontent-lax3-2.cdninstagram.com/v/t50.2886-16/254693390_614941546590078_7945511200483749374_n.mp4?efg=eyJ2ZW5jb2RlX3RhZyI6InZ0c192b2RfdXJsZ2VuLjcyMC5jbGlwcy5iYXNlbGluZSJ9&_nc_ht=scontent-lax3-2.cdninstagram.com&_nc_cat=106&_nc_ohc=X_dPMuTY_oYAX-0gBrm&edm=ABmJApABAAAA&vs=2198644710292468_3438973239&_nc_vs=HBksFQAYJEdBNVFMZzlfTDNFOFNTOENBUDZ0dVBkV0lFUnVicV9FQUFBRhUAAsgBABUAGCRHTUpwS2dfdFY2LTNqeUlDQUZJQmQ4QzhjT2RaYnFfRUFBQUYVAgLIAQAoABgAGwGIB3VzZV9vaWwBMBUAACa2hZW2voLaPxUCKAJDMywXQDZEGJN0vGoYEmRhc2hfYmFzZWxpbmVfMV92MREAdf4HAA%3D%3D&_nc_rid=46aeb30028&ccb=7-4&oe=618A3786&oh=26a129af56c4ef9eac6304693010a661&_nc_sid=6136e7
/Users/shixuesen/OneDrive/Pictures/instagram/parlovetati/ https://scontent-lax3-2.cdninstagram.com/v/t51.2885-15/e35/255166477_613867276318659_6041843099943784371_n.jpg?se=7&_nc_ht=scontent-lax3-2.cdninstagram.com&_nc_cat=103&_nc_ohc=Es6RcI6uvecAX-xdPah&edm=ABmJApABAAAA&ccb=7-4&oh=4e450b1fd0495e6b5c78ff45a5b77108&oe=618FC6BC&_nc_sid=6136e7&ig_cache_key=MjcwMTc2NTI2NzgzNDIwMjgzOQ%3D%3D.2-ccb7-4
/Users/shixuesen/OneDrive/Pictures/instagram/ngoctrinh89/ https://scontent-lax3-1.cdninstagram.com/v/t50.2886-16/10000000_585662186093909_4096738381600548513_n.mp4?efg=eyJ2ZW5jb2RlX3RhZyI6InZ0c192b2RfdXJsZ2VuLjcyMC5jbGlwcy5iYXNlbGluZSJ9&_nc_ht=scontent-lax3-1.cdninstagram.com&_nc_cat=105&_nc_ohc=uL2Sy0jHAZ4AX-PDa_V&edm=ABmJApABAAAA&vs=881083732587817_2799381338&_nc_vs=HBksFQAYJEdJQ1dtQUJWZlk4YXFCUUNBS0ZtQWtYYWlkbzRicV9FQUFBRhUAAsgBABUAGCRHTDlSTGc5OWNpaGNVSE1CQUoyM1ctLXQ0Z05fYnFfRUFBQUYVAgLIAQAoABgAGwGIB3VzZV9vaWwBMBUAACbIkPeoyt6%2FPxUCKAJDMywXQD%2F3S8an754YEmRhc2hfYmFzZWxpbmVfMV92MREAdf4HAA%3D%3D&_nc_rid=3441d0c3a1&ccb=7-4&oe=618BECF5&oh=2e56cb06a316b6e6d9f0a8f1579091c3&_nc_sid=6136e7
/Users/shixuesen/OneDrive/Pictures/instagram/cherry_quahst/ https://scontent-lax3-1.cdninstagram.com/v/t50.12441-16/255531810_1083048569133861_5258824205722722467_n.mp4?efg=eyJ2ZW5jb2RlX3RhZyI6InZ0c192b2RfdXJsZ2VuLjY0MC5zdG9yeS5iYXNlbGluZSJ9&_nc_ht=scontent-lax3-1.cdninstagram.com&_nc_cat=109&_nc_ohc=GXrgCC1NWp4AX_3g3Hs&edm=AOVtZ6oBAAAA&vs=419989946323964_1351106573&_nc_vs=HBksFQAYJEdDSWJPdzhsMnp6bEJ0a0RBS01nVks3QUdQdElicGt3QUFBRhUAAsgBABUAGCRHQ3VpTVEtOGw1aXZYaFVEQUN5S3JsTDJqQjFMYnBrd0FBQUYVAgLIAQAoABgAGwGIB3VzZV9vaWwBMRUAACa2o%2B6Z%2BMa2PxUCKAJDMywXQC0Q5WBBiTcYEmRhc2hfYmFzZWxpbmVfMV92MREAdegHAA%3D%3D&_nc_rid=f7dce76b9c&ccb=7-4&oe=618D6980&oh=747be2e2ec37ef246704cf21bfb6bac7&_nc_sid=bab638
/Users/shixuesen/OneDrive/Pictures/instagram/amandacerny/ https://scontent-lax3-2.cdninstagram.com/v/t50.2886-16/10000000_626056855089192_6276854772659920905_n.mp4?efg=eyJ2ZW5jb2RlX3RhZyI6InZ0c192b2RfdXJsZ2VuLjcyMC5jbGlwcy5iYXNlbGluZSJ9&_nc_ht=scontent-lax3-2.cdninstagram.com&_nc_cat=100&_nc_ohc=-9cF5HDzyDUAX_pu5tx&edm=ABmJApABAAAA&vs=567608327873432_3854848594&_nc_vs=HBksFQAYJEdJQ1dtQUFvOEhRNFpUa0NBQWtnSE5jbzNodFhicV9FQUFBRhUAAsgBABUAGCRHTFZyS2c4dGwzTVl3M2NBQUtZUEp6ZGt2MU1rYnFfRUFBQUYVAgLIAQAoABgAGwGIB3VzZV9vaWwBMBUAACb8robmuLHGQBUCKAJDMywXQE4AAAAAAAAYEmRhc2hfYmFzZWxpbmVfMV92MREAdf4HAA%3D%3D&_nc_rid=f35686a2bb&ccb=7-4&oe=618DB80E&oh=9ee18b4376abaa6f83c073214d393518&_nc_sid=6136e7
/Users/shixuesen/OneDrive/Pictures/instagram/kiyocosplay/ https://scontent-lax3-2.cdninstagram.com/v/t50.16885-16/10000000_1294665354386099_2594239050078212671_n.mp4?efg=eyJ2ZW5jb2RlX3RhZyI6InZ0c192b2RfdXJsZ2VuLjcyMC5pZ3R2LmRlZmF1bHQifQ&_nc_ht=scontent-lax3-2.cdninstagram.com&_nc_cat=111&_nc_ohc=1-moooSC014AX8Lj4Bq&edm=ABmJApABAAAA&vs=17948680876583600_2297443186&_nc_vs=HBksFQAYJEdJQ1dtQUN6R28zRWZaa0VBRC1TVzlLcmxnQWtidlZCQUFBRhUAAsgBABUAGCRHT1JXTnc4N2NlVHk5Y1lEQUpJWC1NWHJlVXd0YnZWQkFBQUYVAgLIAQAoABgAGwGIB3VzZV9vaWwBMRUAACau5cz8xtbmPxUCKAJDMywXQFRRBiTdLxsYEmRhc2hfYmFzZWxpbmVfMV92MREAdewHAA%3D%3D&_nc_rid=4c0a442ffe&ccb=7-4&oe=618EC549&oh=e856e793ad203a3c7ea8ed6cac3d5775&_nc_sid=6136e7
/Users/shixuesen/OneDrive/Pictures/instagram/ngoctrinh89/ https://scontent-lax3-2.cdninstagram.com/v/t50.12441-16/254758393_231729622398943_1866383725571819196_n.mp4?efg=eyJ2ZW5jb2RlX3RhZyI6InZ0c192b2RfdXJsZ2VuLjcyMC5zdG9yeS5iYXNlbGluZSJ9&_nc_ht=scontent-lax3-2.cdninstagram.com&_nc_cat=107&_nc_ohc=JKjNtVofEp4AX-Avfsy&edm=AOVtZ6oBAAAA&vs=923366971946605_873367836&_nc_vs=HBksFQAYJEdQbE5Mdy1mdDlQQndkSUFBTHhHUnlFY3V1WVpicGt3QUFBRhUAAsgBABUAGCRHRThKTkE4YUtYSTNBMU1EQVBVTTR4aWVBZUZVYnBrd0FBQUYVAgLIAQAoABgAGwGIB3VzZV9vaWwBMRUAACa%2BpbDsvLjnPxUCKAJDMywXQCnul41P3zsYEmRhc2hfYmFzZWxpbmVfMV92MREAdegHAA%3D%3D&_nc_rid=db416de36b&ccb=7-4&oe=618E9055&oh=c04dd0684110bba1ac2578d052d32be9&_nc_sid=bab638
/Users/shixuesen/OneDrive/Pictures/instagram/amandacerny/ https://scontent-lax3-2.cdninstagram.com/v/t50.16885-16/10000000_4629376703793775_2334129745422247097_n.mp4?efg=eyJ2ZW5jb2RlX3RhZyI6InZ0c192b2RfdXJsZ2VuLjcyMC5pZ3R2LmRlZmF1bHQifQ&_nc_ht=scontent-lax3-2.cdninstagram.com&_nc_cat=107&_nc_ohc=LUBoeTBtfssAX-BcK3q&edm=ABmJApABAAAA&vs=17919407948022979_1863409924&_nc_vs=HBksFQAYJEdJQ1dtQUJ2Q3ZiQlpISVFBTG5ra1BfaWZtUWdidlZCQUFBRhUAAsgBABUAGCRHQzh1V0E4clBjTkI1WGNFQUp6MFdDY3luVkI5YnZWQkFBQUYVAgLIAQAoABgAGwGIB3VzZV9vaWwBMRUAACbMtO%2BSjKjPPxUCKAJDMywXQGfMzMzMzM0YEmRhc2hfYmFzZWxpbmVfMV92MREAdewHAA%3D%3D&_nc_rid=3cbf47fb86&ccb=7-4&oe=61951857&oh=40cc117cf0f8208b010d71aa35c3c75a&_nc_sid=6136e7
/Users/shixuesen/OneDrive/Pictures/instagram/bivi_0420/ https://scontent-lax3-1.cdninstagram.com/v/t50.16885-16/258170670_141009421609949_5774386139785023088_n.mp4?efg=eyJ2ZW5jb2RlX3RhZyI6InZ0c192b2RfdXJsZ2VuLjcyMC5pZ3R2LmRlZmF1bHQifQ&_nc_ht=scontent-lax3-1.cdninstagram.com&_nc_cat=105&_nc_ohc=uprxKMAhYGQAX9WdIPX&edm=ABmJApABAAAA&vs=17906971082258721_2473403716&_nc_vs=HBksFQAYJEdDNWZZdy1kSzN4UVA0QUFBSEJPMDZHWnZTSlFidlZCQUFBRhUAAsgBABUAGCRHTE54VEEtSEdYVU05amdDQUk0WGpCZFpIQjVLYnZWQkFBQUYVAgLIAQAoABgAGwGIB3VzZV9vaWwBMRUAACbQzeuJ%2FLrKPxUCKAJDMywXQDyqfvnbItEYEmRhc2hfYmFzZWxpbmVfMl92MREAdewHAA%3D%3D&_nc_rid=53d9636037&ccb=7-4&oe=6196EB24&oh=f82cc96bb880dac903ff780ff7d97f8f&_nc_sid=6136e7
/Users/shixuesen/OneDrive/Pictures/instagram/duyenn.hipp/ https://scontent-lax3-2.cdninstagram.com/v/t51.2885-15/e35/255960388_217661747141994_7464141834258348981_n.jpg?se=7&_nc_ht=scontent-lax3-2.cdninstagram.com&_nc_cat=106&_nc_ohc=SuE7oWI6OR8AX9cu0il&edm=ABmJApABAAAA&ccb=7-4&oh=a6e4398099900110dce016eed2c349e6&oe=619ACE92&_nc_sid=6136e7&ig_cache_key=MjcwNzM3OTgxNjEzNDEyMDE5NQ%3D%3D.2-ccb7-4
/Users/shixuesen/OneDrive/Pictures/instagram/amandacerny/ https://scontent-lax3-2.cdninstagram.com/v/t50.2886-16/10000000_316268253649051_7769614224832203038_n.mp4?efg=eyJ2ZW5jb2RlX3RhZyI6InZ0c192b2RfdXJsZ2VuLjcyMC5jbGlwcy5iYXNlbGluZSJ9&_nc_ht=scontent-lax3-2.cdninstagram.com&_nc_cat=107&_nc_ohc=Z0REJmgi8YkAX9E6YC7&edm=ABmJApABAAAA&vs=1081044149101308_373756612&_nc_vs=HBksFQAYJEdJQ1dtQUNibU9ud3BCOEJBQjRKOHVqNE50TnJicV9FQUFBRhUAAsgBABUAGCRHUHN2UlEtRFFpVzlTZ01IQUtaYWJTYUY3WDF0YnFfRUFBQUYVAgLIAQAoABgAGwGIB3VzZV9vaWwBMBUAACau1efT7cDZPxUCKAJDMywXQE37peNT988YEmRhc2hfYmFzZWxpbmVfMV92MREAdf4HAA%3D%3D&_nc_rid=baeafc3f78&ccb=7-4&oe=61984CF4&oh=e9ad8324785d5212e0e22ce46796160a&_nc_sid=6136e7
/Users/shixuesen/OneDrive/Pictures/instagram/ngoctrinh89/ https://scontent-lax3-2.cdninstagram.com/v/t50.2886-16/10000000_477920383547067_7151630549725528088_n.mp4?efg=eyJ2ZW5jb2RlX3RhZyI6InZ0c192b2RfdXJsZ2VuLjcyMC5jbGlwcy5iYXNlbGluZSJ9&_nc_ht=scontent-lax3-2.cdninstagram.com&_nc_cat=103&_nc_ohc=tnecl6kzcX4AX8r6NGk&edm=ABmJApABAAAA&vs=434152981430001_3254225817&_nc_vs=HBksFQAYJEdJQ1dtQUM3TnJHQ3FySUJBQmpBT0JFWXNqOWpicV9FQUFBRhUAAsgBABUAGCRHSGlXYkE5aXM2TFg5MlVCQUQxQjEzd0dHODhiYnFfRUFBQUYVAgLIAQAoABgAGwGIB3VzZV9vaWwBMBUAACb8tt2L04HWPxUCKAJDMywXQE1u2RaHKwIYEmRhc2hfYmFzZWxpbmVfMV92MREAdf4HAA%3D%3D&_nc_rid=d819226fa1&ccb=7-4&oe=6199261E&oh=d6d0772349deb4e345d88321b3456df9&_nc_sid=6136e7
/Users/shixuesen/OneDrive/Pictures/instagram/amandacerny/ https://scontent-lax3-2.cdninstagram.com/v/t50.2886-16/10000000_288901286576539_6067234896254624566_n.mp4?efg=eyJ2ZW5jb2RlX3RhZyI6InZ0c192b2RfdXJsZ2VuLjcyMC5jbGlwcy5iYXNlbGluZSJ9&_nc_ht=scontent-lax3-2.cdninstagram.com&_nc_cat=107&_nc_ohc=3q2O2VHcZu8AX-tA1xF&edm=ABmJApABAAAA&vs=215243547393407_2341694866&_nc_vs=HBksFQAYJEdJQ1dtQUNid1k4U3dRWUJBRFpqSEJqX0pUTlVicV9FQUFBRhUAAsgBABUAGCRHRUs0WmdfMXNCNVlPVzBFQUsteDdybF9ZY0IxYnFfRUFBQUYVAgLIAQAoABgAGwGIB3VzZV9vaWwBMBUAACaix5Ldj8CFQBUCKAJDMywXQD%2F3S8an754YEmRhc2hfYmFzZWxpbmVfMV92MREAdf4HAA%3D%3D&_nc_rid=887a455722&ccb=7-4&oe=619B174D&oh=0da8018e4e502a50b92809c122962b96&_nc_sid=6136e7
/Users/shixuesen/OneDrive/Pictures/instagram/ngoctrinh89/ https://scontent-lax3-2.cdninstagram.com/v/t50.2886-16/10000000_313009227078783_3250413392895561598_n.mp4?efg=eyJ2ZW5jb2RlX3RhZyI6InZ0c192b2RfdXJsZ2VuLjcyMC5jbGlwcy5iYXNlbGluZSJ9&_nc_ht=scontent-lax3-2.cdninstagram.com&_nc_cat=103&_nc_ohc=uZYW0910QqgAX-wESJO&edm=ABmJApABAAAA&vs=203881368589343_1990162413&_nc_vs=HBksFQAYJEdJQ1dtQUItbk1vanJod0JBSDVQdG1qQ3lSc3RicV9FQUFBRhUAAsgBABUAGCRHRllxYWc4OExtUkhsam9CQUtQQ2lUcGJpYTFBYnFfRUFBQUYVAgLIAQAoABgAGwGIB3VzZV9vaWwBMBUAACbWsq7ZpuDnPxUCKAJDMywXQEFAAAAAAAAYEmRhc2hfYmFzZWxpbmVfMV92MREAdf4HAA%3D%3D&_nc_rid=794cd77827&ccb=7-4&oe=619D207A&oh=d4f2f04b6a759828b1c7ba8c2380e37c&_nc_sid=6136e7

Loading…
Cancel
Save