public bool StreamStop([FromHeader(Name = "AccessKey")] string AccessKey, string mediaServerId, string mainId) { ResponseStruct rs; var ret = MediaServerService.StreamStop(mediaServerId, mainId, out rs); if (rs.Code != ErrorNumber.None) { throw new AkStreamException(rs); } return(ret); }
public bool DeleteVideoChannel([FromHeader(Name = "AccessKey")] string AccessKey, string mianId) { ResponseStruct rs; var ret = MediaServerService.DeleteVideoChannel(mianId, out rs); if (rs.Code != ErrorNumber.None) { throw new AkStreamException(rs); } return(ret); }
public ResKeeperCutMergeTaskStatusResponseList GetBacklogTaskList(string mediaServerId) { ResponseStruct rs; var ret = MediaServerService.GetBacklogTaskList(mediaServerId, out rs); if (rs.Code != ErrorNumber.None) { throw new AkStreamException(rs); } return(ret); }
public VideoChannel AddVideoChannel([FromHeader(Name = "AccessKey")] string AccessKey, ReqAddVideoChannel req) { ResponseStruct rs; var ret = MediaServerService.AddVideoChannel(req, out rs); if (rs.Code != ErrorNumber.None) { throw new AkStreamException(rs); } return(ret); }
public ResKeeperCutMergeTaskResponse CutOrMergeVideoFile(ReqKeeperCutOrMergeVideoFile rcmv) { ResponseStruct rs; var ret = MediaServerService.CutOrMergeVideoFile(rcmv, out rs); if (rs.Code != ErrorNumber.None) { throw new AkStreamException(rs); } return(ret); }
public bool SoftDeleteRecordFile([FromHeader(Name = "AccessKey")] string AccessKey, long dbId) { ResponseStruct rs; var ret = MediaServerService.SoftDeleteRecordFile(dbId, out rs); if (rs.Code != ErrorNumber.None) { throw new AkStreamException(rs); } return(ret); }
/// <summary> /// 文件一个一个删除 /// </summary> /// <param name="videoSize"></param> /// <param name="sdp"></param> private void deleteFileOneByOne(decimal videoSize, MediaServerStreamInfo mediaInfo, RecordPlan plan) { ReqGetRecordFileList req = new ReqGetRecordFileList(); req.MainId = mediaInfo.Stream; req.MediaServerId = mediaInfo.MediaServerId; req.Deleted = false; req.OrderBy = new List <OrderByStruct>(); req.OrderBy.Add(new OrderByStruct() { FieldName = "starttime", OrderByDir = OrderByDir.ASC, }); req.PageIndex = 1; req.PageSize = 100; long deleteSize = 0; while (videoSize - deleteSize > plan.LimitSpace) { var recordFileList = MediaServerService.GetRecordFileList(req, out ResponseStruct rs); if (!rs.Code.Equals(ErrorNumber.None)) { break; } if (recordFileList != null && recordFileList.RecordFileList != null && recordFileList.RecordFileList.Count > 0) { foreach (var ret in recordFileList.RecordFileList) { if (ret != null) { if (MediaServerService.DeleteRecordFile(ret.Id, out rs)) { deleteSize += (long)ret.FileSize !; Logger.Info( $"[{Common.LoggerHead}]->删除一个录制文件->{mediaInfo.MediaServerId}->{mediaInfo.Stream}->DBId:{ret.Id}->FilePath:{ret.VideoPath}"); } Thread.Sleep(20); } if ((videoSize - deleteSize) < plan.LimitSpace) { break; } } } } }
public ResDeleteFileList DeleteRecordFileList([FromHeader(Name = "AccessKey")] string AccessKey, List <long> dbIdList) { ResponseStruct rs; var ret = MediaServerService.DeleteRecordFileList(dbIdList, out rs); if (rs.Code != ErrorNumber.None) { throw new AkStreamException(rs); } return(ret); }
public ResGetRecordFileList GetRecordFileList([FromHeader(Name = "AccessKey")] string AccessKey, ReqGetRecordFileList req) { ResponseStruct rs; var ret = MediaServerService.GetRecordFileList(req, out rs); if (rs.Code != ErrorNumber.None) { throw new AkStreamException(rs); } return(ret); }
public string GetStreamSnap([FromHeader(Name = "AccessKey")] string AccessKey, string mediaServerId, ReqZLMediaKitGetSnap req) { ResponseStruct rs; var ret = MediaServerService.GetStreamSnap(mediaServerId, req, out rs); if (rs.Code != ErrorNumber.None) { throw new AkStreamException(rs); } return(ret); }
public ResGetWaitForActiveVideoChannelList GetWaitForActiveVideoChannelList( [FromHeader(Name = "AccessKey")] string AccessKey, ReqPaginationBase req) { ResponseStruct rs; var ret = MediaServerService.GetWaitForActiveVideoChannelList(req, out rs); if (rs.Code != ErrorNumber.None) { throw new AkStreamException(rs); } return(ret); }
public ResKeeperCutMergeTaskStatusResponse GetMergeTaskStatus([FromHeader(Name = "AccessKey")] string AccessKey, string mediaServerId, string taskId) { ResponseStruct rs; var ret = MediaServerService.GetMergeTaskStatus(mediaServerId, taskId, out rs); if (rs.Code != ErrorNumber.None) { throw new AkStreamException(rs); } return(ret); }
public ResMediaServerOpenRtpPort MediaServerOpenRtpPort([FromHeader(Name = "AccessKey")] string AccessKey, string mediaServerId, string stream) { ResponseStruct rs; var ret = MediaServerService.MediaServerOpenRtpPort(mediaServerId, stream, out rs); if (rs.Code != ErrorNumber.None) { throw new AkStreamException(rs); } return(ret); }
public ServerInstance GetMediaServerByMediaServerId([FromHeader(Name = "AccessKey")] string AccessKey, string mediaServerId) { ResponseStruct rs; var ret = MediaServerService.GetMediaServerByMediaServerId(mediaServerId, out rs); if (!rs.Code.Equals(ErrorNumber.None)) { throw new AkStreamException(rs); } return(ret); }
private void KeepLive() { while (true) { try { var dbRet = ORMHelper.Db.Select <VideoChannel>().Where(x => x.Enabled.Equals(true)) .Where(x => x.AutoVideo.Equals(true)).Where(x => x.NoPlayerBreak.Equals(false)).ToList(); if (dbRet != null && dbRet.Count > 0) { foreach (var obj in dbRet) { if (obj != null) { var listRet = Common.VideoChannelMediaInfos.FindLast(x => x.MainId.Equals(obj.MainId)); if (listRet == null) { var mediaServer = Common.MediaServerList.FindLast(x => x.MediaServerId.Equals(obj.MediaServerId)); if (mediaServer != null && mediaServer.IsKeeperRunning && mediaServer.IsMediaServerRunning) { var streamLiveRet = MediaServerService.StreamLive(obj.MediaServerId, obj.MainId, out ResponseStruct rs); if (!rs.Code.Equals(ErrorNumber.None) || streamLiveRet == null) { Logger.Warn( $"[{Common.LoggerHead}]->自动推流失败->{obj.MediaServerId}->{obj.MainId}->{JsonHelper.ToJson(Common.WebPerformanceInfo)}"); } else { Logger.Info( $"[{Common.LoggerHead}]->自动推流成功->{obj.MediaServerId}->{obj.MainId}->{JsonHelper.ToJson(streamLiveRet)}"); } } } } Thread.Sleep(100); } } Thread.Sleep(5000); } catch { // } } }
public static void OnUnRegister(string sipDeviceJson) { //设备注销时,要清掉在线流 var sipDevice = JsonHelper.FromJson <SipDevice>(sipDeviceJson); try { if (sipDevice != null && sipDevice.SipChannels != null && sipDevice.SipChannels.Count > 0) { foreach (var channel in sipDevice.SipChannels) { if (channel != null) { var mediaInfo = Common.VideoChannelMediaInfos.FindLast(x => x.MainId.Equals(channel.Stream)); if (mediaInfo != null) { var ret = MediaServerService.StreamStop(mediaInfo.MediaServerId, mediaInfo.MainId, out ResponseStruct rs); if (ret && rs.Code.Equals(ErrorNumber.None)) { Logger.Info( $"[{Common.LoggerHead}]->设备注销->{sipDevice.RemoteEndPoint.Address.MapToIPv4().ToString()}-{sipDevice.DeviceId}->通道-{channel.DeviceId}->注销成功"); } else { Logger.Warn( $"[{Common.LoggerHead}]->设备注销->{sipDevice.RemoteEndPoint.Address.MapToIPv4().ToString()}-{sipDevice.DeviceId}->通道-{channel.DeviceId}->注销失败->{JsonHelper.ToJson(rs, Formatting.Indented)}"); } } } Thread.Sleep(50); } } } catch (Exception ex) { ResponseStruct rs = new ResponseStruct() { Code = ErrorNumber.Sip_CallBackExcept, Message = ErrorMessage.ErrorDic ![ErrorNumber.Sip_CallBackExcept],
/// <summary> /// 一天一天删除文件 /// </summary> /// <param name="days"></param> /// <param name="sdp"></param> private void DeleteFileByDay(List <string> days, MediaServerStreamInfo mediaInfo) { foreach (var day in days) { var deleteList = ORMHelper.Db.Select <RecordFile>().Where(x => x.RecordDate == day).ToList(); if (deleteList != null && deleteList.Count > 0) { var deleteFileList = deleteList.Select(x => x.Id).ToList(); ORMHelper.Db.Update <RecordFile>().Set(x => x.UpdateTime, DateTime.Now) .Set(x => x.Deleted, true) .Where(x => x.RecordDate == day).ExecuteAffrows(); MediaServerService.DeleteRecordFileList(deleteFileList, out _); Logger.Info( $"[{Common.LoggerHead}]->删除一天录制文件->{mediaInfo.MediaServerId}->{mediaInfo.Stream}->{day}"); } Thread.Sleep(100); } }
public List <ushort> ListRtpServer( [FromHeader(Name = "AccessKey")] string AccessKey, string mediaServerId) { ResponseStruct rs; var ret = MediaServerService.ListRtpServer(mediaServerId, out rs); if (!rs.Code.Equals(ErrorNumber.None)) { throw new AkStreamException(rs); } if (ret != null && ret.Count > 0) { return(ret); } else { return(new List <ushort>()); } }
public void IncreaseMissedPings_Should_Return_Increased_Missed_Pings() { _httpClientMock = new Mock <IHttpClient>(); _embyRepositoryMock = new Mock <IMediaServerRepository>(); _movieRepositoryMock = new Mock <IMovieRepository>(); _showRepositoryMock = new Mock <IShowRepository>(); _embyRepositoryMock = new Mock <IMediaServerRepository>(); _sessionServiceMock = new Mock <ISessionService>(); _embyRepositoryMock.Setup(x => x.ResetMissedPings()); var strategy = new Mock <IClientStrategy>(); strategy.Setup(x => x.CreateHttpClient(It.IsAny <ServerType>())).Returns(_httpClientMock.Object); var libraryRepository = new Mock <ILibraryRepository>(); var service = new MediaServerService(strategy.Object, _embyRepositoryMock.Object, _sessionServiceMock.Object, _settingsServiceMock.Object, _movieRepositoryMock.Object, _showRepositoryMock.Object, libraryRepository.Object); service.IncreaseMissedPings(); _embyRepositoryMock.Verify(x => x.IncreaseMissedPings(), Times.Once); }
public void PingEmby_Should_Ping_Emby_Server() { _httpClientMock = new Mock <IHttpClient>(); _embyRepositoryMock = new Mock <IMediaServerRepository>(); _movieRepositoryMock = new Mock <IMovieRepository>(); _showRepositoryMock = new Mock <IShowRepository>(); _embyRepositoryMock = new Mock <IMediaServerRepository>(); _sessionServiceMock = new Mock <ISessionService>(); _httpClientMock.Setup(x => x.Ping()).Returns(true); var strategy = new Mock <IClientStrategy>(); strategy.Setup(x => x.CreateHttpClient(It.IsAny <ServerType>())).Returns(_httpClientMock.Object); var libraryRepository = new Mock <ILibraryRepository>(); var service = new MediaServerService(strategy.Object, _embyRepositoryMock.Object, _sessionServiceMock.Object, _settingsServiceMock.Object, _movieRepositoryMock.Object, _showRepositoryMock.Object, libraryRepository.Object); var result = service.PingMediaServer("localhost:9000"); result.Should().BeTrue(); _httpClientMock.Verify(x => x.Ping(), Times.Once); }
public void GetUserViewCount_Should_Return_User_View_Count() { _httpClientMock = new Mock <IHttpClient>(); _embyRepositoryMock = new Mock <IMediaServerRepository>(); _movieRepositoryMock = new Mock <IMovieRepository>(); _showRepositoryMock = new Mock <IShowRepository>(); _embyRepositoryMock = new Mock <IMediaServerRepository>(); _sessionServiceMock = new Mock <ISessionService>(); _sessionServiceMock.Setup(x => x.GetPlayCountForUser(It.IsAny <string>())).Returns(12); var strategy = new Mock <IClientStrategy>(); strategy.Setup(x => x.CreateHttpClient(It.IsAny <ServerType>())).Returns(_httpClientMock.Object); var libraryRepository = new Mock <ILibraryRepository>(); var service = new MediaServerService(strategy.Object, _embyRepositoryMock.Object, _sessionServiceMock.Object, _settingsServiceMock.Object, _movieRepositoryMock.Object, _showRepositoryMock.Object, libraryRepository.Object); var result = service.GetUserViewCount("1"); result.Should().Be(12); _sessionServiceMock.Verify(x => x.GetPlayCountForUser("1"), Times.Once); }
public void TestNewApiKey_Should_Return_False() { _httpClientMock = new Mock <IHttpClient>(); _embyRepositoryMock = new Mock <IMediaServerRepository>(); _movieRepositoryMock = new Mock <IMovieRepository>(); _showRepositoryMock = new Mock <IShowRepository>(); _embyRepositoryMock = new Mock <IMediaServerRepository>(); _sessionServiceMock = new Mock <ISessionService>(); _httpClientMock.Setup(x => x.GetServerInfo()).Returns((ServerInfo)null); _httpClientMock.SetupSet(x => x.ApiKey = "1234").Verifiable(); _httpClientMock.SetupSet(x => x.BaseUrl = "localhost:9000").Verifiable(); _httpClientMock.SetupGet(x => x.ApiKey).Returns("12345"); _httpClientMock.SetupGet(x => x.BaseUrl).Returns("localhost:9001"); var strategy = new Mock <IClientStrategy>(); strategy.Setup(x => x.CreateHttpClient(It.IsAny <ServerType>())).Returns(_httpClientMock.Object); var libraryRepository = new Mock <ILibraryRepository>(); var service = new MediaServerService(strategy.Object, _embyRepositoryMock.Object, _sessionServiceMock.Object, _settingsServiceMock.Object, _movieRepositoryMock.Object, _showRepositoryMock.Object, libraryRepository.Object); var result = service.TestNewApiKey("localhost:9000", "1234", ServerType.Emby); result.Should().BeFalse(); _httpClientMock.VerifyGet(x => x.ApiKey, Times.Once); _httpClientMock.VerifyGet(x => x.BaseUrl, Times.Once); _httpClientMock.VerifySet(x => x.ApiKey = "1234", Times.Once); _httpClientMock.VerifySet(x => x.BaseUrl = "localhost:9000", Times.Once); _httpClientMock.VerifySet(x => x.ApiKey = "12345", Times.Once); _httpClientMock.VerifySet(x => x.BaseUrl = "localhost:9001", Times.Once); _httpClientMock.Verify(x => x.GetServerInfo(), Times.Once); }
private void KeepLive() { while (true) { try { var dbRet = ORMHelper.Db.Select <VideoChannel>().ToList(); if (dbRet != null && dbRet.Count > 0) { foreach (var obj in dbRet) { var listRet = Common.Ldb.VideoOnlineInfo.FindOne(x => x.MainId.Equals(obj.MainId) && x.MediaServerId.Equals(obj.MediaServerId)); if (obj != null && obj.AutoVideo.Equals(true) && obj.NoPlayerBreak.Equals(false) && obj.Enabled.Equals(true)) { if (listRet == null) { var mediaServer = Common.MediaServerList.FindLast(x => x.MediaServerId.Equals(obj.MediaServerId)); if (mediaServer != null && mediaServer.IsKeeperRunning && mediaServer.IsMediaServerRunning) { var streamLiveRet = MediaServerService.StreamLive(obj.MediaServerId, obj.MainId, out ResponseStruct rs); if (!rs.Code.Equals(ErrorNumber.None) || streamLiveRet == null) { Logger.Warn( $"[{Common.LoggerHead}]->自动推流失败->{obj.MediaServerId}->{obj.MainId}"); } else { Logger.Info( $"[{Common.LoggerHead}]->自动推流成功->{obj.MediaServerId}->{obj.MainId}"); } } } } else if (obj != null && obj.Enabled.Equals(false)) { if (listRet != null) { var mediaServer = Common.MediaServerList.FindLast(x => x.MediaServerId.Equals(obj.MediaServerId)); if (mediaServer != null && mediaServer.IsKeeperRunning && mediaServer.IsMediaServerRunning) { var streamLiveRet = MediaServerService.StreamStop(obj.MediaServerId, obj.MainId, out ResponseStruct rs); if (!rs.Code.Equals(ErrorNumber.None) || streamLiveRet == null) { Logger.Warn( $"[{Common.LoggerHead}]->自动结束推流失败->{obj.MediaServerId}->{obj.MainId}"); } else { Logger.Info( $"[{Common.LoggerHead}]->自动结束推流成功->{obj.MediaServerId}->{obj.MainId}"); } } } } Thread.Sleep(20); } } Thread.Sleep(Common.AkStreamWebConfig.WaitEventTimeOutMSec); } catch { // } } }
private void KeepRecord() { while (true) { ResponseStruct rs = null; var recordPlanList = RecordPlanService.GetRecordPlanList("", out rs); var videoChannelList = ORMHelper.Db.Select <VideoChannel>().Where(x => x.Enabled.Equals(true)) .Where(x => !string.IsNullOrEmpty(x.RecordPlanName)) .Where(x => x.AutoRecord.Equals(true)).ToList(); if (rs.Code.Equals(ErrorNumber.None) && recordPlanList != null && recordPlanList.Count > 0) { try { foreach (var obj in Common.VideoChannelMediaInfos) { if (obj != null && obj.MediaServerStreamInfo != null) { var videoChannel = videoChannelList.FindLast(x => x.MainId.Equals(obj.MainId)); if (videoChannel != null) { //启用了自动录制 var recordPlan = recordPlanList.FindLast(x => x.Name.Equals(videoChannel.RecordPlanName)); if (recordPlan != null && recordPlan.Enable == true) { //说明绑定了录制模板 var fileSize = getRecordFileSize(videoChannel.MainId); //得到文件总长度 var fileDateList = getRecordFileDataList(videoChannel.MainId); //得到记录天数列表 if (fileDateList == null) { fileDateList = new List <string>(); } var inRange = checkTimeRange(recordPlan); bool stopIt = false; if (!inRange) { stopIt = true; } if (inRange && recordPlan.LimitDays >= fileDateList.Count && recordPlan.LimitSpace >= fileSize) { stopIt = false; } if (inRange && (recordPlan.LimitDays < fileDateList.Count || recordPlan.LimitSpace < fileSize)) { stopIt = true; } if (stopIt && obj.MediaServerStreamInfo.IsRecorded == true) { switch (recordPlan.OverStepPlan) { case OverStepPlan.StopDvr: string info = $"自动停止录制文件条件被触发->{obj.MediaServerId}->{obj.MainId}->{videoChannel.RecordPlanName}"; info += (recordPlan.LimitDays < fileDateList.Count) ? $"限制录制文件天数:{recordPlan.LimitDays}<实际录制文件天数:{fileDateList.Count}" : ""; info += $"->限制录制空间:{recordPlan.LimitSpace}Bytes<实际录制空间:{fileSize}Bytes"; info += !inRange ? "->超出录制模板规定的时间区间" : ""; Logger.Info( $"[{Common.LoggerHead}]->{info}"); MediaServerService.StopRecord(videoChannel.MediaServerId, videoChannel.MainId, out rs); break; case OverStepPlan.DeleteFile: if (!inRange) { string info3 = "超出录制模板规定的时间区间"; Logger.Info( $"[{Common.LoggerHead}]->自动停止录制文件条件被触发->{info3}"); MediaServerService.StopRecord(videoChannel.MediaServerId, videoChannel.MainId, out rs); } else { string info2 = $"自动删除录制文件条件被触发->{obj.MediaServerId}->{obj.MainId}->{videoChannel.RecordPlanName}"; info2 += (recordPlan.LimitDays < fileDateList.Count) ? $"限制录制文件天数:{recordPlan.LimitDays}<实际录制文件天数:{fileDateList.Count}" : ""; info2 += $"->限制录制空间:{recordPlan.LimitSpace}Bytes<实际录制空间:{fileSize}Bytes"; Logger.Info( $"[{Common.LoggerHead}]->{info2}"); bool p = false; if (recordPlan.LimitDays < fileDateList.Count) //先一天一天删除 { int?loopCount = fileDateList.Count - recordPlan.LimitDays; List <string> willDeleteDays = new List <string>(); for (int i = 0; i < loopCount; i++) { willDeleteDays.Add(fileDateList[i] !); } DeleteFileByDay(willDeleteDays, obj.MediaServerStreamInfo); p = true; } if (p) { fileSize = getRecordFileSize(videoChannel .MainId); //删除完一天以后再取一下文件总长度 } if (recordPlan.LimitSpace < fileSize) //还大,再删除一个文件 { deleteFileOneByOne(fileSize, obj.MediaServerStreamInfo, recordPlan); } } break; } } else { if (obj.MediaServerStreamInfo.IsRecorded == false) { Logger.Info( $"[{Common.LoggerHead}]->自动启动录制文件条件被触发->{obj.MediaServerId}->{obj.MainId}->{videoChannel.RecordPlanName}" + $"限制录制文件天数:{recordPlan.LimitDays}>实际录制文件天数:{fileDateList.Count}->限制录制空间:{recordPlan.LimitSpace}Bytes>实际录制空间:{fileSize}Bytes" + $"录制计划模板中时间区间被击中,开始录制音视频流"); MediaServerService.StartRecord(videoChannel.MediaServerId, videoChannel.MainId, out rs); } } } else if (recordPlan != null && recordPlan.Enable == false) { if (obj.MediaServerStreamInfo.IsRecorded == true) { Logger.Info( $"[{Common.LoggerHead}]->自动停止录制条件被触发,结束录制音视频流->{obj.MediaServerId}->{obj.MainId}->{videoChannel.RecordPlanName}-录制计划模板已禁用"); MediaServerService.StopRecord(videoChannel.MediaServerId, videoChannel.MainId, out rs); } } else if (recordPlan == null) { if (obj.MediaServerStreamInfo.IsRecorded == true) { Logger.Info( $"[{Common.LoggerHead}]->自动停止录制条件被触发,结束录制音视频流->{obj.MediaServerId}->{obj.MainId}->未绑定录制计划模板"); MediaServerService.StopRecord(videoChannel.MediaServerId, videoChannel.MainId, out rs); } } } } } } catch { // } } Thread.Sleep(1000); } }