iPhone在线音乐盒,代码开源
iPhone在线音乐盒,代码开源
作者 wz88510731
原帖地址 http://www.cocoachina.com/bbs/read.php?tid-14547.html
因为被AppStore魂牵梦绕的,所以去年12月30号斥资xx大洋买了一台macbook,立刻投入到了神奇的objective-c世界中了。
在 没有任何c语言基础的情况摸索着前进,到目前已经差不多理解了一些重要概念,比如类,NSxx,内存管理,继承,间接。自认为我的学习速度还是挺快的,不 过毕竟是有object pascal的基础支撑。所以学起来并不是很吃力。
本 来是想做一个类似于酷狗的iphone平台的音乐软件的,不过在昨 天晚上正式宣布放弃了。原因是一、我的技术还不够成熟,在线播放总不够完美(也许和我的性格有关,追求完美吧)。二、最重要是我认为自己高估了这产品的市 场前景。三、我有了更好的创意。所以呢,这个半成品就开源出来了。花了5个晚上外加一个周末的时间吧。其实没什么技术含量,相对来说,有点“技术”含量的 也就是三个函数了,用来从百度的搜索引擎页面中抓取信息,和解密百度的mp3地址编码。写的仓促了,毕竟初三了不能有很多时间来编程了,家里总是有意见, 唉唉。主要也是因为我文化课上的精力放的太少了。今天刚考完期末考试,虽然自我感觉不错,但是通常情况下,就见鬼的是,结果都超出我的自我感觉的。当然是 负面超出了。
/* Function For 百度 mp3 搜索模块 */
/*
请求百度mp3搜索页面获得歌曲信息数组
by BinJian.Wong on Sleeplez.com
update on 2010.2.1
mykeyWords = 关键字
pageNavi = 歌曲条目从pageNavi起
*/
+ ( NSArray * ) KeyWordsForSongs: ( NSString * ) myKeyWords pageNavi: ( int ) myPageNavi;
/*
解密百度mp3链接加密算法
by BinJian.Wong on Sleeplez.com
update on 2010.2.1
myEncodeURL = 经过加密的链接
*/
+ ( NSString * ) decodeBaiduURL: ( NSString * ) myEncodeURL;
/*
从百度下载页面中获得经过加密的下载链接
by BinJian.Wong on Sleeplez.com
update on 2010.2.1
myDownpage = 下载页面的链接地址
*/
+ ( NSString * ) DownPageURLToMusicFileURL: ( NSString * ) myDownpage;
// .m
[/pre]+ ( NSArray * ) KeyWordsForSongs: ( NSString * ) myKeyWords pageNavi: ( int ) myPageNavi{
int pageNavi = myPageNavi; //页码
NSString * keyWords = myKeyWords; //关键字
//NSString * keyWords = @"张信哲";
//创建字符串
NSString * myURL = [ NSString stringWithFormat: @ "http://mp3.baidu.com/m?f=ms&rf=idx&tn=baidump3&ct=134217728&lf=&rn=&word=%@&lm=0&pn=%d" ,keyWords,pageNavi] ;
//UTF8 to gb2312
myURL = [ myURL stringByAddingPercentEscapesUsingEncoding: CFStringConvertEncodingToNSStringEncoding( kCFStringEncodingGB_18030_2000) ] ;
NSLog( @ "%@" ,myURL) ;
ASIHTTPRequest * myRequest = [ [ [ ASIHTTPRequest alloc] initWithURL: [ NSURL URLWithString: myURL] ] autorelease] ;
[ myRequest startSynchronous] ;
//如果发生错误,返回nil
if ( [ myRequest error] ) return nil ;
//返回数组定义
NSMutableArray * mySongs = [ NSMutableArray arrayWithCapacity: 15 ] ;
//编码转换 gb2313 to UTF
NSData * myResponseData = [ myRequest responseData] ;
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding ( kCFStringEncodingGB_18030_2000) ;
NSString * myResponseStr = [ [ NSString alloc] initWithData: myResponseData encoding: enc] ;
//NSLog(@"html=%@",myResponseStr);
//如果百度告诉我没有找到?
NSRange myRange;
myRange = [ myResponseStr rangeOfString: @ "抱歉,没有找到与" ] ;
if ( myRange.location != NSNotFound) {
return nil ;
} ;
//将 源代码按 ” <td class=d><a href= “ 切割
NSMutableArray * myResponseArrForSinger = ( NSMutableArray * ) [ myResponseStr componentsSeparatedByString: @ "<td class=d><a href=" ] ;
//去头去尾
if ( [ myResponseArrForSinger count] >= 2 ) {
[ myResponseArrForSinger removeObjectAtIndex: 0 ] ;
[ myResponseArrForSinger removeObjectAtIndex: [ myResponseArrForSinger count] - 1 ] ;
}
//按段处理
for ( int i= 0 ; i<[ myResponseArrForSinger count] ; i++ ) {
//
@try {
//把段按 “ .html" target="_blank"> ” 切割
NSMutableArray * mySubArr = ( NSMutableArray * ) [ [ myResponseArrForSinger objectAtIndex: i] componentsSeparatedByString: @ ".html/" target=/" _blank/" >" ] ;
//处理歌曲下载页面的URL
NSArray * myURLTmpArr = [ [ mySubArr objectAtIndex: 0 ] componentsSeparatedByString: @ "/" title=/" 请点击左键!来源网址: " ] ;
myURLTmpArr = [ [ mySubArr objectAtIndex: 0 ] componentsSeparatedByString: @ "/" " ] ;
NSMutableString * SongsURL = [ myURLTmpArr objectAtIndex: 1 ] ;
//[SongsURL stringByAddingPercentEscapesUsingEncoding:enc];
//NSLog(@"url= %@",SongsURL);
for ( int j= 0 ; j<[ mySubArr count] ; j++ ) {
NSLog( @ "%d= %@" ,j,[ mySubArr objectAtIndex: j] ) ;
}
//如果只有一段,表示 无 歌手名 和 专辑名
//if ([mySubArr count]<=1) {
//NSLog()
//常量定义 段的意义
const int Const_Songs = 0 ;
const int Const_Singer = 1 ;
const int Const_Album = 4 ;
//变量定义
NSMutableString * SongsName = ( NSMutableString * ) @ "" ;
NSString * SongsSinger = @ "" ;
NSString * SongsAlbum = @ "" ;
NSString * SongsSpeed = @ "" ;
NSString * SongsSize = @ "" ;
//处理 歌曲大小
NSMutableArray * mySizeArr = ( NSMutableArray * ) [ [ mySubArr objectAtIndex: ( [ mySubArr count] - 1 ) ] componentsSeparatedByString: @ "<td>" ] ;
if ( [ mySizeArr count] >= 2 ) {
SongsSize = [ mySizeArr objectAtIndex: ( [ mySizeArr count] - 2 ) ] ;
NSLog( @ "size = %@" ,SongsSize) ;
} ;
//处理 歌曲链接速度图片
@try {
if ( [ mySubArr count] >= 3 ) {
if ( [ mySubArr objectAtIndex: ( [ mySubArr count] - 1 ) ] != nil ) {
NSMutableArray * mySpeedArr = ( NSMutableArray * ) [ [ mySubArr objectAtIndex: ( [ mySubArr count] - 1 ) ] componentsSeparatedByString: @ "<td class=spd><img src=/" http://img.baidu.com/img/mp3/" ] ;
if ( [ mySpeedArr count] >0 )
if ( [ mySpeedArr objectAtIndex: 1 ] != nil )
mySpeedArr = ( NSMutableArray * ) [ [ mySpeedArr objectAtIndex: 1 ] componentsSeparatedByString: @ "/" ></td>" ] ;
if ( [ mySpeedArr objectAtIndex: 0 ] != nil )
SongsSpeed = [ mySpeedArr objectAtIndex: 0 ] ;
NSLog( @ "test speed = %@" ,SongsSpeed) ;
}
} ;
}
@catch ( NSException * e) {
//none
}
@finally {
//none
}
//处理 歌曲名
NSMutableArray * myTmpArr = ( NSMutableArray * ) [ [ mySubArr objectAtIndex: Const_Songs] componentsSeparatedByString: @ "/" return ow(event,this)/" target=/" _blank/" >" ] ;
myTmpArr = ( NSMutableArray * ) [ [ myTmpArr objectAtIndex: 1 ] componentsSeparatedByString: @ "</a></td>" ] ;
SongsName = [ myTmpArr objectAtIndex: 0 ] ;
NSString * mySubStr;
//处理 歌手名
if ( [ mySubArr count] >1 ) {
mySubStr = [ mySubArr objectAtIndex: Const_Singer] ;
SongsSinger = mySubStr;
} ;
//处理 专辑名
if ( [ mySubArr count] >= 5 ) {
mySubStr = [ mySubArr objectAtIndex: Const_Album] ;
NSMutableArray * mySubSubArr = ( NSMutableArray * ) [ mySubStr componentsSeparatedByString: @ "</a>" ] ;
mySubStr = [ mySubSubArr objectAtIndex: 0 ] ;
SongsAlbum = mySubStr;
} else {
SongsAlbum = @ "" ;
} ;
//处理: 歌曲名中如果包含歌词
NSMutableString * tmp = [ NSMutableString stringWithString: SongsName] ;
NSRange range = [ tmp rangeOfString: @ "<br><font color=/" #999999/" class=f10>" ] ;
if ( range.location != NSNotFound) {
range.length = SongsName.length - range.location;
//NSLog(@"%d !",range.length);
[ tmp deleteCharactersInRange: range] ;
//NSLog(@"test =%@",tmp);
SongsName = tmp;
}
//[tmp release];
//NSLog(@"t= %@, %@ , %@",SongsName,SongsSinger,SongsAlbum);
//好,现在开始发春了!
NSString * FinalStr = [ [ [ NSString alloc] initWithFormat: @ "<头>%@<分割>%@<分 割>%@<分割>%@<分割>%@<分割>%@" ,
SongsName,SongsSinger,SongsAlbum,SongsURL,SongsSpeed,SongsSize] autorelease] ;
FinalStr = [ FinalStr stringByReplacingOccurrencesOfString: @ "<font color=/" #c60a00/" >" withString: @ "" ] ;
FinalStr = [ FinalStr stringByReplacingOccurrencesOfString: @ "</font>" withString: @ "" ] ;
FinalStr = [ FinalStr stringByReplacingOccurrencesOfString: @ "</a>" withString: @ "" ] ;
FinalStr = [ FinalStr stringByReplacingOccurrencesOfString: @ "<a href=/" http://mp3.baidu.com/singerlist/" withString: @ "" ] ;
FinalStr = [ FinalStr stringByReplacingOccurrencesOfString: @ " " withString: @ "" ] ;
FinalStr = [ FinalStr stringByReplacingOccurrencesOfString: @ "'" withString: @ "'" ] ;
FinalStr = [ FinalStr stringByReplacingOccurrencesOfString: @ "<头> " withString: @ "<头>" ] ;
FinalStr = [ FinalStr stringByReplacingOccurrencesOfString: @ "<头>" withString: @ "" ] ;
FinalStr = [ FinalStr stringByReplacingOccurrencesOfString: @ "&" withString: @ "&" ] ;
FinalStr = [ FinalStr stringByReplacingOccurrencesOfString: @ "</td>" withString: @ "" ] ;
FinalStr = [ FinalStr stringByReplacingPercentEscapesUsingEncoding: enc] ;
//if ([SongsURL hasSuffix:@"3"]) {
[ mySongs addObject: FinalStr] ;
//};
//]
}
@catch ( NSException * e) {
// 没有错误处理, 发生错误就直接丢掉
}
@finally {
// none
}
} ;
[ myResponseStr release] ;
return ( NSArray * ) mySongs;
}
+ ( NSString * ) decodeBaiduURL: ( NSString * ) myEncodeURL{
//我没学过c,没学过c,没学过c,写的太臃肿,太sb了,别骂我呀。
NSString * returnURL = [ [ [ NSString alloc] initWithFormat: @ "" ] autorelease] ;
//char *myCEncodeURL = [myEncodeURL cStringcStringWithEncoding:NSASCIIStringEncoding];
NSLog( @ "input %@" ,myEncodeURL) ;
//字串
static NSString * myConst = @ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" ;
int pyl ; // 偏移量
//NSRange myRange = [myEncodeURL rangeOfString:@":"]; //定位 协议标识符
UniChar myUniChr = [ myEncodeURL characterAtIndex: 0 ] ; //取出第一字符
//转换类型
NSString * myChrAsStr = [ [ [ NSString alloc] initWithFormat: @ "%C" ,myUniChr] autorelease] ;
//确定第一字符在字串中的位置
NSRange myRange2 = [ myConst rangeOfString: myChrAsStr] ;
int myFirstChrLocation = myRange2.location;
//计算偏移量
pyl = myFirstChrLocation - 33 ;
// 33 means "h" 's location .
NSLog( @ "len = %d" ,myEncodeURL.length) ;
//还原字串
//NSLog(@"pyl = %d",pyl);
for ( int i= 0 ; i<[ myEncodeURL length] ; i++ ) {
UniChar myTmpChr= [ myEncodeURL characterAtIndex: i] ;
NSString * myTmpChrAsStr = [ [ [ NSString alloc] initWithFormat: @ "%C" ,myTmpChr] autorelease] ;
NSRange myTmpRange = [ myConst rangeOfString: myTmpChrAsStr] ;
if ( myTmpRange.location != NSNotFound) {
int newChrAsInt = myTmpRange.location - pyl;
//NSLog(@"pyl = %d , oldchr = %C , oldcount = %d, newcount = %d",pyl,myTmpChr,
//hai myTmpRange.location,newChrAsInt);
if ( newChrAsInt<0 ) {
newChrAsInt = newChrAsInt + 62 ;
//NSLog(@"%d",newChrAsInt);
} else {
if ( newChrAsInt>62 ) {
newChrAsInt = newChrAsInt % 62 ;
} ;
}
/// NSLog(@"! pyl = %d , oldchr = %C , oldcount = %d, newcount = %d",pyl,myTmpChr,
// myTmpRange.location,newChrAsInt);
myTmpChr = [ myConst characterAtIndex: newChrAsInt] ;
} ;
//NSLog(@"%C",myTmpChr);
returnURL= [ returnURL stringByAppendingFormat: @ "%C" ,myTmpChr] ;
}
returnURL= [ returnURL stringByReplacingPercentEscapesUsingEncoding: NSUTF8StringEncoding] ;
NSLog( @ "output %@" ,returnURL) ;
return returnURL;
}
+ ( NSString * ) DownPageURLToMusicFileURL: ( NSString * ) myDownpage{
NSURL * myURL = [ NSURL URLWithString: myDownpage] ;
ASIHTTPRequest * myRequest = [ [ [ ASIHTTPRequest alloc] initWithURL: myURL] autorelease] ;
[ myRequest startSynchronous] ;
NSData * myResponseData = [ myRequest responseData] ;
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding ( kCFStringEncodingGB_18030_2000) ;
NSString * myResponseStr = [ [ NSString alloc] initWithData: myResponseData encoding: enc] ;
//NSLog(@"resstr= %@", myResponseStr);
NSArray * myArr = [ myResponseStr componentsSeparatedByString: @ "var encurl = /" " ] ;
myArr = [ [ myArr objectAtIndex: 1 ] componentsSeparatedByString: @ "/" , newurl = /" /" ;" ] ;
[ myResponseStr release] ;
return [ self decodeBaiduURL: [ myArr objectAtIndex: 0 ] ] ;
iPhone在线音乐盒,代码开源相关推荐
- python编写会动的火柴人,一键生成各种姿势的火柴人gif:在线录制视频即可转换 | 代码开源...
原标题:一键生成各种姿势的火柴人gif:在线录制视频即可转换 | 代码开源 本文授权转载自公众号:量子位 子豪 发自 凹非寺 量子位 报道 | 公众号 QbitAI 现在,只需用摄像头录制真人视频,就 ...
- 【NLP】270篇ACL 2019代码开源的论文,全在这里了!
机器学习算法与自然语言处理出品 @公众号原创专栏作者 忆臻 学校 | 哈尔滨工业大学SCIR实验室博士生在读 本仓库整理了ACL2019中270篇有代码开源的所有论文,代码下载地址. 效果如下: 仓库 ...
- 【深度学习】270篇CVPR 2020代码开源的论文,全在这里了!
整理不易,希望点个在看或者转发,支持一下 前言:1467篇 CVPR 2020 "不开源,就是耍流氓","开源,就是生产力",这是我们经常调侃的话术.因为我们经 ...
- leadshop商城系统源码-前后端代码开源-v1.0.0
介绍: eadshop是一款提供持续更新迭代服务的免费商城系统,旨在打造极致的用户体验! Leadshop由浙江禾成云计算有限公司研发,主要面向中小型企业,助力搭建电商平台,并提供专业的技术支持.免费 ...
- .net 本地文件管理 代码_Gitee 在线解决代码冲突上线,解决冲突不再需要 Git 命令...
IT服务圈儿 有温度.有态度的IT自媒体平台 来源: OSCHINA 社区 [http://www.oschina.net] 作者:码云Gitee 许多开发者在使用 Git 的时候会遇到代码冲突的情况 ...
- 5.31 综合案例2.0 - 在线音乐盒
综合案例2.0 - 在线音乐盒 一.案例说明 二.准备器件 三.案例连线 四.代码 代码说明 复制 五.测试 一.案例说明 用python写一个在线音乐播放器,MP3云喇叭 本案例制作一个联网下载声音 ...
- 基于STM32与OneNet平台的智能家居系统设计(代码开源含自制APP代码)
前言:本文为手把手教学的基础物联网开发设计,项目包含对下位机(MCU对外设数据读取与控制)和上位机(包含服务平台和APP端)的设计.下位机选取STM32作为MCU,外设有LED灯和DHT11温湿度传 ...
- Agora Flat:在线教室的开源初体验
开发者其实很多时候都非常向往开源,开源领域的大佬也特别多,我们谈不上有多资深,也是一边探索一边做.同时,也希望可以借这次机会把我们摸索到的一些经验分享给大家. 01 Flat 是什么 Flat 是一个 ...
- LCHub:vika维格表将 70 万行代码开源了
vika维格表将 70 万行代码开源了 今天,vika维格表郑重宣布:我们将 70 万行代码开源了! 更为准确地说,我们正式发布了vika维格表的社区版--「APITable」. 这意味着,你可以通过 ...
最新文章
- 微信小程序tabBar导航栏页和其他页执行onLoad与onShow时机;tabBar页获取不到参数问题;navigateTo跳转无效问题;onShow执行两次问题;
- c++ stack 遍历_划重点啦!带你解读图的两种遍历方式
- C++学习之路 | PTA乙级—— 1035 插入与归并 (25 分)(精简)
- 转 sqlserver 中NOLOCK、HOLDLOCK、UPDLOCK、TABLOCK、TABLOCKX
- U盘安装CentOS 7错误 /dev/root does not exist, could not
- 安装插件设置Intellij IDEA背景图片
- ServerVariables 变量
- 新员工入职表_医院新员工入职培训怎么做?
- HTML5期末大作业:旅游网站设计——中国风的旅游网站(9页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码...
- 【ZYNQ】petalinux包含自定义的动态库
- boss直聘上看信息 但是不会显示已读
- echarts给柱状图某个柱子设置颜色
- 我的世界服务器显示文字,我的世界服务器悬浮字体教程 | 手游网游页游攻略大全...
- spoolsv - spoolsv.exe - 进程信息
- 第三届世界5G大会召开之前,我们来复习一下这本6G白皮书
- Tita OKR:目标地图的妙用
- 社区公共安全治理探索:达观舆情信息智能处理解决方案
- matlab dpm目标检测,车辆目标检测
- R Talk | 旷视科技孙剑博士:云、端、芯上的视觉计算
- 宇宙最强IDE vs2019升级
热门文章
- 怎么使excel表只显示一部分分页内容
- filco蓝牙不好用_filco minila air的蓝牙连接稳定吗?
- 需求分析——系统需求和软件需求
- 基于codewarrior10.x的VxWorks bootrom调试 DDR3 SDRAM调试
- Photoshop CC 2019入门知识手册
- VS Studio和VS Code,IntelliJ IDEA的护眼背景色设置
- 右键快捷创建mk文件
- 外置存储权限在哪打开_安卓手机外置sd卡的权限怎么打开?
- 全国计算机职称考试excel2003,全国计算机职称考试excel2003题库.pdf
- 名帖78 苏轼 小楷《金刚经》