The Webfeed Flutter package for Appeto SDK.
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

109 righe
3.4 KiB

  1. import 'dart:core';
  2. import 'package:webfeed/domain/dublin_core/dublin_core.dart';
  3. import 'package:webfeed/domain/rss_category.dart';
  4. import 'package:webfeed/domain/rss_cloud.dart';
  5. import 'package:webfeed/domain/rss_image.dart';
  6. import 'package:webfeed/domain/rss_item.dart';
  7. import 'package:webfeed/util/xml.dart';
  8. import 'package:xml/xml.dart';
  9. import 'rss_itunes.dart';
  10. class RssFeed {
  11. final String title;
  12. final String author;
  13. final String description;
  14. final String link;
  15. final List<RssItem> items;
  16. final RssImage image;
  17. final RssCloud cloud;
  18. final List<RssCategory> categories;
  19. final List<String> skipDays;
  20. final List<int> skipHours;
  21. final String lastBuildDate;
  22. final String language;
  23. final String generator;
  24. final String copyright;
  25. final String docs;
  26. final String managingEditor;
  27. final String rating;
  28. final String webMaster;
  29. final int ttl;
  30. final DublinCore dc;
  31. final RssItunes itunes;
  32. RssFeed({
  33. this.title,
  34. this.author,
  35. this.description,
  36. this.link,
  37. this.items,
  38. this.image,
  39. this.cloud,
  40. this.categories,
  41. this.skipDays,
  42. this.skipHours,
  43. this.lastBuildDate,
  44. this.language,
  45. this.generator,
  46. this.copyright,
  47. this.docs,
  48. this.managingEditor,
  49. this.rating,
  50. this.webMaster,
  51. this.ttl,
  52. this.dc,
  53. this.itunes,
  54. });
  55. factory RssFeed.parse(String xmlString) {
  56. var document = XmlDocument.parse(xmlString);
  57. XmlElement channelElement;
  58. try {
  59. channelElement = document.findAllElements("channel").first;
  60. } on StateError {
  61. throw ArgumentError("channel not found");
  62. }
  63. return RssFeed(
  64. title: findElementOrNull(channelElement, "title")?.text,
  65. author: findElementOrNull(channelElement, "author")?.text,
  66. description: findElementOrNull(channelElement, "description")?.text,
  67. link: findElementOrNull(channelElement, "link")?.text,
  68. items: channelElement.findElements("item").map((element) {
  69. return RssItem.parse(element);
  70. }).toList(),
  71. image: RssImage.parse(findElementOrNull(channelElement, "image")),
  72. cloud: RssCloud.parse(findElementOrNull(channelElement, "cloud")),
  73. categories: channelElement.findElements("category").map((element) {
  74. return RssCategory.parse(element);
  75. }).toList(),
  76. skipDays: findElementOrNull(channelElement, "skipDays")
  77. ?.findAllElements("day")
  78. ?.map((element) {
  79. return element.text;
  80. })?.toList() ??
  81. [],
  82. skipHours: findElementOrNull(channelElement, "skipHours")
  83. ?.findAllElements("hour")
  84. ?.map((element) {
  85. return int.tryParse(element.text ?? "0");
  86. })?.toList() ??
  87. [],
  88. lastBuildDate: findElementOrNull(channelElement, "lastBuildDate")?.text,
  89. language: findElementOrNull(channelElement, "language")?.text,
  90. generator: findElementOrNull(channelElement, "generator")?.text,
  91. copyright: findElementOrNull(channelElement, "copyright")?.text,
  92. docs: findElementOrNull(channelElement, "docs")?.text,
  93. managingEditor: findElementOrNull(channelElement, "managingEditor")?.text,
  94. rating: findElementOrNull(channelElement, "rating")?.text,
  95. webMaster: findElementOrNull(channelElement, "webMaster")?.text,
  96. ttl: int.tryParse(findElementOrNull(channelElement, "ttl")?.text ?? "0"),
  97. dc: DublinCore.parse(channelElement),
  98. itunes: RssItunes.parse(channelElement),
  99. );
  100. }
  101. }