Exemple #1
0
        private IEnumerable <Story> GetStoriesForProject(ConfigSettings config)
        {
            var filesystemStoryReader = new FilesystemStoryReader(new Filesystem(), config);
            var storyProvider         = new StoryProvider(filesystemStoryReader, new StoryParser());

            return(storyProvider.GetStories());
        }
Exemple #2
0
        public IEnumerable <Story> GetStories(string location)
        {
            var storyReader   = new SingleFileStoryReader(new Filesystem(), ConfigSettings, location);
            var storyProvider = new StoryProvider(storyReader, new StoryParser());

            return(storyProvider.GetStories());
        }
Exemple #3
0
        public int Run()
        {
            var failed = Handler.HandleStories(StoryProvider.GetStories()).Failed;

            // hack
            SessionContext.Dispose();

            return(failed);
        }
Exemple #4
0
        public async Task <IActionResult> GetStory(int storyId, int chapterNo = 1, CancellationToken ctx = default)
        {
            const string storyProviderName = "FanFiction.Net";
            const int    fetchOperationTimeoutMilliSeconds = 4500;
            const string providerUrl = "https://www.fanfiction.net";

            var endpointFragment = $"/s/{storyId}/{chapterNo}";

            var storyProvider = new StoryProvider()
            {
                BaseUri     = new Uri(providerUrl),
                UriFragment = new Uri(endpointFragment, UriKind.Relative),
                FetchRequestTimeoutMilliSeconds = fetchOperationTimeoutMilliSeconds,
                Name = storyProviderName
            };

            try
            {
                var htmlDoc = await storyProvider.LoadFromWebAsync(ctx);

                if (storyProvider.LastStatusCodeReceived != HttpStatusCode.OK)
                {
                    throw new StoryProviderException(RequestFailReason.UnexpectedResponseStatusCode, storyProvider);
                }

                var nodes = htmlDoc.DocumentNode.SelectNodes("//div").Where(n => n.HasClass("panel_normal"));

                if (nodes.Any())
                {
                    throw new StoryProviderException(RequestFailReason.UnexpectedResponseContent, storyProvider);
                }

                var chapterData = new StoryChapter
                {
                    ChapterSeq  = chapterNo,
                    HtmlContent = htmlDoc.GetElementbyId("storytextp").OuterHtml
                };

                return(Request.Headers["Accept"].FirstOrDefault()?.Split(',').FirstOrDefault() == "text/html"
                    ? Ok(chapterData.HtmlContent)
                    : Ok(chapterData));
            }
            catch (Exception ex)
            {
                switch (ex)
                {
                case OperationCanceledException _:
                case StoryProviderException _:
                    return(BadRequest(ex));

                default:
                    throw;
                }
            }
        }
Exemple #5
0
        //[SwaggerResponse(200, "", typeof(IEnumerable<IndexResult>))]
        //[SwaggerResponse(400, "", typeof(ErrorResponse))]
        //[SwaggerResponse(400, "", typeof(WeatherForecast))]
        public async Task <IActionResult> FindStories([FromQuery] string keywords, [FromQuery] int page = 1, CancellationToken ctx = default)
        {
            const string storyProviderName = "FanFiction.Net";
            const int    fetchOperationTimeoutMilliSeconds = 4500;
            const string providerUrl = "https://www.fanfiction.net";

            var endpointFragment = $"/search/?ready=1&keywords={keywords}&type=story&ppage={page}";

            var storyProvider = new StoryProvider
            {
                BaseUri     = new Uri(providerUrl),
                UriFragment = new Uri(endpointFragment, UriKind.Relative),
                FetchRequestTimeoutMilliSeconds = fetchOperationTimeoutMilliSeconds,
                Name = storyProviderName
            };

            try
            {
                var htmlDoc = await storyProvider.LoadFromWebAsync(ctx);

                if (storyProvider.LastStatusCodeReceived != HttpStatusCode.OK)
                {
                    throw new StoryProviderException(RequestFailReason.UnexpectedResponseStatusCode, storyProvider);
                }

                var nodes = htmlDoc.DocumentNode.SelectNodes("//div").Where(n => n.HasClass("z-list"));

                var stories = nodes.Select((node, index) => new IndexResult {
                    Content = node.InnerHtml, Id = index
                });

                return(stories.Any()
                    ? Ok(stories)
                    : throw new StoryProviderException(RequestFailReason.UnexpectedResponseContent, storyProvider));
            }
            catch (Exception ex)
            {
                switch (ex)
                {
                case OperationCanceledException _:
                case StoryProviderException _:
                    return(BadRequest(ex));

                default:
                    throw;
                }
            }
        }
Exemple #6
0
 public Story Get(Guid id)
 {
     return(StoryProvider.GetStory(id));
 }
Exemple #7
0
 public Story GetLatest()
 {
     return(StoryProvider.GetLatest());
 }
Exemple #8
0
 public IEnumerable <Story> Get()
 {
     return(StoryProvider.GetStories());
 }
Exemple #9
0
 public int Run()
 {
     return(Handler.HandleStories(StoryProvider.GetStories()).Failed);
 }