Commit 9de1bf88 by Phạm Văn Đoan

cập nhật: lấy thời lượng của bài hát từ NCT

parent 108f653e
......@@ -68,12 +68,15 @@ class NctCrawlerTrackCommand extends Command
$bulk_track_insert = [];
foreach ($tracks as $key => $track) {
$link = $this->privateGeTrackLink($tracks_playlist, $track['id_nct']);
//$link = $this->privateGeTrackLink($tracks_playlist, $track['id_nct']);
$link = $tracks_playlist[$key]['link'];
$duration = $tracks_playlist[$key]['duration'];
// Xử lý insert/update dựa vào tên bài hát
if (is_array($inserted) && count($inserted) > 0 && in_array($track['title'], $inserted)) {
// Cập nhật
$track_db = Track::where('title', $track['title'])->take(1)->get();
if (isset($track_db[0])) {
$track_db[0]->track_duration = $duration;
$track_db[0]->id_nct = $track['id_nct'];
$track_db[0]->id_nct_str = $track['id_nct_str'];
$track_db[0]->link_nct_top100 = $track['link'];
......@@ -90,6 +93,7 @@ class NctCrawlerTrackCommand extends Command
$bulk_track_insert[$key_insert]['genre'] = 1;
$bulk_track_insert[$key_insert]['download_hash'] = md5($track['id_nct']);
$bulk_track_insert[$key_insert]['time'] = time();
$bulk_track_insert[$key_insert]['track_duration'] = $duration;
$bulk_track_insert[$key_insert]['id_nct'] = $track['id_nct'];
$bulk_track_insert[$key_insert]['id_nct_str'] = $track['id_nct_str'];
$bulk_track_insert[$key_insert]['src_thumbnail_medium'] = $track['img'];
......
......@@ -66,49 +66,59 @@ class TrackRepository extends BaseRepository
return $query->get()->toArray();
}
/**
* Crawler thông tin bài hát từ url top 100: https://www.nhaccuatui.com/top100/top-100-nhac-tre.m3liaiy6vVsF.html
* Nhưng URL này không lấy được link của bài hát và thời lượng
* Sử dụng link dạng playlist của top 100 thì lấy được link và thời lượng
* URL playlist của top 100: https://www.nhaccuatui.com/playlist/top-100-nhac-tre-hay-nhat-va.m3liaiy6vVsF.html?st=1
* Sử dụng composer package "sunra/php-simple-html-dom-parser"
*
* @param $url
* @return array
*/
public function processNctGetTrackInfoFromTop100($url)
{
$tracks = [];
$dom = getDom($url);
/* Lấy tên bài hát */
/* Lấy tên bài hát ------------------------------------------------------------------------------------------ */
$element_track_title = 'div.box_info_field h3.h3 a';
foreach ($dom->find($element_track_title) as $data) {
$tracks['title'][] = str_replace(['<h2 class="card-header">', '</h2>'], ['', ''], $data->innertext);
}
/* Lấy đường dẫn ảnh của bài hát */
/* Lấy đường dẫn ảnh của bài hát ---------------------------------------------------------------------------- */
$element_track_img = 'div.box_info_field a img';
foreach ($dom->find($element_track_img) as $data) {
$tracks['img'][] = str_replace(['<h2 class="card-header">', '</h2>'], ['', ''], $data->{"data-src"});
}
/* Lấy link bài hát */
/* Lấy link bài hát ----------------------------------------------------------------------------------------- */
$element_track_link = 'div.box_info_field h3.h3 a';
foreach ($dom->find($element_track_link) as $data) {
$link = str_replace(['<h2 class="card-header">', '</h2>'], ['', ''], $data->href);
$tracks['link'][] = $link;
}
/* Lấy tên ca sĩ hát */
/* Lấy tên ca sĩ hát ---------------------------------------------------------------------------------------- */
$element_track_singer = 'div.box_info_field h4.list_name_singer a';
foreach ($dom->find($element_track_singer) as $data) {
$tracks['singer'][] = str_replace(['<h2 class="card-header">', '</h2>'], ['', ''], $data->innertext);
}
/* Lấy url thông tin cá nhân ca sĩ */
/* Lấy url thông tin cá nhân ca sĩ -------------------------------------------------------------------------- */
$element_singer_profile = 'div.box_info_field h4.list_name_singer a';
foreach ($dom->find($element_singer_profile) as $data) {
$tracks['url_profile'][] = str_replace(['<h2 class="card-header">', '</h2>'], ['', ''], $data->href);
}
/* Lấy ID dạng chuỗi của bài hát */
/* Lấy ID dạng chuỗi của bài hát ---------------------------------------------------------------------------- */
$element_track_id_str = 'div.box_song_action a.button_add_playlist';
foreach ($dom->find($element_track_id_str) as $data) {
$tracks['id_nct_str'][] = str_replace(['btnShowBoxPlaylist_', '</h2>'], ['', ''], $data->id);
}
/* Lấy ID dạng số của bài hát */
/* Lấy ID dạng số của bài hát ------------------------------------------------------------------------------- */
$element_track_id = 'div.box_info_field';
$start = '<span class=\"export_listen\" id="NCTCounter__';
$end = '">0<\/span>';
......@@ -121,7 +131,7 @@ class TrackRepository extends BaseRepository
}
}
/* Tổng hợp dữ liệu thành mảng */
/* Tổng hợp dữ liệu thành mảng ------------------------------------------------------------------------------ */
$result = [];
for($i=0; $i < count($tracks['title']); $i++) {
$result[$i]['id_nct_str'] = $tracks['id_nct_str'][$i];
......@@ -134,12 +144,20 @@ class TrackRepository extends BaseRepository
return $result;
}
/**
* Lấy link và thời lượng của bài hát từ link playlist của top 100
* URL: https://www.nhaccuatui.com/playlist/top-100-nhac-tre-hay-nhat-va.m3liaiy6vVsF.html?st=1
* Sử dụng composer package "yangqi/htmldom"
*
* @param $url
* @return array
*/
public function processNctGetTrackInfoFromTop100Playlist($url)
{
$tracks = [];
$dom = new Htmldom($url);
/* Lấy ID dạng chuỗi của bài hát */
/* Lấy ID dạng chuỗi của bài hát ---------------------------------------------------------------------------- */
$element_track_id_str = 'li';
foreach ($dom->find($element_track_id_str) as $data) {
if (isset($data->key)) {
......@@ -147,7 +165,7 @@ class TrackRepository extends BaseRepository
}
}
/* Lấy link bài hát */
/* Lấy link bài hát ----------------------------------------------------------------------------------------- */
$element_track_link = 'li a';
foreach ($dom->find($element_track_link) as $data) {
if (isset($data->class) && $data->class == 'button_new_window') {
......@@ -155,7 +173,7 @@ class TrackRepository extends BaseRepository
}
}
/* Lấy ID dạng số */
/* Lấy ID dạng số ------------------------------------------------------------------------------------------- */
$element_track_id = 'li span';
foreach ($dom->find($element_track_id) as $data) {
if (isset($data->id) && isset($data->class) && $data->class == 'icon_listen') {
......@@ -163,12 +181,27 @@ class TrackRepository extends BaseRepository
}
}
/* Tổng hợp dữ liệu thành mảng */
/* Lấy thời gian của bài hát từ thẻ <meta content="PT3M51S" itemprop="duration" /> -------------------------- */
$element_track_duration = 'li meta';
foreach ($dom->find($element_track_duration) as $data) {
if (isset($data->content) && isset($data->itemprop) && $data->itemprop == 'duration') {
$duration_str = str_replace(['PT', 'M', 'S'], ['', ':', ''], $data->content);
$duration_array = explode(':', $duration_str);
if (count($duration_array) == 2) {
$tracks['duration'][] = intval($duration_array[0])*60 + intval($duration_array[1]);
} else {
$tracks['duration'][] = 0;
}
}
}
/* Tổng hợp dữ liệu thành mảng ------------------------------------------------------------------------------ */
$result = [];
for($i=0; $i < count($tracks['id_nct_str']); $i++) {
$result[$i]['id_nct_str'] = $tracks['id_nct_str'][$i];
$result[$i]['id_nct'] = $tracks['id_nct'][$i];
$result[$i]['link'] = $tracks['link'][$i];
$result[$i]['duration'] = $tracks['duration'][$i];
}
return $result;
......
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