From 510fe63aa7bf232fcca7f2a3d0fdab2c45307b78 Mon Sep 17 00:00:00 2001 From: Stefan Pluecken Date: Thu, 11 Jun 2009 12:46:49 +0200 Subject: [PATCH] add a format converter, i.e. to convert from lamedb to sat.xml files the main destination format of this converter is a sat.xml file easily extendable with further datasources --- tools/host_tools/FormatConverter/README | 7 ++ tools/host_tools/FormatConverter/datasource.py | 109 ++++++++++++++++++++++ tools/host_tools/FormatConverter/datasource.pyc | Bin 0 -> 6401 bytes tools/host_tools/FormatConverter/input.py | 23 +++++ tools/host_tools/FormatConverter/input.pyc | Bin 0 -> 992 bytes tools/host_tools/FormatConverter/lamedb.py | 81 ++++++++++++++++ tools/host_tools/FormatConverter/lamedb.pyc | Bin 0 -> 3401 bytes tools/host_tools/FormatConverter/lamedb2satxml.py | 21 +++++ tools/host_tools/FormatConverter/main.py | 43 +++++++++ tools/host_tools/FormatConverter/satxml.py | 87 +++++++++++++++++ tools/host_tools/FormatConverter/satxml.pyc | Bin 0 -> 4337 bytes 11 files changed, 371 insertions(+) create mode 100644 tools/host_tools/FormatConverter/README create mode 100644 tools/host_tools/FormatConverter/datasource.py create mode 100644 tools/host_tools/FormatConverter/datasource.pyc create mode 100644 tools/host_tools/FormatConverter/input.py create mode 100644 tools/host_tools/FormatConverter/input.pyc create mode 100644 tools/host_tools/FormatConverter/lamedb.py create mode 100644 tools/host_tools/FormatConverter/lamedb.pyc create mode 100755 tools/host_tools/FormatConverter/lamedb2satxml.py create mode 100755 tools/host_tools/FormatConverter/main.py create mode 100644 tools/host_tools/FormatConverter/satxml.py create mode 100644 tools/host_tools/FormatConverter/satxml.pyc diff --git a/tools/host_tools/FormatConverter/README b/tools/host_tools/FormatConverter/README new file mode 100644 index 0000000..8584b59 --- /dev/null +++ b/tools/host_tools/FormatConverter/README @@ -0,0 +1,7 @@ +extendable format converter + +Can be used to convert lamedb to a satellites.xml file, including TSID/ONID entries for example to check diseqc setups with the enigma2 diseqc checker plugin. + +Just start lamedb2satxml for usage information. + +A more general usage interface is present in main.py, where you can call the different modules directly via a console user interface. diff --git a/tools/host_tools/FormatConverter/datasource.py b/tools/host_tools/FormatConverter/datasource.py new file mode 100644 index 0000000..6969d3b --- /dev/null +++ b/tools/host_tools/FormatConverter/datasource.py @@ -0,0 +1,109 @@ +from input import inputChoices + +class datasource: + def __init__(self): + self.clear() + + def setDatasources(self, datasources): + self.datasources = datasources + + def getCapabilities(self): + return [] + + def getName(self): + return "N/A" + + def getStatus(self): + text = str(len(self.transponderlist.keys())) + " Satellites" + "\n" + return text + + def printAll(self): + for sat in self.transponderlist.keys(): + print "***********" + print "sat:", sat, self.satnames[sat] + for transponder in self.transponderlist[sat]: + print transponder + + def clear(self): + self.transponderlist = {} + self.satnames = {} + + def read(self): + pass + + def write(self): + pass + + def addSat(self, satname, satpos): + if not self.transponderlist.has_key(satpos): + self.transponderlist[satpos] = [] + self.satnames[satpos] = satname + + def addTransponder(self, satpos, transponder): + if len(transponder.keys()) >= 6: + self.transponderlist[satpos].append(transponder) + +class genericdatasource(datasource): + def __init__(self): + datasource.__init__(self) + self.source = self.destination = None + + def getName(self): + return "Generic Datasource" + + def getCapabilities(self): + return [("copy data from one source to another", self.copy), ("merge data from one source into another", self.merge)] + + def copy(self): + self.copymerge(action = "copy") + + def merge(self): + self.copymerge(action = "merge") + + def copymerge(self, action = "copy"): + choice = -1 + while choice is not None: + choice = inputChoices(["select source", "select destination", "copy now!"]) + if choice == 0: + print "\nselect source:" + self.source = self.selectDatasource() + elif choice == 1: + print "\nselect destination" + self.destination = self.selectDatasource() + elif choice == 2: + self.docopymerge(action) + + def docopymerge(self, action = "copy"): + if self.source is None: + print "select a source first!" + elif self.destination is None: + print "select a destination first!" + else: + if action == "copy": + print "copying ", + elif action == "merge": + print "merging ", + print "from %s to %s" % (self.source.getName(), self.destination.getName()) + countsat = 0 + counttransponder = 0 + if action == "copy": + self.destination.clear() + for satpos in self.source.transponderlist.keys(): + countsat += 1 + self.destination.addSat(self.source.satnames[satpos], satpos) + for transponder in self.source.transponderlist[satpos]: + counttransponder += 1 + self.destination.addTransponder(satpos, transponder) + print "copied %d sats with %d transponders" % (countsat, counttransponder) + + def selectDatasource(self): + list = [] + sources = [] + for source in self.datasources: + if source != self: + list.append(source.getName() + (" (%d sats)" % len(source.transponderlist.keys()))) + sources.append(source) + choice = inputChoices(list) + if choice is None: + return None + return sources[choice] \ No newline at end of file diff --git a/tools/host_tools/FormatConverter/datasource.pyc b/tools/host_tools/FormatConverter/datasource.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9d90ab73677ba72a23ba6260d75df405801fd4b GIT binary patch literal 6401 zcmd5=+in|082-nH#7+}vDI~OF3!Z>?;EFr=zJJzUgMbU9Iyjlx**Wa|hwnek{QT?6(mTJr@=0IHUjxq% zP~5wyQv4hFT4Z44h7pt2BwduWF5ijV7y0rA-Wy_TvTr19PJ8Q;F34`Dg)d~kXl)!8L%ZP*ZCdm`>g!`mHH0+#-8QrY4%@fPI>P&3=?0j0RnT2WNq09s3* zxhvHrd%8jBr(y0yFXB)749O+k@;@e)5$N_9&g1e7wFL8|C_-LGM~Ks~IT#Nd(&%Y1 z2o9kaUDseh?NeNM&%dKf%d3yL63Nq2OjOY zX_BV9iC^b-d=+!vte8IOW1%)TQ5*#VR}H>{6AB*sR#S?{#Z=x09z00POa;PEbTfWi z{dCMorcNcuM`;+1Y@SwrC0^s4b6kQlr__hJ0)+8-6*8`(r!>C{ro%{9=0|jcy`H9= zz22}$j|X^-X$CRbiK+9r#fl$|A7Mo?#OGPjO~sG1x`?XcP+JdL=P?}wHS6dE7fice z{x#Z*?S{6So{~SXxgBTyDvj%-Q-9>-BNX=qD*K;OY9`Y-1R$$Ms*QXaZ6wwqpKddI zW{8~nZIY`Xyo3foNR!kwffm<5vj^0nM*dz|Anjb4RlR7K?-scYhNfo(jan&=4q2Y~ ztjJHr%@Z^mC?(EddQ{M)DA$~VU_Z(3h^FnJoTy4{1B|$C&dHwQ{59gE`|~G6@~L$YiWr#DuOq6;;zKyn*tMf}&#xQi8f6rTbz+Ora>dirl16q{cJ^<-x0= zfVb0Qi?qCj@*mlXuV8I_dBRXk7@UfFNWwLgk`I-!o_i^M+TbP!e?$fCAf-O}fuSxH zxz(29TQNArKxZj#6B=@WgN#n%jHcYGX_$o9+uosqsao||bvbGyd}7k#bW-cDlN!@W zZJl&31l%Umee7cR36_x8GrV^7qQvRh%MNVcmsaHHJ8+}Go*BpICLoIP;`SvNDJC&h zSt_Rn6MP$P7Xu7olYyCUfG6lpqu?;rBj@V}KU3VCu4B9z#mh)Wj&%3Ja1)hoZ1}1F|Vi7l3F<0et`_ z+dKJ1Q>I5mN;$y8SZ*)?$kbJ*Elh97cD@STqBB5-oq&vHQj6v1!x1@vD74{4S8)(* z5tFPD3#Xqgp@O8XLC9%Rc5-L(siq(;L-*F6m3s|Eb6eizX;CqnP4{fc-G*F1xnC1= z@_MzN-CKKC^& zpN*ZrrPP~5KXXQX=c-C zJ&llryXbc25BV~4rga@nTot{F@CeI7l1J!QXXTLE(SAaHr#4aND>u>%vR@qM9vi8F z=*!GTr;+@|&w;d0QQS+YaC|mxmfDJG0s1X-35KwM);V(?IpdOf%AC{Z6Cqup8Ia9Q z6!$%<1K|w?Yxv18OT29Dbrqe8kXv;r-chhKo2!>T5hjB>1->>U19UXYTV11<18%}h zb$PIpqgA;M9}%1&;j8H%O{@vK0kXJ+0G%XG)L+yoRs4cpDC>P>d;tSNld57p_w&|6 zomfm|cQl)%5;d97yCjD5;2B-;Y0q;a%6!f%@j7V0D?pa^ z6F= len(list): + repeat = True + return action \ No newline at end of file diff --git a/tools/host_tools/FormatConverter/input.pyc b/tools/host_tools/FormatConverter/input.pyc new file mode 100644 index 0000000000000000000000000000000000000000..081fff6b015780087fba89ff4ad891a56c5097d6 GIT binary patch literal 992 zcmcgq&2AGh5FYPOmQ*Pm5C;xiKuCLmMO-+55K>T6amXR5s8k7|&DtVvch~89f>LR7 zYA+ml0p5ux;2n4Y_{NFg3BdAyr9HxQpgX-q{IL}vgI z-2f=kG3kVKN;eUmMdC2e2XMB(Fs31pf+;eF`1??dV?{QiYoaYt4>J}#&&6$;%c~rV z_m$^VR@S!VTR@#Db!}U--|p-x+zF;_S8J9;DJcIQs93tj6udOrRYlX(<-!*lL7Iiz z6sEPGn)3Odm7S|SZg~EWYU59gGvR*<~s@le(i=N?5R% zi?X_?qzp-1${0iZHz*LWjcN0h`k34ol1s3`-8P}kVM<3aN90mc8k8!eg3W8h&Zy4_Od&kX^OW2Ho(`#84oQie z!ebuzpIYQep_(UX7C4ozhPqC=^^X6evi4>sm4*GOLtms`^eU{iX>+MPoYvMeXRrb- zjSlS;%%G4ZcxP6otr0^=v}~H0fZ$SAY+d_*dOVWXVf2VN%s&RT version or 4 < version: + print "unsupported lamedb version" + return + + transpondersreading = False + sats = {} + transponders = {} + for line in lines: + if line.strip() == "transponders": + transpondersreading = True + continue + if line.strip() == "services": + transpondersreading = False + continue + if transpondersreading: + if ord(line[0]) == 9: + transponder = line.strip().split(' ')[1].split(':') + sat = transponder[4] + if not sats.has_key(sat): + sats[sat] = [] + sats[sat].append((transponder, tsid, onid)) + tsid = None + onid = None + elif line.strip() != "/" and line.strip() != "end": + data = line.strip().split(":") + tsid = str(int(data[1], 16)) + onid = str(int(data[2], 16)) + satlist = sats.keys() + satlist.sort() + + for sat in satlist: + print sat + self.addSat(sat, sat) + transponders = sats[sat] + transponders.sort(key = lambda a: a[0]) + for transpondertuple in transponders: + transponder = transpondertuple[0] + tsid = transpondertuple[1] + onid = transpondertuple[2] + print transponder, tsid, onid + tmp_transponder = {} + tmp_transponder["frequency"] = transponder[0] + tmp_transponder["symbol_rate"] = transponder[1] + tmp_transponder["polarization"] = transponder[2] + tmp_transponder["fec"] = transponder[3] + if version == 3: + if len(transponder) > 6: + tmp_transponder["system"] = transponder[6] + tmp_transponder["modulation"] = transponder[7] + elif version == 4: + if len(transponder) > 7: + tmp_transponder["system"] = transponder[7] + tmp_transponder["modulation"] = transponder[8] + if (tsid != "1" or onid != "1"): + tmp_transponder["tsid"] = transponder[0] + tmp_transponder["onid"] = transponder[0] + self.addTransponder(sat, tmp_transponder) + \ No newline at end of file diff --git a/tools/host_tools/FormatConverter/lamedb.pyc b/tools/host_tools/FormatConverter/lamedb.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee06dbd22691236e5598857f80bf8b5ed7288f1d GIT binary patch literal 3401 zcmcguTW=dh6h7l?;>1px(2LW8A|#N75C$X!Dp5sgX$puuI7JbWinZ}>l5N+!o1Jl$ zAe#r$2OjuyJn+na;DJ~8zB6{>!gJ&G&Ym-K=A7?b=JNYr&Bo_{e)!EmroRflU*NUx zp$YLf@?0bl*%vWkNg|O$BVk!yikyr5un(ppyPYb;yRV8ZD+wD+sj}`~iH+vs| zwr`nz__{1hEM{2O z_vE9j7zXY^mcEDz7ZqI}wh!{N9s#I*He#CQ|2{V{00-e|U$ZxJkrC=KMe0S53Oozq z3Xn6xjIE^$Vg`gWdo@=Cgi700csrU9vs9;?Bd9_&^4c~Yv36i_5K%lho$8`Mi|aZGC?p5*VnnoL|0i{CT+$VoOX-_ zj1D7{vbd^@v9K%BCXWH|6?s;Xyoo)gri@6|08^Lk$03%g!4@*9$}yDJw5`kO_tgFH z>33$bAmasz>$Ddx$g`4UP=t_T#>uaea_wJ?FJ6qR#@TpPGBL(2QWN$bA`2TT>gHzC zizRwN@MMxaf888o@zBKf)fwVCDt0d`b2~fOile&!SoE5H0c#S*tIRbn7wL$O0 zr}xcdMaCFJh$n~uC`1y_NC6a_M_{%QnQeq-`!N#^BZw|0jG=K&w#Z=;xpmKBBDps_ zSM}U=a9Ufehfh%t*QkfNyTMw^HUSx$Zg}aNe(o*LwPow%{jy2Ff(&%jv=Cm=acf@3 zbkOpoK*gi6&NP`@fJc6Ap z^>Wq~IuSBf35yEx(qXt8c#F9GI35N;7(TfylMc@VJ(v}EoaQ6PGfu&I7kC$$78wl1 z>5*cZm7PZ5QlF*kl+lt6ob72{lA|_F&0LkLn>KL0+k|lkjZWl^Q>|bqiLG<2()nql z91wZhxnbU)8@QSx?6FQ5IQugiF>7YoG)n7c)ohrmsg`PnPhDzeo!@C&H#g1OrU9uI zAR$;{tC{7>Vwum5zs91^U;eKUl5US%K1lbt Ki|Hk4we&AF5zTG@ literal 0 HcmV?d00001 diff --git a/tools/host_tools/FormatConverter/lamedb2satxml.py b/tools/host_tools/FormatConverter/lamedb2satxml.py new file mode 100755 index 0000000..d6adc1f --- /dev/null +++ b/tools/host_tools/FormatConverter/lamedb2satxml.py @@ -0,0 +1,21 @@ +#!/usr/bin/python +from datasource import genericdatasource +from satxml import satxml +from lamedb import lamedb + +import sys + +if len(sys.argv) != 3: + print "usage: %s " % sys.argv[0] + sys.exit() + +gen = genericdatasource() +db = lamedb(sys.argv[1]) +xml = satxml(sys.argv[2]) + +db.read() +gen.source = db +gen.destination = xml +gen.docopymerge(action = "copy") +xml.write() + diff --git a/tools/host_tools/FormatConverter/main.py b/tools/host_tools/FormatConverter/main.py new file mode 100755 index 0000000..5a36b5f --- /dev/null +++ b/tools/host_tools/FormatConverter/main.py @@ -0,0 +1,43 @@ +#!/usr/bin/python +from datasource import genericdatasource +from satxml import satxml +from lamedb import lamedb +from input import * +import sys +import os + +maindata = genericdatasource() + +sources = [satxml, lamedb] + +datasources = [maindata] + +for source in sources: + datasources.append(source()) + +for source in datasources: + source.setDatasources(datasources) + +while(True): + os.system("/usr/bin/clear") + list = [] + for index in range(len(datasources)): + list.append(datasources[index].getName() + (" (%d sats)" % len(datasources[index].transponderlist.keys()))) + index = inputChoices(list, "q", "quit") + if index is None: + break + + while(True): + print datasources[index].getStatus() + list = [] + for action in datasources[index].getCapabilities(): + list.append(action[0]) + action = inputChoices(list) + if action is None: + break + + datasources[index].getCapabilities()[action][1]() + #except: + # print sys.exc_info() + # print "sorry, could not execute that command" + diff --git a/tools/host_tools/FormatConverter/satxml.py b/tools/host_tools/FormatConverter/satxml.py new file mode 100644 index 0000000..5e2069e --- /dev/null +++ b/tools/host_tools/FormatConverter/satxml.py @@ -0,0 +1,87 @@ +import os +from datasource import datasource +from xml.dom import minidom +from xml.dom.minidom import Document +from input import inputText + +class satxml(datasource): + def __init__(self, filename = "satellites.xml"): + self.filename = filename + datasource.__init__(self) + + if not os.path.isfile(filename): + print "File %s doesn't exist. Creating it." % filename + + def getStatus(self): + text = datasource.getStatus(self) + return text + + def getCapabilities(self): + return [("set filename", self.setFilename), ("read file", self.read), ("write file", self.write), ("print all", self.printAll)] + + def getName(self): + return "satellites.xml" + + def setFilename(self): + print "Please give a filename :" + filename = inputText() + if filename == "": + self.filename = "satellites.xml" + else: + self.filename = filename + print "Filename set to %s" % self.filename + + def read(self): + basicsatxml = minidom.parse(self.filename) + + for sat in basicsatxml.firstChild.childNodes: + if sat.nodeType == sat.ELEMENT_NODE and sat.localName == "sat": + print sat.localName + satname = str(sat.getAttribute("name")) + satpos = str(sat.getAttribute("position")) + self.addSat(satname, satpos) + for transponder in sat.childNodes: + if transponder.nodeType == transponder.ELEMENT_NODE and transponder.localName == "transponder": + parameters = {} + paramlist = ["frequency", "symbol_rate", "polarization", "fec", "system", "modulation", "tsid", "onid"] + for param in paramlist: + entry = str(transponder.getAttribute(param)) + if entry != "": + parameters[param] = entry + if len(parameters.keys()) > 1: + self.addTransponder(satpos, parameters) + print self.transponderlist + + def write(self): + satxml = Document() + satellites = satxml.createElement("satellites") + satxml.appendChild(satellites) + satlist = self.transponderlist.keys() + print self.transponderlist + satlist.sort() + + for sat in satlist: + xmlsat = satxml.createElement("sat") + xmlsat.setAttribute("name", self.satnames[sat]) + xmlsat.setAttribute("flags", "1") + xmlsat.setAttribute("position", sat) + satellites.appendChild(xmlsat) + transponders = self.transponderlist[sat] + transponders.sort(key = lambda a: a["frequency"]) + + for transponder in transponders: + xmltransponder = satxml.createElement("transponder") + paramlist = ["frequency", "symbol_rate", "polarization", "fec", "system", "modulation", "tsid", "onid"] + for param in paramlist: + if transponder.has_key(param): + xmltransponder.setAttribute(param, transponder[param]) + xmlsat.appendChild(xmltransponder) + prettyxml = satxml.toprettyxml() + print prettyxml + file = open(self.filename, "w") + file.write(prettyxml) + file.close() + + + + \ No newline at end of file diff --git a/tools/host_tools/FormatConverter/satxml.pyc b/tools/host_tools/FormatConverter/satxml.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5a6b0d24d7dcb53a6a4499697087faa894ff052 GIT binary patch literal 4337 zcmcgv%WfP+6umX?aqKuaBw$_{5fCGUY=}^hAc_dKlPH1#wIf+rvPSLcvfXh{_qeMZ z#>ifvWXTfo3H%0M01{uomNk0>=iHjHjacJ2T~l@IaUXThsjA=poSXUN_xB$SWb&_t z-%s(m9TW-v8`&4x4E2ia8_A4p8Zqpv%6>(%s%%z6yC(ZJ$?CFM5AC|_HzaGyW)tm( zSR*?|lBPTtc_#ApW{be$DwI4lP?$eNH1(>zUzVGwZAYB4w* z+S~_88+*Me$Bt9ympUt@jeVN$c2d98 zWdJ;*w1dHUJhTz&LDKIdlD^;fT(NMzhM!UF_cUm!;{;Wv9nNMuQ5_??_(I_}P+Q(B zhIZNS*`ydO4~JR2?UoZ5Fx)Q2%QjDUhw-h`UtbiN!wl#9p?be4hp}HN@~5`+wppRo!cJv(kk*LJc>2FHpW@xf=RHnJ_#97v*QJyAZ0p=FdMI*%dp6lyWO(&go z50hwo#APoggr4EUPOikGcsm8kQtOxmj%guh@uXQAPdcUi5^(chfCjrS+6^)p+~^_1 z*HJxh{=X9ZUNHZ`LuC0gndCP(>PbZk(t~D1-$*_qWF73(5Uj@~t7KY^hp;*ohRvCgW9(f`o>jz*f7L-XS>5_sPC);4Rf;kw{Rw-E z29(xR>5pRekPA47a44Zf2M$r_n33d?B(t*Hl9Q&4@5*r#Yu=WVmKuUJ+H%~Q8iG3J z%*m6g6qlg_?FPH=9Q+{$-v-D4l601t2X~Uo@}wrkix>(`A5#%pLUHFna{`IWsiOSCy)tyd)0DHZ0ZJw6%*lh!_8`(my4xZnG7 zbxl3Uib0$a=D~Yks^x(GJ@3nO`w*`1tc#Om9g(3EAYQd_-@*$b5Pgr&#f7Gxi&KU} zzstl{ylI@aW0wxXSsJ~_(PSI6HRh8m5yBq5#6C`izqHW8O+6CW1r9d44vOr>( z)+96*2@Jv(Vq7Az#913K3&(0)$tH)i}DrK?*<1ouRL zTRj2#r_cwUfzxDOk}HzDpiIz~@ohqVb!$mZz&lMz!AdinS-cFjE!v1SI#8{H4x2fqN_UjW%~9eNQZ@WUm92suRCK|Krf@?=(yXGt6ARKL)e(+DaT5Oh6F zJEY{~(9txFuAxU0Z6}L&9j?YAA4EJJ6&Jw6fFgc8U)J&I^$@zT@M5_2MK41fa+Cvg zk@#YAR@vZAhP!VP-@Q-k@QI>Kt%`U!MX#`UmBni;UT5(JiyJ7^+;6%}{)j$$rt*Ln zdb^fczH$`c@n~f8L>Vc1k7EfEB@I`UUKs{Q^BKdCXD9e~N(Ote>m#0lbBj@Fy+6WZ zB`_n_R_=?GX?X7&WQDU`+7b?RGHJw{>XcbX7J+I=FIWlM)QodPHQ^ijMpb8w7Jb0w zZgIJAAw6%6K10xT0dEev`w>2Uq4CWz4_cWA<;+w_GV|so5YH9fDa_T0B+$ESZWYq8LQG}*GZX#Z^qZe54N)>5vb>C^mS;A`Ve`Q*3rXCQ~ z-Y~PxcCB5-U%P!xU5VHko>8n}@0RfX4u>Ueod}jD5A%?>%o=@$M^(