Source.java 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package eu.kanade.mangafeed.sources;
  2. import com.squareup.okhttp.Headers;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import eu.kanade.mangafeed.data.caches.CacheManager;
  6. import eu.kanade.mangafeed.data.helpers.NetworkHelper;
  7. import eu.kanade.mangafeed.data.models.Chapter;
  8. import eu.kanade.mangafeed.data.models.Manga;
  9. import rx.Observable;
  10. import rx.schedulers.Schedulers;
  11. public abstract class Source {
  12. protected NetworkHelper mNetworkService;
  13. protected CacheManager mCacheManager;
  14. protected Headers mRequestHeaders;
  15. public Source(NetworkHelper networkService, CacheManager cacheManager) {
  16. mNetworkService = networkService;
  17. mCacheManager = cacheManager;
  18. mRequestHeaders = headersBuilder().build();
  19. }
  20. // Default headers, it can be overriden by children or add new keys
  21. protected Headers.Builder headersBuilder() {
  22. Headers.Builder builder = new Headers.Builder();
  23. builder.add("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64)");
  24. return builder;
  25. }
  26. // Get the most popular mangas from the source
  27. public Observable<List<Manga>> pullPopularMangasFromNetwork(int page) {
  28. String url = getUrlFromPageNumber(page);
  29. return mNetworkService
  30. .getStringResponse(url, mNetworkService.NULL_CACHE_CONTROL, mRequestHeaders)
  31. .flatMap(response -> Observable.just(parsePopularMangasFromHtml(response)));
  32. }
  33. // Get mangas from the source with a query
  34. public Observable<List<Manga>> searchMangasFromNetwork(String query, int page) {
  35. return mNetworkService
  36. .getStringResponse(getSearchUrl(query, page), mNetworkService.NULL_CACHE_CONTROL, mRequestHeaders)
  37. .flatMap(response -> Observable.just(parseSearchFromHtml(response)));
  38. }
  39. // Get manga details from the source
  40. public Observable<Manga> pullMangaFromNetwork(final String mangaUrl) {
  41. return mNetworkService
  42. .getStringResponse(getMangaUrl(mangaUrl), mNetworkService.NULL_CACHE_CONTROL, mRequestHeaders)
  43. .flatMap(unparsedHtml -> Observable.just(parseHtmlToManga(mangaUrl, unparsedHtml)));
  44. }
  45. // Get chapter list of a manga from the source
  46. public Observable<List<Chapter>> pullChaptersFromNetwork(String mangaUrl) {
  47. return mNetworkService
  48. .getStringResponse(mangaUrl, mNetworkService.NULL_CACHE_CONTROL, mRequestHeaders)
  49. .flatMap(unparsedHtml ->
  50. Observable.just(parseHtmlToChapters(unparsedHtml)));
  51. }
  52. // Get the URLs of the images of a chapter
  53. public Observable<String> getImageUrlsFromNetwork(final String chapterUrl) {
  54. return mNetworkService
  55. .getStringResponse(chapterUrl, mNetworkService.NULL_CACHE_CONTROL, mRequestHeaders)
  56. .flatMap(unparsedHtml -> Observable.from(parseHtmlToPageUrls(unparsedHtml)))
  57. .buffer(3)
  58. .concatMap(batchedPageUrls -> {
  59. List<Observable<String>> imageUrlObservables = new ArrayList<>();
  60. for (String pageUrl : batchedPageUrls) {
  61. Observable<String> temporaryObservable = mNetworkService
  62. .getStringResponse(pageUrl, mNetworkService.NULL_CACHE_CONTROL, mRequestHeaders)
  63. .flatMap(unparsedHtml -> Observable.just(parseHtmlToImageUrl(unparsedHtml)))
  64. .subscribeOn(Schedulers.io());
  65. imageUrlObservables.add(temporaryObservable);
  66. }
  67. return Observable.merge(imageUrlObservables);
  68. });
  69. }
  70. // Store the URLs of a chapter in the cache
  71. public Observable<String> pullImageUrlsFromNetwork(final String chapterUrl) {
  72. final List<String> temporaryCachedImageUrls = new ArrayList<>();
  73. return mCacheManager.getImageUrlsFromDiskCache(chapterUrl)
  74. .onErrorResumeNext(throwable -> {
  75. return getImageUrlsFromNetwork(chapterUrl)
  76. .doOnNext(imageUrl -> temporaryCachedImageUrls.add(imageUrl))
  77. .doOnCompleted(mCacheManager.putImageUrlsToDiskCache(chapterUrl, temporaryCachedImageUrls));
  78. })
  79. .onBackpressureBuffer();
  80. }
  81. // Get the URL to the details of a manga, useful if the source provides some kind of API or fast calls
  82. protected String getMangaUrl(String defaultMangaUrl) {
  83. return defaultMangaUrl;
  84. }
  85. public abstract String getName();
  86. public abstract int getSource();
  87. protected abstract String getUrlFromPageNumber(int page);
  88. protected abstract String getSearchUrl(String query, int page);
  89. protected abstract List<Manga> parsePopularMangasFromHtml(String unparsedHtml);
  90. protected abstract List<Manga> parseSearchFromHtml(String unparsedHtml);
  91. protected abstract Manga parseHtmlToManga(String mangaUrl, String unparsedHtml);
  92. protected abstract List<Chapter> parseHtmlToChapters(String unparsedHtml);
  93. protected abstract List<String> parseHtmlToPageUrls(String unparsedHtml);
  94. protected abstract String parseHtmlToImageUrl(String unparsedHtml);
  95. }