技術討論區 > 網頁技術

分享給還在用舊版千千靜聽

(1/1)

dark:
天阿 ... 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


剛發現一個問題
當抓下來的魔鏡網頁中 , 同時有兩首以上歌詞
全抓存檔 , 但千千靜聽視 "第一首歌歌詞=[時間值]" + "最後一首歌標題=[標籤值]" 有效

dark:

--- 代碼: ---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:傷心的人別聽慢歌] 這標籤

dark:
回應清單
改為所有搜尋 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]]);
}
}


?>





--- 程式碼結尾 ---

導覽

[0] 文章列表

前往完整版本