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)); }
/// <summary> /// 搜索媒体资源 /// </summary> /// <param name="input"></param> /// <returns></returns> public SearchMediaResponse SearchMediaList(SearchMediaRequest input) { var client = InitVodClient(); var response = client.GetAcsResponse(input); return(response); }
public async Task <SearchResult <Media> > SearchAsync( SearchMediaRequest request, CancellationToken cancellationToken) { return(await _mediaStore.SearchAsync( request, _albumService.GetMediaIdsAsync, cancellationToken)); }
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)); }
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)); }
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); }
private async Task <IEnumerable <Guid> > GetIdsFromFilter(IEnumerable <FilterDescription> filters, CancellationToken cancellationToken) { SearchMediaRequest request = MapToSearchRequest(filters); return(await _mediaStore.GetIdsFromSearchRequestAsync(request, cancellationToken)); }
public async Task <SearchResult <Media> > SearchMediaAsync( SearchMediaRequest request, CancellationToken cancellationToken) { return(await _mediaSearchService.SearchAsync(request, cancellationToken)); }