Example #1
0
        public async Task <IEnumerable <Guid> > GetIdsFromSearchRequestAsync(
            SearchMediaRequest request,
            CancellationToken cancellationToken)
        {
            FilterDefinition <Media>?filter = await BuildFilterFromRequestAsync(
                request,
                albumMediaResolver : null,
                cancellationToken);

            ProjectionDefinition <Media> projection = Builders <Media> .Projection
                                                      .Include(x => x.Id);

            var options = new FindOptions <Media, BsonDocument> {
                Projection = projection
            };

            IAsyncCursor <BsonDocument>?cursor = await _mediaStoreContext.Medias.FindAsync(
                filter,
                options,
                cancellationToken);

            List <BsonDocument> docs = await cursor.ToListAsync(cancellationToken);

            return(docs.Select(x => x["_id"].AsGuid));
        }
Example #2
0
        /// <summary>
        /// 搜索媒体资源
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public SearchMediaResponse SearchMediaList(SearchMediaRequest input)
        {
            var client = InitVodClient();


            var response = client.GetAcsResponse(input);

            return(response);
        }
Example #3
0
 public async Task <SearchResult <Media> > SearchAsync(
     SearchMediaRequest request,
     CancellationToken cancellationToken)
 {
     return(await _mediaStore.SearchAsync(
                request,
                _albumService.GetMediaIdsAsync,
                cancellationToken));
 }
Example #4
0
        private SearchMediaRequest MapToSearchRequest(IEnumerable <FilterDescription> filters)
        {
            var request = new SearchMediaRequest()
            {
                PageSize = 100000
            };

            foreach (FilterDescription?filter in filters)
            {
                switch (filter.Key.ToLower())
                {
                case "folder":
                    request.Folder = filter.Value;
                    break;

                case "date":
                    request.Date = filter.Value;
                    break;

                case "persons":
                    request.Persons = filter.Value.Split(',').Select(x => Guid.Parse(x));
                    break;

                case "countries":
                    request.Countries = filter.Value.Split(',');
                    break;

                case "cities":
                    request.Cities = filter.Value.Split(',');
                    break;

                case "albumId":
                    request.AlbumId = Guid.Parse(filter.Value);
                    break;

                case "mediaTypes":
                    request.MediaTypes = filter.Value.Split(',').Select(x => Enum.Parse <MediaType>(x, true));
                    break;

                case "geoRadius":
                    var parts  = filter.Value.Split(':');
                    var coords = parts[1].Split(',');
                    request.GeoRadius = new GeoRadiusFilter
                    {
                        Distance  = int.Parse(parts[0]),
                        Latitude  = double.Parse(coords[0]),
                        Longitude = double.Parse(coords[1]),
                    };
                    break;
                }
            }

            return(request);
        }
        /// <summary>
        /// 搜索媒体信息,支持各种条件筛选,以及对返回结果进行排序、过滤等功能,具体包括:
        /// - 根据媒体文件名或描述信息进行文本模糊搜索。
        /// - 根据媒体分类、标签进行检索。
        ///     - 指定分类集合 ClassIds(见输入参数),返回满足集合中任意分类的媒体。例如:假设媒体分类有电影、电视剧、综艺,其中电影又有子分类历史片、动作片、言情片。如果 ClassIds 指定了电影、电视剧,那么电影和电视剧下的所有子分类
        ///     都会返回;而如果 ClassIds 指定的是历史片、动作片,那么只有这 2 个子分类下的媒体才会返回。
        ///     - 指定标签集合 Tags(见输入参数),返回满足集合中任意标签的媒体。例如:假设媒体标签有二次元、宫斗、鬼畜,如果 Tags 指定了二次元、鬼畜 2 个标签,那么只要符合这 2 个标签中任意一个的媒体都会被检索出来。
        /// - 允许指定筛选某一来源 Source(见输入参数)的媒体。
        /// - 允许根据直播推流码、Vid(见输入参数)筛选直播录制的媒体。
        /// - 允许根据媒体的创建范围筛选媒体。
        /// - 允许对上述条件进行任意组合,检索同时满足以上条件的媒体。例如可以筛选从 2018 年 12 月 1 日到 2018 年 12 月 8 日创建的电影、电视剧分类下带有宫斗、鬼畜标签的媒体。
        /// - 允许对结果进行排序,允许通过 Offset 和 Limit 实现只返回部分结果。
        ///
        /// 接口搜索限制:
        /// - 搜索结果超过 5000条,不再支持分页查询超过 5000 部分的数据。
        /// </summary>
        /// <param name="req">参考<see cref="SearchMediaRequest"/></param>
        /// <returns>参考<see cref="SearchMediaResponse"/>实例</returns>
        public async Task <SearchMediaResponse> SearchMedia(SearchMediaRequest req)
        {
            JsonResponseModel <SearchMediaResponse> rsp = null;

            try
            {
                var strResp = await this.InternalRequest(req, "SearchMedia");

                rsp = JsonConvert.DeserializeObject <JsonResponseModel <SearchMediaResponse> >(strResp);
            }
            catch (JsonSerializationException e)
            {
                throw new TencentCloudSDKException(e.Message);
            }
            return(rsp.Response);
        }
        /// <summary>
        /// </summary>
        /// <returns></returns>
        public async Task <List <VideoResource> > SynchronousVideoVodData()
        {
            await Task.Yield();

            var dtos = new GetVideoInfosResponse
            {
                VideoList = new List <GetVideoInfosResponse.GetVideoInfos_Video>()
            };
            var maxResult = 20; //批量查询vid不能超过20条
            var request   = new SearchMediaRequest
            {
                SearchType = AliyunVodAppConts.MediaTypeConsts.Video,
                PageNo     = 1,
                PageSize   = maxResult,
                Fields     = "CreateTime"
            };

            var media       = _aliyunVodManager.SearchMediaList(request);
            var totalRecord = media.Total; //2

            if (totalRecord < maxResult)
            {
                var vidList = media.MediaList.Select(a => a.Video.VideoId).ToList();
                dtos = GetVodVideoBatchVideosInfo(vidList);

                return(ConvertToVideoResources(dtos.VideoList));
            }

            //大于了2页数据
            //获取总页数
            var totalPage = (totalRecord + maxResult - 1) / maxResult; // 3

            //模拟分页获取数据
            for (var i = 0; i < totalPage; i++)
            {
                request.PageNo = i + 1; //1+1

                var mediaList = _aliyunVodManager.SearchMediaList(request);
                var mediaIds  = mediaList.MediaList.Select(a => a.Video.VideoId).ToList();

                var subDtos = GetVodVideoBatchVideosInfo(mediaIds);

                dtos.VideoList.AddRange(subDtos.VideoList);
            }

            return(ConvertToVideoResources(dtos.VideoList));
        }
Example #7
0
        public async Task <SearchResult <Media> > SearchAsync(
            SearchMediaRequest request,
            Func <Guid, CancellationToken, Task <IEnumerable <Guid> > > albumMediaResolver,
            CancellationToken cancellationToken)
        {
            FilterDefinition <Media>?filter = await BuildFilterFromRequestAsync(request, albumMediaResolver, cancellationToken);

            IFindFluent <Media, Media>?cursor = _mediaStoreContext.Medias.Find(filter);

            List <Media> medias = await cursor
                                  .SortByDescending(x => x.DateTaken)
                                  .Skip(request.PageNr * request.PageSize)
                                  .Limit(request.PageSize + 1)
                                  .ToListAsync();

            return(new SearchResult <Media>(
                       medias.Take(request.PageSize),
                       medias.Count() > request.PageSize));
        }
Example #8
0
        private async Task <FilterDefinition <Media> > BuildFilterFromRequestAsync(
            SearchMediaRequest request, Func <Guid, CancellationToken, Task <IEnumerable <Guid> > >?albumMediaResolver,
            CancellationToken cancellationToken)
        {
            FilterDefinition <Media>?filter = await new MediaFilterBuilder(
                _mediaStoreContext,
                albumMediaResolver,
                cancellationToken)
                                              .AddFolder(request.Folder)
                                              .AddPersons(request.Persons)
                                              .AddCities(request.Cities)
                                              .AddCountries(request.Countries)
                                              .AddMediaTypes(request.MediaTypes)
                                              .AddAlbum(request.AlbumId)
                                              .AddGeoRadius(request.GeoRadius)
                                              .AddDate(request.Date)
                                              .BuildAsync();

            return(filter);
        }
Example #9
0
        private async Task <IEnumerable <Guid> > GetIdsFromFilter(IEnumerable <FilterDescription> filters, CancellationToken cancellationToken)
        {
            SearchMediaRequest request = MapToSearchRequest(filters);

            return(await _mediaStore.GetIdsFromSearchRequestAsync(request, cancellationToken));
        }
Example #10
0
 public async Task <SearchResult <Media> > SearchMediaAsync(
     SearchMediaRequest request,
     CancellationToken cancellationToken)
 {
     return(await _mediaSearchService.SearchAsync(request, cancellationToken));
 }