Пример #1
0
        private PlaylistItem CreatePlaylistItem(BaseItem item, long startPostionTicks, string serverAddress)
        {
            var deviceInfo = _device.Properties;

            var profile = _dlnaManager.GetProfile(deviceInfo.ToDeviceIdentification()) ??
                          _dlnaManager.GetDefaultProfile();

            var mediaSources = item is Audio || item is Video
                ? _dtoService.GetMediaSources(item)
                : new List <MediaSourceInfo>();

            var playlistItem = GetPlaylistItem(item, mediaSources, profile, _session.DeviceId);

            playlistItem.StreamInfo.StartPositionTicks = startPostionTicks;

            playlistItem.StreamUrl = playlistItem.StreamInfo.ToUrl(serverAddress);

            var itemXml =
                new DidlBuilder(profile, _imageProcessor, serverAddress, _dtoService).GetItemDidl(item, _session.DeviceId,
                                                                                                  new Filter());

            playlistItem.Didl = itemXml;

            return(playlistItem);
        }
Пример #2
0
        private void AddVideoResource(XmlElement container, Video video, string deviceId, Filter filter)
        {
            var res = container.OwnerDocument.CreateElement(string.Empty, "res", NS_DIDL);

            var sources = _dtoService.GetMediaSources(video);

            int?maxBitrateSetting = null;

            var streamInfo = new StreamBuilder().BuildVideoItem(new VideoOptions
            {
                ItemId       = video.Id.ToString("N"),
                MediaSources = sources,
                Profile      = _profile,
                DeviceId     = deviceId,
                MaxBitrate   = maxBitrateSetting
            });

            var url = streamInfo.ToDlnaUrl(_serverAddress);

            //res.AppendChild(container.OwnerDocument.CreateCDataSection(url));
            res.InnerText = url;

            var mediaSource = sources.First(i => string.Equals(i.Id, streamInfo.MediaSourceId));

            if (mediaSource.RunTimeTicks.HasValue)
            {
                res.SetAttribute("duration", TimeSpan.FromTicks(mediaSource.RunTimeTicks.Value).ToString("c", _usCulture));
            }

            if (filter.Contains("res@size"))
            {
                if (streamInfo.IsDirectStream || streamInfo.EstimateContentLength)
                {
                    var size = streamInfo.TargetSize;

                    if (size.HasValue)
                    {
                        res.SetAttribute("size", size.Value.ToString(_usCulture));
                    }
                }
            }

            var totalBitrate     = streamInfo.TargetTotalBitrate;
            var targetSampleRate = streamInfo.TargetAudioSampleRate;
            var targetChannels   = streamInfo.TargetAudioChannels;

            var targetWidth  = streamInfo.TargetWidth;
            var targetHeight = streamInfo.TargetHeight;

            if (targetChannels.HasValue)
            {
                res.SetAttribute("nrAudioChannels", targetChannels.Value.ToString(_usCulture));
            }

            if (filter.Contains("res@resolution"))
            {
                if (targetWidth.HasValue && targetHeight.HasValue)
                {
                    res.SetAttribute("resolution", string.Format("{0}x{1}", targetWidth.Value, targetHeight.Value));
                }
            }

            if (targetSampleRate.HasValue)
            {
                res.SetAttribute("sampleFrequency", targetSampleRate.Value.ToString(_usCulture));
            }

            if (totalBitrate.HasValue)
            {
                res.SetAttribute("bitrate", totalBitrate.Value.ToString(_usCulture));
            }

            var mediaProfile = _profile.GetVideoMediaProfile(streamInfo.Container,
                                                             streamInfo.AudioCodec,
                                                             streamInfo.VideoCodec,
                                                             streamInfo.TargetAudioBitrate,
                                                             targetChannels,
                                                             targetWidth,
                                                             targetHeight,
                                                             streamInfo.TargetVideoBitDepth,
                                                             streamInfo.TargetVideoBitrate,
                                                             streamInfo.TargetVideoProfile,
                                                             streamInfo.TargetVideoLevel,
                                                             streamInfo.TargetFramerate,
                                                             streamInfo.TargetPacketLength,
                                                             streamInfo.TargetTimestamp);

            var filename = url.Substring(0, url.IndexOf('?'));

            var mimeType = mediaProfile == null || string.IsNullOrEmpty(mediaProfile.MimeType)
               ? MimeTypes.GetMimeType(filename)
               : mediaProfile.MimeType;

            var contentFeatures = new ContentFeatureBuilder(_profile).BuildVideoHeader(streamInfo.Container,
                                                                                       streamInfo.VideoCodec,
                                                                                       streamInfo.AudioCodec,
                                                                                       targetWidth,
                                                                                       targetHeight,
                                                                                       streamInfo.TargetVideoBitDepth,
                                                                                       streamInfo.TargetVideoBitrate,
                                                                                       streamInfo.TargetAudioChannels,
                                                                                       streamInfo.TargetAudioBitrate,
                                                                                       streamInfo.TargetTimestamp,
                                                                                       streamInfo.IsDirectStream,
                                                                                       streamInfo.RunTimeTicks,
                                                                                       streamInfo.TargetVideoProfile,
                                                                                       streamInfo.TargetVideoLevel,
                                                                                       streamInfo.TargetFramerate,
                                                                                       streamInfo.TargetPacketLength,
                                                                                       streamInfo.TranscodeSeekInfo);

            res.SetAttribute("protocolInfo", String.Format(
                                 "http-get:*:{0}:{1}",
                                 mimeType,
                                 contentFeatures
                                 ));

            container.AppendChild(res);
        }
Пример #3
0
        public RecordingInfoDto GetRecordingInfoDto(ILiveTvRecording recording, LiveTvChannel channel, ILiveTvService service, User user = null)
        {
            var info = recording.RecordingInfo;

            var dto = new RecordingInfoDto
            {
                Id              = GetInternalRecordingId(service.Name, info.Id).ToString("N"),
                SeriesTimerId   = string.IsNullOrEmpty(info.SeriesTimerId) ? null : GetInternalSeriesTimerId(service.Name, info.SeriesTimerId).ToString("N"),
                Type            = recording.GetClientTypeName(),
                Overview        = info.Overview,
                EndDate         = info.EndDate,
                Name            = info.Name,
                StartDate       = info.StartDate,
                ExternalId      = info.Id,
                ChannelId       = GetInternalChannelId(service.Name, info.ChannelId).ToString("N"),
                Status          = info.Status,
                StatusName      = GetStatusName(info.Status),
                Path            = info.Path,
                Genres          = info.Genres,
                IsRepeat        = info.IsRepeat,
                EpisodeTitle    = info.EpisodeTitle,
                ChannelType     = info.ChannelType,
                MediaType       = info.ChannelType == ChannelType.Radio ? MediaType.Audio : MediaType.Video,
                CommunityRating = GetClientCommunityRating(info.CommunityRating),
                OfficialRating  = info.OfficialRating,
                Audio           = info.Audio,
                IsHD            = info.IsHD,
                ServiceName     = service.Name,
                IsMovie         = info.IsMovie,
                IsSeries        = info.IsSeries,
                IsSports        = info.IsSports,
                IsLive          = info.IsLive,
                IsNews          = info.IsNews,
                IsKids          = info.IsKids,
                IsPremiere      = info.IsPremiere,
                RunTimeTicks    = (info.EndDate - info.StartDate).Ticks,
                OriginalAirDate = info.OriginalAirDate,

                MediaSources = _dtoService.GetMediaSources((BaseItem)recording)
            };

            dto.MediaStreams = dto.MediaSources.SelectMany(i => i.MediaStreams).ToList();

            if (info.Status == RecordingStatus.InProgress)
            {
                var now   = DateTime.UtcNow.Ticks;
                var start = info.StartDate.Ticks;
                var end   = info.EndDate.Ticks;

                var pct = now - start;
                pct /= end;
                pct *= 100;
                dto.CompletionPercentage = pct;
            }

            var imageTag = GetImageTag(recording);

            if (imageTag != null)
            {
                dto.ImageTags[ImageType.Primary] = imageTag;
                _dtoService.AttachPrimaryImageAspectRatio(dto, recording);
            }

            if (user != null)
            {
                dto.UserData = _dtoService.GetUserItemDataDto(_userDataManager.GetUserData(user.Id, recording.GetUserDataKey()));

                dto.PlayAccess = recording.GetPlayAccess(user);
            }

            if (!string.IsNullOrEmpty(info.ProgramId))
            {
                dto.ProgramId = GetInternalProgramId(service.Name, info.ProgramId).ToString("N");
            }

            if (channel != null)
            {
                dto.ChannelName = channel.Name;

                if (!string.IsNullOrEmpty(channel.PrimaryImagePath))
                {
                    dto.ChannelPrimaryImageTag = GetImageTag(channel);
                }
            }

            return(dto);
        }