iPhone在线音乐盒,代码开源

时间: 2010-02-03 09:50 来源: http://www.cocoachina.com/bbs/ 点击: 124次
这是一个初中学生用一个月时间自学Objective-C以后开发的作品,一个类似酷狗的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在线音乐盒,代码开源相关推荐

  1. python编写会动的火柴人,一键生成各种姿势的火柴人gif:在线录制视频即可转换 | 代码开源...

    原标题:一键生成各种姿势的火柴人gif:在线录制视频即可转换 | 代码开源 本文授权转载自公众号:量子位 子豪 发自 凹非寺 量子位 报道 | 公众号 QbitAI 现在,只需用摄像头录制真人视频,就 ...

  2. 【NLP】270篇ACL 2019代码开源的论文,全在这里了!

    机器学习算法与自然语言处理出品 @公众号原创专栏作者 忆臻 学校 | 哈尔滨工业大学SCIR实验室博士生在读 本仓库整理了ACL2019中270篇有代码开源的所有论文,代码下载地址. 效果如下: 仓库 ...

  3. 【深度学习】270篇CVPR 2020代码开源的论文,全在这里了!

    整理不易,希望点个在看或者转发,支持一下 前言:1467篇 CVPR 2020 "不开源,就是耍流氓","开源,就是生产力",这是我们经常调侃的话术.因为我们经 ...

  4. leadshop商城系统源码-前后端代码开源-v1.0.0

    介绍: eadshop是一款提供持续更新迭代服务的免费商城系统,旨在打造极致的用户体验! Leadshop由浙江禾成云计算有限公司研发,主要面向中小型企业,助力搭建电商平台,并提供专业的技术支持.免费 ...

  5. .net 本地文件管理 代码_Gitee 在线解决代码冲突上线,解决冲突不再需要 Git 命令...

    IT服务圈儿 有温度.有态度的IT自媒体平台 来源: OSCHINA 社区 [http://www.oschina.net] 作者:码云Gitee 许多开发者在使用 Git 的时候会遇到代码冲突的情况 ...

  6. 5.31 综合案例2.0 - 在线音乐盒

    综合案例2.0 - 在线音乐盒 一.案例说明 二.准备器件 三.案例连线 四.代码 代码说明 复制 五.测试 一.案例说明 用python写一个在线音乐播放器,MP3云喇叭 本案例制作一个联网下载声音 ...

  7. 基于STM32与OneNet平台的智能家居系统设计(代码开源含自制APP代码)

     前言:本文为手把手教学的基础物联网开发设计,项目包含对下位机(MCU对外设数据读取与控制)和上位机(包含服务平台和APP端)的设计.下位机选取STM32作为MCU,外设有LED灯和DHT11温湿度传 ...

  8. Agora Flat:在线教室的开源初体验

    开发者其实很多时候都非常向往开源,开源领域的大佬也特别多,我们谈不上有多资深,也是一边探索一边做.同时,也希望可以借这次机会把我们摸索到的一些经验分享给大家. 01 Flat 是什么 Flat 是一个 ...

  9. LCHub:vika维格表将 70 万行代码开源了

    vika维格表将 70 万行代码开源了 今天,vika维格表郑重宣布:我们将 70 万行代码开源了! 更为准确地说,我们正式发布了vika维格表的社区版--「APITable」. 这意味着,你可以通过 ...

最新文章

  1. 微信小程序tabBar导航栏页和其他页执行onLoad与onShow时机;tabBar页获取不到参数问题;navigateTo跳转无效问题;onShow执行两次问题;
  2. c++ stack 遍历_划重点啦!带你解读图的两种遍历方式
  3. C++学习之路 | PTA乙级—— 1035 插入与归并 (25 分)(精简)
  4. 转 sqlserver 中NOLOCK、HOLDLOCK、UPDLOCK、TABLOCK、TABLOCKX
  5. U盘安装CentOS 7错误 /dev/root does not exist, could not
  6. 安装插件设置Intellij IDEA背景图片
  7. ServerVariables 变量
  8. 新员工入职表_医院新员工入职培训怎么做?
  9. HTML5期末大作业:旅游网站设计——中国风的旅游网站(9页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码...
  10. 【ZYNQ】petalinux包含自定义的动态库
  11. boss直聘上看信息 但是不会显示已读
  12. echarts给柱状图某个柱子设置颜色
  13. 我的世界服务器显示文字,我的世界服务器悬浮字体教程 | 手游网游页游攻略大全...
  14. spoolsv - spoolsv.exe - 进程信息
  15. 第三届世界5G大会召开之前,我们来复习一下这本6G白皮书
  16. Tita OKR:目标地图的妙用
  17. 社区公共安全治理探索:达观舆情信息智能处理解决方案
  18. matlab dpm目标检测,车辆目标检测
  19. R Talk | 旷视科技孙剑博士:云、端、芯上的视觉计算
  20. 宇宙最强IDE vs2019升级

热门文章

  1. 怎么使excel表只显示一部分分页内容
  2. filco蓝牙不好用_filco minila air的蓝牙连接稳定吗?
  3. 需求分析——系统需求和软件需求
  4. 基于codewarrior10.x的VxWorks bootrom调试 DDR3 SDRAM调试
  5. Photoshop CC 2019入门知识手册
  6. VS Studio和VS Code,IntelliJ IDEA的护眼背景色设置
  7. 右键快捷创建mk文件
  8. 外置存储权限在哪打开_安卓手机外置sd卡的权限怎么打开?
  9. 全国计算机职称考试excel2003,全国计算机职称考试excel2003题库.pdf
  10. 名帖78 苏轼 小楷《金刚经》