From 6ccf135b6cbc601d379bdba17059d42d8c116911 Mon Sep 17 00:00:00 2001 From: xiaomlove Date: Sun, 16 May 2021 14:44:02 +0800 Subject: [PATCH] api peer list --- app/Console/Commands/Test.php | 32 ++------- app/Http/Controllers/PeerController.php | 31 +++++---- app/Http/Resources/PeerResource.php | 64 ++---------------- app/Repositories/TorrentRepository.php | 89 +++++++++++++++++++++++++ 4 files changed, 119 insertions(+), 97 deletions(-) diff --git a/app/Console/Commands/Test.php b/app/Console/Commands/Test.php index ddcb19d5..67a74a77 100644 --- a/app/Console/Commands/Test.php +++ b/app/Console/Commands/Test.php @@ -61,34 +61,10 @@ class Test extends Command // $r = $disk->put('/', base_path('composer.json')); // $r = DB::table('users')->where('id', 1)->update(['modcomment' => DB::raw("concat_ws(',', 'ddddd', modcomment)")]); - $text = '[quote]转自PTer,感谢原制作者发布。[/quote] -[img]https://img9.doubanio.com/view/photo/l_ratio_poster/public/p2515853287.jpg[/img] -[img]https://pterclub.com/pic/PTerWEB.png[/img] -◎译  名 To us, From us / 再见18班 -◎片  名 再见十八班 -◎年  代 2018 -◎产  地 中国大陆 -◎类  别 剧情 -◎语  言 汉语普通话 -◎上映日期 2018-03-07(中国大陆) -◎IMDb评分 6.9/10 from 30 users -◎IMDb链接 https://www.imdb.com/title/tt7861446 -◎豆瓣评分 6.7/10 from 7214 users -◎豆瓣链接 https://movie.douban.com/subject/30159456/ -◎片  长 102分钟 -◎主  演 柯焱曦 Yanxi Ke -      熊婧文 Jingwen Xiong -      秦海 Hai Qin - - -◎标  签 青春 | 校园 | 感动 | 成长 | 高中 | 回忆 | 老师 | 教师 - -◎简  介 - -  梧桐中学高二十八班是远近闻名的问题班级,后进生、艺术生、体育生、不良少年聚集在此,以宋宸(柯焱曦 饰)为首的男生帮派和以秦淼淼(熊婧文 饰)为首的女生帮派互相不服,班级混乱无序。一天,高二十八班收到了一封信,这封信自称是由一年后的他们集体寄来。信上说,即将调来的班主任谭 睿明(秦海 饰)会改变十八班,成为对他们最重要的人。然而在一年后的未来,谭老师却永远地离开了他们。为了实现一段没有遗憾的青春,扭转历史,少年们决定按照信上所说,挑战一个个不可能实现的任务...'; - - $r = format_description($text); - dd($r); + $yesterday = Carbon::parse('2021-05-16 13:30'); + $now = Carbon::now(); + $r = $yesterday->diffInSeconds($now); + dd($yesterday, $now, $r); } } diff --git a/app/Http/Controllers/PeerController.php b/app/Http/Controllers/PeerController.php index 1ba392c8..bd868008 100644 --- a/app/Http/Controllers/PeerController.php +++ b/app/Http/Controllers/PeerController.php @@ -5,10 +5,17 @@ namespace App\Http\Controllers; use App\Http\Resources\PeerResource; use App\Models\Peer; use App\Models\Torrent; +use App\Repositories\TorrentRepository; use Illuminate\Http\Request; class PeerController extends Controller { + private $repository; + + public function __construct(TorrentRepository $repository) + { + $this->repository = $repository; + } /** * Display a listing of the resource. * @@ -17,22 +24,22 @@ class PeerController extends Controller */ public function index(Request $request) { - $torrentId = $request->torrent_id; - $peers = Peer::query()->where('torrent', $torrentId)->with(['user', 'relative_torrent'])->get()->groupBy('seeder'); - $seederResource = []; - $leecherResource = []; - if ($peers->has(Peer::SEEDER_YES)) { - $seederResource = PeerResource::collection($peers->get(Peer::SEEDER_YES)); - } - if ($peers->has(Peer::SEEDER_NO)) { - $leecherResource = PeerResource::collection($peers->get(Peer::SEEDER_NO)); - } + $request->validate([ + 'torrent_id' => 'required', + ]); $response = [ - 'seeder_list' => $seederResource, - 'leecher_list' => $leecherResource, + 'seeder_list' => [], + 'leecher_list' => [], 'card_titles' => Peer::$cardTitles, ]; + $result = $this->repository->listPeers($request->torrent_id); + if ($result['seeder_list']->isNotEmpty()) { + $response['seeder_list'] = PeerResource::collection($result['seeder_list']); + } + if ($result['leecher_list']->isNotEmpty()) { + $response['leecher_list'] = PeerResource::collection($result['leecher_list']); + } return $this->success($response); diff --git a/app/Http/Resources/PeerResource.php b/app/Http/Resources/PeerResource.php index c5b6e161..22e392be 100644 --- a/app/Http/Resources/PeerResource.php +++ b/app/Http/Resources/PeerResource.php @@ -14,69 +14,19 @@ class PeerResource extends JsonResource */ public function toArray($request) { - $seconds = $this->started->diff($this->last_action)->s; - if ($this->uploaded == 0) { - $uploadSpeed = mksize(0) . '/s'; - } else { - $uploadSpeed = mksize(($this->uploaded - $this->uploadoffset) / $seconds) . '/s'; - } - $nowTimestamp = time(); return [ 'id' => $this->id, 'connectable_text' => $this->connectableText, - - 'upload_text' => sprintf('%s@%s', mksize($this->uploaded), $uploadSpeed), - - 'download_text' => sprintf('%s@%s', mksize($this->downloaded), $this->getUploadSpeed($this->resource)), - - 'share_ratio' => $this->getShareRatio($this->resource), - 'download_progress' => $this->getDownloadProgress($this->resource), - 'connect_time_total' => mkprettytime($nowTimestamp - $this->started->timestamp), - 'last_action_human' => mkprettytime($nowTimestamp - $this->last_action->timestamp), - 'agent_human' => htmlspecialchars(get_agent($this->peer_id, $this->agent)), + 'upload_text' => $this->upload_text, + 'download_text' => $this->download_text, + 'share_ratio' => $this->share_ratio, + 'download_progress' => $this->download_progress, + 'connect_time_total' => $this->connect_time_total, + 'last_action_human' => $this->last_action_human, + 'agent_human' => $this->agent_human, 'user' => new UserResource($this->whenLoaded('user')), ]; } - - /** - * 获得上传速度 - * - * @see viewpeerlist.php - * - * @param $peer - * @return string - */ - protected function getUploadSpeed($peer) - { - $diff = $peer->downloaded - $peer->downloadoffset; - if ($peer->isSeeder()) { - $seconds = $peer->finishedat - $peer->started->getTimestamp(); - } else { - $seconds = $this->started->diff($this->last_action)->s; - } - - return mksize($diff / $seconds) . '/s'; - } - - protected function getShareRatio($peer) - { - if ($peer->downloaded) { - $ratio = floor(($peer->uploaded / $peer->downloaded) * 1000) / 1000; - } elseif ($peer->uploaded) { - //@todo 读语言文件 - $ratio = '无限'; - } else { - $ratio = '---'; - } - - return $ratio; - } - - protected function getDownloadProgress($peer) - { - return sprintf("%.2f%%", 100 * (1 - ($peer->to_go / $peer->relative_torrent->size))); - } - } diff --git a/app/Repositories/TorrentRepository.php b/app/Repositories/TorrentRepository.php index 4dbd06f6..53c26bf7 100644 --- a/app/Repositories/TorrentRepository.php +++ b/app/Repositories/TorrentRepository.php @@ -6,6 +6,7 @@ use App\Models\AudioCodec; use App\Models\Category; use App\Models\Codec; use App\Models\Media; +use App\Models\Peer; use App\Models\Processing; use App\Models\Source; use App\Models\Standard; @@ -13,6 +14,7 @@ use App\Models\Team; use App\Models\Torrent; use App\Models\User; use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Seeder; use Illuminate\Http\Request; class TorrentRepository extends BaseRepository @@ -124,4 +126,91 @@ class TorrentRepository extends BaseRepository return $result; } + public function listPeers($torrentId) + { + $seederList = $leecherList = collect(); + $peers = Peer::query()->where('torrent', $torrentId)->with(['user', 'relative_torrent'])->get()->groupBy('seeder'); + if ($peers->has(Peer::SEEDER_YES)) { + $seederList = $peers->get(Peer::SEEDER_YES)->sort(function ($a, $b) { + $x = $a->uploaded; + $y = $b->uploaded; + if ($x == $y) + return 0; + if ($x < $y) + return 1; + return -1; + }); + $seederList = $this->formatPeers($seederList); + } + if ($peers->has(Peer::SEEDER_NO)) { + $leecherList = $peers->get(Peer::SEEDER_NO)->sort(function ($a, $b) { + $x = $a->to_go; + $y = $b->to_go; + if ($x == $y) + return 0; + if ($x < $y) + return -1; + return 1; + }); + $leecherList = $this->formatPeers($leecherList); + } + + return [ + 'seeder_list' => $seederList, + 'leecher_list' => $leecherList, + ]; + + } + + public function getUploadSpeed($peer): string + { + $diff = $peer->uploaded - $peer->uploadoffset; + $seconds = max(1, $peer->started->diffInSeconds($peer->last_action)); + return mksize($diff / $seconds) . '/s'; + } + + public function getDownloadSpeed($peer): string + { + $diff = $peer->downloaded - $peer->downloadoffset; + if ($peer->isSeeder()) { + $seconds = max(1, $peer->started->diffInSeconds($peer->finishedat)); + } else { + $seconds = max(1, $peer->started->diffInSeconds($peer->last_action)); + } + return mksize($diff / $seconds) . '/s'; + } + + public function getDownloadProgress($peer): string + { + return sprintf("%.2f%%", 100 * (1 - ($peer->to_go / $peer->relative_torrent->size))); + } + + public function getShareRatio($peer) + { + if ($peer->downloaded) { + $ratio = floor(($peer->uploaded / $peer->downloaded) * 1000) / 1000; + } elseif ($peer->uploaded) { + //@todo 读语言文件 + $ratio = '无限'; + } else { + $ratio = '---'; + } + return $ratio; + } + + private function formatPeers($peers) + { + $nowTimestamp = time(); + foreach ($peers as &$item) { + $item->upload_text = sprintf('%s@%s', mksize($item->uploaded), $this->getUploadSpeed($item)); + $item->download_text = sprintf('%s@%s', mksize($item->downloaded), $this->getDownloadSpeed($item)); + $item->download_progress = $this->getDownloadProgress($item); + $item->share_ratio = $this->getShareRatio($item); + $item->connect_time_total = mkprettytime($nowTimestamp - $item->started->timestamp); + $item->last_action_human = mkprettytime($nowTimestamp - $item->last_action->timestamp); + $item->agent_human = htmlspecialchars(get_agent($item->peer_id, $item->agent)); + } + return $peers; + } + }