Commit f63f3efd by Phạm Văn Đoan

lấy lượt nghe bài hát

parent f3fbe27b
<?php
namespace App\Console\Commands;
use App\Models\CrawlerListen;
use App\Models\Crontjob;
use App\Repositories\TrackRepository;
use Carbon\Carbon;
use Illuminate\Console\Command;
class CrawlerTrackListenCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'crawler:get-listen {from_page?}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Lấy lượt nghe của bài hát ở các hệ thống dựa vào tham số truyền vào';
protected $trackRepository;
/**
* Create a new command instance.
*
* CrawlerTrackListenCommand constructor.
* @param TrackRepository $trackRepository
*/
public function __construct(TrackRepository $trackRepository)
{
parent::__construct();
$this->trackRepository = $trackRepository;
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
// Ghi log xem có gọi không
Crontjob::create(['message' => 'CrawlerTrackListenCommand is called at ' . Carbon::now()]);
$from_page = $this->argument('from_page');
if (empty($from_page) || !in_array($from_page, ['zing', 'nct', 'nhacvn', 'keeng'])) {
$from_page = $this->choice('Chọn trang nhạc ', ['zing', 'nct', 'nhacvn', 'keeng']);
}
echo "\n Bắt đầu xử lý lấy lượt nghe từ: " . $from_page;
$crawlered = $this->trackRepository->getCrawlerListenInserted($from_page, false);
echo "\n Tổng số bài hát đã lấy lượt nghe hôm nay: " . count($crawlered);
// Lấy mảng bài hát theo từng hệ thống nhạc
$inserted = $this->trackRepository->getTrackBySource($from_page, $crawlered);
echo "\n Tổng số bài hát cần lấy lượt nghe: " . count($inserted);
if (count($inserted) > 0) {
$data_listen = [];
foreach ($inserted as $key => $track) {
$listen = $this->privateGetListen($from_page, $track);
if ($listen > 0) {
$data_listen[$track['id']] = $listen;
}
echo "\n " . ($key + 1) . ". " . $track['title'] . " (Track ID= " . $track['id'] . "): " . $listen;
}
if (count($data_listen) > 0) {
foreach ($data_listen as $track_id => $listen ) {
switch ($from_page) {
case 'zing':
CrawlerListen::updateOrCreate(
['track_id' => $track_id],
['today_zing' => $listen, 'zing_crawler_at' => Carbon::now()]
);
break;
case 'nct':
CrawlerListen::updateOrCreate(
['track_id' => $track_id],
['today_nct' => $listen, 'nct_crawler_at' => Carbon::now()]
);
break;
}
}
}
}
echo "\n Lấy số lượt nghe kết thúc.";
}
/**
* Hàm lấy lượt nghe thông qua api của các trang nhạc
*
* @param $src
* @param $track
* @return int
*/
private function privateGetListen($src, $track)
{
$listen = 0;
switch ($src) {
case 'zing':
$url = getZingUrlGetCounter($track['id_zing']);
$curl = cURL($url);
$response = json_decode($curl);
if (isset($response->err) && $response->err == 0) {
if (isset($response->data) && isset($response->data->total) && $response->data->total > 0) {
$listen = $response->data->total;
}
}
break;
case 'nct':
$url = getNctUrlGetCounter($track['id_nct']);
$curl = cURL($url);
$response = json_decode($curl);
if (isset($response->error_code) && $response->error_code == 0) {
if (isset($response->data) && isset($response->data->songs) && $response->data->songs->{$track['id_nct']} > 0) {
$listen = $response->data->songs->{$track['id_nct']};
}
}
break;
}
return $listen;
}
}
......@@ -2,10 +2,12 @@
namespace App\Console;
use App\Console\Commands\CrawlerTrackListenCommand;
use App\Console\Commands\CrontjobCommand;
use App\Console\Commands\Keeng\KeengCrawlerTrackCommand;
use App\Console\Commands\Nct\NctCrawlerTrackCommand;
use App\Console\Commands\NhacVn\NhacVnCrawlerTrackCommand;
use App\Console\Commands\Zing\ZingCrawlerListenCommand;
use App\Console\Commands\Zing\ZingCrawlerNewRealeaseCommand;
use App\Console\Commands\Zing\ZingCrawlerTrackCommand;
use App\Console\Commands\CrawlerTrackImageCommand;
......@@ -28,6 +30,10 @@ class Kernel extends ConsoleKernel
KeengCrawlerTrackCommand::class,
CrawlerTrackImageCommand::class,
//ZingCrawlerListenCommand::class,
CrawlerTrackListenCommand::class
];
/**
......
......@@ -5,6 +5,11 @@ namespace App\Helpers;
class Constants
{
const TABLE_ARTISTS = 'artists';
const TABLE_COUNT_VIEWS = 'count_views';
const TABLE_CRAWLER_LISTEN_HISTORIES = 'crawler_listen_histories';
const TABLE_CRAWLER_LISTENS = 'crawler_listens';
const TABLE_CRONTJOBS = 'crontjobs';
const TABLE_FAILED_JOBS = 'failed_jobs';
const TABLE_JOBS = 'jobs';
const TABLE_MIGRATIONS = 'migrations';
......@@ -19,9 +24,11 @@ class Constants
const TABLE_PERMISSIONS = 'permissions';
const TABLE_ROLE_USER = 'role_user';
const TABLE_ROLES = 'roles';
const TABLE_TRACK_ARTIST = 'track_artist';
const TABLE_TRACK_USER = 'track_user';
const TABLE_TRACKS = 'tracks';
const TABLE_USER_LOGS = 'user_logs';
const TABLE_USERS = 'users';
......@@ -117,4 +124,6 @@ class Constants
const VMUSICCHART_IMG_EMPTY_JPG = '/home/aseanvn/public_html/vmusicchart.dcv.vn/uploads/empty-1x1-jpg.jpg';
const VMUSICCHART_IMG_EMPTY_GIF = '/home/aseanvn/public_html/vmusicchart.dcv.vn/uploads/empty-1x1-gif.gif';
const CRAWLER_LISTEN_LIMIT = 500;
}
\ No newline at end of file
<?php
namespace App\Models;
use App\Helpers\Constants;
use Illuminate\Database\Eloquent\Model;
class CrawlerListen extends Model
{
protected $table = Constants::TABLE_CRAWLER_LISTENS;
public $timestamps = true;
protected $fillable = [
'track_id',
'yesterday_zing','yesterday_nct','yesterday_nhacvn','yesterday_keeng',
'today_zing','today_nct','today_nhacvn','today_keeng',
'date_zing','date_nct','date_nhacvn','date_keeng',
'week_zing','week_nct','week_nhacvn','week_keeng',
'month_zing','month_nct','week_nhacvn','month_keeng',
'year_zing','year_nct','year_nhacvn','year_keeng',
'alltime_zing','alltime_nct','alltime_nhacvn','alltime_keeng',
'zing_crawler_at','nct_crawler_at','nhacvn_crawler_at','keeng_crawler_at'
];
}
<?php
namespace App\Models;
use App\Helpers\Constants;
use Illuminate\Database\Eloquent\Model;
class CrawlerListenHistory extends Model
{
protected $table = Constants::TABLE_CRAWLER_LISTEN_HISTORIES;
public $timestamps = true;
protected $fillable = [
'track_id',
'zing_count',
'nct_count',
'nhacvn_count',
'keeng_count'
];
}
......@@ -2,11 +2,12 @@
namespace App\Models;
use App\Helpers\Constants;
use Illuminate\Database\Eloquent\Model;
class Crontjob extends Model
{
protected $table = 'crontjobs';
protected $table = Constants::TABLE_CRONTJOBS;
public $timestamps = true;
......
......@@ -2,6 +2,8 @@
namespace App\Repositories;
use App\Helpers\Constants;
use App\Models\CrawlerListen;
use App\Models\Track;
use Sunra\PhpSimple\HtmlDomParser;
use Yangqi\Htmldom\Htmldom;
......@@ -279,5 +281,88 @@ class TrackRepository extends BaseRepository
return $result;
}
/**
* Lấy ds bài hát chưa lấy lượt nghe trong ngày theo từng hệ thống nhạc
* Bài nào đã lấy rồi thì sẽ ko lấy nữa
* Mỗi lần quét 500 bài cho đến hết
*
* @param string $src
* @param $crawlered
* @param int $limit
*
* @return array
*/
public function getTrackBySource($src='zing', $crawlered, $limit = Constants::CRAWLER_LISTEN_LIMIT)
{
$query = Track::select(['id', 'id_zing', 'id_nct', 'id_nhacvn', 'id_keeng', 'title']);
if (is_array($crawlered) && count($crawlered) > 0) {
$query->whereNotIn('id', $crawlered);
}
switch ($src) {
case 'zing': $query->whereNotNull('id_zing')->where('id_zing', '<>', ''); break;
case 'nct': $query->whereNotNull('id_nct')->where('id_nct', '<>', ''); break;
case 'nhacvn': $query->whereNotNull('id_nhacvn')->where('id_nhacvn', '<>', ''); break;
case 'keeng': $query->whereNotNull('id_keeng')->where('id_keeng', '<>', ''); break;
}
$query->take(($limit < 1) ? Constants::CRAWLER_LISTEN_LIMIT : $limit);
return $query->get()->toArray();
}
/**
* Lấy ds những bài hát đã lấy lượt nghe trong ngày, để lần quét sau sẽ bỏ qua
* Mỗi lần quét 300-500 bài trong tracks và bỏ qua những bài đã lấy lượt nghe trong ngày ở bảng crawler_listens
* Lấy những bài hát có lượng nghe trong ngày = 0 để cập nhật lại
* Có thể tùy biến thêm ($is_update_all): cập nhật toàn bộ hoặc chỉ cập nhập những bài chưa lấy lượt nghe
*
* @param string $src
* @param boolean $is_update_all
*
* @return array
*/
public function getCrawlerListenInserted($src='zing', $is_update_all=false)
{
$min_date = date('Y-m-d 00:00:00');
$max_date = date('Y-m-d 23:59:59');
if ($is_update_all) {
$min_date = date('Y-m-d 00:00:00', time() + 86400);
$max_date = date('Y-m-d 23:59:59', time() + 86400);
}
$query = CrawlerListen::select(['id', 'track_id']);
switch ($src) {
case 'zing':
$query->where('zing_crawler_at', '>=', $min_date)
->where('zing_crawler_at', '<=', $max_date)
->where('today_zing', '>' ,0);
break;
case 'nct':
$query->where('nct_crawler_at', '>=', $min_date)
->where('nct_crawler_at', '<=', $max_date)
->where('today_nct', '>' ,0);
break;
case 'nhacvn':
$query->where('nhacvn_crawler_at', '>=', $min_date)
->where('nhacvn_crawler_at', '<=', $max_date)
->where('today_nhacvn', '>' ,0);
break;
case 'keeng':
$query->where('keeng_crawler_at', '>=', $min_date)
->where('keeng_crawler_at', '<=', $max_date)
->where('today_keeng', '>' ,0);
break;
}
$result = $query->get();
return collect($result)->map(function ($item) { return $item->track_id; })->all();
}
}
\ No newline at end of file
......@@ -85,6 +85,13 @@ return [
'api_get_rank' => 'http://vip.service.keeng.vn:8080/KeengWSRestful//ws/common/getRankDetail?item_type=1&rank_type=50'
],
'listen' => [
'zing' => 'https://mp3.zing.vn/xhr/get-counter?id=ZWB0EF7E&type=audio',
'nct' => 'https://www.nhaccuatui.com/interaction/api/counter?listSongIds=6238530',
'nhacvn' => null,
'keeng' => null
],
];
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment