LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: bargain685

mplayer控制台前端播放器CMMusic版本更新(支持歌词,插件扩展)

[复制链接]
发表于 2009-3-1 19:12:52 | 显示全部楼层
Post by bargain685;1954315

我开发不是很急(自用+没钱拿+代码简单),一个版本大概一个月。
我计划是下个版本增加个自动下载歌曲插件(不是主程序),
但在网上搜了下,有倒是有,但搜索引擎都是一样的(BAIDU),
并且现在已经不可用了,估计是换密码了。
难点在这,其它需要只要提出来,可以重现,解决不是难题。


能不能提供类似酷我音乐盒的功能,不下载直接在线听歌,同时显示歌词?可以利用百度mp3搜索,只要获得它搜索的地址不就可以播放了吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-1 22:29:12 | 显示全部楼层
Post by Daring666;1954658
能不能提供类似酷我音乐盒的功能,不下载直接在线听歌,同时显示歌词?可以利用百度mp3搜索,只要获得它搜索的地址不就可以播放了吗?


据说,mplayer就是这个功能,但没试过,建议不错。
不过现在的问题是...连可靠的URL取到都是问题,
本人倒想做在插件范畴里,然后其他人开发此功能得了。
回复 支持 反对

使用道具 举报

发表于 2009-3-1 23:32:53 | 显示全部楼层
1.希望控制键跟mplayer相同。
我想建议下把暂停,前进,后退  控制键  做成跟 mplayer的控制键相同,或者至少可以自定义,这样会方便很多,因为mplayer的控制已经印在脑袋里了cmmusic如果跟mplayer的控制键相同感觉就像是一体的一样,不相同感觉有点精神分裂。

2.希望英文歌词可以满行显示。
英文歌词显示只有汉字显示的一行的一半空间,可能跟汉字断行有关,因为用唱歌练习英语发音效果非常不错,能不能也让英文页可以满行显示。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-2 09:55:48 | 显示全部楼层
Post by onelay;1954818
1.希望控制键跟mplayer相同。
我想建议下把暂停,前进,后退  控制键  做成跟 mplayer的控制键相同,或者至少可以自定义,这样会方便很多,因为mplayer的控制已经印在脑袋里了cmmusic如果跟mplayer的控制键相同感觉就像是一体的一样,不相同感觉有点精神分裂。

2.希望英文歌词可以满行显示。
英文歌词显示只有汉字显示的一行的一半空间,可能跟汉字断行有关,因为用唱歌练习英语发音效果非常不错,能不能也让英文页可以满行显示。


正在增加配置功能
1,虽然有点麻烦...但好吧.有配置功能就可以实现。
2,我试了些方法,如果中英文混合,满行则断行有问题,
    只能实现只有英文情况下全满,或只有中文情况下全满。
    目前没有其它好办法,真的挺不好做的。
    (你可以看看代码,PrintLrc函数)
回复 支持 反对

使用道具 举报

发表于 2009-3-3 20:54:35 | 显示全部楼层
全英文也只能最多显示歌词显示区域的一半,右边一半什么都不显示好可惜。

左边和右边图为同一歌词的相同显示部分。只能显示一半的歌词显示区域,如果把令一半利用起来就完美了。


最近有点懒如果容易解决的话希望作者在升级版本时修改下,麻烦的话有时间的话我去读下代码。

谢谢作者的软件,希望它越来越完美!!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2009-3-3 21:27:04 | 显示全部楼层
Post by bargain685;1954320
1.你要真拉得这么小就太没诚意了吧...这个我会考虑修正的,但估计优先级不会太高。不定下个版本能改掉。
2.我看目前的播放器大都是这样的,不一样的话需要有个映射,涉及记忆功能,要映射还要有个交互指明哪个对哪个,我想这衍生的部分就多了,所以暂时不考虑这个问题。

我想您误解了我第二条的意思,或许是我没有表达清楚。我的意思是:设歌曲名为 ABC.mp3,歌词文件名为abc.lrc是无法显示的,必须大小写也完全相同。
另:这个软件确实很好,呵呵,加油!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-4 02:23:12 | 显示全部楼层
恩,好的。
楼上两位的建议我会采纳的。
新的版本正在开发中。
版本周期大概一个月。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-4 15:18:52 | 显示全部楼层
Post by onelay;1955839
全英文也只能最多显示歌词显示区域的一半,右边一半什么都不显示好可惜。

左边和右边图为同一歌词的相同显示部分。只能显示一半的歌词显示区域,如果把令一半利用起来就完美了。


最近有点懒如果容易解决的话希望作者在升级版本时修改下,麻烦的话有时间的话我去读下代码。

谢谢作者的软件,希望它越来越完美!!!


修改了一下以下函数。版本出得比较晚,所以你可以自己看看。
void CUIMgr:rintLrc(const char* lpszStr)
{
        std::string str = lpszStr;
        size_t nPos = 0;
        size_t nStart = 0;
        size_t nLen = 0;
        int nLine = 3;
        size_t nPrintWid = m_nCOLS-STD_WID-4;
        int nOffset = 0;
        int nMid = (m_nLINES-8)/2; // in fact the index. base 0.
        int nCnt1 = 0;
        int nCnt2 = 0;

        int nSize = strlen(lpszStr);
        wchar_t* wcs = new wchar_t[nSize];
        memset(wcs, 0, nSize*sizeof(wchar_t));
        mbstowcs(wcs, lpszStr, nSize-1);
        std::wstring wstr(wcs);
        delete[] wcs;

#ifndef HAVE_MVWADDWSTR
        char* cs = new char[nSize*2];
#endif

        double fPatch = 1.0f;
        size_t nPatchLen = 0;
        while ((nPos=wstr.find(L'\n', nStart))!=std::wstring::npos && nLine <= m_nLINES-6)
        {
                nCnt1++;
                nLen = nPos - nStart;
                // patch begin
                fPatch = 1;
                if (nLen > 0)
                {
                        char* cs2 = new char[nLen*2];
                        std::wstring wstr2 = wstr.substr(nStart,nLen);
                        wcstombs(cs2,wstr2.c_str(),nLen*2);
                        if (strlen(cs2) != wstr2.length())
                        {
                                fPatch = ((double)wstr2.length())/((double)strlen(cs2));
                        }
                        delete []cs2;
                }
                nPatchLen = (size_t)(((double)nPrintWid)*fPatch);
                // patch end
                if (nLen > nPatchLen)
                {
                        nLen = nPatchLen;
                        wstr.insert(nStart + nLen, L"\n");
                        nPos = nStart + nLen;
                        nCnt2++;
                        if (nCnt1-nCnt2<nMid)
                        {
                                nOffset ++;
                        }
                }
                mvwhline(m_wins[3],nLine, 1, ' ', m_nCOLS-STD_WID-4);
                if (nLen > 0)
                {
#ifndef HAVE_MVWADDWSTR
                        memset(cs,0,nSize*2);
                        wcstombs(cs,wstr.substr(nStart,nLen).c_str(),nSize*2);
                        mvwaddstr(m_wins[3], nLine, 1, cs);
#else
                        mvwaddwstr(m_wins[3], nLine, 1, wstr.substr(nStart,nLen).c_str());
#endif
                }
                nLine ++;
                nStart = nPos+1;
        }
#ifndef HAVE_MVWADDWSTR
        delete []cs;
#endif

#ifndef _WITHOUT_REVERSE
        mvwchgat(m_wins[3],nMid+3+nOffset,1,m_nCOLS-STD_WID-4, A_REVERSE, 0, NULL);
#endif
        wrefresh(m_wins[3]);
}

种处理也是有BUG的,问题就在于这种方法是假定中英文平均分布的情况下的。如果是以下歌词,问题还会有一点点,但多少比当初好多了。
[00:00.00]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRST

[00:10.00]一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十
[00:15.00]一二三四五ABCDEFGHIJKLMNOPQRSTUVWXYZOPQRSTUVWXYZ
[00:20.00]ABCDEFGHIJKLMNOPQRSTUVWXYZ一二三四五六七八九十一
回复 支持 反对

使用道具 举报

发表于 2009-3-5 04:35:33 | 显示全部楼层
Thank you very much, it works!

中英文问题可以忽略,一般老外不唱中文,华产歌手夹杂几句外国话也无关紧要。
当然本着对问题的完美解决是需要我们对解决问题有着完美的态度和要求,但如果可以把无关紧要的问题所花的时间用在更需要的更紧要的更有实际意义的方面也是一件不错的事和不错的解决问题的态度。

Thanks man!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-16 12:53:53 | 显示全部楼层
版本更新1.5,自己顶一下。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表