PageRenderTime 50ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/plugin/services/Mayak/Mayak.php

https://gitlab.com/slondon/fortissimo
PHP | 176 lines | 145 code | 31 blank | 0 comment | 2 complexity | 3225db9cc538fbae1e4b9472ba2fb685 MD5 | raw file
  1. <?php
  2. require_once 'tools/service.php';
  3. class MayakService extends Service
  4. {
  5. const ID = 'Mayak';
  6. public function __construct()
  7. {
  8. parent::__construct(self::ID);
  9. }
  10. public function load_main_folder()
  11. {
  12. return $this->_do_load_categories();
  13. }
  14. public function load_category($parent_node)
  15. {
  16. $url = $parent_node->rss_url;
  17. $title = $parent_node->title;
  18. hd_print("load category: title='$title', url=$url");
  19. $doc = file_get_contents($url);
  20. $pattern = '|\<div class\="podcast-list__item"\>'
  21. . '\s*'
  22. . '\<div class\="podcast-list__preview"\>'
  23. . '\s*'
  24. . '\<div class\="podcast-list__picture"\>'
  25. . '\s*'
  26. . '\<a class\="podcast-list__link"'
  27. . '\s+'
  28. . 'href\="(.+)"\>' # i[1]=url
  29. . '\s*'
  30. . '\<img src\="(.+)".+title\="(.+)"\>' # i[2]=icon; i[3]=title
  31. . '.+'
  32. . '\<div class\="podcast-list__anons"\>'
  33. . '\s*'
  34. . '\<a class\="podcast-list__link"'
  35. . '\s+'
  36. . 'href\=".+"\>(.+)\<div' # i[4]=descr
  37. . '.+'
  38. . '\<div class\="podcast-list__count"\>'
  39. . '\s*'
  40. . '\<a class\="podcast-list__link"'
  41. . '\s+'
  42. . 'href\=".+"\>(.+)\</a\>' # i[5]=count
  43. . '|sU';
  44. $doc = file_get_contents($url);
  45. preg_match_all($pattern, $doc, $out, PREG_SET_ORDER);
  46. $idx = 0;
  47. $items = array();
  48. foreach($out as $i)
  49. {
  50. $node_info = new NodeInfo();
  51. $node_info->id = $idx;
  52. $node_info->path = '';
  53. $node_info->type = 'dir';
  54. $title = trim(html_entity_decode(strip_tags($i[3])));
  55. $node_info->name = $title;
  56. $node_info->icon = $i[2];
  57. $node_info->rss_url = $this->_cfg['base_url'] . $i[1];
  58. $node_info->descr = array
  59. (
  60. 'Title' => $title,
  61. 'Count' => trim(html_entity_decode(strip_tags($i[5]))),
  62. 'Description' => trim(html_entity_decode(strip_tags($i[4]))),
  63. );
  64. $node = new Node($node_info, $this, 'load_channel_media');
  65. $items[$idx] = $node;
  66. $idx++;
  67. }
  68. return $items;
  69. }
  70. public function load_channel_media($parent_node)
  71. {
  72. $items = array();
  73. $url = $parent_node->rss_url;
  74. hd_print("load_channel_media url=$url");
  75. $doc = file_get_contents($url);
  76. $pattern = '|(.+)' # out[1]=*<span class="podcast-header__{completed|updating}">*
  77. . '\<a class\="podcast-header__link podcast-header__link--rss no-ajaxy"'
  78. . '\s+'
  79. . 'href\="(.+)"\>.+\</a\>' # out[2]=url
  80. . '|sU';
  81. if(preg_match($pattern, $doc, $out))
  82. {
  83. $rss_url = $this->_cfg['base_url'] . $out[2];
  84. hd_print("get audio rss url: $url -> $rss_url");
  85. $node_info = new NodeInfo();
  86. $node_info->id = 'audio';
  87. $node_info->path = '';
  88. $node_info->name = $parent_node->name . ' [Audio]';
  89. $node_info->icon = $parent_node->icon;
  90. $node_info->descr = $parent_node->descr;
  91. $node_info->descr['Status'] = 'Обновляется';
  92. if(preg_match('|\<span class\="podcast-header__completed"\>|sU', $out[1]))
  93. {
  94. $node_info->descr['Status'] = 'Завершен';
  95. }
  96. $node_info->type = 'rss';
  97. $node_info->rss_url = $rss_url;
  98. $node = new Node($node_info, $this, 'load_rss');
  99. $items[$node_info->id] = $node;
  100. }
  101. return $items;
  102. }
  103. private function _do_load_categories()
  104. {
  105. $url = $this->_cfg['categories_url'];
  106. hd_print("parse categories: url=$url");
  107. $categories = array();
  108. $pattern = '|\<li class\="podcast-categories__item.*"\>'
  109. . '\s*'
  110. . '\<div class\="podcast-categories__info"\>'
  111. . '\s*'
  112. . '\<h2 class\="podcast-categories__title"\>'
  113. . '\s*'
  114. . '\<a class\="podcast-categories__link"\s+href\="(.+)"\>(.+)\</a\>' # i[1]=url; i[2]=title
  115. . '.+'
  116. . '\<div class\="podcast-categories__count"\>'
  117. . '\s*'
  118. . '\<a class\="podcast-categories__link"\s+href\=".+"\>(.+)\</a\>' # i[3]=count
  119. . '|sU';
  120. $doc = file_get_contents($url);
  121. preg_match_all($pattern, $doc, $out, PREG_SET_ORDER);
  122. $idx = 0;
  123. foreach($out as $i)
  124. {
  125. $node_info = new NodeInfo();
  126. $node_info->id = $idx;
  127. $node_info->path = '';
  128. $node_info->type = 'dir';
  129. $title = trim(html_entity_decode(strip_tags($i[2])));
  130. $node_info->name = $title;
  131. $node_info->icon = $this->get_icon();
  132. $node_info->rss_url = $this->_cfg['base_url'] . $i[1];
  133. $node_info->descr = array
  134. (
  135. 'Title' => $title,
  136. 'Count' => trim(html_entity_decode(strip_tags($i[3]))),
  137. );
  138. $node = new Node($node_info, $this, 'load_category');
  139. $categories[$idx] = $node;
  140. $idx++;
  141. }
  142. return $categories;
  143. }
  144. }
  145. ?>