skeleton of satellites downloader

This commit is contained in:
Dmitriy Yefremov
2018-04-23 14:42:41 +03:00
parent b310b640b4
commit 3f0738d874
15 changed files with 265 additions and 15 deletions

View File

@@ -1,11 +1,11 @@
import glob
import os
import re
import shutil
from collections import namedtuple
from html.parser import HTMLParser
import re
from app.commons import log, run_task
from app.properties import Profile

75
app/tools/satellites.py Normal file
View File

@@ -0,0 +1,75 @@
""" Module for download satellites from internet ("flysat.com")
for replace or update current satellites.xml file.
"""
import requests
from html.parser import HTMLParser
class SatellitesParser(HTMLParser):
""" Parser for satellite html page. (https://www.lyngsat.com/*sat-name*.html) """
_HEADERS = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:45.0) Gecko/20100101 Firefox/59.02"}
def __init__(self, url, entities=False, separator=' '):
HTMLParser.__init__(self)
self._parse_html_entities = entities
self._separator = separator
self._is_td = False
self._is_th = False
self._is_provider = False
self._current_row = []
self._current_cell = []
self._rows = []
self._url = url
def handle_starttag(self, tag, attrs):
if tag == 'td':
self._is_td = True
if tag == 'tr':
self._is_th = True
if tag == "a":
self._current_row.append(attrs[0][1])
def handle_data(self, data):
""" Save content to a cell """
if self._is_td or self._is_th:
self._current_cell.append(data.strip())
def handle_endtag(self, tag):
if tag == 'td':
self._is_td = False
elif tag == 'tr':
self._is_th = False
if tag in ('td', 'th'):
final_cell = self._separator.join(self._current_cell).strip()
self._current_row.append(final_cell)
self._current_cell = []
elif tag == 'tr':
row = self._current_row
self._rows.append(row)
self._current_row = []
def error(self, message):
pass
def get_satellites(self):
self.reset()
request = requests.get(url=self._url, headers=self._HEADERS)
reason = request.reason
if reason == "OK":
print(reason)
self.feed(request.text)
if self._rows:
for num, sat in enumerate(filter(lambda x: all(x) and len(x) == 5, self._rows)):
print(num + 1, sat)
else:
print(reason)
if __name__ == "__main__":
parser = SatellitesParser(url="https://www.flysat.com/satlist.php")
parser.get_satellites()

View File

@@ -9,7 +9,7 @@
<property name="icon_name">system-help</property>
<property name="type_hint">normal</property>
<property name="program_name">DemonEditor</property>
<property name="version">0.3.1 Pre-alpha</property>
<property name="version">0.3.2 Pre-alpha</property>
<property name="copyright">2018 Dmitriy Yefremov
</property>
<property name="comments" translatable="yes">Enigma2 channel and satellites list editor for GNU/Linux</property>

View File

@@ -19,7 +19,8 @@ from .download_dialog import show_download_dialog
from .main_helper import edit_marker, insert_marker, move_items, rename, ViewTarget, set_flags, locate_in_services, \
scroll_to, get_base_model, update_picons, copy_picon_reference, assign_picon, remove_picon, \
is_only_one_item_selected, gen_bouquets, BqGenType
from .picons_dialog import PiconsDialog
from .tools.picons_downloader import PiconsDialog
from .tools.satellites_downloader import SatellitesDownloaderDialog
from .satellites_dialog import show_satellites_dialog
from .settings_dialog import show_settings_dialog
from .service_details_dialog import ServiceDetailsDialog, Action
@@ -104,6 +105,7 @@ class MainAppWindow:
"on_fav_popup": self.on_fav_popup,
"on_locate_in_services": self.on_locate_in_services,
"on_picons_loader_show": self.on_picons_loader_show,
"on_satellites_downloader_show": self.on_satellites_downloader_show,
"on_filter_changed": self.on_filter_changed,
"on_assign_picon": self.on_assign_picon,
"on_remove_picon": self.on_remove_picon,
@@ -929,6 +931,10 @@ class MainAppWindow:
dialog.show()
self.update_picons()
@run_idle
def on_satellites_downloader_show(self, item):
SatellitesDownloaderDialog(self._main_window, self._options).show()
@run_idle
def on_filter_toggled(self, toggle_button: Gtk.ToggleToolButton):
self._filter_info_bar.set_visible(toggle_button.get_active())

View File

@@ -122,6 +122,11 @@
<property name="can_focus">False</property>
<property name="stock">gtk-save-as</property>
</object>
<object class="GtkImage" id="image10">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-goto-bottom</property>
</object>
<object class="GtkImage" id="image4">
<property name="visible">True</property>
<property name="can_focus">False</property>
@@ -794,8 +799,24 @@
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="Picons loader">
<property name="label" translatable="yes">Picons loader</property>
<object class="GtkImageMenuItem" id="satellites_downloader_menu_item">
<property name="label" translatable="yes">Satellites downloader</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">image10</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_satellites_downloader_show" swapped="no"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="tools_separatormenuitem1">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="picons_downloader_menu_item">
<property name="label" translatable="yes">Picons downloader</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
@@ -805,7 +826,7 @@
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="menuitem5">
<object class="GtkSeparatorMenuItem" id="tools_separatormenuitem2">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
@@ -2469,7 +2490,7 @@
<object class="GtkLabel" id="ver_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label">Ver. 0.3.1 Pre-alpha</property>
<property name="label">Ver. 0.3.2 Pre-alpha</property>
<property name="xalign">0.94999998807907104</property>
</object>
<packing>

View File

@@ -839,4 +839,125 @@
<column type="gchararray"/>
</columns>
</object>
<object class="GtkListStore" id="satellites_list_store"/>
<object class="GtkListStore" id="source_urls_list_store"/>
<object class="GtkDialog" id="satellites_dialog">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Satellites download tool</property>
<property name="modal">True</property>
<property name="destroy_with_parent">True</property>
<property name="type_hint">dialog</property>
<property name="skip_pager_hint">True</property>
<child internal-child="vbox">
<object class="GtkBox" id="satellites_dialog_vbox">
<property name="width_request">320</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child internal-child="action_area">
<object class="GtkButtonBox" id="satellites_dialog_action_area">
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox" id="satelittes_dialog_main_box">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel" id="label4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Not implemented yet!</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox" id="box3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Source:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkComboBox" id="combobox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="model">source_urls_list_store</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkTreeView" id="satellites_tree_view">
<property name="height_request">100</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="model">satellites_list_store</property>
<child internal-child="selection">
<object class="GtkTreeSelection" id="treeview-selection2"/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkSeparator" id="separator4">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">4</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</interface>

0
app/ui/tools/__init__.py Normal file
View File

View File

@@ -7,11 +7,11 @@ from gi.repository import GLib, GdkPixbuf
from app.commons import run_idle, run_task
from app.ftp import upload_data, DownloadDataType
from app.picons.picons import PiconsParser, parse_providers, Provider, convert_to
from app.tools.picons import PiconsParser, parse_providers, Provider, convert_to
from app.properties import Profile
from .uicommons import Gtk, Gdk, UI_RESOURCES_PATH, TEXT_DOMAIN
from .dialogs import show_dialog, DialogType, get_message
from .main_helper import update_entry_data
from app.ui.uicommons import Gtk, Gdk, UI_RESOURCES_PATH, TEXT_DOMAIN
from app.ui.dialogs import show_dialog, DialogType, get_message
from app.ui.main_helper import update_entry_data
class PiconsDialog:
@@ -38,7 +38,7 @@ class PiconsDialog:
builder = Gtk.Builder()
builder.set_translation_domain(TEXT_DOMAIN)
builder.add_objects_from_file(UI_RESOURCES_PATH + "picons_dialog.glade",
builder.add_objects_from_file(UI_RESOURCES_PATH + "tools.glade",
("picons_dialog", "receive_image", "providers_list_store"))
builder.connect_signals(handlers)
self._dialog = builder.get_object("picons_dialog")

View File

@@ -0,0 +1,24 @@
from app.ui.uicommons import Gtk, UI_RESOURCES_PATH, TEXT_DOMAIN
class SatellitesDownloaderDialog:
def __init__(self, transient, options):
handlers = {}
builder = Gtk.Builder()
builder.set_translation_domain(TEXT_DOMAIN)
builder.add_objects_from_file(UI_RESOURCES_PATH + "tools.glade",
("satellites_dialog", "source_urls_list_store", "satellites_list_store"))
builder.connect_signals(handlers)
self._dialog = builder.get_object("satellites_dialog")
self._dialog.set_transient_for(transient)
self._satellites_tree_view = builder.get_object("satellites_tree_view")
def show(self):
self._dialog.run()
self._dialog.destroy()
if __name__ == "__main__":
pass

View File

@@ -1,5 +1,5 @@
#!/bin/bash
VER="0.3.1_Pre-alpha"
VER="0.3.2_Pre-alpha"
B_PATH="dist/DemonEditor"
DEB_PATH="$B_PATH/usr/share/demoneditor"

Binary file not shown.

View File

@@ -142,9 +142,12 @@ msgstr "Родительский замок Вкл/Выкл Ctrl + L"
msgid "Picons"
msgstr "Пиконы"
msgid "Picons loader"
msgid "Picons downloader"
msgstr "Загрузчик пиконов"
msgid "Satellites downloader"
msgstr "Загрузчик спутников"
msgid "Preferences"
msgstr "Настройки"