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 ...@@ -68,12 +68,15 @@ class NctCrawlerTrackCommand extends Command
$bulk_track_insert = []; $bulk_track_insert = [];
foreach ($tracks as $key => $track) { 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 // 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)) { if (is_array($inserted) && count($inserted) > 0 && in_array($track['title'], $inserted)) {
// Cập nhật // Cập nhật
$track_db = Track::where('title', $track['title'])->take(1)->get(); $track_db = Track::where('title', $track['title'])->take(1)->get();
if (isset($track_db[0])) { if (isset($track_db[0])) {
$track_db[0]->track_duration = $duration;
$track_db[0]->id_nct = $track['id_nct']; $track_db[0]->id_nct = $track['id_nct'];
$track_db[0]->id_nct_str = $track['id_nct_str']; $track_db[0]->id_nct_str = $track['id_nct_str'];
$track_db[0]->link_nct_top100 = $track['link']; $track_db[0]->link_nct_top100 = $track['link'];
...@@ -90,6 +93,7 @@ class NctCrawlerTrackCommand extends Command ...@@ -90,6 +93,7 @@ class NctCrawlerTrackCommand extends Command
$bulk_track_insert[$key_insert]['genre'] = 1; $bulk_track_insert[$key_insert]['genre'] = 1;
$bulk_track_insert[$key_insert]['download_hash'] = md5($track['id_nct']); $bulk_track_insert[$key_insert]['download_hash'] = md5($track['id_nct']);
$bulk_track_insert[$key_insert]['time'] = time(); $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'] = $track['id_nct'];
$bulk_track_insert[$key_insert]['id_nct_str'] = $track['id_nct_str']; $bulk_track_insert[$key_insert]['id_nct_str'] = $track['id_nct_str'];
$bulk_track_insert[$key_insert]['src_thumbnail_medium'] = $track['img']; $bulk_track_insert[$key_insert]['src_thumbnail_medium'] = $track['img'];
......
...@@ -66,49 +66,59 @@ class TrackRepository extends BaseRepository ...@@ -66,49 +66,59 @@ class TrackRepository extends BaseRepository
return $query->get()->toArray(); 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) public function processNctGetTrackInfoFromTop100($url)
{ {
$tracks = []; $tracks = [];
$dom = getDom($url); $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'; $element_track_title = 'div.box_info_field h3.h3 a';
foreach ($dom->find($element_track_title) as $data) { foreach ($dom->find($element_track_title) as $data) {
$tracks['title'][] = str_replace(['<h2 class="card-header">', '</h2>'], ['', ''], $data->innertext); $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'; $element_track_img = 'div.box_info_field a img';
foreach ($dom->find($element_track_img) as $data) { foreach ($dom->find($element_track_img) as $data) {
$tracks['img'][] = str_replace(['<h2 class="card-header">', '</h2>'], ['', ''], $data->{"data-src"}); $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'; $element_track_link = 'div.box_info_field h3.h3 a';
foreach ($dom->find($element_track_link) as $data) { foreach ($dom->find($element_track_link) as $data) {
$link = str_replace(['<h2 class="card-header">', '</h2>'], ['', ''], $data->href); $link = str_replace(['<h2 class="card-header">', '</h2>'], ['', ''], $data->href);
$tracks['link'][] = $link; $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'; $element_track_singer = 'div.box_info_field h4.list_name_singer a';
foreach ($dom->find($element_track_singer) as $data) { foreach ($dom->find($element_track_singer) as $data) {
$tracks['singer'][] = str_replace(['<h2 class="card-header">', '</h2>'], ['', ''], $data->innertext); $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'; $element_singer_profile = 'div.box_info_field h4.list_name_singer a';
foreach ($dom->find($element_singer_profile) as $data) { foreach ($dom->find($element_singer_profile) as $data) {
$tracks['url_profile'][] = str_replace(['<h2 class="card-header">', '</h2>'], ['', ''], $data->href); $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'; $element_track_id_str = 'div.box_song_action a.button_add_playlist';
foreach ($dom->find($element_track_id_str) as $data) { foreach ($dom->find($element_track_id_str) as $data) {
$tracks['id_nct_str'][] = str_replace(['btnShowBoxPlaylist_', '</h2>'], ['', ''], $data->id); $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'; $element_track_id = 'div.box_info_field';
$start = '<span class=\"export_listen\" id="NCTCounter__'; $start = '<span class=\"export_listen\" id="NCTCounter__';
$end = '">0<\/span>'; $end = '">0<\/span>';
...@@ -121,7 +131,7 @@ class TrackRepository extends BaseRepository ...@@ -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 = []; $result = [];
for($i=0; $i < count($tracks['title']); $i++) { for($i=0; $i < count($tracks['title']); $i++) {
$result[$i]['id_nct_str'] = $tracks['id_nct_str'][$i]; $result[$i]['id_nct_str'] = $tracks['id_nct_str'][$i];
...@@ -134,12 +144,20 @@ class TrackRepository extends BaseRepository ...@@ -134,12 +144,20 @@ class TrackRepository extends BaseRepository
return $result; 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) public function processNctGetTrackInfoFromTop100Playlist($url)
{ {
$tracks = []; $tracks = [];
$dom = new Htmldom($url); $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'; $element_track_id_str = 'li';
foreach ($dom->find($element_track_id_str) as $data) { foreach ($dom->find($element_track_id_str) as $data) {
if (isset($data->key)) { if (isset($data->key)) {
...@@ -147,7 +165,7 @@ class TrackRepository extends BaseRepository ...@@ -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'; $element_track_link = 'li a';
foreach ($dom->find($element_track_link) as $data) { foreach ($dom->find($element_track_link) as $data) {
if (isset($data->class) && $data->class == 'button_new_window') { if (isset($data->class) && $data->class == 'button_new_window') {
...@@ -155,7 +173,7 @@ class TrackRepository extends BaseRepository ...@@ -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'; $element_track_id = 'li span';
foreach ($dom->find($element_track_id) as $data) { foreach ($dom->find($element_track_id) as $data) {
if (isset($data->id) && isset($data->class) && $data->class == 'icon_listen') { if (isset($data->id) && isset($data->class) && $data->class == 'icon_listen') {
...@@ -163,12 +181,27 @@ class TrackRepository extends BaseRepository ...@@ -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 = []; $result = [];
for($i=0; $i < count($tracks['id_nct_str']); $i++) { for($i=0; $i < count($tracks['id_nct_str']); $i++) {
$result[$i]['id_nct_str'] = $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]['id_nct'] = $tracks['id_nct'][$i];
$result[$i]['link'] = $tracks['link'][$i]; $result[$i]['link'] = $tracks['link'][$i];
$result[$i]['duration'] = $tracks['duration'][$i];
} }
return $result; 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