Объявление

Свернуть
Пока нет объявлений.

Enigma2 IPTV Plugin своими руками, почти с нуля (python) - enigma iptv player

Свернуть
X
 
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения

  • Enigma2 IPTV Plugin своими руками, почти с нуля (python) - enigma iptv player

    хочу в этой теме в тихушку собирать инфу и научится делать плаг.
    цель- бесплатный плаг для картины и родного.
    состояние дел не ахти.
    знания пайтона минимальны
    но есть и хорошая новость- скрипт от anst, который написан на python и был использован для XBMC.

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

    с удовольствием приму советы и подсказки

    ----------------
    Dreambox IPK packages maker
    http://dream.altmaster.net/showpost....mp;postcount=2
    Вложения
    Обсуждение всех нюансов развода в Германии. www.razvod.net

  • #2
    Re: Enigma2 Plugin своими руками, почти с нуля (python)

    ну в итоге основыне функции выглядят так

    Код:
    import cookielib
    import urllib
    import urllib2
    
    userid  = "145"
    userpwd  = "541" 
    
    class ParseError(Exception):
      def __init__(self, value):
        self.value = value
      def __str__(self):
        return repr(self.value)
    
    class KTVHarvester:
      DIR = 0
      VIDEO = 1
      base_url   ="http://iptv.kartina.tv"
      
      base_headers =[
      ('Accept-Encoding','gzip, deflate'),
      ('Accept-Language','en-us'),
      ('Connection','keep-alive'),
      ('Accept','*/*'),
      ('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.7'),
      ('Keep-Alive','300'),
      ('Referer','http://iptv.kartina.tv/'),
      ('User-agent','Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1')
      ] 
      
      post_base = "act=login&code_login=%s&code_pass=%s"  
      stream_base = base_url+"/?protect_code=%s&m=channels&act=get_stream_url&cid=%s"
      list_url = base_url+"/?m=channels&act=get_list_xml"
    #  thumb_base = base_url+"/img/ico/24/%s.gif"
      thumb_base = "http://www.kartina.tv/images/icons/c...s/%s.gif"
      cj = cookielib.LWPCookieJar() 
      COOKIEFILE = 'cookies.lwp' 
    
      def __init__(self,bp):
        self.base_path = bp
        self.flash_pattern = re.compile('http://[^"]+')
        self.cache_path = os.path.join(self.base_path, "data" )
        if not os.path.exists(self.cache_path):
          os.mkdir(self.cache_path)
        opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj))
        opener.addheaders = self.base_headers
        urllib2.install_opener(opener)
        self.cfile=os.path.join(self.cache_path, self.COOKIEFILE)
        if os.path.isfile(self.cfile):
          self.cj.load(self.cfile)
        
    
    
      def set_report_hook(self, func, udata=None):
        self.report_hook = func
        self.report_udata = udata
     
      def parse_list(self, data):
        list = []
    
        tree = elementtree.ElementTree.XML(data)      
        sz=len(tree)
        i=0
        thumb_path=os.path.join(self.cache_path,"thumbs")
        for node in tree:
          # sect=node.get("title")            
          # if sect == 'Радио':
          sect=node.get("id")            
          if sect == '23':
            kind="R"
          else:
            kind="T"
          j=0
          dls=[]
          for chan in node:
              id=chan.get("id")
              title=chan.get("title") 
              section = sect
              program=chan.get("programm")
              if (program==None) :
                program=" "
              dl = threadDownloadURL(self.thumb_base %(id),thumb_path)
              thumb=dl.filepath
              dl.start()
              dls.append(dl)
              list.append((id,title,thumb,section,program,kind))
              j=j+1
          for dl in dls:
              dl.join()
          i+=1    
          self.report_hook(i,sz,self.report_udata)
        return list
    
      def download_link(self,id):
        data = self.getData(self.stream_base % (userpwd,id))
        link=re.search("http[^ ]*.",data).group(0).replace("\"","").strip()
        return link
            
      def download_list(self):
        path=os.path.join(self.cache_path, "channels.dat")
        if (os.path.isfile(path)):
          fp=open(path, 'rb')     
          list=[]
          list=pickle.load(fp)
          fp.close()
        else:
          data = self.getData(self.list_url)
          list = self.parse_list(data)
          fp=open(path,'wb')
          pickle.dump(list,fp)
          fp.close()
        return list
        
      def getData(self,url):
          req = urllib2.Request(url)
          u = urllib2.urlopen(req)      
          data = u.read() 
          if (data.find('code_login')!=-1):
            self.Authorize()
            u = urllib2.urlopen(req)      
            data = u.read()         
          self.cj.save(self.cfile)      
          return data 
    
      def Authorize(self):
          txtdata= self.post_base % (userid,userpwd)
          req = urllib2.Request(self.base_url, txtdata)
          u = urllib2.urlopen(req)
          data = u.read()    
          self.cj.save(self.cfile)
    теперь вопрос, как получить хоть чтото, ну к примеру авторизироваться и сообщить мне о том, авторизировался я или нет.

    питон установил отсюда, http://www.python.org/download/
    запускаю скрипт при помощи комманднойс строки

    Код:
    C:\Python27>python.exe KTV.py

    Spoiler
    http://www.oozoon-dreamboxupdate.de/opendreambox/1.6/dm800/experimental/mipsel/index.html
    http://www.oozoon-dreamboxupdate.de/...6.6_mipsel.ipk
    Обсуждение всех нюансов развода в Германии. www.razvod.net

    Комментарий


    • #3
      Re: Enigma2 Plugin своими руками, почти с нуля (python)

      [quote author=Eugene Bond link=topic=860.msg88234#msg88234 date=1286299879]
      сам плагин морально устарел, если тебе надо питоновский код для получения данных с картины, то вот наброски, работающие с API
      Код:
      # (c) Eugene Bond
      # eugene.bond@gmail.com
      #
      # kartina tv XML api
      
      import urllib2
      from xml.dom import minidom
      from elementtree.ElementTree import parse, tostring
      from pprint import pprint
      from time import time
      
      import re
      import os 
      
      
      KARTINA_API = 'http://iptv.kartina.tv/api/xml/%s'
      
      
      class kartina:
      	
      	def __init__(self, login, password):
      		self.SID = None
      		self.channels = []
      		self.channels_ttl = 0
      		self.login = login
      		self.password = password
      	
      	def _request(self, cmd, params):
      		
      		if self.SID == None:
      			if cmd != 'login':
      				self._auth(self.login, self.password)
      		
      		url = KARTINA_API % cmd
      		url = url + '?' + params
      		if (self.SID != None):
      			url = url + '&' + self.SID
      		#log.info('Requesting %s' % url)
      		
      		req = urllib2.Request(url, None, {'User-agent': 'Mozilla/5.0', 'Connection': 'Close'})
      		res = parse(urllib2.urlopen(req)).getroot()
      		
      		self._errors_check(res)
      		
      		return res
      	
      	def _auth(self, user, password):
      		response = self._request('login', 'login=%s&pass=%s' % (user, password))
      		
      		if response.findtext('sid'):
      			self.SID = '%s=%s' % (response.findtext('sid_name'), response.findtext('sid'))
      		
      		print tostring(response, 'UTF-8')
      	
      	def _errors_check(self, xml):
      		
      		if len(xml.findall('error')):
      			print 'ERROR'
      			print tostring(xml, 'UTF-8')
      			self.SID = None
      	
      	
      	def channel_list(self):
      		if self.channels_ttl < time():
      			xmlChannels = self._request('channel_list', '')
      			self.channels = []
      			print tostring(xmlChannels, 'UTF-8')
      			
      			for channel in xmlChannels.findall('groups/item/channels/item'):
      				programm = channel.findtext('epg_progname')
      				if not programm:
      					programm = ""
      				m = re.search("[^\n]+", programm)
      				prog = ""
      				desc = ""
      				if m:
      					prog = m.group(0).strip()
      					if len(m.groups()) > 1:
      						desc = m.group(1).strip()
      				
      				self.channels.append( (
      					channel.findtext('id'),
      					channel.findtext('name'),
      					"",
      					"",
      					prog,
      					desc,
      					channel.findtext('is_video'),
      					channel.findtext('have_archive'),
      					channel.findtext('protected')
      				))
      			self.channels_ttl = time() + 600
      		
      		return self.channels
      	
      	def channel_url(self, id):
      		params = 'cid=%s&protect_code=%s' % (id, self.password)
      		response = self._request('get_url', params)
      		print tostring(response, "UTF-8")
      		url = response.findtext('url')
      		url = re.search("http[^ ]*.",url).group(0).replace("\"","").strip()
      		#http/ts://217.19.222.34:18046/?ticket=W4z3WFdoSRnMMXHgYFq...md4ZGtVyT6mjgqGZk%3D
      		
      		#url = re.sub('http/ts(.*?)\s(.*)', 'http\\1', url)
      		
      		return url
      	
      	def test(self):
      		pprint(self.channel_list())
      		pprint(self.channel_url(6))
      
      
      if __name__ == '__main__':
      	foo = kartina('147', '741')
      	foo.test()
      тут получение списка и урла потока (авторизация "прозрачная&quot
      в принципе, не сложно добавить и остальные функции API (но нет времени )

      PS: скорее всего импорт minidom является рудиментарным и не нужен
      PPS: код не претендует на гениальность, но может кому пригодится

      [/quote]

      поставил себе дома питона на мак, приятно то, что скрипты можно запускать прям из редактора TextMate
      попытаюсь поиграться с набросками указаными сверху
      Обсуждение всех нюансов развода в Германии. www.razvod.net

      Комментарий


      • #4
        Re: Enigma2 Plugin своими руками, почти с нуля (python)

        потихоньку помаленьку догоняю что и как просходит

        вот так к примеру я получаю епг

        Код:
        	#/epg?cid=<идентификатор канала>&day=<дата формата DDMMYY>	
        	def get_epg(self, id, day):
        		params = 'cid=%s&day=%s' % (id, day)
        		xmlEpg = self._request('epg', params)
        		self.epg = []
        		print tostring(xmlEpg, 'UTF-8')
        		for epg in xmlEpg.findall('epg/item'):
        			self.epg.append( (
        				epg.findtext('ut_start'),
        				epg.findtext('progname'),
        			))
        
        		return self.epg
        
        today = strftime("%d%m%y", gmtime())
        pprint(self.get_epg(6, today))
        пока всё просто, жалко что епг и другие хмл выплевываются в уникоде и на экране видна всякая лабудень.

        ('1286413080',
        u'"\u041f\u0440\u043e\u0433\u043d\u043e\ u0437 \u043f\u043e\u0433\u043e\u0434\u
        044b".&#039,
        ('1286413140',
        u'"\u0411\u0435\u0437 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u 0440\u
        0438\u0435\u0432".&#039]
        сначало по мелочи настрепаю нужные функции, а потом посмотрю как брать время с сервера картины и вообще как шманаться по архивам
        Обсуждение всех нюансов развода в Германии. www.razvod.net

        Комментарий


        • #5
          Re: Enigma2 Plugin своими руками, почти с нуля (python)

          Желаю удачи,а вдруг заработает и на азике с енигма
          Dbox2 Nokia ; Kathrein UFS910;AZBox HD Elite;AZBox HD Premium ;AZBox HD Premium +
          OpenAZBox PLi MOD HD Prerelease 7 ;OpenRSi 2.1 и AZtrino 2.0 RC2 ;PANASONIC TX-P42GT30E
          ИСТОРИЯ О БОЛГАРСКОМ НАРОДЕ
          http://sparotok.blog.bg/

          Комментарий


          • #6
            Re: Enigma2 Plugin своими руками, почти с нуля (python)

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

            итак как из картиновремени сделать время для запроса

            Код:
            		todaytime = localtime(float(self.servertime))
            		today = strftime("%d%m%y",todaytime)
            		pprint(self.servertime)
            		pprint(today)
            а это чтобы скакать по епг минус день
            Код:
            		day_minus_two = datetime.fromtimestamp(float(self.servertime)) - timedelta(days=2)
            		print day_minus_two.strftime("%d%m%y")
            Обсуждение всех нюансов развода в Германии. www.razvod.net

            Комментарий


            • #7
              Re: Enigma2 Plugin своими руками, почти с нуля (python)

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

              для начала попытаюсь подглядеть как делается гуи здесь
              http://git.opendreambox.org/?p=enigm...ins/TestPlugin

              также там есть куча других исходников, медиаплеер и тому подобное, посмотрим, как быстро я попаду в тупик


              ---------
              http://docs.python.org/tutorial/index.html
              http://dream.reichholf.net/pydoc/html/namespaces.html
              http://dream.reichholf.net/wiki/Howt...kete_erstellen
              http://git.opendreambox.org/?p=enigm...;f=doc/PLUGINS
              Обсуждение всех нюансов развода в Германии. www.razvod.net

              Комментарий


              • #8
                Re: Enigma2 Plugin своими руками, почти с нуля (python)

                Привет!

                Чтото я не пойму, ты хочешь новый плаг писать, каторый уже есть???

                Думаю, что тот, кто писал плаг на дрим не будут в восторге. Причём плагин уже у тебя в наличии.

                Интересно както получается. Может я не прав, тогда поправь.
                Xtreamer 2.7 (ГлавТВ PlugIn) + 500GB HDD
                Xtreamer Prodigy 3.5 (ГлавТВ PlugIn)
                iNeXT HD-1 (ГлавТВ PlugIn)
                Dreambox 800 HD PVR DVB-C (Kartina.tv PlugIn) + 500GB HDD
                2 x FritzBox 7270 + 2x FRITZ!Fon MT-D
                Nintendo Wii + WiKey2 + 500GB HDD

                Комментарий


                • #9
                  Re: Enigma2 Plugin своими руками, почти с нуля (python)

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

                  смысл... попытаться научится делать плаги и не тупо сделать чтото а научится на конкретной тяжелой задаче - иптв видеоплеер, может потом эти коды ктото приспособит под xbmc, а он вскоре будет идти на плейстейшн3
                  Обсуждение всех нюансов развода в Германии. www.razvod.net

                  Комментарий


                  • #10
                    Re: Enigma2 Plugin своими руками, почти с нуля (python)

                    итак у меня проблема с епг

                    <item><ut_start>1286071200</ut_start><progname>"НЕИЗВЕСТНАЯ ПЛАНЕТА"тут типо \n
                    - "ЛЕГЕНДЫ ДАЛМАЦИИ"</progname><t_start>05:00</t_start></item>
                    сделал также как и в плейлисте

                    Код:
                          m = re.search("[^\n]+", epg_programm)
                          epg_prog = ""
                          epg_desc = ""
                          
                          if m:
                            epg_prog = m.group(0).strip()
                            if len(m.groups()) > 1:
                              epg_desc = m.group(1).strip()
                          
                          self.epg.append( (
                            ut_start,
                            epg_prog,
                            epg_desc
                            
                          ))
                    но на выходе нет 2й части epg_desc, а только имя программы
                    Обсуждение всех нюансов развода в Германии. www.razvod.net

                    Комментарий


                    • #11
                      Re: Enigma2 Plugin своими руками, почти с нуля (python)

                      думаю проблема в следующем:

                      Код:
                       	for channel in self.channel_list():
                      		 print channel[1].encode('utf-8')
                      		 print channel[2].encode('utf-8')
                      
                      		
                      		day_minus_two = datetime.fromtimestamp(float(self.servertime)) - timedelta(days=3)
                      		day_minus_two = day_minus_two.strftime("%d%m%y")
                      
                      
                      		for epg in self.get_epg(7,day_minus_two):
                      			print epg[1]
                      когда получаю инфу из списка каналов, то их нужно перекодировать для выдачи на экран, а вот инфа из епг поступает как надо. только всеравно не понимаю какой знак вместо \n нужно искать в епг инфе, наверсно пора подглянуть в скрипт от consros

                      -----
                      пора спать
                      толькочто убрал .encode('utf-8&#039 и получил нормальные знаки вместо уникодских закарючек...
                      в шоке, скрипт живет своей жизнью
                      Обсуждение всех нюансов развода в Германии. www.razvod.net

                      Комментарий


                      • #12
                        Re: Enigma2 Plugin своими руками, почти с нуля (python)

                        nitrogen14
                        1) мне кажется, что с поиском перевода строки при помощи регуляров я погорячился (скорее всего с копипастил откуда-то). там достаточно ограничиться str.split("\n",1) и получить на выходе два значения: название и описание.
                        или, как мне кажется, еще надежней будет сделать splitlines

                        2) на счет utf-8: тебе не надо дополнительный .encode в utf-8 делать. у тебя и так все в уникоде, а ты еще дополнительно оборачиваешь это дело. а если сделал, то потом надо конвертировать обратно (см тут пример "To convert a Unicode string into an 8-bit string..."

                        Комментарий


                        • #13
                          Re: Enigma2 Plugin своими руками, почти с нуля (python)

                          1.спасибо, проверю.
                          2.да я не знаю почему он у меня на компе в уникоде знаки выдавал, поэтому я их в утф-8 кодировал.
                          вчера вечером всё стало нормально показывать без перекодировки. и я не знаю почему
                          Обсуждение всех нюансов развода в Германии. www.razvod.net

                          Комментарий


                          • #14
                            Re: Enigma2 Plugin своими руками, почти с нуля (python)

                            спасибо, заработало

                            Код:
                            			epg_progname = epg.findtext('progname')
                            			print epg_progname.encode('utf-8')
                            			epg_programm = []
                            			if epg_progname:
                            				epg_programm = epg_progname.split("\n",1)	
                            				if len(epg_programm)>0:
                            					epg_prog = epg_programm[0]
                            
                            				if len(epg_programm)>1:	
                            					epg_desc = epg_programm[1]
                            			
                            			self.epg.append( (
                            				ut_start,
                            				epg_prog,
                            				epg_desc,
                            				epg_programm
                            				
                            			))
                            .encode('utf-8&#039 без этого винда матерится мол косяк с знаком, на маке такого нет, поэтому эта перекодировка перед выводом на экран не нужна, да и вижу я на маке нормальные буквы, а здесь на винде всякие кракосябры
                            "ðùðÆðÉðØð½ðÖ ðúðûðÿðØ"


                            "ðØðò ðÆðáðÿ ð£ðØðò!"


                            "ðöðÉðÆðÉðÖðóðò ðáðÉðùðæðòðáðòð£ðíð»!"
                            Обсуждение всех нюансов развода в Германии. www.razvod.net

                            Комментарий


                            • #15
                              Re: Enigma2 Plugin своими руками, почти с нуля (python)

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

                              ну а пока на работе и энигмы нет под рукой, смотрю, как построены плаги и как нужно проигрывать вебстрим.
                              Spoiler
                              http://www.dream-multimedia-tv.de/board/index.php?page=Thread&threadID=13428


                              Код:
                                def play(self):
                                      cmd ="gst-launch -v playbin2 uri=http://...........mp4 > /tmp/gst.log"
                                      os.system(cmd)
                              интересно, всё на самом деле так просто...
                              не вроде это типо дебага

                              вот что стоит в радиоплеере
                              Код:
                              	  try:
                              	    con = urlopener.open(url)
                              	    print "[webradioFS.StreamPlayer] playing stream", url
                              	    esref = eServiceReference("4097:0:0:0:0:0:0:0:0:0:%s" % url.replace(':', '%3a'))
                              	    try:
                              	      self.session.nav.playService(esref)
                              -->
                              sref = eServiceReference(4114, 0, http://xxx.xxx.xxx.xxx/Aliens.ts) - >this will work with MPEG2,h264 SD & HD streams


                              -------------
                              Spoiler
                              http://www.qboxsvn.com/projects/qboxhd/browser/e2-0.2/trunk/lib/python/Plugins/Extensions/VlcPlayer/VlcPlayer.py?rev=87


                              Код:
                              312	    def play(self):
                              313	        if self.state == self.STATE_PAUSED:
                              314	            self.unpause()
                              315	            return
                              316	        print "[VLC] setupStream: " + self.filename
                              317	        if ENIGMA_SERVICE_ID == 0:
                              318	            self.hide()
                              319	            self.session.open(
                              320	                    MessageBox, _("No valid Enigma-Service to play a VLC-Stream\nCheck your installation and try again!"), MessageBox.TYPE_ERROR
                              321	            )
                              322	            self.close()
                              323	            return
                              324	        try:
                              325	            url = self.server.playFile(self.filename, DEFAULT_VIDEO_PID, DEFAULT_AUDIO_PID)
                              326	            print "[VLC] url: " + url
                              327	        except Exception, e:
                              328	            self.hide()
                              329	            self.session.open(
                              330	                    MessageBox, _("Error with VLC server:\n%s" % e), MessageBox.TYPE_ERROR
                              331	            )
                              332	            self.close()
                              333	            return
                              334	        if url is not None:
                              335	            sref = eServiceReference(ENIGMA_SERVICE_ID, 0, url)
                              336	            print "sref valid=", sref.valid()
                              337	            sref.setData(0, DEFAULT_VIDEO_PID)
                              338	            sref.setData(1, DEFAULT_AUDIO_PID)
                              339	            self.session.nav.playService(sref)
                              340	            self.state = self.STATE_PLAYING
                              341	            if self.shown:
                              342	                self.__setHideTimer()
                              343	            self.vlcservice.setServer(self.server)
                              Обсуждение всех нюансов развода в Германии. www.razvod.net

                              Комментарий

                              Обработка...
                              X