03 июля | 2024г. | 06:45:28


АвторТема: Пишем плагин сами или случайные уроки по python  (Прочитано 83301 раз)

0 Пользователей и 3 Гостей смотрят эту тему.

Оффлайн ака УчкунАвтор темы

  • Рыцарь Джедай
  • *****
  • Забанен!
  • Сообщений: 1098
  • Поблагодарили: 4787
  • Уважение: +49
Пишем плагин сами или случайные уроки по python

В чем смысл данной темы?
Ведь не настолько же я наивен, чтобы полагать, что можно вот так взять и с помощью нескольких постов на форуме, научить простого пользователя ресиверов с имиджем на энигме писать плагины.
Да, разумеется это невозможно.
Цель этого FAQ вижу в другом.
Исходя из своего опыта изучения языка программирования python, знаю, что самое неприятное в этом деле это при всей этой для начала очень нудной зубрежке, совершенное непонимание того, что как же эту чертову теорию соотнести применительно к нашим имиджам на энигме.
То есть как недавно сказал один пользователь
Цитировать
.......без практики мне python нафиг не нужен......
Что же понять его можно.

Вот и постараюсь показать как соотнести, даже еще не самое возможно углубленное изучение языка python с практикой.
И возможно затем, получив некое вдохновение вы возьметесь-таки за более углубленное изучение python.
То есть вы поняли, задача этого FAQ, сделать процесс изучения python веселее, если кто решился-таки изучать его ради того, чтобы научиться писать или хотя бы править плагины...........

Итак, начнем.
Для начала определим свою задачу.
Чтобы было наиболее наглядно, нам с вами нужно написать плагин (прямо в этой теме), в котором бы отображался весь необходимый процесс плагинописания. Сам питоновский код и все необходимые действия с имиджем.
Да и еще, чтобы такого плагина еще не было бы написано (иначе какой смысл) и чтобы он был полезен для нас.

И вот какой плагин мы напишем.
Многие из нас частенько устанавливают имиджи с нуля.
При этом мы довели этот процесс до автоматизма.
Установили имидж, быстренько накатили настройки и пользуемся.
Так вот, кому как, а мне лично каждый раз при этом приходится вручную переписывать файл settings в имидже, чтобы внести туда настройки тюнера. Много "тарелок", сложное подключение спутников к тюнеру и через дайсики протокола 2.0, а затем в конце еще и дайсик протокола 1.1.
Дримбоксэдит передает все настройки кроме настроек тюнера.
Конечно переписать вручную файл сеттингс вроде нетяжело и недолго, но почему бы не автоматизировать этот процесс? Тем более что есть пользователи, которые как огня боятся что-нибудь в имидже править вручную.

Решено, это будет плагин, который будет сохранять настройку наших тюнеров, а затем восстанавливать эти настройки во вновь установленных имиджах.

Какой плагин написать решили, теперь нам надо подготовить софт, с помощью которого собственно и будем творить.

Разумеется сперва-наперва устанавливаем у себя на компе собственно саму среду программирования python.
Как и любое свободное ПО, python скачиваем с официального сайта, то есть вот отсюда https://www.python.org/getit/.
В наших имиджах (практически во всех) установлен Python версии 2.7.
Потому именно эту версию питона нужно скачать и установить.
Как скачать с сайта и как установить думаю показывать нет необходимости, ибо если не разберетесь с этим, далее эту тему читать нет смысла.....

После установки python, если вы работаете на винде, обязательно проверьте, а добавился ли путь к python в переменную path.
Для этого открываем
Панель управления-Система
Далее во вкладке Дополнительно или Дополнительные параметры системы (смотря какая у вас винда) находим кнопочку Переменные среды и нажав на нее, видим это окошко



И в нижнем окне нажав на пункт "Path" нажимаем Изменить... и проверяем, есть ли там путь к python. Если нет, добавляем, есттественно узнав сначала, куда же установился python.
У меня например он установился в папку C:\Python27 и я вот так добавил путь к нему в переменную path, просто прописав в начало этой переменной C:\Python27\; то есть отделил этот путь от остальных записей точкой с запятой.....



Собственно в IDLE самого питона мы не будем писать плагин, так как есть более юзабельное ПО для этого.
Но для компиляции на компе-то, да и для работы в консоли винды нам питон нужен будет........

Сам плагин мы будем писать в очень продвинутом свободном (опенсурч) редакторе под названием Geany.
Последнюю версию всегда можете скачать здесь https://www.geany.org/Download/Releases

Запускаем этот самый Geany и настраиваем так, чтобы эта продвинутая прога удобно подсвечивала нам синтаксис питона.
Идем во вкладку Правка-Настройки-Редактор-Отображение и ставим настройки как показана на скрине. Здесь главное пункт - Обратить цвета подсветки синтаксиса (будет подсвечивать синтаксис питона очень удобно для чтения)








Пожалуй это вся подготовительная работа.
Далее приступим к написанию непосредственно кода.

Продолжение следует (по наличию свободного времени, сегодня или завтра)......


Кстати, думаю понятно почему тема в разделе авторские создана.
Плагин будет создан прямо здесь, на страницах форума....


 
Продолжим.
Но сначала, как водится, снова лирическое отступление.
Enigma2 на наших ресах это операционная система (ОС) на линуксе, такая же как Ubuntu, Mandriva, Slax и т.д.
Хотите продвинуться дальше, изучайте устройство этой ОС енигма2, вникайте во все исходники.
А уж где система (имидж) хранит свои настройки, а откуда из имиджа можно вытянуть какие сведения это нужно знать подавно.
Вобщем потихоньку вместе с изучением питона, изучайте и имидж......

Также надеюсь, хоть немножко "позубрили" питон, например хотя бы здесь https://younglinux.info/python.php.
Хотя бы азы, что такое строки, списки, словари и их встроенные методы, простые операторы if-else, for, выражения, кортежи и т.д........
В этой теме невозможно охватить все, будем выполнять только свою задачу, как использовать получаемые знания на имидже, и подразумевается, что питон вы уже изучаете.......

Начнем решать нашу задачу.
Вкратце повторим суть задачи.

Задание.
- написать плагин для наших имиджей на энигме2, который бы одним кликом сохранял настройки нашего тюнера, затем будучи установленным на другой "чистый" имидж, одним кликом восстановить настройки тюнера. Не ахти какой нужный плагин))), но суть - такого плагина нет и мы его напишем.

Решение
При написании плагина, как и при решении любых задач в программировании, решение начинается с разработки самого алгоритма решения задачи.
Алгоритм - это проще говоря, последовательность шагов, при точном выполнении которых, задача окажется решенной.
В нашем случае задача выглядит так:

1. Вытащить из имиджа настройки тюнера, и сохранить эти настройки в файл.
2. Сохранить плагин с этими настройками и в последующем установить плагин с этими сохраненными настройками на вновь установленный нами имидж, ну и применить эти настройки в новом имидже.

Вроде бы все просто. Вот теперь оба этих пункта по очереди детально будем осуществлять.
Пункт первый, так как же вытащить из имиджа настройки тюнера?
Вот мы и начали работать непосредственно с имиджем.
В результате изучения энигмы2 узнаем, что настройки тюнера (тюнеров) имидж хранит (и использует оттуда) в файле
/etc/enigma2/settings

Далее вступают в дело наши (пусть даже пока скудные) знания в питоне.
Теперь разработаем непосредственно алгоритм по пункту номер один.

а) открыть файл /etc/enigma2/settings для чтения
б) прочитать файл построчно
в) закрыть файл
г) выделить строки с настройкой тюнера (тюнеров)
д) открыть другой файл (вернее создать) с правами на запись и записать туда эти строки с настройками тюнера
е) закрыть файл

Как видите все очень просто и код будет простой.
Открываем Geany, идем во вкладку Файл-Создать из шаблона, выбираем main.py.
Откроется это окно.






Далее идем во вкладку Документ-Установить окончания строк, выбираем "Заменить окончания строк на LF (Unix)".
Далее из окна удаляем готовый код и начнем.
По порядку

а) открыть файл /etc/enigma2/settings для чтения.
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.Результат открывания файла присвоили переменной a (просто произвольная буква).

Далее прочитываем файл
б) прочитать файл построчно
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.Опять присваиваем переменной b (снова любой произвольный знак).
Здесь нужны разъяснения.
Как питон читает текстовый файл, состоящий из строк?
Он читает его как одну единую строку, заменяя переходы на следующую строку на знак обратного слеша с латинской буквой n, то есть \n.

Спойлер   :
Хотя правда здесь я намеренно (чтобы вы постигли сути) путаю понятия на самом деле.
Ну то есть, не питон так читает, а на самом деле такова структура самого текстового файла.

Можем это легко проверить.
Открываем файл /etc/enigma2/settings и смотрим. У меня он выглядит так:

Спойлер   :
config.av.scaler_sharpness=17
config.av.policy_169=scale
config.av.videorate.1080i=multi
config.av.policy_43=scale
config.av.videoport=DVI
config.av.videomode.DVI=1080i
config.misc.rcused=0
config.misc.firstrun=false
config.misc.initialchannelselection=false
config.misc.startCounter=247
config.misc.languageselected=false
config.misc.epgcache_filename=/media/usb/epg.dat
config.misc.lastrotorposition=850
config.misc.videowizardenabled=false
config.usage.movielist_trashcan_reserve=40
config.usage.allowed_timeshift_paths=['/media/hdd/']
config.usage.show_event_progress_in_servicelist=barleft
config.usage.hide_zap_errors=true
config.usage.servicetype_icon_mode=1
config.usage.service_icon_enable=true
config.usage.multiepg_ask_bouquet=true
config.usage.alternative_number_mode=true
config.usage.movielist_trashcan_days=8
config.usage.hide_number_markers=true
config.usage.quickzap_bouquet_change=true
config.usage.hide_ci_messages=true
config.usage.show_second_infobar=6
config.usage.screen_saver=5
config.radio.lastroot=1:7:1:0:0:0:0:0:0:0:FROM BOUQUET "bouquets.radio" ORDER BY bouquet;1:7:2:0:0:0:0:0:0:0:FROM BOUQUET "userbouquet.favourites.radio" ORDER BY bouquet;
config.radio.lastservice=1:0:2:1D:2:1:3848FF4:0:0:0:
config.plugins.smoothhide.eff=3
config.plugins.ExtraChannelSelection.colselremain=20
config.plugins.ExtraChannelSelection.text=true
config.plugins.ExtraChannelSelection.picomode=1
config.plugins.ExtraChannelSelection.fontperc=2
config.plugins.ExtraChannelSelection.picbar=4
config.plugins.ExtraChannelSelection.colnamesel=34
config.plugins.ExtraChannelSelection.colpercsel=35
config.plugins.ExtraChannelSelection.colbordersel=31
config.plugins.ExtraChannelSelection.fontnum=7
config.plugins.ExtraChannelSelection.fontsat=6
config.plugins.ExtraChannelSelection.okmode=true
config.plugins.ExtraChannelSelection.colselnum=25
config.plugins.ExtraChannelSelection.colevent=1
config.plugins.ExtraChannelSelection.barpercmode=true
config.plugins.ExtraChannelSelection.colborder=34
config.plugins.ExtraChannelSelection.colormode=false
config.plugins.ExtraChannelSelection.colremain=17
config.plugins.ExtraChannelSelection.colname=25
config.plugins.ExtraChannelSelection.percmode=3
config.plugins.ExtraChannelSelection.barmode=2
config.plugins.ExtraChannelSelection.fontrem=5
config.plugins.ExtraChannelSelection.epgext=true
config.plugins.ExtraChannelSelection.fonttxt=5
config.plugins.ExtraChannelSelection.listmode=true
config.plugins.ExtraChannelSelection.doubmode=true
config.plugins.ExtraChannelSelection.colperc=6
config.plugins.ExtraChannelSelection.colnum=9
config.plugins.ExtraChannelSelection.fontend=7
config.plugins.ExtraChannelSelection.coltext=4
config.plugins.ExtraChannelSelection.coleventsel=24
config.plugins.ExtraChannelSelection.colend=4
config.plugins.ExtraChannelSelection.colselend=6
config.plugins.brightnesssetup.brightnessstandby=0
config.plugins.EncryptedChannel.enabled=true
config.plugins.epanel.time=4
config.plugins.epanel.TransponderTime=1
config.plugins.epanel.onoff=1
config.plugins.epgd.checkepgfile=true
config.plugins.epgd.weekday=0
config.plugins.xModem.mainmenu=true
config.plugins.QuickSignal.enabled=false
config.plugins.QuickButton.backupdirs=['/etc/']
config.plugins.QuickButton.okexitstate=true
config.plugins.NumberZapExt.acount=true
config.plugins.NumberZapExt.enable=true
config.plugins.NumberZapExt.picons=true
config.plugins.configurationbackup.backupdirs=['/etc/default_gw', '/etc/enigma2/', '/etc/hostname', '/etc/network/interfaces', '/etc/resolv.conf', '/etc/wpa_supplicant.ath0.conf', '/etc/wpa_supplicant.conf', '/etc/wpa_supplicant.wlan0.conf']
config.timezone.val=(GMT+05:00) Islamabad, Karachi, Tashkent
config.Nims.1.configMode=advanced
config.Nims.1.advanced.sats=558
config.Nims.1.advanced.sat.558.lnb=1
config.Nims.1.advanced.lnb.1.threshold=10750
config.Nims.1.advanced.lnb.1.lofh=10750
config.Nims.1.advanced.lnb.1.lof=user_defined
config.Nims.1.advanced.lnb.1.lofl=10750
config.Nims.1.powerMeasurement=false
config.Nims.0.configMode=advanced
config.Nims.0.advanced.sats=560
config.Nims.0.advanced.sat.130.lnb=3
config.Nims.0.advanced.sat.600.lnb=13
config.Nims.0.advanced.sat.850.lnb=7
config.Nims.0.advanced.sat.48.lnb=14
config.Nims.0.advanced.sat.915.lnb=9
config.Nims.0.advanced.sat.420.lnb=12
config.Nims.0.advanced.sat.750.lnb=5
config.Nims.0.advanced.sat.560.tonemode=on
config.Nims.0.advanced.sat.560.lnb=18
config.Nims.0.advanced.sat.90.lnb=2
config.Nims.0.advanced.sat.965.lnb=11
config.Nims.0.advanced.sat.900.lnb=8
config.Nims.0.advanced.sat.935.lnb=10
config.Nims.0.advanced.sat.530.lnb=1
config.Nims.0.advanced.sat.800.lnb=6
config.Nims.0.advanced.lnb.11.diseqcMode=1_1
config.Nims.0.advanced.lnb.11.uncommittedDiseqcCommand=1
config.Nims.0.advanced.lnb.11.fastDiseqc=true
config.Nims.0.advanced.lnb.11.commandOrder=cut
config.Nims.0.advanced.lnb.11.sequenceRepeat=true
config.Nims.0.advanced.lnb.11.commitedDiseqcCommand=BB
config.Nims.0.advanced.lnb.10.diseqcMode=1_1
config.Nims.0.advanced.lnb.10.uncommittedDiseqcCommand=4
config.Nims.0.advanced.lnb.10.fastDiseqc=true
config.Nims.0.advanced.lnb.10.commandOrder=cut
config.Nims.0.advanced.lnb.10.sequenceRepeat=true
config.Nims.0.advanced.lnb.10.commitedDiseqcCommand=AA
config.Nims.0.advanced.lnb.13.diseqcMode=1_1
config.Nims.0.advanced.lnb.13.uncommittedDiseqcCommand=2
config.Nims.0.advanced.lnb.13.fastDiseqc=true
config.Nims.0.advanced.lnb.13.commandOrder=cut
config.Nims.0.advanced.lnb.13.sequenceRepeat=true
config.Nims.0.advanced.lnb.13.commitedDiseqcCommand=AA
config.Nims.0.advanced.lnb.12.diseqcMode=1_1
config.Nims.0.advanced.lnb.12.uncommittedDiseqcCommand=2
config.Nims.0.advanced.lnb.12.fastDiseqc=true
config.Nims.0.advanced.lnb.12.commandOrder=cut
config.Nims.0.advanced.lnb.12.sequenceRepeat=true
config.Nims.0.advanced.lnb.12.commitedDiseqcCommand=BA
config.Nims.0.advanced.lnb.14.diseqcMode=1_1
config.Nims.0.advanced.lnb.14.uncommittedDiseqcCommand=1
config.Nims.0.advanced.lnb.14.commitedDiseqcCommand=BA
config.Nims.0.advanced.lnb.14.sequenceRepeat=true
config.Nims.0.advanced.lnb.14.fastDiseqc=true
config.Nims.0.advanced.lnb.14.commandOrder=cut
config.Nims.0.advanced.lnb.18.lof=user_defined
config.Nims.0.advanced.lnb.18.diseqcMode=1_1
config.Nims.0.advanced.lnb.18.uncommittedDiseqcCommand=6
config.Nims.0.advanced.lnb.18.commandOrder=cut
config.Nims.0.advanced.lnb.18.threshold=10750
config.Nims.0.advanced.lnb.18.lofh=10750
config.Nims.0.advanced.lnb.18.lofl=10750
config.Nims.0.advanced.lnb.18.fastDiseqc=true
config.Nims.0.advanced.lnb.1.diseqcMode=1_1
config.Nims.0.advanced.lnb.1.uncommittedDiseqcCommand=2
config.Nims.0.advanced.lnb.1.fastDiseqc=true
config.Nims.0.advanced.lnb.1.commandOrder=cut
config.Nims.0.advanced.lnb.1.sequenceRepeat=true
config.Nims.0.advanced.lnb.1.commitedDiseqcCommand=BB
config.Nims.0.advanced.lnb.3.sequenceRepeat=true
config.Nims.0.advanced.lnb.3.diseqcMode=1_1
config.Nims.0.advanced.lnb.3.uncommittedDiseqcCommand=5
config.Nims.0.advanced.lnb.3.commandOrder=cut
config.Nims.0.advanced.lnb.3.fastDiseqc=true
config.Nims.0.advanced.lnb.2.sequenceRepeat=true
config.Nims.0.advanced.lnb.2.diseqcMode=1_1
config.Nims.0.advanced.lnb.2.uncommittedDiseqcCommand=3
config.Nims.0.advanced.lnb.2.commandOrder=cut
config.Nims.0.advanced.lnb.2.fastDiseqc=true
config.Nims.0.advanced.lnb.5.diseqcMode=1_1
config.Nims.0.advanced.lnb.5.uncommittedDiseqcCommand=1
config.Nims.0.advanced.lnb.5.fastDiseqc=true
config.Nims.0.advanced.lnb.5.commandOrder=cut
config.Nims.0.advanced.lnb.5.sequenceRepeat=true
config.Nims.0.advanced.lnb.5.commitedDiseqcCommand=AA
config.Nims.0.advanced.lnb.5.powerMeasurement=false
config.Nims.0.advanced.lnb.7.diseqcMode=1_1
config.Nims.0.advanced.lnb.7.uncommittedDiseqcCommand=4
config.Nims.0.advanced.lnb.7.fastDiseqc=true
config.Nims.0.advanced.lnb.7.commandOrder=cut
config.Nims.0.advanced.lnb.7.sequenceRepeat=true
config.Nims.0.advanced.lnb.7.commitedDiseqcCommand=BA
config.Nims.0.advanced.lnb.6.diseqcMode=1_1
config.Nims.0.advanced.lnb.6.uncommittedDiseqcCommand=1
config.Nims.0.advanced.lnb.6.lof=c_band
config.Nims.0.advanced.lnb.6.fastDiseqc=true
config.Nims.0.advanced.lnb.6.sequenceRepeat=true
config.Nims.0.advanced.lnb.6.commitedDiseqcCommand=AB
config.Nims.0.advanced.lnb.6.commandOrder=cut
config.Nims.0.advanced.lnb.9.diseqcMode=1_1
config.Nims.0.advanced.lnb.9.uncommittedDiseqcCommand=4
config.Nims.0.advanced.lnb.9.fastDiseqc=true
config.Nims.0.advanced.lnb.9.commandOrder=cut
config.Nims.0.advanced.lnb.9.sequenceRepeat=true
config.Nims.0.advanced.lnb.9.commitedDiseqcCommand=BB
config.Nims.0.advanced.lnb.8.diseqcMode=1_1
config.Nims.0.advanced.lnb.8.uncommittedDiseqcCommand=1
config.Nims.0.advanced.lnb.8.lof=c_band
config.Nims.0.advanced.lnb.8.fastDiseqc=true
config.Nims.0.advanced.lnb.8.sequenceRepeat=true
config.Nims.0.advanced.lnb.8.commitedDiseqcCommand=BB
config.Nims.0.advanced.lnb.8.commandOrder=cut
config.seek.selfdefined_46=60
config.seek.selfdefined_13=15
config.seek.selfdefined_79=300
config.osd.language=ru_RU
config.tv.lastroot=1:7:1:0:0:0:0:0:0:0:FROM BOUQUET "bouquets.tv" ORDER BY bouquet;1:7:1:0:0:0:0:0:0:0:FROM BOUQUET "userbouquet.dbe00.tv" ORDER BY bouquet;
config.tv.lastservice=1:0:1:25D:C:1:3522F80:0:0:0:
config.pep.mosquito_noise_reduction=3
config.pep.digital_contour_removal=2
config.pep.saturation=160
config.pep.sharpness=151
config.pep.block_noise_reduction=3
config.recording.margin_before=3
config.recording.keep_timers=7
config.recording.margin_after=5
config.recording.offline_decode_delay=1000
config.skin.primary_skin=classplus_hd/skin.xml
config.epg.mhw=true
config.epg.histminutes=45
config.hdmicec.fixed_physical_address=1.0.0.0
config.hdmicec.minimum_send_interval=100
config.hdmicec.control_receiver_standby=true
config.hdmicec.control_receiver_wakeup=true
config.hdmicec.tv_wakeup_detection=wakeup
config.hdmicec.volume_forwarding=true
config.audio.volume=60
config.movielist.videodirs=['/hdd/movie/']
config.movielist.btn_text=sort

А теперь вводя предыдущий код, читаем этот файл через python (заодно научимся работать непосредственно в питоне).
Для этого открываем любую телнетовскую прогу.
Например телнет в програмке DCC и логинимся в имидже:



И запускаем питон, предустановленный в имидже, просто написав команду python



И вводим тот самый код по очереди
a = open("/etc/enigma2/settings", "r")
b = a.read()

а затем попросим питон вывести на экран значение переменной b (то есть просто пишем b и нажимаем Enter)

Ввели? Убедились?

Далее обязательно закрываем файл, который открывали ранее для чтения (никогда не забывайте сделать это)
в) закрыть файл
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
А вот следующий пункт выделить строки с настройкой тюнера (тюнеров) выполнить не так просто ввиду именно того, что результат чтения это только одна единая строка.
Это один из нюансов работы со строками. Конечно существует много способов обойти эту проблему. Рассмотрим один из них.
Для этого воспользуемся встроенным методом строк split, который создает список из строк, разделив именно на этих знаках \n (удалив эти знаки), снова присвоив результат какой-то переменной
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
В результате получим список, состоящий из строк (из тех самых строк файла settings).
И желательно этот код продолжаем вводить в телнете (где запустили питон в имидже).
Это нужно еще, чтобы убедиться что какую-нибудь синтаксическую ошибку не допускаем.
Я всегда так делаю, пишу код и тут же ввожу в питоне.....
Можете также "приказать питону" вывести результат c и получите примерно такой результат
Спойлер   :
>>>с = b.split('\n')
>>>c
['config.Nims.0.advanced.lnb.6.commandOrder=cut', 'config.Nims.0.advanced.
nb.9.diseqcMode=1_1', 'config.Nims.0.advanced.lnb.9.uncommittedDiseqcCommand=4'
 'config.Nims.0.advanced.lnb.9.fastDiseqc=true', 'config.Nims.0.advanced.lnb.9.
ommandOrder=cut', 'config.Nims.0.advanced.lnb.9.sequenceRepeat=true', 'config.N
ms.0.advanced.lnb.9.commitedDiseqcCommand=BB', 'config.Nims.0.advanced.lnb.8.di
eqcMode=1_1', 'config.Nims.0.advanced.lnb.8.uncommittedDiseqcCommand=1', 'confi
.Nims.0.advanced.lnb.8.lof=c_band', 'config.Nims.0.advanced.lnb.8.fastDiseqc=tr
e', 'config.Nims.0.advanced.lnb.8.sequenceRepeat=true', 'config.Nims.0.advanced
lnb.8.commitedDiseqcCommand=BB', 'config.Nims.0.advanced.lnb.8.commandOrder=cut
, 'config.seek.selfdefined_46=60', 'config.seek.selfdefined_13=15', 'config.see
.selfdefined_79=300', 'config.osd.language=ru_RU', 'config.tv.lastroot=1:7:1:0:
:0:0:0:0:0:FROM BOUQUET "bouquets.tv" ORDER BY bouquet;1:7:1:0:0:0:0:0:0:0:FROM
BOUQUET "userbouquet.dbe00.tv" ORDER BY bouquet;', 'config.tv.lastservice=1:0:1
25D:C:1:3522F80:0:0:0:', 'config.pep.mosquito_noise_reduction=3', 'config.pep.d
gital_contour_removal=2', 'config.pep.saturation=160', 'config.pep.sharpness=15
', 'config.pep.block_noise_reduction=3', 'config.recording.margin_before=3', 'c
nfig.recording.keep_timers=7', 'config.recording.margin_after=5', 'config.recor
ing.offline_decode_delay=1000', 'config.skin.primary_skin=classplus_hd/skin.xml
, 'config.epg.mhw=true', 'config.epg.histminutes=45', 'config.hdmicec.fixed_phy
ical_address=1.0.0.0', 'config.hdmicec.minimum_send_interval=100', 'config.hdmi
ec.control_receiver_standby=true', 'config.hdmicec.control_receiver_wakeup=true
, 'config.hdmicec.tv_wakeup_detection=wakeup', 'config.hdmicec.volume_forwardin
=true', 'config.audio.volume=60', "config.movielist.videodirs=['/hdd/movie/']",
'config.movielist.btn_text=sort', '']

Вот теперь можем из этого списка выдергивать члены-строки, которые относятся к настройкам тюнера (тюнеров).
Для этого воспользуемся другим встроенным методом строк __contains__, который выделяет строки по содержанию, проверяя наличие текста в строке, который передан этому методу в качестве аргумента.
А в файле сеттингс, как мы можем легко выяснить, абсолютно все строки с настройками тюнеров содержат "слово" Nims.
То есть в этом случае мы включаем логику. И вообще, учтите в программировании без логики очень-очень трудно.
С логикой надо очень сильно дружит.........
Значит чтобы "выделить" настройки тюнеров, мы сначала создаем пустой список, а потом добавляем туда все строчки-члены предыдущего списка, которые содержат "слово" Nims. Применив оператор for для этого.

г) выделить строки с настройкой тюнера (тюнеров)

d = []
for x in c:
   if x.__contains__('Nims'):
      d.append(x)

Использовали еще один встроенный метод (но уже списка теперь) append.
Все это простые операторы и простые методы строк и списков.
Предыдущий код звучит так:
"Каждый элемент х из списка с, если он содержит подстроку Nims, добавить в новый список d".
В итоге мы получили список из строк с настройками тюнера (тюнеров).
Но список мы не можем записать в файл как строки. Соответственно теперь проведем обратную операцию, воспользовавшись другим встроенным методом join. Этот метод прямая противоположность методу split, склеивает строки из списка, вот так:

Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
Так как питон требует в конце файла пустую строку, логика нам подсказывает, что к полученному нам бы нужно добавить символ переноса строки, то есть (включите логику и поймете, что я прав):

Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
Давайте взглянем в окно Geany и проверим, одно и то же ли мы с вами пишем. Чем хорош Geany, вам стоит поставить двоеточие и нажать Enter, табуляция (или пробелы, смотря как настроите) любезно будет вставлена самой прогой.



Теперь весь этот код можете ввести в окно терминала, где вы вошли в питон на имидже (по одной строке), а вконце введите f и увидите, что результатом является одна строка в памяти....

Далее создаем другой файл и записываем туда настройки тюнера.
Так как пока просто пишем код, а не плагин непосредственно, пока будем создавать файл в папке темп (чтобы проверить код) (файл скажем назовем mysettings).
То есть открываем (создаем) файл в папке темп с правами записи и записываем туда последнюю полученную строку:

Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
И закрываем файл (обязательно)

е) закрыть файл

Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
Полученный код.





И введя весь этот код в терминале имиджа с вводом в питон, убеждаемся, что да код верный, вот он файл и его содержание.








Конечно, полученный результат пока мало похоже на плагин, но дойдем и до этого......


Продолжение следует......








Добавлено  01 декабря | 2013г. | 18:17:05







 
С кодом, с помощью которого будем сохранять настройки тюнера (тюнеров) разобрались.
Теперь из этой второй части
2. Сохранить плагин с этими настройками и в последующем установить плагин с этими сохраненными настройками на вновь установленный нами имидж, ну и применить эти настройки в новом имидже.

будем разбираться с кодом, который будет восстанавливать настройки на вновь установленном имидже.

То есть оформление непосредственно самого плагина оставим напоследок. Для любой программной задачи, главное код.

С помощью значит этого кода, мы поняли, что сохраним настройки

Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
Конечно при оформлении плагина изменим путь сохранения настроек с папки темп в другую нужную папку.
Затем пользователь получается сохранить физически плагин с настройками куда нибудь на комп скажем, установит имидж, скопирует папку плагина скажем в папку /usr/lib/enigma2/python/Plugins/Extensions/, перегрузится, откроет окно плагина и выберет восстановление настроек.
Вот сейчас нужно написать код, который и будет задействован после именно этого выбора восстановления пользователем.

Алгоритм в данном случае также достаточно прост (вроде бы):
а) открыть ранее сохраненный файл на чтение
б) прочитать файл
в) закрыть файл
г) открыть файл /etc/enigma2/settings,
д) удалить из него строчки, касающиеся настроек тюнера
е) и наоборот записать туда ранее сохраненные строчки с настройками тюнера.

По пунктам будем решать задачу. Пишем код.

а) открыть ранее сохраненный файл на чтение
Пока мы сохраняли файл в папку темп, следовательно
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
Ну и прочитать файл
б) прочитать файл
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
Спойлер   :
Здесь обращаю внимания на имена переменных a или b придумывайте любые имена (я для сокращения кода называю одной буквой), лишь бы они не совпадали со встроенными или другими именами и случаем не переписывали ничего.......

в) закрыть файл
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.

А вот с пунктами г, д, е немного незадача.
То есть согласно выработанному нами алгоритму, мы должны открыть файл /etc/enigma2/settings и удалить из него определенные строчки, и наоборот записать туда другие строчки из нашего ранее сохраненного файла.
А так как мы уже знаем, что файл settings это текстовый файл состоящий из последовательности символов (переход на другую строчку тоже символ \n), то бишь это строковый файл, ее нельзя изменять. Из питона знаем строка неизменяемая последовательность.
Соответственно, исходя из этого обстоятельства мы перепишем наш последний алгоритм действий:

а) открыть ранее сохраненный файл на чтение (уже выполнили)
б) прочитать файл  (уже выполнили)
в) закрыть файл  (уже выполнили)
г) открыть файл /etc/enigma2/settings для чтения
д) удалить из него строчки, касающиеся настроек тюнера
е) и наоборот записать туда ранее сохраненные строчки с настройками тюнера.
д) прочитать файл /etc/enigma2/settings
e) закрыть файл /etc/enigma2/settings
ж) методом split создать список строк
и) удалить из этого списка те строки в которых есть подстрока Nims (списки как известно можно изменять)
к) Список с оставшимися строками с помощью метода join вновь объединить в строку
л) методом простой конкатенации соединить строки полученные из файлов  /etc/enigma2/settings и /tmp/mysettings и записать новый файл settings
м) этим новым файлом заменить файл /etc/enigma2/settings


Ого, задача как видим усложнилась (из-за неизменяемости строк в питоне), но она все же по-прежнему выполнима.
Спойлер   :
Еще раз подчеркну, чтобы придумать такой алгоритм, кроме собственно знаний питона (что строки неизменяемы, но списки-то изменяемы), нужна железная логика, только и только логика помогает придумывать правильные, точные алгоритмы....

Идем дальше по пунктам.
г) открыть файл /etc/enigma2/settings для чтения
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
д) прочитать файл /etc/enigma2/settings
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
e) закрыть файл /etc/enigma2/settings
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
е) методом split создать список строк
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
Спойлер   :
В процессе написания кода время от времени не забываем вводить это непосредственно в питон и смотреть результаты, требуя от питона вывести полученное значение той или иной переменной....

и) удалить из этого списка те строки в которых есть подстрока Nims
Решим эту задачу от обратного, то есть сохраним в этом списке только те строки, в которых нет подстроки (то бишь просто "слова")  Nims:
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
То бишь последний код означает:
Спойлер   :
"для каждой строки x в списке m, если эта строка НЕ СОДЕРЖИТ (not) подстроку Nims, добавить в новый список v

к) Список с оставшимися строками с помощью метода join вновь объединить в строку
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
Спойлер   :
Вот здесь уже не требуется добавлять в конец строки знак перехода на новую, так как этот знак уже там есть (снова об этом говорит только логика, если вы его включили)....

л) методом простой конкатенации соединить строки полученные из файлов  /etc/enigma2/settings и /tmp/mysettings и записать новый файл settings
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.Это есть простая конкатенация, то есть сложение двух строк, получаем одну объединенную строку.
Создаем в папке темп новый файл settings (с правами на запись) и пишем туда полученное:

Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
Закрываем файл (действие обязательное)
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
Вот весь код второго этапа (восстановление настроек)

Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
Или так на экране в програмке Geany:




Чтобы проверить, не ошиблись ли где, снова открываем телнет в програмке DCC, запускаем питон на нем, дав команду
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
И строчку за строчкой вводим написанный нами код.

Спойлер   :
Если вдруг не знаете, в консоль (а терминал это и есть консоль) можно вводить текст, просто скопировав, а затем в окне терминала просто нажимаем правую кнопку мыши....

Все нормально, файл сеттингс в папке темп создался (проверяйте сами)



Остается последнее, собственно применить эти настройки, то есть в нашем случае просто заменить файл settings находящийся в папке /etc/enigma2/, другим файлом settings созданным нами в папке темп.
Здесь есть вот какой нюанс.
Этот файл (/etc/enigma2/settings) является системным, в котором имидж хранить свои настройки, соответственно любые записи которые мы туда впишем, имидж при перезагрузке перепишет на свои.
Чтобы этого не произошло, нужно остановит имидж, перезаписать этот файл и вновь запустит. Тогда имидж будет думать, что сам сохранил эти настройки при предыдущем отключении и применит эти настройки.
Но так как, если мы остановим имидж, остановится естественно и плагин наш, задачу замены этого файла мы будем решат скриптом, естественно заложив в плагин запуск этого скрипта в нужный момент. Код запуска этого скрипта (в нужный момент) напишем, когда будем оформлять интерфейс плагина (код очень простой).
 А сам скрипт тоже простой, это уже обычная командная строка.......

Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
Это простые команды удаления и копирования. Можно добавить еще вывод сообщений в консоль (хотя пользователи ее не читают)....

Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
Этот скрипт положим наверно вовнутрь плагина и плагин запустит его в нужный момент.

Собственно, непосредственно с самой задачей в питоне мы справились.
Осталось оформить все это в виде плагина....

Далее будем именно это рассматривать...

Продолжение следует......



  • vu+ultimo 9995
Мои авторские работы  нельзя редактировать для выкладывания на паблик.
Но их можно выкладывать неизмененными на любых ресурсах с указанием авторства
Мои кошельки:
WMZ     Z356196865451 WMR     R105983132832

Теги:
 

Похожие темы

  Тема / Автор Ответов Последний ответ
9 Ответов
16062 Просмотров
Последний ответ 14 февраля | 2019г. | 10:01:39
от drakon71
27 Ответов
25738 Просмотров
Последний ответ 04 апреля | 2022г. | 06:06:17
от тихон
1 Ответов
9246 Просмотров
Последний ответ 20 марта | 2014г. | 00:40:50
от Taapat
0 Ответов
3469 Просмотров
Последний ответ 07 апреля | 2014г. | 00:52:47
от 2boom
4 Ответов
4844 Просмотров
Последний ответ 03 апреля | 2016г. | 16:49:33
от Corwin



X

Добро пожаловать!

Мы заметили, что у Вас установлено расширение AdBlock или ему подобное. Пожалуйста добавьте наш Клуб в белый список, внесите этим посильную лепту в его развитие. Спасибо!