酷!學園
技術討論區 => 網頁技術 => 主題作者是: dark 於 2015-04-21 18:38
-
天阿 ... 50 行不到 ... 花了我 4 小時
應該去年千千靜聽 (我用 5.7 版) 抓歌詞就漸漸錯誤了
可能是大陸越來越不注意台灣流行音樂
所以較新的歌都沒歌詞 , 甚至抓到歌名相近卻不同首的大陸流行樂
小弟就把自動下載歌詞關掉
手動編輯 lrc 檔
先給建議 ..
1. 至少把 "下載後自動覆蓋" 關閉 , 小弟沒把握抓到是正確
使用手動搜尋歌詞 , 若舊檔存在 , 就另外命名檔案
再使用 "歌詞關聯" 決定留不留
2.
findlrc01 使用 google 搜尋歌手+歌曲 , 從 mojin (魔鏡歌詞網) 抓
原本想先代替去把 (hosts 位置) 站裡的資料 file 回來確認 ...
寫到最後 , 乾脆 google + 完直接貼 bash (吃飯時間近了)
可增加其他方法 findlrc02 ... findlrc03
以下解法 .. (須有自己的 web server)
1.
將聽歌的桌機 hosts 檔增加
192.168.8.80 ccnc.qianqian.com
192.168.8.80 cct2.qianqian.com
192.168.8.80 ttlrccnc.qianqian.com
192.168.8.80 ttlrcct.qianqian.com
2.
php.conf 增加 php 副檔名 dll (我是 8.80 web server 那台)
AddHandler php5-script .php .dll
AddType text/html .php .dll
3. 將底下 php 檔存成 /var/www/html/dll/lyricsvr.dll
<?php
session_id("lrcdirtmp");
session_start();
function unicode_decode($strs){
$restr='';
for($i=0;$i<strlen($strs);$i+=4){
$tmpstr=substr($strs,$i,4);
$tmpstr=chr(base_convert(substr($tmpstr,0,2),16,10)).chr(base_convert(substr($tmpstr,2,2),16,10));
$tmpstr=iconv('UCS-2', 'UTF-8', $tmpstr);
$restr.=$tmpstr;
}
return $restr;
}
function findlrc01($name,$song){
// 魔鏡歌詞網
$tmpstr='LANG=zh_TW.UTF-8;lynx --dump "$(lynx '."--dump 'http://www.google.com.tw/search?q=$name+$song+歌詞&gws_rd=ssl' | grep mojim | ".'head -1 | awk "{print \$1}")" | sed "s/^[ \t]*//g" | grep -E "^\\[ti:|^\\[ar:|^\\[al:|[00-59]:[00-59]" ';
system($tmpstr);
}
if(@$_GET['dl?Id']!=""){
findlrc01($_SESSION['a'][$_GET['dl?Id']]['歌手'],$_SESSION['a'][$_GET['dl?Id']]['歌名']);
}else{
$tmpstr=time();
$_SESSION['a'][$tmpstr]['歌手']=iconv("BIG5","UTF-8",iconv("gb2312","BIG5",iconv("UTF-8","gb2312",unicode_decode($_GET['Title']))));
$_SESSION['a'][$tmpstr]['歌名']=iconv("BIG5","UTF-8",iconv("gb2312","BIG5",iconv("UTF-8","gb2312",unicode_decode($_GET['sh?Artist']))));
echo '<?xml version="1.0" encoding="UTF-8" ?>'."\n";
echo '<result>'."\n";
echo ' <lrc id="'.$tmpstr.'" artist='.$_SESSION['a'][$tmpstr]['歌手'].' title="'.$_SESSION['a'][$tmpstr]['歌名'].'"></lrc>'."\n";
echo '</result>'."\n";
}
$oldist=array_keys($_SESSION['a']);
$nowtimeu=time();
for($i=0;$i<count($oldist);$i++){
if($nowtimeu-$oldist[$i]>600){
unset($_SESSION['a'][$oldist[$i]]);
}
}
?>
ps ..
千千靜聽發出查詢
http://ttlrccnc.qianqian.com/dll/lyricsvr.dll?sh?Artist=E180875B015A&Title=3172315C2F66&Flags=0&ci=6111756532545c3a5316101c0219106c5622292758564444141c464808425c5353011d01
千千靜聽發出要檔
http://ttlrccnc.qianqian.com/dll/lyricsvr.dll?dl?Id=783662&Code=163128925&ci=6111756532545c3a5316101c0219106c5622292758564444141c464808425c5353011d01
剛發現一個問題
當抓下來的魔鏡網頁中 , 同時有兩首以上歌詞
全抓存檔 , 但千千靜聽視 "第一首歌歌詞=[時間值]" + "最後一首歌標題=[標籤值]" 有效
-
function findlrc02($name,$song){
$tmpp=file("http://www.google.com.tw/search?q=$name+$song+歌詞&gws_rd=ssl");
for ($i=0;$i<count($tmpp);$i++){
$buffer = strip_tags($tmpp[$i]);
$buffer = iconv("BIG5","UTF-8",$buffer);
if(strpos($buffer,"mojim.com/")){
$okurl="http://".preg_replace("/htm.*/","htm",strstr($buffer,"mojim.com/"));
break;
}
}
$tmpp=file("$okurl");
foreach($tmpp as $key => $val){
//$buffer = strip_tags(preg_replace("/<br \/>/","\n",$val));
$buffer = explode("<br />",$val);
foreach($buffer as $a => $b){
if(preg_match("/^\[[00-59]?[00-59]/",strip_tags($b))){
echo strip_tags($b)."\n";
}
}
}
}
與 function01 一樣 , 只是使用 php
這樣就能找免費 php 空間 , 又剛好能申請 dll 這帳號 , 還能用 ip 連
不過明明跟 bash 動作一樣 , 卻有不同結果
反正目前兩 function 二選一找 ... 還沒出錯
另外 .. 上篇問題一首歌兩歌詞問題
千千靜聽有時也出現同時 show 兩首歌詞
至於過濾出該歌曲歌詞 , 目前無解 , 因為有些歌詞沒 [ti:傷心的人別聽慢歌] 這標籤
-
回應清單
改為所有搜尋 function 一起跑
且多顯示歌詞前 5 行供人為判斷
ps:
pcntl_fork 子程序寫完才發現
我的 web server 沒支援
最近這台還有任務 , 所以不想動到系統環境
但 pcntl_fork 部分註解起來跑是 OK 的
<?php
session_id("lrcdirtmp");
session_start();
function unicode_decode($strs){
$restr='';
for($i=0;$i<strlen($strs);$i+=4){
$tmpstr=substr($strs,$i,4);
$tmpstr=chr(base_convert(substr($tmpstr,0,2),16,10)).chr(base_convert(substr($tmpstr,2,2),16,10));
$tmpstr=iconv('UCS-2', 'UTF-8', $tmpstr);
$restr.=$tmpstr;
}
return $restr;
}
function cutlines($strs){
$tmparr=explode("\n",$strs);
//$strs=preg_replace("/\[.*\]/","",preg_match("/00/",$strs));
//$strs=preg_match("/00/",$strs);
$showline=5;
$showdata='';
for($i=0;$i<count($tmparr);$i++){
if(preg_match("/\[00/",$tmparr[$i])){
$tmpstr=preg_replace("/\[.*\]/","",$tmparr[$i]);
if(strlen($tmpstr)>2){
$showdata.=$tmpstr.",";
$showline--;
if($showline<=0)break;
}
}
}
return $showdata;
}
function findlrc01($name,$song){
// 魔鏡歌詞網
$tmpstr='LANG=zh_TW.UTF-8;lynx --dump "$(lynx '."--dump 'http://www.google.com.tw/search?q=$name+$song+歌詞&gws_rd=ssl' | grep mojim | ".'head -1 | awk "{print \$1}")" | sed "s/^[ \t]*//g" | grep -E "^\\[ti:|^\\[ar:|^\\[al:|[00-59]:[00-59]" | grep "^\\["';
exec($tmpstr,$tmparr);
return implode("\n",$tmparr);
}
function findlrc02($name,$song){
$tmpp=file("http://www.google.com.tw/search?q=$name+$song+歌詞&gws_rd=ssl");
for ($i=0;$i<count($tmpp);$i++){
$buffer = strip_tags($tmpp[$i]);
$buffer = iconv("BIG5","UTF-8",$buffer);
if(strpos($buffer,"mojim.com/")){
$okurl="http://".preg_replace("/htm.*/","htm",strstr($buffer,"mojim.com/"));
break;
}
}
$showstr='';
$tmpp=file("$okurl");
foreach($tmpp as $key => $val){
//$buffer = strip_tags(preg_replace("/<br \/>/","\n",$val));
$buffer = explode("<br />",$val);
foreach($buffer as $a => $b){
if(preg_match("/^\[[00-59]?[00-59]/",strip_tags($b))){
$showstr.=strip_tags($b)."\n";
}
}
}
return $showstr;
}
$ffuns=2;
$reipid=$_SERVER["REMOTE_ADDR"];
$reipid=preg_replace("/\./","+",$reipid);
eval('$reipid=sprintf("%03d",'.$reipid.');');
if(@$_GET['dl?Id']!=""){
//限 10 位數字=時時分分秒秒(ip x 3)(function x 1)
//開頭數字不為零
echo $_SESSION['a'][$_GET['dl?Id']]['歌詞'];
}else{
@$tmpstr=(date("His")+100000).$reipid;
$counttime=time();
echo '<?xml version="1.0" encoding="UTF-8" ?>'."\n";
echo '<result>'."\n";
// $children=array();
for($i=1;$i<=$ffuns;$i++){
// $pid=pcntl_fork();
// if($pid){
// $children[]=$pid;
// }else{
$tindex=$tmpstr.$i;
$_SESSION['a'][$tindex]['歌手']=iconv("BIG5","UTF-8",iconv("gb2312","BIG5",iconv("UTF-8","gb2312",preg_replace("/ /","+",unicode_decode($_GET['Title'])))));
$_SESSION['a'][$tindex]['歌名']=iconv("BIG5","UTF-8",iconv("gb2312","BIG5",iconv("UTF-8","gb2312",preg_replace("/ /","+",unicode_decode($_GET['sh?Artist'])))));
// 須收 utf8
$songstr="findlrc0".$i."('".$_SESSION['a'][$tindex]['歌手']."','".$_SESSION['a'][$tindex]['歌名']."');";
eval('$songstr='.$songstr);
$_SESSION['a'][$tindex]['歌詞']=$songstr;
$show=' 歌詞:'.cutlines($songstr);
echo ' <lrc id="'.$tindex.'" artist='.$_SESSION['a'][$tindex]['歌名'].' title="'.$_SESSION['a'][$tindex]['歌手'].$show.'"></lrc>'."\n";
// }
}
// foreach($children as $pid){
// pcntl_waitpid($pid, $status);
// }
echo '</result>'."\n";
echo 'use time: '.(time()-$counttime).' sec';
}
$oldist=array_keys($_SESSION['a']);
@$nowtimeu=(date("His")+100000);
for($i=0;$i<count($oldist);$i++){
if($nowtimeu-substr($oldist[$i],0,6)>100){ //1min
unset($_SESSION['a'][$oldist[$i]]);
}
}
?>