The Webfeed Flutter package for Appeto SDK.
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

103 рядки
3.3 KiB

  1. import 'package:webfeed/domain/itunes/itunes_category.dart';
  2. import 'package:webfeed/domain/itunes/itunes_episode_type.dart';
  3. import 'package:webfeed/domain/itunes/itunes_image.dart';
  4. import 'package:webfeed/domain/itunes/itunes_owner.dart';
  5. import 'package:webfeed/domain/itunes/itunes_type.dart';
  6. import 'package:webfeed/util/xml.dart';
  7. import 'package:xml/xml.dart';
  8. class Itunes {
  9. final String? author;
  10. final String? summary;
  11. final bool? explicit;
  12. final String? title;
  13. final String? subtitle;
  14. final ItunesOwner? owner;
  15. final List<String>? keywords;
  16. final ItunesImage? image;
  17. final List<ItunesCategory?>? categories;
  18. final ItunesType? type;
  19. final String? newFeedUrl;
  20. final bool? block;
  21. final bool? complete;
  22. final int? episode;
  23. final int? season;
  24. final Duration? duration;
  25. final ItunesEpisodeType? episodeType;
  26. Itunes({
  27. this.author,
  28. this.summary,
  29. this.explicit,
  30. this.title,
  31. this.subtitle,
  32. this.owner,
  33. this.keywords,
  34. this.image,
  35. this.categories,
  36. this.type,
  37. this.newFeedUrl,
  38. this.block,
  39. this.complete,
  40. this.episode,
  41. this.season,
  42. this.duration,
  43. this.episodeType,
  44. });
  45. static parse(XmlElement? element) {
  46. if (element == null) {
  47. return null;
  48. }
  49. var episodeStr = findFirstElement(element, 'itunes:episode')?.text;
  50. var seasonStr = findFirstElement(element, 'itunes:season')?.text;
  51. var durationStr = findFirstElement(element, 'itunes:duration')?.text;
  52. return Itunes(
  53. author: findFirstElement(element, 'itunes:author')?.text,
  54. summary: findFirstElement(element, 'itunes:summary')?.text,
  55. explicit: parseBoolLiteral(element, 'itunes:explicit'),
  56. title: findFirstElement(element, 'itunes:title')?.text,
  57. subtitle: findFirstElement(element, 'itunes:subtitle')?.text,
  58. owner: ItunesOwner.parse(findFirstElement(element, 'itunes:owner')),
  59. keywords: findFirstElement(element, 'itunes:keywords')
  60. ?.text
  61. .split(',')
  62. .map((keyword) => keyword.trim())
  63. .toList() ??
  64. [],
  65. image: ItunesImage.parse(findFirstElement(element, 'itunes:image')),
  66. categories: findElements(element, 'itunes:category')!
  67. .map((e) => ItunesCategory.parse(e))
  68. .toList(),
  69. type: newItunesType(findFirstElement(element, 'itunes:type')),
  70. newFeedUrl: findFirstElement(element, 'itunes:new-feed-url')?.text,
  71. block: parseBoolLiteral(element, 'itunes:block'),
  72. complete: parseBoolLiteral(element, 'itunes:complete'),
  73. episode: episodeStr == null ? null : int.parse(episodeStr),
  74. season: seasonStr == null ? null : int.parse(seasonStr),
  75. duration: durationStr == null ? null : _parseDuration(durationStr),
  76. episodeType:
  77. newItunesEpisodeType(findFirstElement(element, 'itunes:episodeType')),
  78. );
  79. }
  80. static Duration _parseDuration(String s) {
  81. var hours = 0;
  82. var minutes = 0;
  83. var seconds = 0;
  84. var parts = s.split(':');
  85. if (parts.length > 2) {
  86. hours = int.parse(parts[parts.length - 3]);
  87. }
  88. if (parts.length > 1) {
  89. minutes = int.parse(parts[parts.length - 2]);
  90. }
  91. seconds = int.parse(parts[parts.length - 1]);
  92. return Duration(
  93. hours: hours,
  94. minutes: minutes,
  95. seconds: seconds,
  96. );
  97. }
  98. }