本帖最后由 sas 于 2018-3-7 06:13 编辑
软件截图:
注意:本软件已不再更新,请大家使用新出软件 https://www.52pojie.cn/thread-699547-1-1.html
功能简介:
1 简洁快速观看斗鱼,不受广告干扰
2 自带了弹幕显示功能,多增添一份乐趣
链接: https://pan.baidu.com/s/1nxeMExV 密码: sj6v
更新说明:
v1.2
1 修复在多显示上全屏到主显示器的问题
2 增加黑屏选项,如果发现直播加载后是黑屏,请打勾
3 增加自动保存设置功能
v1.1
1 修复在多显示上全屏到主显示器的问题
2 增加隐藏弹幕功能
3 增加选择音频播放设备功能
下面是软件1.0版本的源码,编程语言是aardio
import win.ui;
/*DSG{{*/
var winform = win.form(text="斗鱼简易播放器";right=935;bottom=607)
winform.add(
btnFullScreen={cls="button";text="全屏";left=488;top=560;right=584;bottom=592;db=1;dl=1;z=4};
btnView={cls="button";text="查看";left=360;top=560;right=456;bottom=592;db=1;dl=1;z=2};
custom={cls="custom";text="custom";left=16;top=16;right=921;bottom=525;ah=1;aw=1;z=5};
edRoomId={cls="edit";text="https://www.douyu.com/71771";left=120;top=560;right=344;bottom=593;db=1;dl=1;edge=1;multiline=1;z=1};
static={cls="static";text="直播间地址";left=24;top=568;right=104;bottom=592;db=1;dl=1;transparent=1;z=3};
static2={cls="static";text="音量";left=680;top=576;right=720;bottom=594;db=1;dl=1;transparent=1;z=7};
trackbar={cls="trackbar";left=720;top=560;right=904;bottom=590;db=1;dl=1;max=100;min=0;z=6}
)
/*}}*/
import mpvPlayer;
import hpsocket.tcpPullClient;
import thread.command
var mpv = mpvPlayer(winform.custom);
var tcpPullClient = hpsocket.tcpPullClient()
var thCmd = thread.command()
thCmd.onChat = function(nick, txt){
mpv.setOption("osd-msg1", nick ++ ":" ++ txt );
}
var mpvOption = {
["osd-font-size"] = 35;// 字体大小
["osd-spacing"] = 2;// 字体间距
["osd-align-x"] = "center";// 显示位置
["osd-align-y"] = "bottom";
["osd-back-color"] = "#171111";// 背景颜色
}
for(k,v in mpvOption){
mpv.setOption(k,v)
}
var sendData = function(s){
var data = {
int len;
struct msg = {
int len;
word type = 689;
byte cryptedField;
byte reservedField;
byte body[] = s;
byte e;
}
}
data.len = raw.sizeof(data.msg)
data.msg.len = data.len
tcpPullClient.send( data,raw.sizeof(data ))
}
var loginreq = function(roomId){
sendData( "type@=loginreq/roomid@=" ++ roomId ++ "/" )
}
var joingroup = function(roomId){
sendData( "type@=joingroup/rid@=" ++ roomId ++ "/gid@=-9999/" )
}
var keepLive = function(){
sendData( "type@=mrkl/" )
}
var getFlvUrl = function(link){
import crypt;
import web.json;
import inet.http;
if !#link
return null, "请填写房间号";
link = string.match( link, "<@www.douyu.com/@>(.+?)$" )
if !link
return null, "房间号填写有误";
var http = inet.http()
// 获取直播房间详情
var html = http.get( "http://open.douyucdn.cn/api/RoomApi/room/" ++ link )
if !html
return null, "网络连接有误";
var r = web.json.parse( html )
if( r.error !== 0 )
return null, "数据解析有误,网站可能已更新";
var roomId = r.data.room_id
var roomInfo = {
name = r.data.owner_name;
roomName = r.data.room_name;
roomId = roomId
}
if( r.data.room_status === "2" ){
return null, "没有开播";
}
var key = "zNzMV1y4EMxOHS6I5WKm"
var t = tonumber(time())
var basicUrl = "http://capi.douyucdn.cn/api/v1/"
var path = "room/" ++ roomId ++ "?aid=wp&cdn=ws&client_sys=wp&time=" ++ t
var url = basicUrl ++ path ++ "&auth=" ++ crypt.md5( path ++ key, false )
html = http.get( url )
if( !html ){
return null, "网络连接有误";
}
var r = web.json.parse(html)
if( r.error === 0 ){
return r.data.rtmp_url ++ "/" ++ r.data.rtmp_live, roomInfo;
}
return null, "数据解析有误,网站可能已更新";
}
var tmId;
var view = function(link){
var url , roomInfo = win.invoke( getFlvUrl, link )
if !url
return null, roomInfo;
tcpPullClient.stop()
if( !tcpPullClient.start( "openbarrage.douyutv.com",8601,false) )
return null, "连接斗鱼弹幕服务器失败";
loginreq( roomInfo.roomId)
joingroup(roomInfo.roomId)
if( tmId ){
winform.killtimer(tmId)
}
tmId = winform.addtimer(
15000,
function(hwnd,msg,id,tick){
keepLive()
}
)
winform.text = roomInfo.name ++ ":" ++ roomInfo.roomName
mpv.command("loadfile", url)
return true;
}
tcpPullClient.onPullReceive = function(hpTcpPullClient,connId,length){
import thread.command
while(
var min, remain = 9, length;
;
remain >= min
) {
remain -= 4;
var buf = {INT len};
if 0 !== hpTcpPullClient.peek( buf, 4 )
return ;
var len = buf.len;
if remain < len
return ;
remain -= len;
var bufLen = 4+len
buf = raw.buffer( bufLen )
if 0 !== hpTcpPullClient.fetch( buf, bufLen )
return ;
var s = raw.tostring(buf)
if( string.match( s, `type@=(.+?)/`) == "chatmsg" ){
var nickname = string.match( s, `nn@=(.+?)/`)
var txt = string.match( s, `txt@=(.+?)/`)
if( nickname ? txt ){
thread.command.post( "onChat", nickname , txt )
}
}
}
}
winform.btnView.oncommand = function(id,event){
owner.disabled = true
var link = winform.edRoomId.text
var url, err = view(link)
if( !url ){
winform.msgboxErr(err)
}
owner.disabled = false
}
winform.trackbar.pos = 70
mpv.setVolume(winform.trackbar.pos)
winform.trackbar.oncommand = function(id,event,pos){
if( event == 0x8/*_TB_ENDTRACK*/ ){
mpv.setVolume(winform.trackbar.pos)
}
elseif( event = 0x5/*_TB_THUMBTRACK*/ ){
mpv.setVolume(pos)
}
}
winform.btnFullScreen.oncommand = function(id,event){
winform.custom.fullscreen(true)
}
import win.ui.accelerator
win.ui.accelerator({
{ vkey =0x1B/*_VK_ESC*/;oncommand = function(id,event) winform.custom.fullscreen(false) }
{ vkey =0x7A/*_VK_F11*/; oncommand = function(id,event) winform.custom.fullscreen() }
},winform);
winform.show()
win.loopMessage();
|