diff --git a/main/__init__.py b/main/__init__.py
new file mode 100644
index 00000000..77c354c0
--- /dev/null
+++ b/main/__init__.py
@@ -0,0 +1,5 @@
+from main.ui import start_app as start
+
+if __name__ == "__main__":
+ start()
+
diff --git a/main/data/lamedb_example b/main/data/lamedb_example
new file mode 100644
index 00000000..028baaef
--- /dev/null
+++ b/main/data/lamedb_example
@@ -0,0 +1,944 @@
+eDVB services /4/
+transponders
+01680000:0001:0070
+ s 12322060:27500000:3:3:360:2:0:1:2:0:2:-1:1:0
+/
+01680000:0002:0070
+ s 11861740:27500000:3:3:360:2:0:1:2:0:2:-1:1:0
+/
+01680000:0004:0070
+ s 12437120:27500000:3:3:360:2:0:1:2:0:2:-1:1:0
+/
+01680000:0007:0070
+ s 12245000:27500000:3:3:360:2:0:1:2:0:2:-1:1:0
+/
+01680000:0009:0070
+ s 12207000:27500000:3:3:360:2:0:1:2:0:2:-1:1:0
+/
+01680000:000a:0070
+ s 12264500:27500000:2:3:360:2:0
+/
+01680000:000b:0070
+ s 12341000:27500000:2:3:360:2:0
+/
+01680000:000c:0070
+ s 12398780:27500000:3:3:360:2:0:1:2:0:2:-1:1:0
+/
+01680000:000d:0070
+ s 11766000:27500000:1:3:360:2:0
+/
+01680000:000e:0070
+ s 11823000:27500000:3:3:360:2:0:1:2:0:2:-1:1:0
+/
+01680000:0011:0070
+ s 11938460:27500000:3:3:360:2:0:1:2:0:2:-1:1:0
+/
+01680000:0012:0070
+ s 11976820:27500000:3:3:360:2:0:1:2:0:2:-1:1:0
+/
+01680000:0013:0070
+ s 11900100:27500000:3:3:360:2:0:1:2:0:2:-1:1:0
+/
+01680000:0014:0070
+ s 12130260:27500000:3:3:360:2:0:1:2:0:2:-1:1:0
+/
+01680000:0015:0070
+ s 12091900:27500000:3:3:360:2:0:1:2:0:2:-1:1:0
+/
+01680000:0016:0070
+ s 12015180:27500000:3:3:360:2:0:1:2:0:2:-1:1:0
+/
+0168affb:0008:0070
+ s 12283000:27500000:3:3:360:2:0:1:2:0:2:-1:1:0
+/
+0168affc:0008:0070
+ s 12284000:27500000:1:3:360:2:0
+/
+end
+services
+00c9:01680000:0002:0070:1:0
+Fashion One (4K)
+p:HTB+,c:0000ce,c:010132,c:0300ce,c:050001,C:0500
+4e8b:01680000:0014:0070:25:0
+1HD
+p:HTB+,C:0500
+00ca:01680000:0002:0070:1:0
+HOME 4K (TECT)
+p:HTB+,C:0500
+03f7:01680000:000a:0070:1:0
+ТВОЙ ДОМ
+p:HTB+,C:0500
+0480:01680000:000b:0070:2:0
+Детское радио
+p:HTB+
+02e5:01680000:0007:0070:2:0
+Юмор FM
+p:HTB+
+02e6:01680000:0007:0070:2:0
+Радио Для Двоих
+p:HTB+
+02e7:01680000:0007:0070:2:0
+Романтика
+p:HTB+
+02e8:01680000:0007:0070:2:0
+Авторадио
+p:HTB+
+02e9:01680000:0007:0070:2:0
+Радио Ваня
+p:HTB+
+02ea:01680000:0007:0070:2:0
+ENERGY FM
+p:HTB+
+02eb:01680000:0007:0070:2:0
+DFM
+p:HTB+
+02ec:01680000:0007:0070:2:0
+Русское радио
+p:HTB+
+02ed:01680000:0007:0070:2:0
+HIT FM
+p:HTB+
+02ee:01680000:0007:0070:2:0
+Maximum
+p:HTB+
+02ef:01680000:0007:0070:2:0
+Business FM
+p:HTB+
+02f2:01680000:0007:0070:2:0
+Комсомольская правда
+p:HTB+
+02f3:01680000:0007:0070:2:0
+Relax FM
+p:HTB+
+02f4:01680000:0007:0070:2:0
+Эхо Москвы
+p:HTB+
+02f5:01680000:0007:0070:2:0
+Радио МИР
+p:HTB+
+02f6:01680000:0007:0070:2:0
+Love Radio
+p:HTB+
+02f7:01680000:0007:0070:2:0
+Радио Шансон
+p:HTB+
+02f8:01680000:0007:0070:2:0
+Детское радио
+p:HTB+
+1f53:01680000:000a:0070:12:0
+VAHD3100S DOWNLOAD SVC
+p:HTB+,f:40
+1b58:01680000:000a:0070:12:0
+OPENTEL 1740V OTA
+p:HTB+
+025d:01680000:0015:0070:12:0
+Neotion Update Service
+p:HTB+,f:40
+1f5e:01680000:0015:0070:12:0
+KMedia
+p:HTB+
+0265:01680000:0015:0070:12:0
+Neotion CAM PRO
+p:HTB+,f:40
+1f68:01680000:000a:0070:12:0
+Jiuzhou 1HD SSU
+p:HTB+
+1f7f:01680000:000a:0070:12:0
+SMiT
+p:HTB+,f:40
+1f80:01680000:000a:0070:12:0
+SMiT+
+p:HTB+,f:40
+0884:01680000:0015:0070:12:0
+TEST2180
+p:HTB+,f:40
+028c:01680000:0015:0070:12:0
+SPro16
+p:HTB+,f:40
+028d:0168affb:0008:0070:12:0
+SPro16
+p:HTB+,f:40
+028d:0168affc:0008:0070:12:0
+SPro16
+p:HTB+,f:40
+0296:01680000:000b:0070:12:0
+SPro16
+p:HTB+,f:40
+0297:01680000:000d:0070:12:0
+SPro16
+p:HTB+,f:40
+0709:01680000:0012:0070:22:0
+Первый канал +2
+p:HTB+,C:0500
+070a:01680000:0012:0070:22:0
+HTB +2
+p:HTB+,C:0500
+070b:01680000:0012:0070:22:0
+ТВЦ +2
+p:HTB+,C:0500
+070c:01680000:0012:0070:22:0
+ТНТ +2
+p:HTB+,C:0500
+070f:01680000:0012:0070:22:0
+ТРО
+p:HTB+,C:0500
+0710:01680000:0012:0070:22:0
+History
+p:HTB+,C:0500
+0711:01680000:0012:0070:22:0
+MCM Top
+p:HTB+,C:0500
+0712:01680000:0012:0070:22:0
+Астрахань 24
+p:HTB+,C:0500
+0713:01680000:0012:0070:22:0
+Outdoor Channel
+p:HTB+,C:0500
+0714:01680000:0012:0070:22:0
+RU.TV
+p:HTB+,C:0500
+0515:01680000:000d:0070:22:0
+МАТЧ! АРЕНА
+p:HTB+,C:0500,f:40
+0715:01680000:0012:0070:22:0
+Travel Channel
+p:HTB+,C:0500
+0516:01680000:000d:0070:22:0
+МАТЧ! БОЕЦ
+p:HTB+,C:0500,f:40
+0716:01680000:0012:0070:22:0
+RTД (русск.)
+p:HTB+,C:0500
+0517:01680000:000d:0070:22:0
+МАТЧ! ИГРА
+p:HTB+,C:0500,f:40
+0518:01680000:000d:0070:22:0
+МАТЧ! НАШ СПОРТ
+p:HTB+,C:0500,f:40
+0718:01680000:0012:0070:22:0
+RTG TV
+p:HTB+,C:0500
+0519:01680000:000d:0070:22:0
+МАТЧ! ФУТБОЛ 1
+p:HTB+,C:0500,f:40
+051a:01680000:000d:0070:22:0
+МАТЧ! ФУТБОЛ 2
+p:HTB+,C:0500,f:40
+071a:01680000:0012:0070:22:0
+BRIDGE TV DANCE
+p:HTB+,C:0500
+051b:01680000:000d:0070:22:0
+МАТЧ! ФУТБОЛ 3
+p:HTB+,C:0500,f:40
+051c:01680000:000d:0070:22:0
+ОТР
+p:HTB+,C:0500,f:40
+071c:01680000:0012:0070:22:0
+THT4
+p:HTB+,C:0500
+051d:01680000:000d:0070:22:0
+ИНФОКАНАЛ НТВ-ПЛЮС
+p:HTB+,C:0500
+071d:01680000:0012:0070:22:0
+Ani
+p:HTB+,C:0500
+051e:01680000:000d:0070:22:0
+Доктор
+p:HTB+,C:0500
+071e:01680000:0012:0070:22:0
+История
+p:HTB+,C:0500
+051f:01680000:000d:0070:22:0
+Звезда
+p:HTB+,C:0500
+071f:01680000:0012:0070:22:0
+МИР 24
+p:HTB+,C:0500
+0520:01680000:000d:0070:22:0
+Канал Disney
+p:HTB+,c:0000d4,c:010138,c:0300d4,c:050001,C:0500
+0720:01680000:0012:0070:22:0
+Царьград
+p:HTB+,C:0500
+0321:0168affb:0008:0070:22:0
+Animal Planet
+p:HTB+,C:0500
+0321:0168affc:0008:0070:22:0
+Animal Planet
+p:HTB+,C:0500
+0521:01680000:000d:0070:22:0
+МУЗ
+p:HTB+,C:0500,f:40
+0721:01680000:0012:0070:22:0
+Санкт-Петербург
+p:HTB+,C:0500
+0322:0168affb:0008:0070:22:0
+Cartoon Network
+p:HTB+,C:0500,f:40
+0322:0168affc:0008:0070:22:0
+Cartoon Network
+p:HTB+,C:0500
+0522:01680000:000d:0070:22:0
+НАШ ФУТБОЛ
+p:HTB+,C:0500,f:40
+0323:0168affb:0008:0070:22:0
+Discovery Channel
+p:HTB+,C:0500
+0323:0168affc:0008:0070:22:0
+Discovery Channel
+p:HTB+,C:0500
+0523:01680000:000d:0070:22:0
+НТВ
+p:HTB+,C:0500
+0324:0168affb:0008:0070:22:0
+НСТ
+p:HTB+,C:0500
+0324:0168affc:0008:0070:22:0
+НСТ
+p:HTB+,C:0500
+0524:01680000:000d:0070:22:0
+Телеканал 360
+p:HTB+,C:0500
+0325:0168affb:0008:0070:22:0
+DTX
+p:HTB+,C:0500
+0325:0168affc:0008:0070:22:0
+DTX
+p:HTB+,C:0500
+0525:01680000:000d:0070:22:0
+РБК-ТВ
+p:HTB+,C:0500
+0326:0168affb:0008:0070:22:0
+Fox Life
+p:HTB+,C:0500,f:40
+0326:0168affc:0008:0070:22:0
+Fox Life
+p:HTB+,C:0500
+0526:01680000:000d:0070:22:0
+Телеканал КХЛ
+p:HTB+,C:0500
+0327:0168affb:0008:0070:22:0
+ID Xtra
+p:HTB+,C:0500,f:40
+0327:0168affc:0008:0070:22:0
+ID Xtra
+p:HTB+,C:0500
+0527:01680000:000d:0070:22:0
+ТНТ
+p:HTB+,C:0500
+0328:0168affb:0008:0070:22:0
+O!
+p:HTB+,C:0500,f:40
+0328:0168affc:0008:0070:22:0
+O!
+p:HTB+,C:0500,f:40
+0528:01680000:000d:0070:22:0
+Ю-ТВ
+p:HTB+,C:0500
+0329:0168affb:0008:0070:22:0
+MTV
+p:HTB+,C:0500
+0329:0168affc:0008:0070:22:0
+MTV
+p:HTB+,C:0500,f:40
+032a:0168affb:0008:0070:22:0
+MTV Dance
+p:HTB+,C:0500
+032a:0168affc:0008:0070:22:0
+MTV Dance
+p:HTB+,C:0500
+052a:01680000:000d:0070:22:0
+World Fashion
+p:HTB+,C:0500,f:40
+032b:0168affb:0008:0070:22:0
+MTV Hits
+p:HTB+,C:0500
+032b:0168affc:0008:0070:22:0
+MTV Hits
+p:HTB+,C:0500
+052b:01680000:000d:0070:22:0
+Shop&Show
+p:HTB+,C:0500,f:40
+032c:0168affb:0008:0070:22:0
+MTV Rocks
+p:HTB+,C:0500
+032c:0168affc:0008:0070:22:0
+MTV Rocks
+p:HTB+,C:0500
+052c:01680000:000d:0070:22:0
+THT MUSIC
+p:HTB+,C:0500
+032d:0168affb:0008:0070:22:0
+National Geographic
+p:HTB+,C:0500,f:40
+032d:0168affc:0008:0070:22:0
+National Geographic
+p:HTB+,C:0500
+032e:0168affb:0008:0070:22:0
+Nick Jr.
+p:HTB+,C:0500,f:40
+032e:0168affc:0008:0070:22:0
+Nick Jr.
+p:HTB+,C:0500
+032f:0168affb:0008:0070:22:0
+TLC
+p:HTB+,C:0500,f:40
+032f:0168affc:0008:0070:22:0
+TLC
+p:HTB+,C:0500,f:40
+0330:0168affb:0008:0070:22:0
+VH1 Classic
+p:HTB+,C:0500,f:40
+0330:0168affc:0008:0070:22:0
+VH1 Classic
+p:HTB+,C:0500,f:40
+0331:0168affb:0008:0070:22:0
+VH1 European
+p:HTB+,C:0500
+0331:0168affc:0008:0070:22:0
+VH1 European
+p:HTB+,C:0500
+0332:0168affb:0008:0070:22:0
+БОБЁР
+p:HTB+,C:0500
+0332:0168affc:0008:0070:22:0
+БОБЁР
+p:HTB+,C:0500
+0333:0168affb:0008:0070:22:0
+Время: далекое и близкое
+p:HTB+,C:0500
+0333:0168affc:0008:0070:22:0
+Время: далекое и близкое
+p:HTB+,C:0500
+0334:0168affb:0008:0070:22:0
+Дом Кино
+p:HTB+,C:0500
+0334:0168affc:0008:0070:22:0
+Дом Кино
+p:HTB+,c:0000dc,c:010140,c:0300dc,c:050001,C:0500
+0335:0168affb:0008:0070:22:0
+Boomerang
+p:HTB+,C:0500
+0335:0168affc:0008:0070:22:0
+Boomerang
+p:HTB+,C:0500,f:40
+0835:01680000:0015:0070:22:0
+2X2
+p:HTB+,C:0500
+0336:0168affb:0008:0070:22:0
+Карусель
+p:HTB+,c:0000de,c:010142,c:02020a,c:0300de,c:050001,C:0500
+0336:0168affc:0008:0070:22:0
+Карусель
+p:HTB+,C:0500
+0836:01680000:0015:0070:22:0
+A1
+p:HTB+,C:0500
+0337:0168affb:0008:0070:22:0
+Музыка Первого
+p:HTB+,C:0500,f:40
+0337:0168affc:0008:0070:22:0
+Музыка Первого
+p:HTB+,C:0500,f:40
+0837:01680000:0015:0070:22:0
+AMEDIA HIT
+p:HTB+,C:0500
+0338:0168affb:0008:0070:22:0
+ТЕЛЕКАФЕ
+p:HTB+,C:0500,f:40
+0338:0168affc:0008:0070:22:0
+ТЕЛЕКАФЕ
+p:HTB+,C:0500,f:40
+0838:01680000:0015:0070:22:0
+Amedia Premium
+p:HTB+,C:0500
+083a:01680000:0015:0070:22:0
+CBS Reality
+p:HTB+,C:0500
+083b:01680000:0015:0070:22:0
+ЕвроКино
+p:HTB+,C:0500
+083c:01680000:0015:0070:22:0
+Теленовелла
+p:HTB+,C:0500
+083d:01680000:0015:0070:22:0
+НАШЕ ТВ
+p:HTB+,C:0500
+083e:01680000:0015:0070:22:0
+Bollywood
+p:HTB+,C:0500
+083f:01680000:0015:0070:22:0
+Русский Иллюзион
+p:HTB+,C:0500
+0840:01680000:0015:0070:22:0
+AMC
+p:HTB+,C:0500
+0841:01680000:0015:0070:22:0
+ТВЦ
+p:HTB+,c:0000d5,c:010139,c:020201,c:0300d5,c:050001,C:0500
+0842:01680000:0015:0070:22:0
+Москва 24
+p:HTB+,C:0500,f:40
+0843:01680000:0015:0070:22:0
+Совершенно секретно
+p:HTB+,C:0500
+0844:01680000:0015:0070:22:0
+TВ-21М
+p:HTB+,C:0500
+0845:01680000:0015:0070:22:0
+A2
+p:HTB+,c:0000d9,c:01013d,c:020205,c:0300d9,c:050001,C:0500
+0846:01680000:0015:0070:22:0
+BRIDGE TV
+p:HTB+,C:0500
+0847:01680000:0015:0070:22:0
+BRIDGE TV Русский Хит
+p:HTB+,C:0500
+0848:01680000:0015:0070:22:0
+Playboy TV
+p:HTB+,C:0500,f:40
+0849:01680000:0015:0070:22:0
+TiJi
+p:HTB+,C:0500,f:40
+084a:01680000:0015:0070:22:0
+Gulli Girl
+p:HTB+,C:0500
+054b:01680000:000d:0070:22:0
+ПП Тест2
+p:HTB+,C:0500,f:40
+084b:01680000:0015:0070:22:0
+BBC World News
+p:HTB+,C:0500
+084c:01680000:0015:0070:22:0
+Первый МЕТЕО
+p:HTB+,C:0500
+044d:01680000:000b:0070:22:0
+Первый канал
+p:HTB+,C:0500
+084d:01680000:0015:0070:22:0
+КРИК-Тв
+p:HTB+,C:0500,f:40
+044e:01680000:000b:0070:22:0
+Домашний
+p:HTB+,C:0500
+084e:01680000:0015:0070:22:0
+Russian extreme TV
+p:HTB+,C:0500
+044f:01680000:000b:0070:22:0
+Кубань 24 ОРБИТА
+p:HTB+
+084f:01680000:0015:0070:22:0
+ПРОСВЕЩЕНИЕ
+p:HTB+,C:0500
+0450:01680000:000b:0070:22:0
+ТВ Губерния
+p:HTB+,C:0500
+0451:01680000:000b:0070:22:0
+СТС
+p:HTB+,c:0000cd,c:010131,c:0300cd,c:050001,C:0500
+0452:01680000:000b:0070:22:0
+CTC Love
+p:HTB+,C:0500
+0453:01680000:000b:0070:22:0
+ТДК
+p:HTB+,C:0500
+0454:01680000:000b:0070:22:0
+ТНВ-Планета
+p:HTB+,C:0500
+0455:01680000:000b:0070:22:0
+Че
+p:HTB+,c:0000d1,c:010135,c:0300d1,c:050001,C:0500
+0555:01680000:000d:0070:22:0
+TEST VIRTUAL
+p:HTB+,C:0500,f:40
+0456:01680000:000b:0070:22:0
+Discovery Science
+p:HTB+,C:0500
+0457:01680000:000b:0070:22:0
+NHK WORLD TV
+p:HTB+,f:40
+0458:01680000:000b:0070:22:0
+Детский
+p:HTB+,c:0000d4,c:010138,c:0300d4,c:050001,C:0500
+0459:01680000:000b:0070:22:0
+Зоопарк
+p:HTB+,C:0500
+045a:01680000:000b:0070:22:0
+КИНО ТВ
+p:HTB+,C:0500
+045b:01680000:000b:0070:22:0
+Комедия
+p:HTB+,C:0500
+045c:01680000:000b:0070:22:0
+Россия 1 +2
+p:HTB+,C:0500
+0065:01680000:0001:0070:22:0
+365 дней ТВ
+p:HTB+,C:0500
+0066:01680000:0001:0070:22:0
+Авто Плюс
+p:HTB+,C:0500
+0067:01680000:0001:0070:22:0
+Европа Плюс ТВ
+p:HTB+,C:0500
+0068:01680000:0001:0070:22:0
+ИНДИЙСКОЕ КИНО
+p:HTB+,C:0500
+0069:01680000:0001:0070:22:0
+КИНОМИКС
+p:HTB+,C:0500
+006a:01680000:0001:0070:22:0
+КИНОСВИДАНИЕ
+p:HTB+,C:0500
+006b:01680000:0001:0070:22:0
+КИНОХИТ
+p:HTB+,C:0500
+006c:01680000:0001:0070:22:0
+КИНОКОМЕДИЯ
+p:HTB+,C:0500
+006d:01680000:0001:0070:22:0
+Кто есть кто
+p:HTB+,C:0500
+006e:01680000:0001:0070:22:0
+Кухня ТВ
+p:HTB+,C:0500
+006f:01680000:0001:0070:22:0
+Ля-минор ТВ
+p:HTB+,C:0500
+0071:01680000:0001:0070:22:0
+КИНОСЕРИЯ
+p:HTB+,C:0500
+0073:01680000:0001:0070:22:0
+РОДНОЕ КИНО
+p:HTB+,C:0500
+0075:01680000:0001:0070:22:0
+Ностальгия
+p:HTB+,C:0500
+0078:01680000:0001:0070:22:0
+Русская ночь
+p:HTB+,C:0500
+007a:01680000:0001:0070:22:0
+Hustler TV
+p:HTB+,C:0500
+007b:01680000:0001:0070:22:0
+ЖАРА
+p:HTB+,C:0500
+0191:01680000:0004:0070:22:0
+Detektiv.tv
+p:HTB+,C:0500
+0192:01680000:0004:0070:22:0
+PEH TB +2
+p:HTB+,C:0500
+0193:01680000:0004:0070:22:0
+Карусель +3
+p:HTB+,C:0500
+0194:01680000:0004:0070:22:0
+Fine Living
+p:HTB+,C:0500
+0195:01680000:0004:0070:22:0
+Fashion TV Network
+p:HTB+,C:0500
+0196:01680000:0004:0070:22:0
+НТВ Право
+p:HTB+,C:0500
+0198:01680000:0004:0070:22:0
+НТВ Сериал
+p:HTB+,C:0500
+0199:01680000:0004:0070:22:0
+ACB TV
+p:HTB+,C:0500
+019a:01680000:0004:0070:22:0
+Звезда +2
+p:HTB+,C:0500
+019b:01680000:0004:0070:22:0
+Архыз 24
+p:HTB+,C:0500
+019c:01680000:0004:0070:22:0
+МИР +4
+p:HTB+,C:0500
+019d:01680000:0004:0070:22:0
+Пятый канал +2
+p:HTB+,C:0500
+4a9d:01680000:0013:0070:22:0
+Телеканал Да Винчи
+p:HTB+,C:0500
+019f:01680000:0004:0070:22:0
+НТВ Стиль
+p:HTB+,C:0500
+01a0:01680000:0004:0070:22:0
+Food Network
+p:HTB+,C:0500
+4aa1:01680000:0013:0070:22:0
+Viasat Explore
+p:HTB+,C:0500
+01a2:01680000:0004:0070:22:0
+ЖИВИ!
+p:HTB+,C:0500
+4aa2:01680000:0013:0070:22:0
+Viasat History
+p:HTB+,C:0500
+01a3:01680000:0004:0070:22:0
+Сарафан
+p:HTB+,C:0500
+4aa3:01680000:0013:0070:22:0
+Viasat Nature
+p:HTB+,C:0500
+01a4:01680000:0004:0070:22:0
+Страна
+p:HTB+,C:0500
+01a5:01680000:0004:0070:22:0
+Русский бестселлер
+p:HTB+,C:0500
+4aa5:01680000:0013:0070:22:0
+Extreme Sports
+p:HTB+,C:0500
+01a6:01680000:0004:0070:22:0
+БОКС ТВ
+p:HTB+,C:0500
+01a7:01680000:0004:0070:22:0
+Game Show
+p:HTB+,C:0500
+4aa7:01680000:0013:0070:22:0
+Первый образовательный
+p:HTB+,C:0500
+01a8:01680000:0004:0070:22:0
+Русский роман
+p:HTB+,C:0500
+4aa8:01680000:0013:0070:22:0
+ДОМАШНИЕ ЖИВОТНЫЕ
+p:HTB+,C:0500
+01a9:01680000:0004:0070:22:0
+В гостях у сказки
+p:HTB+,C:0500
+4aa9:01680000:0013:0070:22:0
+ПСИХОЛОГИЯ21
+p:HTB+,C:0500
+01aa:01680000:0004:0070:22:0
+
+p:HTB+,C:0500
+01ab:01680000:0004:0070:22:0
+Duck
+p:HTB+,C:0500
+4aab:01680000:0013:0070:22:0
+FOX
+p:HTB+,C:0500
+4aac:01680000:0013:0070:22:0
+Nat Geo Wild
+p:HTB+,C:0500
+4aad:01680000:0013:0070:22:0
+АРМЕНИЯ ТВ
+p:HTB+,C:0500
+4ab0:01680000:0013:0070:22:0
+Мама
+p:HTB+,C:0500
+4ab1:01680000:0013:0070:22:0
+Paramount Channel
+p:HTB+,C:0500
+4ab6:01680000:0013:0070:22:0
+Mezzo
+p:HTB+,C:0500
+4ab7:01680000:0013:0070:22:0
+БСТ
+p:HTB+,C:0500
+4ab8:01680000:0013:0070:22:0
+Первый Вегетарианский
+p:HTB+,C:0500
+02bd:01680000:0007:0070:22:0
+8 канал
+p:HTB+
+02be:01680000:0007:0070:22:0
+ABTO24
+p:HTB+,C:0500
+02bf:01680000:0007:0070:22:0
+Детский мир/Телеклуб
+p:HTB+,C:0500
+02c0:01680000:0007:0070:22:0
+Eurosport 1
+p:HTB+,C:0500
+02c1:01680000:0007:0070:22:0
+Bloomberg Television
+p:HTB+,C:0500
+02c3:01680000:0007:0070:22:0
+FRANCE 24
+p:HTB+,C:0500
+02c4:01680000:0007:0070:22:0
+JimJam
+p:HTB+,C:0500
+02c5:01680000:0007:0070:22:0
+Nickelodeon
+p:HTB+,C:0500
+02c6:01680000:0007:0070:22:0
+SONY CHANNEL
+p:HTB+,C:0500
+02c7:01680000:0007:0070:22:0
+Sony Sci-Fi
+p:HTB+,C:0500
+02c9:01680000:0007:0070:22:0
+Travel+Adventure
+p:HTB+,C:0500
+02ca:01680000:0007:0070:22:0
+Продвижение
+p:HTB+,C:0500
+02cb:01680000:0007:0070:22:0
+Загородная жизнь
+p:HTB+,C:0500
+02cc:01680000:0007:0070:22:0
+Радость моя
+p:HTB+,C:0500
+02cd:01680000:0007:0070:22:0
+ДОН 24
+p:HTB+,C:0500
+02ce:01680000:0007:0070:22:0
+Грозный
+p:HTB+,C:0500
+02cf:01680000:0007:0070:22:0
+Мир сериала
+p:HTB+,C:0500
+02d0:01680000:0007:0070:22:0
+Брянская Губерния
+p:HTB+,C:0500
+02d1:01680000:0007:0070:22:0
+Первый Ярославский
+p:HTB+,C:0500
+02d2:01680000:0007:0070:22:0
+Любимое Кино
+p:HTB+,C:0500
+02d3:01680000:0007:0070:22:0
+TRiCK
+p:HTB+,C:0500
+02d4:01680000:0007:0070:22:0
+Шансон-ТВ
+p:HTB+,C:0500
+03e9:01680000:000a:0070:22:0
+Россия 1
+p:HTB+,C:0500
+03ea:01680000:000a:0070:22:0
+МАТЧ!
+p:HTB+,C:0500,f:40
+03eb:01680000:000a:0070:22:0
+Пятый канал
+p:HTB+,c:0000cb,c:01012f,c:0201f7,c:0300cb,c:050001,C:0500
+03ec:01680000:000a:0070:22:0
+РЕН ТВ
+p:HTB+,c:0000cc,c:010130,c:0300cc,c:050001,C:0500
+03ed:01680000:000a:0070:22:0
+Россия К
+p:HTB+,C:0500
+03ee:01680000:000a:0070:22:0
+Россия 24
+p:HTB+,c:0000ce,c:010132,c:0300ce,c:050001,C:0500
+03ef:01680000:000a:0070:22:0
+СПАС
+p:HTB+,C:0500
+03f0:01680000:000a:0070:22:0
+ТВ-3
+p:HTB+,C:0500
+03f1:01680000:000a:0070:22:0
+ПЯТНИЦА
+p:HTB+,c:0000d1,c:010135,c:0300d1,c:050001,C:0500
+03f2:01680000:000a:0070:22:0
+МИР
+p:HTB+,C:0500
+03f3:01680000:000a:0070:22:0
+Shopping Live
+p:HTB+,f:40
+03f4:01680000:000a:0070:22:0
+Shop24
+p:HTB+,C:0500,f:40
+03f5:01680000:000a:0070:22:0
+RT (арабский)
+p:HTB+,C:0500,f:40
+03f6:01680000:000a:0070:22:0
+RT (испанский)
+p:HTB+,C:0500,f:40
+2f47:01680000:000c:0070:25:0
+HD Life
+p:HTB+,C:0500
+2f49:01680000:000c:0070:25:0
+Discovery Channel HD
+p:HTB+,C:0500
+2f4a:01680000:000c:0070:25:0
+Телеканал КХЛ HD
+p:HTB+,C:0500
+057c:01680000:000e:0070:25:0
+MTV Live HD
+p:HTB+,C:0500
+057f:01680000:000e:0070:25:0
+МИР HD
+p:HTB+,C:0500
+4e85:01680000:0014:0070:25:0
+Nat Geo Wild HD
+p:HTB+,C:0500
+4e86:01680000:0014:0070:25:0
+RTG HD
+p:HTB+,C:0500
+4e87:01680000:0014:0070:25:0
+Mezzo Live HD
+p:HTB+,C:0500
+4e88:01680000:0014:0070:25:0
+MGM HD
+p:HTB+,C:0500
+4e89:01680000:0014:0070:25:0
+Первый канал HD
+p:HTB+,c:0000cd,c:010131,c:0201f9,c:0300cd,c:050001,C:0500
+4e8a:01680000:0014:0070:25:0
+Россия 1 HD
+p:HTB+,C:0500,f:40
+6592:01680000:0009:0070:25:0
+National Geographic HD
+p:HTB+,C:0500
+6593:01680000:0009:0070:25:0
+Amedia Premium HD
+p:HTB+,C:0500
+6594:01680000:0009:0070:25:0
+History HD
+p:HTB+,C:0500
+6595:01680000:0009:0070:25:0
+TLC HD
+p:HTB+,C:0500
+6596:01680000:0009:0070:25:0
+Travel Channel HD
+p:HTB+,C:0500
+0899:01680000:0016:0070:25:0
+HTB HD
+p:HTB+,c:0000c9,c:01012d,c:0300c9,c:050001,C:0500
+089a:01680000:0016:0070:25:0
+Animal Planet HD
+p:HTB+,C:0500,f:40
+089b:01680000:0016:0070:25:0
+КОННЫЙ МИР HD
+p:HTB+,C:0500
+089c:01680000:0016:0070:25:0
+МАТЧ! HD
+p:HTB+,C:0500,f:40
+089d:01680000:0016:0070:25:0
+Дом Кино Премиум HD
+p:HTB+,C:0500
+089e:01680000:0016:0070:25:0
+BRIDGE HD
+p:HTB+,C:0500
+089f:01680000:0016:0070:25:0
+THT HD
+p:HTB+,c:0000cf,c:010133,c:0300cf,c:050001,C:0500
+42cd:01680000:0011:0070:25:0
+FOX HD
+p:HTB+,C:0500
+42d1:01680000:0011:0070:25:0
+Viasat Nature/History HD
+p:HTB+,C:0500
+1f51:01680000:000a:0070:100:0
+12264V SID 0x1f51
+p:DVB-S QPSK 12264V 36.0°E,f:40
+0003:01680000:000a:0070:135:0
+EPG TECT
+p:HTB+,C:0500,f:40
+0002:01680000:000a:0070:136:0
+Имена групп каналов
+p:HTB+,C:0500,f:40
+0032:01680000:000a:0070:139:0
+010D011320
+p:HTB+,f:40
+003c:01680000:000a:0070:139:0
+010E01130F
+p:HTB+,f:40
+end
\ No newline at end of file
diff --git a/main/editor_ui.glade b/main/editor_ui.glade
index b7cb3fa7..17199eae 100644
--- a/main/editor_ui.glade
+++ b/main/editor_ui.glade
@@ -179,7 +179,6 @@
Satellites editor
True
False
- image1
False
@@ -602,6 +601,67 @@
+
False
Options
@@ -620,6 +680,7 @@
False
+ end
end
@@ -632,7 +693,7 @@
True
True
- 0
+ 2
@@ -646,20 +707,21 @@
True
True
- 1
+ 3
False
False
- 1
+ 0
True
False
+ True
True
@@ -731,6 +793,8 @@
True
True
root
+ emblem-personal
+ False
0
@@ -744,6 +808,8 @@
False
●
root
+ emblem-nowrite
+ False
password
@@ -755,7 +821,7 @@
False
True
- 1
+ 0
@@ -768,7 +834,7 @@
False
True
- 2
+ 1
@@ -846,7 +912,7 @@
False
True
- 3
+ 2
@@ -858,7 +924,58 @@
False
True
- 4
+ 3
+
+
+
+
+ True
+ False
+ True
+
+
+ True
+ False
+ Data directory:
+ 0
+
+
+ 0
+ 0
+
+
+
+
+ True
+ True
+ /data
+ gtk-open
+ False
+ Select
+
+
+
+ 0
+ 1
+
+
+
+
+ False
+ True
+ 5
+
+
+
+
+ True
+ False
+
+
+ False
+ True
+ 2
+ 6
diff --git a/main/eparser/__init__.py b/main/eparser/__init__.py
index 139597f9..e37a3f28 100644
--- a/main/eparser/__init__.py
+++ b/main/eparser/__init__.py
@@ -1,2 +1,3 @@
-
+if __name__ == "__main__":
+ pass
diff --git a/main/eparser/bouquets.py b/main/eparser/bouquets.py
index e69de29b..244a421f 100644
--- a/main/eparser/bouquets.py
+++ b/main/eparser/bouquets.py
@@ -0,0 +1,2 @@
+if __name__ == "__main__":
+ pass
diff --git a/main/eparser/lamedb.py b/main/eparser/lamedb.py
index d9bc0f2e..111eca9f 100644
--- a/main/eparser/lamedb.py
+++ b/main/eparser/lamedb.py
@@ -2,7 +2,7 @@ from collections import namedtuple
Channel = namedtuple("Channel", ["name", "service", "freq", "fec"])
-FILE_PATH = "files/lamedb"
+FILE_PATH = "files/lamedb_example"
with open(FILE_PATH) as file:
lines = file.readlines()
@@ -13,3 +13,7 @@ for l in lines:
print(lines)
+
+if __name__ == "__main__":
+ pass
+
diff --git a/main/eparser/satxml.py b/main/eparser/satxml.py
index a206dcfe..fe519c71 100644
--- a/main/eparser/satxml.py
+++ b/main/eparser/satxml.py
@@ -34,3 +34,7 @@ for elem in dom.getElementsByTagName("sat"):
for sat in satellites:
print(sat)
+
+
+if __name__ == "__main__":
+ pass
diff --git a/main/properties.py b/main/properties.py
index cced6085..5b34a0f7 100644
--- a/main/properties.py
+++ b/main/properties.py
@@ -2,12 +2,15 @@ import json
import os
from pathlib import Path
+
CONFIG_PATH = str(Path.home()) + "/.config/demon-editor/"
CONFIG_FILE = CONFIG_PATH + "config.json"
+DATA_PATH = "data/"
def get_config():
os.makedirs(os.path.dirname(CONFIG_PATH), exist_ok=True) # create dir if not exist
+ os.makedirs(os.path.dirname(DATA_PATH), exist_ok=True)
if not os.path.isfile(CONFIG_FILE) or os.stat(CONFIG_FILE).st_size == 0:
with open(CONFIG_FILE, "w") as default_config_file:
json.dump(get_default_settings(), default_config_file)
@@ -27,12 +30,9 @@ def get_default_settings():
"user": "root", "password": "root",
"services_path": "/etc/enigma2/",
"user_bouquet_path": "/etc/enigma2/",
- "satellites_xml_path": "/etc/tuxbox/"}
+ "satellites_xml_path": "/etc/tuxbox/",
+ "data_dir_path": "/data"}
if __name__ == "__main__":
- prop = get_config()
- print(prop)
- prop["host"] = "192.168.1.11"
- write_config(prop)
- print(get_config())
+ pass
diff --git a/main/ui.py b/main/ui.py
index 6929dfb5..1298c78e 100644
--- a/main/ui.py
+++ b/main/ui.py
@@ -1,11 +1,12 @@
import gi
from ftplib import FTP
-from properties import get_config, write_config
+from main.properties import get_config, write_config
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
-status_bar = None
+__status_bar = None
+__options = get_config()
def on_about_app(item):
@@ -16,40 +17,63 @@ def on_about_app(item):
dialog.destroy()
+def get_handlers():
+ return {
+ "on_close_main_window": Gtk.main_quit,
+ "on_about_app": on_about_app,
+ "on_preferences": on_preferences,
+ "on_connect": on_connect,
+ "on_data_dir_field_icon_press": on_path_open
+ }
+
+
+def on_path_open(*args):
+ builder = Gtk.Builder()
+ builder.add_from_file("editor_ui.glade")
+ dialog = builder.get_object("path_chooser_dialog")
+ response = dialog.run()
+ if response == -12: # for fix assertion 'gtk_widget_get_can_default (widget)' failed
+ args[0].set_text(dialog.get_filename())
+ dialog.destroy()
+
+
def on_preferences(item):
builder = Gtk.Builder()
builder.add_from_file("editor_ui.glade")
+ builder.connect_signals(get_handlers())
dialog = builder.get_object("settings_dialog")
- options = get_config()
host_field = builder.get_object("host_field")
- host_field.set_text(options["host"])
+ host_field.set_text(__options["host"])
port_field = builder.get_object("port_field")
- port_field.set_text(options["port"])
+ port_field.set_text(__options["port"])
login_field = builder.get_object("login_field")
- login_field.set_text(options["user"])
+ login_field.set_text(__options["user"])
password_field = builder.get_object("password_field")
- password_field.set_text(options["password"])
+ password_field.set_text(__options["password"])
services_field = builder.get_object("services_field")
- services_field.set_text(options["services_path"])
+ services_field.set_text(__options["services_path"])
user_bouquet_field = builder.get_object("user_bouquet_field")
- user_bouquet_field.set_text(options["user_bouquet_path"])
+ user_bouquet_field.set_text(__options["user_bouquet_path"])
satellites_xml_field = builder.get_object("satellites_xml_field")
- satellites_xml_field.set_text(options["satellites_xml_path"])
+ satellites_xml_field.set_text(__options["satellites_xml_path"])
+ data_dir_field = builder.get_object("data_dir_field")
+ data_dir_field.set_text(__options["data_dir_path"])
if dialog.run() == Gtk.ResponseType.OK:
- options["host"] = host_field.get_text()
- options["port"] = port_field.get_text()
- options["user"] = login_field.get_text()
- options["password"] = password_field.get_text()
- options["services_path"] = services_field.get_text()
- options["user_bouquet_path"] = user_bouquet_field.get_text()
- options["satellites_xml_path"] = satellites_xml_field.get_text()
- write_config(options)
+ __options["host"] = host_field.get_text()
+ __options["port"] = port_field.get_text()
+ __options["user"] = login_field.get_text()
+ __options["password"] = password_field.get_text()
+ __options["services_path"] = services_field.get_text()
+ __options["user_bouquet_path"] = user_bouquet_field.get_text()
+ __options["satellites_xml_path"] = satellites_xml_field.get_text()
+ __options["data_dir_path"] = data_dir_field.get_text()
+ write_config(__options)
dialog.destroy()
def on_connect(item):
- connect(get_config())
+ connect(__options)
def connect(properties):
@@ -57,27 +81,21 @@ def connect(properties):
try:
with FTP(properties["host"]) as ftp:
ftp.login(user=properties["user"], passwd=properties["password"])
- status_bar.push(1, ftp.voidcmd("NOOP"))
+ __status_bar.push(1, ftp.voidcmd("NOOP"))
ftp.cwd(properties["services_path"])
ftp.retrlines("LIST")
except Exception as e:
- status_bar.remove_all(1)
- status_bar.push(1, getattr(e, "message", repr(e))) # Or maybe so: getattr(e, 'message', str(e))
+ __status_bar.remove_all(1)
+ __status_bar.push(1, getattr(e, "message", repr(e))) # Or maybe so: getattr(e, 'message', str(e))
def init_ui():
- handlers = {
- "on_close_main_window": Gtk.main_quit,
- "on_about_app": on_about_app,
- "on_preferences": on_preferences,
- "on_connect": on_connect
- }
builder = Gtk.Builder()
builder.add_from_file("editor_ui.glade")
main_window = builder.get_object("main_window")
- global status_bar
- status_bar = builder.get_object("status_bar")
- builder.connect_signals(handlers)
+ global __status_bar
+ __status_bar = builder.get_object("status_bar")
+ builder.connect_signals(get_handlers())
main_window.show_all()